WC_Cart_Totals subclass
This commit is contained in:
parent
698c3b9e1b
commit
250dabaf41
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* Order/cart totals calculation class.
|
||||
*
|
||||
* Methods are private and class is final to keep this as an internal API.
|
||||
* Methods are protected and class is final to keep this as an internal API.
|
||||
* May be opened in the future once structure is stable.
|
||||
*
|
||||
* @author Automattic
|
||||
|
@ -16,14 +16,12 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
/**
|
||||
* WC_Totals class.
|
||||
*
|
||||
* @todo consider extending this for cart vs orders if lots of conditonal logic is needed.
|
||||
* @todo Instead of setting cart totals from here, do it from a subclass.
|
||||
* @todo woocommerce_tax_round_at_subtotal option - how should we handle this with precision?
|
||||
* @todo woocommerce_calculate_totals action for carts.
|
||||
* @todo woocommerce_calculated_total filter for carts.
|
||||
* @since 3.2.0
|
||||
*/
|
||||
class WC_Totals {
|
||||
abstract class WC_Totals {
|
||||
|
||||
/**
|
||||
* Reference to cart or order object.
|
||||
|
@ -31,7 +29,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @var array
|
||||
*/
|
||||
private $object;
|
||||
protected $object;
|
||||
|
||||
/**
|
||||
* Line items to calculate.
|
||||
|
@ -39,7 +37,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @var array
|
||||
*/
|
||||
private $items = array();
|
||||
protected $items = array();
|
||||
|
||||
/**
|
||||
* Fees to calculate.
|
||||
|
@ -47,7 +45,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @var array
|
||||
*/
|
||||
private $fees = array();
|
||||
protected $fees = array();
|
||||
|
||||
/**
|
||||
* Shipping costs.
|
||||
|
@ -55,7 +53,15 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @var array
|
||||
*/
|
||||
private $shipping = array();
|
||||
protected $shipping = array();
|
||||
|
||||
/**
|
||||
* Applied coupon objects.
|
||||
*
|
||||
* @since 3.2.0
|
||||
* @var array
|
||||
*/
|
||||
protected $coupons = array();
|
||||
|
||||
/**
|
||||
* Discount amounts in cents after calculation for the cart.
|
||||
|
@ -63,7 +69,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @var array
|
||||
*/
|
||||
private $discount_totals = array();
|
||||
protected $discount_totals = array();
|
||||
|
||||
/**
|
||||
* Precision so we can work in cents.
|
||||
|
@ -71,7 +77,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @var int
|
||||
*/
|
||||
private $precision = 1;
|
||||
protected $precision = 1;
|
||||
|
||||
/**
|
||||
* Stores totals.
|
||||
|
@ -79,7 +85,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @var array
|
||||
*/
|
||||
private $totals = array(
|
||||
protected $totals = array(
|
||||
'fees_total' => 0,
|
||||
'fees_total_tax' => 0,
|
||||
'items_subtotal' => 0,
|
||||
|
@ -104,35 +110,43 @@ class WC_Totals {
|
|||
public function __construct( &$cart = null ) {
|
||||
$this->precision = pow( 10, wc_get_price_decimals() );
|
||||
$this->object = $cart;
|
||||
$this->set_items();
|
||||
$this->calculate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a cart or order object passed in for calculation. Normalises data
|
||||
* into the same format for use by this class.
|
||||
*
|
||||
* Each item is made up of the following props, in addition to those returned by get_default_item_props() for totals.
|
||||
* - key: An identifier for the item (cart item key or line item ID).
|
||||
* - cart_item: For carts, the cart item from the cart which may include custom data.
|
||||
* - quantity: The qty for this line.
|
||||
* - price: The line price in cents.
|
||||
* - product: The product object this cart item is for.
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function set_items() {
|
||||
$this->items = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get and normalise fees.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function set_fees() {
|
||||
$this->fees = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get shipping methods and normalise.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function set_shipping() {
|
||||
$this->shipping = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Set array of coupon objects from the cart or an order.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
private function set_items() {
|
||||
if ( is_a( $this->object, 'WC_Cart' ) ) {
|
||||
foreach ( $this->object->get_cart() as $cart_item_key => $cart_item ) {
|
||||
$item = $this->get_default_item_props();
|
||||
$item->key = $cart_item_key;
|
||||
$item->cart_item = $cart_item;
|
||||
$item->quantity = $cart_item['quantity'];
|
||||
$item->price = $this->add_precision( $cart_item['data']->get_price() ) * $cart_item['quantity'];
|
||||
$item->product = $cart_item['data'];
|
||||
$this->items[ $cart_item_key ] = $item;
|
||||
}
|
||||
}
|
||||
protected function set_coupons() {
|
||||
$this->coupons = array();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -142,7 +156,7 @@ class WC_Totals {
|
|||
* @param int|array $value Value to remove precision from.
|
||||
* @return float
|
||||
*/
|
||||
private function add_precision( $value ) {
|
||||
protected function add_precision( $value ) {
|
||||
if ( is_array( $value ) ) {
|
||||
foreach ( $value as $key => $subvalue ) {
|
||||
$value[ $key ] = $this->add_precision( $subvalue );
|
||||
|
@ -160,7 +174,7 @@ class WC_Totals {
|
|||
* @param int|array $value Value to remove precision from.
|
||||
* @return float
|
||||
*/
|
||||
private function remove_precision( $value ) {
|
||||
protected function remove_precision( $value ) {
|
||||
if ( is_array( $value ) ) {
|
||||
foreach ( $value as $key => $subvalue ) {
|
||||
$value[ $key ] = $this->remove_precision( $subvalue );
|
||||
|
@ -177,7 +191,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @return array
|
||||
*/
|
||||
private function get_default_item_props() {
|
||||
protected function get_default_item_props() {
|
||||
return (object) array(
|
||||
'key' => '',
|
||||
'quantity' => 0,
|
||||
|
@ -200,7 +214,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @return array
|
||||
*/
|
||||
private function get_default_fee_props() {
|
||||
protected function get_default_fee_props() {
|
||||
return (object) array(
|
||||
'total_tax' => 0,
|
||||
'taxes' => array(),
|
||||
|
@ -213,7 +227,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @return array
|
||||
*/
|
||||
private function get_default_shipping_props() {
|
||||
protected function get_default_shipping_props() {
|
||||
return (object) array(
|
||||
'total' => 0,
|
||||
'total_tax' => 0,
|
||||
|
@ -231,7 +245,7 @@ class WC_Totals {
|
|||
* @param object $item Item to adjust the prices of.
|
||||
* @return object
|
||||
*/
|
||||
private function adjust_non_base_location_price( $item ) {
|
||||
protected function adjust_non_base_location_price( $item ) {
|
||||
$base_tax_rates = WC_Tax::get_base_tax_rates( $item->product->tax_class );
|
||||
$item_tax_rates = $this->get_item_tax_rates( $item );
|
||||
|
||||
|
@ -253,7 +267,7 @@ class WC_Totals {
|
|||
* @param object $item Item to get the price of.
|
||||
* @return int
|
||||
*/
|
||||
private function get_discounted_price_in_cents( $item ) {
|
||||
protected function get_discounted_price_in_cents( $item ) {
|
||||
return $item->price - $this->discount_totals[ $item->key ];
|
||||
}
|
||||
|
||||
|
@ -263,23 +277,11 @@ class WC_Totals {
|
|||
* @param object $item Item to get tax rates for.
|
||||
* @return array of taxes
|
||||
*/
|
||||
private function get_item_tax_rates( $item ) {
|
||||
protected function get_item_tax_rates( $item ) {
|
||||
$tax_class = $item->product->get_tax_class();
|
||||
return isset( $this->item_tax_rates[ $tax_class ] ) ? $this->item_tax_rates[ $tax_class ] : $this->item_tax_rates[ $tax_class ] = WC_Tax::get_rates( $item->product->get_tax_class() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Return array of coupon objects from the cart or an order.
|
||||
*
|
||||
* @since 3.2.0
|
||||
* @return array
|
||||
*/
|
||||
private function get_coupons() {
|
||||
if ( is_a( $this->object, 'WC_Cart' ) ) {
|
||||
return $this->object->get_coupons();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a single total with or without precision (in cents).
|
||||
*
|
||||
|
@ -300,7 +302,7 @@ class WC_Totals {
|
|||
* @param string $key Total name you want to set.
|
||||
* @param int $total Total to set.
|
||||
*/
|
||||
private function set_total( $key = 'total', $total ) {
|
||||
protected function set_total( $key = 'total', $total ) {
|
||||
$this->totals[ $key ] = $total;
|
||||
}
|
||||
|
||||
|
@ -321,7 +323,7 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @return array
|
||||
*/
|
||||
private function get_merged_taxes() {
|
||||
protected function get_merged_taxes() {
|
||||
$taxes = array();
|
||||
|
||||
foreach ( array_merge( $this->items, $this->fees, $this->shipping ) as $item ) {
|
||||
|
@ -355,15 +357,43 @@ class WC_Totals {
|
|||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
private function calculate() {
|
||||
$this->calculate_item_subtotals();
|
||||
$this->calculate_discounts();
|
||||
protected function calculate() {
|
||||
$this->calculate_item_totals();
|
||||
$this->calculate_fee_totals();
|
||||
$this->calculate_shipping_totals();
|
||||
$this->calculate_totals();
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate item totals.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function calculate_item_totals() {
|
||||
$this->set_items();
|
||||
$this->calculate_item_subtotals();
|
||||
$this->calculate_discounts();
|
||||
|
||||
foreach ( $this->items as $item ) {
|
||||
$item->total = $this->get_discounted_price_in_cents( $item );
|
||||
$item->total_tax = 0;
|
||||
|
||||
if ( wc_tax_enabled() && $item->product->is_taxable() ) {
|
||||
$item->taxes = WC_Tax::calc_tax( $item->total, $this->get_item_tax_rates( $item ), $item->price_includes_tax );
|
||||
$item->total_tax = array_sum( $item->taxes );
|
||||
|
||||
if ( $item->price_includes_tax ) {
|
||||
$item->total = $item->total - $item->total_tax;
|
||||
} else {
|
||||
$item->total = $item->total;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->set_total( 'items_total', array_sum( array_values( wp_list_pluck( $this->items, 'total' ) ) ) );
|
||||
$this->set_total( 'items_total_tax', array_sum( array_values( wp_list_pluck( $this->items, 'total_tax' ) ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Subtotals are costs before discounts.
|
||||
*
|
||||
|
@ -378,7 +408,7 @@ class WC_Totals {
|
|||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
private function calculate_item_subtotals() {
|
||||
protected function calculate_item_subtotals() {
|
||||
foreach ( $this->items as $item ) {
|
||||
if ( $item->price_includes_tax && apply_filters( 'woocommerce_adjust_non_base_location_prices', true ) ) {
|
||||
$item = $this->adjust_non_base_location_price( $item );
|
||||
|
@ -409,10 +439,12 @@ class WC_Totals {
|
|||
* @since 3.2.0
|
||||
* @uses WC_Discounts class.
|
||||
*/
|
||||
private function calculate_discounts() {
|
||||
protected function calculate_discounts() {
|
||||
$this->set_coupons();
|
||||
|
||||
$discounts = new WC_Discounts( $this->items );
|
||||
|
||||
foreach ( $this->get_coupons() as $coupon ) {
|
||||
foreach ( $this->coupons as $coupon ) {
|
||||
$discounts->apply_coupon( $coupon );
|
||||
}
|
||||
|
||||
|
@ -432,69 +464,17 @@ class WC_Totals {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Totals are costs after discounts. @todo move cart specific setters to subclass?
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
private function calculate_item_totals() {
|
||||
foreach ( $this->items as $item ) {
|
||||
$item->total = $this->get_discounted_price_in_cents( $item );
|
||||
$item->total_tax = 0;
|
||||
|
||||
if ( wc_tax_enabled() && $item->product->is_taxable() ) {
|
||||
$item->taxes = WC_Tax::calc_tax( $item->total, $this->get_item_tax_rates( $item ), $item->price_includes_tax );
|
||||
$item->total_tax = array_sum( $item->taxes );
|
||||
|
||||
if ( $item->price_includes_tax ) {
|
||||
$item->total = $item->total - $item->total_tax;
|
||||
} else {
|
||||
$item->total = $item->total;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->set_total( 'items_total', array_sum( array_values( wp_list_pluck( $this->items, 'total' ) ) ) );
|
||||
$this->set_total( 'items_total_tax', array_sum( array_values( wp_list_pluck( $this->items, 'total_tax' ) ) ) );
|
||||
|
||||
$this->object->subtotal = $this->get_total( 'items_total' ) + $this->get_total( 'items_total_tax' );
|
||||
$this->object->subtotal_ex_tax = $this->get_total( 'items_total' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the cart fees API, grabs the list of fees, and calculates taxes.
|
||||
*
|
||||
* Note: This class sets the totals for the 'object' as they are calculated. This is so that APIs like the fees API can see these totals if needed.
|
||||
*
|
||||
* @since 3.2.0
|
||||
* @todo logic is unqiue to carts.
|
||||
*/
|
||||
private function calculate_fee_totals() {
|
||||
$this->fees = array();
|
||||
$this->object->calculate_fees();
|
||||
|
||||
foreach ( $this->object->get_fees() as $fee_key => $fee_object ) {
|
||||
$fee = $this->get_default_fee_props();
|
||||
$fee->object = $fee_object;
|
||||
$fee->total = $this->add_precision( $fee->object->amount );
|
||||
|
||||
if ( wc_tax_enabled() && $fee->object->taxable ) {
|
||||
$fee->taxes = WC_Tax::calc_tax( $fee->total, WC_Tax::get_rates( $fee->object->tax_class ), false );
|
||||
$fee->total_tax = array_sum( $fee->taxes );
|
||||
}
|
||||
|
||||
$this->fees[ $fee_key ] = $fee;
|
||||
}
|
||||
|
||||
// Store totals to self.
|
||||
protected function calculate_fee_totals() {
|
||||
$this->set_fees();
|
||||
$this->set_total( 'fees_total', array_sum( wp_list_pluck( $this->fees, 'total' ) ) );
|
||||
$this->set_total( 'fees_total_tax', array_sum( wp_list_pluck( $this->fees, 'total_tax' ) ) );
|
||||
|
||||
// Transfer totals to the cart.
|
||||
foreach ( $this->fees as $fee_key => $fee ) {
|
||||
$this->object->fees[ $fee_key ]->tax = $this->remove_precision( $fee->total_tax );
|
||||
$this->object->fees[ $fee_key ]->tax_data = $this->remove_precision( $fee->taxes );
|
||||
}
|
||||
$this->object->fee_total = $this->remove_precision( array_sum( wp_list_pluck( $this->fees, 'total' ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -502,17 +482,8 @@ class WC_Totals {
|
|||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
private function calculate_shipping_totals() {
|
||||
$this->shipping = array();
|
||||
|
||||
foreach ( $this->object->calculate_shipping() as $key => $shipping_object ) {
|
||||
$shipping_line = $this->get_default_shipping_props();
|
||||
$shipping_line->total = $this->add_precision( $shipping_object->cost );
|
||||
$shipping_line->taxes = array_map( array( $this, 'add_precision' ), $shipping_object->taxes );
|
||||
$shipping_line->total_tax = array_sum( $shipping_object->taxes );
|
||||
$this->shipping[ $key ] = $shipping_line;
|
||||
}
|
||||
|
||||
protected function calculate_shipping_totals() {
|
||||
$this->set_shipping();
|
||||
$this->set_total( 'shipping_total', array_sum( wp_list_pluck( $this->shipping, 'total' ) ) );
|
||||
$this->set_total( 'shipping_tax_total', array_sum( wp_list_pluck( $this->shipping, 'total_tax' ) ) );
|
||||
}
|
||||
|
@ -522,15 +493,10 @@ class WC_Totals {
|
|||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
private function calculate_totals() {
|
||||
protected function calculate_totals() {
|
||||
$this->set_total( 'taxes', $this->get_merged_taxes() );
|
||||
$this->set_total( 'tax_total', array_sum( wp_list_pluck( $this->get_total( 'taxes', true ), 'tax_total' ) ) );
|
||||
$this->set_total( 'shipping_tax_total', array_sum( wp_list_pluck( $this->get_total( 'taxes', true ), 'shipping_tax_total' ) ) );
|
||||
$this->set_total( 'total', round( $this->get_total( 'items_total', true ) + $this->get_total( 'fees_total', true ) + $this->get_total( 'shipping_total', true ) + $this->get_total( 'tax_total', true ) + $this->get_total( 'shipping_tax_total', true ) ) );
|
||||
|
||||
$this->object->total = $this->get_total( 'total' );
|
||||
$this->object->tax_total = $this->get_total( 'tax_total' );
|
||||
$this->object->shipping_total = $this->get_total( 'shipping_total' );
|
||||
$this->object->shipping_tax_total = $this->get_total( 'shipping_tax_total' );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,168 @@
|
|||
<?php
|
||||
/**
|
||||
* Cart totals calculation class.
|
||||
*
|
||||
* Methods are protected and class is final to keep this as an internal API.
|
||||
* May be opened in the future once structure is stable.
|
||||
*
|
||||
* @author Automattic
|
||||
* @package WooCommerce/Classes
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC_Cart_Totals class.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
final class WC_Cart_Totals extends WC_Totals {
|
||||
|
||||
/**
|
||||
* Sets up the items provided, and calculate totals.
|
||||
*
|
||||
* @since 3.2.0
|
||||
* @param object $cart Cart or order object to calculate totals for.
|
||||
*/
|
||||
public function __construct( &$cart = null ) {
|
||||
parent::__construct( $cart );
|
||||
|
||||
if ( is_a( $cart, 'WC_Cart' ) ) {
|
||||
$this->calculate();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles a cart or order object passed in for calculation. Normalises data
|
||||
* into the same format for use by this class.
|
||||
*
|
||||
* Each item is made up of the following props, in addition to those returned by get_default_item_props() for totals.
|
||||
* - key: An identifier for the item (cart item key or line item ID).
|
||||
* - cart_item: For carts, the cart item from the cart which may include custom data.
|
||||
* - quantity: The qty for this line.
|
||||
* - price: The line price in cents.
|
||||
* - product: The product object this cart item is for.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function set_items() {
|
||||
foreach ( $this->object->get_cart() as $cart_item_key => $cart_item ) {
|
||||
$item = $this->get_default_item_props();
|
||||
$item->key = $cart_item_key;
|
||||
$item->cart_item = $cart_item;
|
||||
$item->quantity = $cart_item['quantity'];
|
||||
$item->price = $this->add_precision( $cart_item['data']->get_price() ) * $cart_item['quantity'];
|
||||
$item->product = $cart_item['data'];
|
||||
$this->items[ $cart_item_key ] = $item;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get fee objects from the cart. Normalises data
|
||||
* into the same format for use by this class.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function set_fees() {
|
||||
$this->fees = array();
|
||||
$this->object->calculate_fees();
|
||||
|
||||
foreach ( $this->object->get_fees() as $fee_key => $fee_object ) {
|
||||
$fee = $this->get_default_fee_props();
|
||||
$fee->object = $fee_object;
|
||||
$fee->total = $this->add_precision( $fee->object->amount );
|
||||
|
||||
if ( wc_tax_enabled() && $fee->object->taxable ) {
|
||||
$fee->taxes = WC_Tax::calc_tax( $fee->total, WC_Tax::get_rates( $fee->object->tax_class ), false );
|
||||
$fee->total_tax = array_sum( $fee->taxes );
|
||||
}
|
||||
|
||||
$this->fees[ $fee_key ] = $fee;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get shipping methods from the cart and normalise.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function set_shipping() {
|
||||
$this->shipping = array();
|
||||
|
||||
foreach ( $this->object->calculate_shipping() as $key => $shipping_object ) {
|
||||
$shipping_line = $this->get_default_shipping_props();
|
||||
$shipping_line->total = $this->add_precision( $shipping_object->cost );
|
||||
$shipping_line->taxes = array_map( array( $this, 'add_precision' ), $shipping_object->taxes );
|
||||
$shipping_line->total_tax = array_sum( $shipping_object->taxes );
|
||||
$this->shipping[ $key ] = $shipping_line;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return array of coupon objects from the cart. Normalises data
|
||||
* into the same format for use by this class.
|
||||
*
|
||||
* @since 3.2.0
|
||||
* @return array
|
||||
*/
|
||||
protected function set_coupons() {
|
||||
$this->coupons = $this->object->get_coupons();
|
||||
}
|
||||
|
||||
/**
|
||||
* Totals are costs after discounts.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function calculate_item_totals() {
|
||||
parent::calculate_item_totals();
|
||||
|
||||
$this->object->subtotal = $this->get_total( 'items_total' ) + $this->get_total( 'items_total_tax' );
|
||||
$this->object->subtotal_ex_tax = $this->get_total( 'items_total' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Triggers the cart fees API, grabs the list of fees, and calculates taxes.
|
||||
*
|
||||
* Note: This class sets the totals for the 'object' as they are calculated. This is so that APIs like the fees API can see these totals if needed.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function calculate_fee_totals() {
|
||||
parent::calculate_fee_totals();
|
||||
|
||||
foreach ( $this->fees as $fee_key => $fee ) {
|
||||
$this->object->fees[ $fee_key ]->tax = $this->remove_precision( $fee->total_tax );
|
||||
$this->object->fees[ $fee_key ]->tax_data = $this->remove_precision( $fee->taxes );
|
||||
}
|
||||
$this->object->fee_total = $this->remove_precision( array_sum( wp_list_pluck( $this->fees, 'total' ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate any shipping taxes.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function calculate_shipping_totals() {
|
||||
parent::calculate_shipping_totals();
|
||||
|
||||
$this->object->shipping_total = $this->get_total( 'shipping_total' );
|
||||
$this->object->shipping_tax_total = $this->get_total( 'shipping_tax_total' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Main cart totals.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
protected function calculate_totals() {
|
||||
parent::calculate_totals();
|
||||
|
||||
$this->object->total = $this->get_total( 'total' );
|
||||
$this->object->tax_total = $this->get_total( 'tax_total' );
|
||||
$this->object->shipping_total = $this->get_total( 'shipping_total' );
|
||||
$this->object->shipping_tax_total = $this->get_total( 'shipping_tax_total' );
|
||||
}
|
||||
}
|
|
@ -14,8 +14,6 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
|
||||
/**
|
||||
* Discounts class.
|
||||
*
|
||||
* @todo this class will need to be called instead get_discounted_price, in the cart?
|
||||
*/
|
||||
class WC_Discounts {
|
||||
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
<?php
|
||||
/**
|
||||
* Order totals calculation class.
|
||||
*
|
||||
* Methods are protected and class is final to keep this as an internal API.
|
||||
* May be opened in the future once structure is stable.
|
||||
*
|
||||
* @author Automattic
|
||||
* @package WooCommerce/Classes
|
||||
*/
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC_Order_Totals class. @todo this class needs writing.
|
||||
*
|
||||
* @since 3.2.0
|
||||
*/
|
||||
final class WC_Order_Totals extends WC_Totals {}
|
|
@ -303,6 +303,7 @@ final class WooCommerce {
|
|||
include_once( WC_ABSPATH . 'includes/abstracts/abstract-wc-log-handler.php' );
|
||||
include_once( WC_ABSPATH . 'includes/abstracts/abstract-wc-deprecated-hooks.php' );
|
||||
include_once( WC_ABSPATH . 'includes/abstracts/abstract-wc-session.php' );
|
||||
include_once( WC_ABSPATH . 'includes/abstracts/abstract-wc-totals.php' );
|
||||
|
||||
/**
|
||||
* Core classes.
|
||||
|
@ -334,7 +335,8 @@ final class WooCommerce {
|
|||
include_once( WC_ABSPATH . 'includes/class-wc-deprecated-filter-hooks.php' );
|
||||
include_once( WC_ABSPATH . 'includes/class-wc-background-emailer.php' );
|
||||
include_once( WC_ABSPATH . 'includes/class-wc-discounts.php' );
|
||||
include_once( WC_ABSPATH . 'includes/class-wc-totals.php' );
|
||||
include_once( WC_ABSPATH . 'includes/class-wc-cart-totals.php' );
|
||||
include_once( WC_ABSPATH . 'includes/class-wc-order-totals.php' );
|
||||
|
||||
/**
|
||||
* Data stores - used to store and retrieve CRUD object data from the database.
|
||||
|
|
|
@ -67,7 +67,7 @@ class WC_Tests_Totals extends WC_Unit_Test_Case {
|
|||
|
||||
add_action( 'woocommerce_cart_calculate_fees', array( $this, 'add_cart_fees_callback' ) );
|
||||
|
||||
$this->totals = new WC_Totals( WC()->cart );
|
||||
$this->totals = new WC_Cart_Totals( WC()->cart );
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue