2011-08-09 15:16:18 +00:00
< ? php
/**
2011-08-10 17:11:11 +00:00
* WooCommerce cart
2011-08-09 15:16:18 +00:00
*
2011-08-10 17:11:11 +00:00
* The WooCommerce cart class stores cart data and active coupons as well as handling customer sessions and some cart related urls .
2011-08-09 15:16:18 +00:00
* The cart class also has a price calculation function which calls upon other classes to calcualte totals .
*
2011-08-10 17:11:11 +00:00
* @ class woocommerce_cart
* @ package WooCommerce
* @ category Class
* @ author WooThemes
2011-08-09 15:16:18 +00:00
*/
2011-08-10 17:11:11 +00:00
class woocommerce_cart {
2011-08-09 15:16:18 +00:00
2011-11-06 13:45:18 +00:00
/* Public Variables */
var $cart_contents ;
var $applied_coupons ;
2011-09-06 11:11:22 +00:00
var $cart_contents_total ;
var $cart_contents_weight ;
var $cart_contents_count ;
var $cart_contents_tax ;
2011-11-06 13:45:18 +00:00
2011-09-06 11:11:22 +00:00
var $total ;
var $subtotal ;
var $subtotal_ex_tax ;
var $tax_total ;
2011-11-25 19:31:06 +00:00
var $discount_cart ;
2011-09-06 11:11:22 +00:00
var $discount_total ;
var $shipping_total ;
var $shipping_tax_total ;
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
/* Private variables */
var $tax ;
2011-11-06 13:45:18 +00:00
/**
* Constructor
*/
2011-08-09 15:16:18 +00:00
function __construct () {
2011-11-19 20:59:16 +00:00
$this -> tax = & new woocommerce_tax ();
2011-11-22 13:18:33 +00:00
$this -> prices_include_tax = ( get_option ( 'woocommerce_prices_include_tax' ) == 'yes' ) ? true : false ;
2011-11-22 17:00:47 +00:00
$this -> display_totals_ex_tax = ( get_option ( 'woocommerce_display_totals_excluding_tax' ) == 'yes' ) ? true : false ;
2011-11-19 20:59:16 +00:00
2011-11-02 20:32:35 +00:00
add_action ( 'init' , array ( & $this , 'init' ), 1 ); // Get cart on init
add_action ( 'wp' , array ( & $this , 'calculate_totals' ), 1 ); // Defer calculate totals so we can detect page
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* Loads the cart data from the session during WordPress init
*/
function init () {
2011-09-06 11:11:22 +00:00
$this -> applied_coupons = array ();
$this -> get_cart_from_session ();
if ( isset ( $_SESSION [ 'coupons' ]) ) $this -> applied_coupons = $_SESSION [ 'coupons' ];
2011-11-09 17:26:45 +00:00
add_action ( 'woocommerce_check_cart_items' , array ( & $this , 'check_cart_items' ), 1 );
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* Get the cart data from the PHP session
*/
2011-08-09 15:16:18 +00:00
function get_cart_from_session () {
2011-11-06 13:45:18 +00:00
if ( isset ( $_SESSION [ 'cart' ]) && is_array ( $_SESSION [ 'cart' ])) :
2011-08-09 15:16:18 +00:00
$cart = $_SESSION [ 'cart' ];
2011-11-06 13:45:18 +00:00
foreach ( $cart as $key => $values ) :
2011-08-09 15:16:18 +00:00
2011-11-06 13:45:18 +00:00
if ( $values [ 'variation_id' ] > 0 ) :
2011-08-10 17:11:11 +00:00
$_product = & new woocommerce_product_variation ( $values [ 'variation_id' ]);
2011-08-09 15:16:18 +00:00
else :
2011-08-10 17:11:11 +00:00
$_product = & new woocommerce_product ( $values [ 'product_id' ]);
2011-08-09 15:16:18 +00:00
endif ;
2011-08-22 12:26:17 +00:00
if ( $_product -> exists && $values [ 'quantity' ] > 0 ) :
2011-11-06 13:45:18 +00:00
// Put session data into array. Run through filter so other plugins can load their own session data
$this -> cart_contents [ $key ] = apply_filters ( 'woocommerce_get_cart_item_from_session' , array (
2011-08-09 15:16:18 +00:00
'product_id' => $values [ 'product_id' ],
'variation_id' => $values [ 'variation_id' ],
'variation' => $values [ 'variation' ],
'quantity' => $values [ 'quantity' ],
'data' => $_product
2011-11-06 13:45:18 +00:00
), $values );
2011-08-09 15:16:18 +00:00
endif ;
endforeach ;
else :
2011-09-06 11:11:22 +00:00
$this -> cart_contents = array ();
2011-08-09 15:16:18 +00:00
endif ;
2011-09-06 11:11:22 +00:00
if ( ! is_array ( $this -> cart_contents )) $this -> cart_contents = array ();
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* Sets the php session data for the cart and coupons
*/
2011-08-09 15:16:18 +00:00
function set_session () {
2011-10-31 15:00:06 +00:00
// Set cart and coupon session data
$_SESSION [ 'cart' ] = $this -> cart_contents ;
2011-09-06 11:11:22 +00:00
$_SESSION [ 'coupons' ] = $this -> applied_coupons ;
2011-10-31 15:00:06 +00:00
// Cart contents change so reset shipping
unset ( $_SESSION [ '_chosen_shipping_method' ]);
// Calculate totals
2011-09-06 11:11:22 +00:00
$this -> calculate_totals ();
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* Empty the cart data and destroy the session
*/
2011-08-09 15:16:18 +00:00
function empty_cart () {
2011-11-01 13:11:07 +00:00
$this -> cart_contents = array ();
2011-11-19 20:59:16 +00:00
$this -> reset_totals ();
2011-08-09 15:16:18 +00:00
unset ( $_SESSION [ 'cart' ]);
unset ( $_SESSION [ 'coupons' ]);
}
2011-08-22 11:57:50 +00:00
/**
* Check if product is in the cart and return cart item key
*
2011-11-06 13:45:18 +00:00
* Cart item key will be unique based on the item and its properties , such as variations
2011-08-22 11:57:50 +00:00
*/
2011-11-06 13:45:18 +00:00
function find_product_in_cart ( $cart_id = false ) {
if ( $cart_id !== false ) foreach ( $this -> cart_contents as $cart_item_key => $cart_item ) if ( $cart_item_key == $cart_id ) return $cart_item_key ;
}
/**
* Generate a unique ID for the cart item being added
*/
function generate_cart_id ( $product_id , $variation_id = '' , $variation = '' , $cart_item_data = '' ) {
2011-08-22 11:57:50 +00:00
2011-11-06 13:45:18 +00:00
$id_parts = array ( $product_id );
2011-08-22 11:57:50 +00:00
2011-11-06 13:45:18 +00:00
if ( $variation_id ) $id_parts [] = $variation_id ;
if ( is_array ( $variation )) :
$variation_key = '' ;
foreach ( $variation as $key => $value ) :
$variation_key .= trim ( $key ) . trim ( $value );
endforeach ;
$id_parts [] = $variation_key ;
endif ;
2011-08-22 11:57:50 +00:00
2011-11-06 13:45:18 +00:00
if ( is_array ( $cart_item_data )) :
$cart_item_data_key = '' ;
foreach ( $cart_item_data as $key => $value ) :
if ( is_array ( $value )) $value = http_build_query ( $value );
$cart_item_data_key .= trim ( $key ) . trim ( $value );
endforeach ;
$id_parts [] = $cart_item_data_key ;
endif ;
return md5 ( implode ( '_' , $id_parts ) );
}
2011-08-09 15:16:18 +00:00
/**
* Add a product to the cart
*
* @ param string product_id contains the id of the product to add to the cart
* @ param string quantity contains the quantity of the item to add
2011-08-22 12:02:45 +00:00
* @ param int variation_id
* @ param array variation attribute values
2011-08-09 15:16:18 +00:00
*/
2011-11-06 13:45:18 +00:00
function add_to_cart ( $product_id , $quantity = 1 , $variation_id = '' , $variation = '' ) {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
2011-08-09 15:16:18 +00:00
2011-11-06 13:45:18 +00:00
if ( $quantity < 1 ) return false ;
2011-08-22 12:02:45 +00:00
2011-11-06 13:45:18 +00:00
// Load cart item data - may be added by other plugins
$cart_item_data = ( array ) apply_filters ( 'woocommerce_add_cart_item_data' , array (), $product_id );
// Generate a ID based on product ID, variation ID, variation data, and other cart item data
$cart_id = $this -> generate_cart_id ( $product_id , $variation_id , $variation , $cart_item_data );
// See if this product and its options is already in the cart
$cart_item_key = $this -> find_product_in_cart ( $cart_id );
2011-08-09 15:16:18 +00:00
2011-08-30 11:24:28 +00:00
if ( $variation_id > 0 ) :
$product_data = & new woocommerce_product_variation ( $variation_id );
else :
$product_data = & new woocommerce_product ( $product_id );
endif ;
2011-08-27 20:07:16 +00:00
2011-11-19 20:59:16 +00:00
// Type/Exists check
if ( $product_data -> is_type ( 'external' ) || ! $product_data -> exists () ) :
2011-11-09 12:17:05 +00:00
$woocommerce -> add_error ( __ ( 'This product cannot be purchased.' , 'woothemes' ) );
return false ;
endif ;
2011-08-27 20:07:16 +00:00
// Price set check
2011-08-30 11:24:28 +00:00
if ( $product_data -> get_price () === '' ) :
2011-11-09 12:17:05 +00:00
$woocommerce -> add_error ( __ ( 'This product cannot be purchased - the price is not yet set.' , 'woothemes' ) );
2011-08-27 20:07:16 +00:00
return false ;
2011-08-30 11:24:28 +00:00
endif ;
2011-11-06 13:45:18 +00:00
2011-08-30 11:24:28 +00:00
// Stock check - only check if we're managing stock and backorders are not allowed
if ( ! $product_data -> has_enough_stock ( $quantity ) ) :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( sprintf ( __ ( 'You cannot add that amount to the cart since there is not enough stock. We have %s in stock.' , 'woothemes' ), $product_data -> get_stock_quantity () ));
2011-08-30 11:24:28 +00:00
return false ;
elseif ( ! $product_data -> is_in_stock () ) :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'You cannot add that product to the cart since the product is out of stock.' , 'woothemes' ) );
2011-08-30 11:24:28 +00:00
return false ;
endif ;
2011-11-06 13:45:18 +00:00
if ( $cart_item_key ) :
2011-08-30 11:24:28 +00:00
2011-11-06 13:45:18 +00:00
$quantity = $quantity + $this -> cart_contents [ $cart_item_key ][ 'quantity' ];
2011-08-09 15:16:18 +00:00
2011-08-30 11:24:28 +00:00
// Stock check - this time accounting for whats already in-cart
if ( ! $product_data -> has_enough_stock ( $quantity ) ) :
2011-11-06 13:45:18 +00:00
$woocommerce -> add_error ( sprintf ( __ ( 'You cannot add that amount to the cart since there is not enough stock. We have %s in stock and you already have %s in your cart.' , 'woothemes' ), $product_data -> get_stock_quantity (), $this -> cart_contents [ $cart_item_key ][ 'quantity' ] ));
2011-08-30 11:24:28 +00:00
return false ;
elseif ( ! $product_data -> is_in_stock () ) :
2011-09-06 11:11:22 +00:00
$woocommerce -> add_error ( __ ( 'You cannot add that product to the cart since the product is out of stock.' , 'woothemes' ) );
2011-08-30 11:24:28 +00:00
return false ;
endif ;
2011-11-06 13:45:18 +00:00
$this -> cart_contents [ $cart_item_key ][ 'quantity' ] = $quantity ;
2011-08-09 15:16:18 +00:00
else :
2011-11-06 13:45:18 +00:00
// Add item after merging with $cart_item_data - hook to allow plugins to modify cart item
$this -> cart_contents [ $cart_id ] = apply_filters ( 'woocommerce_add_cart_item' , array_merge ( $cart_item_data , array (
2011-08-09 15:16:18 +00:00
'product_id' => $product_id ,
'variation_id' => $variation_id ,
'variation' => $variation ,
'quantity' => $quantity ,
2011-08-27 20:07:16 +00:00
'data' => $product_data
2011-11-06 13:45:18 +00:00
)));
2011-08-09 15:16:18 +00:00
2011-11-06 13:45:18 +00:00
endif ;
2011-09-06 11:11:22 +00:00
$this -> set_session ();
2011-08-30 11:24:28 +00:00
return true ;
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* Applies a coupon code
*
* @ param string code The code to apply
* @ return bool True if the coupon is applied , false if it does not exist or cannot be applied
*/
function add_discount ( $coupon_code ) {
global $woocommerce ;
$the_coupon = & new woocommerce_coupon ( $coupon_code );
if ( $the_coupon -> id ) :
// Check if applied
if ( $woocommerce -> cart -> has_discount ( $coupon_code )) :
$woocommerce -> add_error ( __ ( 'Discount code already applied!' , 'woothemes' ) );
return false ;
endif ;
// Check it can be used with cart
if ( ! $the_coupon -> is_valid ()) :
$woocommerce -> add_error ( __ ( 'Invalid coupon.' , 'woothemes' ) );
return false ;
endif ;
// If its individual use then remove other coupons
if ( $the_coupon -> individual_use == 'yes' ) :
$this -> applied_coupons = array ();
endif ;
foreach ( $this -> applied_coupons as $code ) :
$coupon = & new woocommerce_coupon ( $code );
if ( $coupon -> individual_use == 'yes' ) :
$this -> applied_coupons = array ();
endif ;
endforeach ;
$this -> applied_coupons [] = $coupon_code ;
$this -> set_session ();
$woocommerce -> add_message ( __ ( 'Discount code applied successfully.' , 'woothemes' ) );
return true ;
else :
$woocommerce -> add_error ( __ ( 'Coupon does not exist!' , 'woothemes' ) );
return false ;
endif ;
return false ;
}
2011-08-09 15:16:18 +00:00
/**
* Set the quantity for an item in the cart
*
* @ param string cart_item_key contains the id of the cart item
* @ param string quantity contains the quantity of the item
*/
2011-11-06 13:45:18 +00:00
function set_quantity ( $cart_item_key , $quantity = 1 ) {
2011-08-09 15:16:18 +00:00
if ( $quantity == 0 || $quantity < 0 ) :
2011-11-06 13:45:18 +00:00
unset ( $this -> cart_contents [ $cart_item_key ]);
2011-08-09 15:16:18 +00:00
else :
2011-11-06 13:45:18 +00:00
$this -> cart_contents [ $cart_item_key ][ 'quantity' ] = $quantity ;
2011-08-09 15:16:18 +00:00
endif ;
2011-09-06 11:11:22 +00:00
$this -> set_session ();
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
2011-11-19 20:59:16 +00:00
* Reset totals
2011-08-09 15:16:18 +00:00
*/
2011-11-19 20:59:16 +00:00
private function reset_totals () {
2011-09-06 11:11:22 +00:00
$this -> total = 0 ;
$this -> cart_contents_total = 0 ;
$this -> cart_contents_weight = 0 ;
$this -> cart_contents_count = 0 ;
$this -> cart_contents_tax = 0 ;
$this -> tax_total = 0 ;
$this -> shipping_tax_total = 0 ;
$this -> subtotal = 0 ;
$this -> subtotal_ex_tax = 0 ;
$this -> discount_total = 0 ;
2011-11-25 19:31:06 +00:00
$this -> discount_cart = 0 ;
2011-09-06 11:11:22 +00:00
$this -> shipping_total = 0 ;
2011-11-19 20:59:16 +00:00
}
/**
* Function to apply discounts to a product and get the discounted price ( before tax is applied )
*/
2011-11-25 19:31:06 +00:00
function get_discounted_price ( $values , $price , $add_totals = false ) {
2011-11-23 23:19:23 +00:00
2011-11-19 20:59:16 +00:00
if ( $this -> applied_coupons ) foreach ( $this -> applied_coupons as $code ) :
$coupon = & new woocommerce_coupon ( $code );
2011-11-06 13:45:18 +00:00
2011-11-19 20:59:16 +00:00
if ( $coupon -> apply_before_tax () && $coupon -> is_valid () ) :
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
switch ( $coupon -> type ) :
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
case " fixed_product " :
case " percent_product " :
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
$this_item_is_discounted = false ;
// Specific product ID's get the discount
if ( sizeof ( $coupon -> product_ids ) > 0 ) :
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
if (( in_array ( $values [ 'product_id' ], $coupon -> product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> product_ids ))) :
$this_item_is_discounted = true ;
endif ;
else :
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
// No product ids - all items discounted
$this_item_is_discounted = true ;
endif ;
// Specific product ID's excluded from the discount
if ( sizeof ( $coupon -> exclude_product_ids ) > 0 ) :
2011-10-08 10:39:26 +00:00
2011-11-19 20:59:16 +00:00
if (( in_array ( $values [ 'product_id' ], $coupon -> exclude_product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> exclude_product_ids ))) :
$this_item_is_discounted = false ;
endif ;
2011-10-08 10:39:26 +00:00
2011-11-19 20:59:16 +00:00
endif ;
// Apply filter
$this_item_is_discounted = apply_filters ( 'woocommerce_item_is_discounted' , $this_item_is_discounted , $values , $before_tax = true );
// Apply the discount
if ( $this_item_is_discounted ) :
if ( $coupon -> type == 'fixed_product' ) :
2011-11-23 23:19:23 +00:00
if ( $price < $coupon -> amount ) :
$discount_amount = $price ;
else :
$discount_amount = $coupon -> amount ;
endif ;
2011-11-19 20:59:16 +00:00
$price = $price - $coupon -> amount ;
2011-11-23 23:19:23 +00:00
if ( $price < 0 ) $price = 0 ;
2011-11-25 19:31:06 +00:00
if ( $add_totals ) :
$this -> discount_cart = $this -> discount_cart + ( $discount_amount * $values [ 'quantity' ] );
endif ;
2011-11-23 23:19:23 +00:00
2011-11-19 20:59:16 +00:00
elseif ( $coupon -> type == 'percent_product' ) :
2011-10-08 10:39:26 +00:00
2011-11-21 16:44:33 +00:00
$percent_discount = ( $values [ 'data' ] -> get_price_excluding_tax ( false ) / 100 ) * $coupon -> amount ;
2011-11-19 20:59:16 +00:00
2011-11-25 19:31:06 +00:00
if ( $add_totals ) $this -> discount_cart = $this -> discount_cart + ( $percent_discount * $values [ 'quantity' ] );
2011-11-19 20:59:16 +00:00
$price = $price - $percent_discount ;
endif ;
2011-08-09 15:16:18 +00:00
endif ;
2011-11-19 20:59:16 +00:00
break ;
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
case " fixed_cart " :
2011-11-23 23:19:23 +00:00
/**
* This is the most complex discount - we need to divide the discount between rows based on their price in
* proportion to the subtotal . This is so rows with different tax rates get a fair discount , and so rows
* with no price ( free ) don ' t get discount too .
*/
// Get item discount by dividing item cost by subtotal to get a %
$discount_percent = ( $values [ 'data' ] -> get_price_excluding_tax ( false ) * $values [ 'quantity' ]) / $this -> subtotal_ex_tax ;
2011-11-19 20:59:16 +00:00
// Use pence to help prevent rounding errors
$coupon_amount_pence = $coupon -> amount * 100 ;
2011-11-23 23:19:23 +00:00
// Work out the discount for the row
$item_discount = $coupon_amount_pence * $discount_percent ;
// Work out discount per item
$item_discount = $item_discount / $values [ 'quantity' ];
// Pence
$price = ( $price * 100 );
// Check if discount is more than price
if ( $price < $item_discount ) :
$discount_amount = $price ;
else :
$discount_amount = $item_discount ;
endif ;
2011-11-19 20:59:16 +00:00
// Take discount off of price (in pence)
2011-11-23 23:19:23 +00:00
$price = $price - $discount_amount ;
2011-11-19 20:59:16 +00:00
// Back to pounds
$price = $price / 100 ;
2011-11-23 23:19:23 +00:00
// Cannot be below 0
if ( $price < 0 ) $price = 0 ;
2011-11-19 20:59:16 +00:00
// Add coupon to discount total (once, since this is a fixed cart discount and we don't want rounding issues)
2011-11-25 19:31:06 +00:00
if ( $add_totals ) $this -> discount_cart = $this -> discount_cart + (( $discount_amount * $values [ 'quantity' ]) / 100 );
2011-11-23 23:40:48 +00:00
2011-11-19 20:59:16 +00:00
break ;
2011-11-01 16:25:54 +00:00
2011-11-19 20:59:16 +00:00
case " percent " :
2011-11-15 22:20:59 +00:00
2011-11-19 20:59:16 +00:00
// Get % off each item - this works out the same as doing the whole cart
2011-11-21 16:44:33 +00:00
$percent_discount = ( $values [ 'data' ] -> get_price_excluding_tax ( false ) / 100 ) * $coupon -> amount ;
2011-11-19 20:59:16 +00:00
2011-11-25 19:31:06 +00:00
if ( $add_totals ) $this -> discount_cart = $this -> discount_cart + ( $percent_discount * $values [ 'quantity' ] );
2011-11-19 20:59:16 +00:00
$price = $price - $percent_discount ;
break ;
2011-11-01 16:25:54 +00:00
2011-11-19 20:59:16 +00:00
endswitch ;
endif ;
endforeach ;
2011-11-21 16:44:33 +00:00
return apply_filters ( 'woocommerce_get_discounted_price_' , $price , $values , $this );
2011-11-19 20:59:16 +00:00
}
/**
* Function to apply product discounts after tax
*/
2011-11-20 00:55:23 +00:00
function apply_product_discounts_after_tax ( $values , $price ) {
2011-11-19 20:59:16 +00:00
if ( $this -> applied_coupons ) foreach ( $this -> applied_coupons as $code ) :
$coupon = & new woocommerce_coupon ( $code );
2011-11-21 16:44:33 +00:00
do_action ( 'woocommerce_product_discount_after_tax_' . $coupon -> type , $coupon );
2011-11-19 20:59:16 +00:00
if ( $coupon -> type != 'fixed_product' && $coupon -> type != 'percent_product' ) continue ;
if ( ! $coupon -> apply_before_tax () && $coupon -> is_valid () ) :
2011-11-20 00:55:23 +00:00
$this_item_is_discounted = false ;
// Specific product ID's get the discount
if ( sizeof ( $coupon -> product_ids ) > 0 ) :
2011-11-01 16:25:54 +00:00
2011-11-20 00:55:23 +00:00
if (( in_array ( $values [ 'product_id' ], $coupon -> product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> product_ids ))) :
2011-11-01 16:25:54 +00:00
$this_item_is_discounted = true ;
endif ;
2011-11-20 00:55:23 +00:00
else :
2011-11-01 16:25:54 +00:00
2011-11-20 00:55:23 +00:00
// No product ids - all items discounted
$this_item_is_discounted = true ;
endif ;
// Specific product ID's excluded from the discount
if ( sizeof ( $coupon -> exclude_product_ids ) > 0 ) :
2011-11-01 16:25:54 +00:00
2011-11-20 00:55:23 +00:00
if (( in_array ( $values [ 'product_id' ], $coupon -> exclude_product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> exclude_product_ids ))) :
$this_item_is_discounted = false ;
2011-08-09 15:16:18 +00:00
endif ;
2011-11-20 00:55:23 +00:00
endif ;
2011-11-19 20:59:16 +00:00
2011-11-20 00:55:23 +00:00
// Apply filter
$this_item_is_discounted = apply_filters ( 'woocommerce_item_is_discounted' , $this_item_is_discounted , $values , $before_tax = false );
// Apply the discount
if ( $this_item_is_discounted ) :
if ( $coupon -> type == 'fixed_product' ) :
2011-11-23 23:19:23 +00:00
if ( $price < $coupon -> amount ) :
$discount_amount = $price ;
else :
$discount_amount = $coupon -> amount ;
endif ;
$this -> discount_total = $this -> discount_total + ( $discount_amount * $values [ 'quantity' ] );
2011-11-20 00:55:23 +00:00
elseif ( $coupon -> type == 'percent_product' ) :
$this -> discount_total = $this -> discount_total + ( $price / 100 ) * $coupon -> amount ;
endif ;
endif ;
2011-08-09 15:16:18 +00:00
endif ;
2011-11-19 20:59:16 +00:00
endforeach ;
}
/**
* Function to apply cart discounts after tax
*/
function apply_cart_discounts_after_tax () {
2011-11-02 20:32:35 +00:00
2011-09-06 11:11:22 +00:00
if ( $this -> applied_coupons ) foreach ( $this -> applied_coupons as $code ) :
$coupon = & new woocommerce_coupon ( $code );
2011-11-19 20:59:16 +00:00
2011-11-21 16:44:33 +00:00
do_action ( 'woocommerce_cart_discount_after_tax_' . $coupon -> type , $coupon );
2011-11-19 20:59:16 +00:00
if ( ! $coupon -> apply_before_tax () && $coupon -> is_valid () ) :
2011-10-28 15:04:39 +00:00
2011-11-19 20:59:16 +00:00
switch ( $coupon -> type ) :
case " fixed_cart " :
2011-10-28 15:04:39 +00:00
2011-11-19 20:59:16 +00:00
$this -> discount_total = $this -> discount_total + $coupon -> amount ;
break ;
2011-10-28 15:04:39 +00:00
2011-11-19 20:59:16 +00:00
case " percent " :
2011-11-21 17:11:44 +00:00
$percent_discount = ( round ( $this -> cart_contents_total + $this -> tax_total , 2 ) / 100 ) * $coupon -> amount ;
2011-11-19 20:59:16 +00:00
$this -> discount_total = $this -> discount_total + $percent_discount ;
break ;
endswitch ;
2011-11-21 16:44:33 +00:00
2011-08-09 15:16:18 +00:00
endif ;
endforeach ;
2011-11-19 20:59:16 +00:00
}
/**
* calculate totals for the items in the cart
*/
function calculate_totals () {
global $woocommerce ;
$this -> reset_totals ();
2011-11-23 23:19:23 +00:00
// Get count of all items + weights + subtotal (we may need this for discounts)
2011-11-19 20:59:16 +00:00
if ( sizeof ( $this -> cart_contents ) > 0 ) foreach ( $this -> cart_contents as $cart_item_key => $values ) :
2011-11-23 23:19:23 +00:00
$_product = $values [ 'data' ];
$this -> cart_contents_weight = $this -> cart_contents_weight + ( $_product -> get_weight () * $values [ 'quantity' ]);
2011-11-21 11:33:46 +00:00
$this -> cart_contents_count = $this -> cart_contents_count + $values [ 'quantity' ];
2011-11-23 23:19:23 +00:00
// Base Price (inlusive of tax for now)
$base_price = $_product -> get_price ();
$tax_amount = 0 ;
if ( $this -> prices_include_tax ) :
if ( get_option ( 'woocommerce_calc_taxes' ) == 'yes' && $_product -> is_taxable () ) :
$tax_rate = $this -> tax -> get_shop_base_rate ( $_product -> get_tax_class () );
$tax_amount = $this -> tax -> calc_tax ( $base_price * $values [ 'quantity' ], $tax_rate , true );
// Rounding
if ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'no' ) :
$tax_amount = round ( $tax_amount , 2 );
endif ;
endif ;
// Sub total is based on base prices (without discounts)
$this -> subtotal = $this -> subtotal + ( $base_price * $values [ 'quantity' ] );
$this -> subtotal_ex_tax = $this -> subtotal_ex_tax + ( $base_price * $values [ 'quantity' ] ) - round ( $tax_amount , 2 );
else :
if ( get_option ( 'woocommerce_calc_taxes' ) == 'yes' && $_product -> is_taxable () ) :
$tax_rate = $this -> tax -> get_rate ( $_product -> get_tax_class () );
$tax_amount = $this -> tax -> calc_tax ( $base_price * $values [ 'quantity' ], $tax_rate , false );
// Rounding
if ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'no' ) :
$tax_amount = round ( $tax_amount , 2 );
endif ;
endif ;
// Sub total is based on base prices (without discounts)
$this -> subtotal = $this -> subtotal + ( $base_price * $values [ 'quantity' ] ) + $tax_amount ;
$this -> subtotal_ex_tax = $this -> subtotal_ex_tax + ( $base_price * $values [ 'quantity' ]);
endif ;
2011-11-21 11:33:46 +00:00
endforeach ;
2011-11-23 23:19:23 +00:00
// Now calc the main totals, including discounts
2011-11-22 13:18:33 +00:00
if ( $this -> prices_include_tax ) :
2011-11-21 11:33:46 +00:00
/**
* Calculate totals for items
*/
if ( sizeof ( $this -> cart_contents ) > 0 ) : foreach ( $this -> cart_contents as $cart_item_key => $values ) :
2011-11-19 20:59:16 +00:00
2011-11-21 11:33:46 +00:00
/**
* Prices include tax
*
* To prevent rounding issues we need to work with the inclusive price where possible
* otherwise we ' ll see errors such as when working with a 9.99 inc price , 20 % VAT which would
* be 8.325 leading to totals being 1 p off
*
* Pre tax coupons come off the price the customer thinks they are paying - tax is calculated
* afterwards .
*
* e . g . $ 100 bike with $ 10 coupon = customer pays $ 90 and tax worked backwards from that
*
* Used this excellent article for reference :
* http :// developer . practicalecommerce . com / articles / 1473 - Coding - for - Tax - Calculations - Everything - You - Never - Wanted - to - Know - Part - 2
*/
$_product = $values [ 'data' ];
// Base Price (inlusive of tax for now)
2011-11-21 16:26:06 +00:00
$base_price = $_product -> get_price ();
2011-11-21 11:33:46 +00:00
// Base Price Adjustment
if ( get_option ( 'woocommerce_calc_taxes' ) == 'yes' && $_product -> is_taxable () ) :
2011-11-21 16:26:06 +00:00
// Get tax rate for base - we will handle customer's outside base later
$tax_rate = $this -> tax -> get_shop_base_rate ( $_product -> get_tax_class () );
/**
* ADJUST TAX - Checkout calculations when customer is OUTSIDE the shop base country and prices INCLUDE tax
2011-11-21 11:33:46 +00:00
*/
if ( $woocommerce -> customer -> is_customer_outside_base () && defined ( 'WOOCOMMERCE_CHECKOUT' ) && WOOCOMMERCE_CHECKOUT ) :
2011-11-21 16:26:06 +00:00
// Get rate
$rate = $this -> tax -> get_rate ( $_product -> get_tax_class () );
2011-11-21 11:33:46 +00:00
2011-11-22 13:18:33 +00:00
// Work out new price based on region
2011-11-25 22:13:01 +00:00
$adjusted_price = ( $base_price / ( 1 + ( $tax_rate / 100 ) ) ) * ( 1 + ( $rate / 100 ) );
// Apply discounts
$discounted_price = $this -> get_discounted_price ( $values , $adjusted_price , true );
2011-11-21 11:33:46 +00:00
2011-11-21 16:26:06 +00:00
$discounted_tax_amount = $this -> tax -> calc_tax ( $discounted_price * $values [ 'quantity' ], $rate , true );
2011-11-25 22:13:01 +00:00
//$discounted_price = ( $discounted_price / ( 1 + ( $tax_rate / 100 ) ) ) * ( 1 + ( $rate / 100 ) );
//$discounted_tax_amount = $this->tax->calc_tax( $discounted_price * $values['quantity'], $rate, true );
2011-11-21 16:26:06 +00:00
2011-11-21 11:33:46 +00:00
/**
2011-11-21 16:26:06 +00:00
* ADJUST TAX - Checkout calculations when a tax class is modified
2011-11-21 11:33:46 +00:00
*/
elseif ( $_product -> get_tax_class () !== $_product -> tax_class ) :
2011-11-22 13:18:33 +00:00
// Get rate
$rate = $this -> tax -> get_rate ( $_product -> tax_class );
2011-11-21 11:33:46 +00:00
2011-11-25 22:13:01 +00:00
// Work out new price based on tax class
$adjusted_price = ( $base_price / ( 1 + ( $tax_rate / 100 ) ) ) * ( 1 + ( $rate / 100 ) );
2011-11-21 11:33:46 +00:00
2011-11-25 22:13:01 +00:00
// Apply discounts
$discounted_price = $this -> get_discounted_price ( $values , $adjusted_price , true );
2011-11-22 13:18:33 +00:00
$discounted_tax_amount = $this -> tax -> calc_tax ( $discounted_price * $values [ 'quantity' ], $rate , true );
2011-11-25 22:13:01 +00:00
//$discounted_price = ( $discounted_price / ( 1 + ( $tax_rate / 100 ) ) ) * ( 1 + ( $rate / 100 ) );
//$discounted_tax_amount = $this->tax->calc_tax( $discounted_price * $values['quantity'], $rate, true );
/**
* Regular tax calculation ( customer inside base and the tax class is unmodified
*/
else :
$discounted_price = $this -> get_discounted_price ( $values , $base_price , true );
$discounted_tax_amount = $this -> tax -> calc_tax ( $discounted_price * $values [ 'quantity' ], $tax_rate , true );
2011-11-21 11:33:46 +00:00
endif ;
// Rounding
if ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'no' ) :
$discounted_tax_amount = round ( $discounted_tax_amount , 2 );
endif ;
2011-11-21 16:26:06 +00:00
2011-11-21 11:33:46 +00:00
else :
2011-11-25 22:13:01 +00:00
// Discounted Price (price with any pre-tax discounts applied)
$discounted_price = $this -> get_discounted_price ( $values , $base_price , true );
2011-11-21 16:26:06 +00:00
2011-11-23 23:19:23 +00:00
$discounted_tax_amount = 0 ;
2011-11-21 16:26:06 +00:00
2011-11-25 22:13:01 +00:00
endif ;
2011-11-21 11:33:46 +00:00
// Total item price (price, discount and quantity) - round tax so price is correctly calculated
$total_item_price = ( $discounted_price * $values [ 'quantity' ]) - round ( $discounted_tax_amount , 2 );
// Add any product discounts (after tax)
$this -> apply_product_discounts_after_tax ( $values , $total_item_price + $discounted_tax_amount );
// Tax Totals
$this -> tax_total = $this -> tax_total + $discounted_tax_amount ;
// Cart contents total is based on discounted prices and is used for the final total calculation
$this -> cart_contents_total = $this -> cart_contents_total + $total_item_price ;
endforeach ; endif ;
else :
if ( sizeof ( $this -> cart_contents ) > 0 ) : foreach ( $this -> cart_contents as $cart_item_key => $values ) :
2011-11-19 20:59:16 +00:00
2011-11-21 11:33:46 +00:00
/**
* Prices exclude tax
*
* This calculation is simpler - work with the base , untaxed price .
*/
$_product = $values [ 'data' ];
// Base Price (i.e. no tax, regardless of region)
$base_price = $_product -> get_price_excluding_tax ();
// Discounted Price (base price with any pre-tax discounts applied
2011-11-25 19:31:06 +00:00
$discounted_price = $this -> get_discounted_price ( $values , $base_price , true );
2011-11-21 11:33:46 +00:00
// Tax Amount (For the line, based on discounted, ex.tax price)
if ( get_option ( 'woocommerce_calc_taxes' ) == 'yes' && $_product -> is_taxable () ) :
// Now calc product rates
$tax_rate = $this -> tax -> get_rate ( $_product -> get_tax_class () );
$discounted_tax_amount = $this -> tax -> calc_tax ( $discounted_price * $values [ 'quantity' ], $tax_rate , false );
2011-11-23 23:40:48 +00:00
2011-11-21 11:33:46 +00:00
// Rounding
if ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'no' ) :
$discounted_tax_amount = round ( $discounted_tax_amount , 2 );
endif ;
else :
2011-11-23 23:19:23 +00:00
$discounted_tax_amount = 0 ;
2011-11-21 11:33:46 +00:00
endif ;
// Total item price (price, discount and quantity)
$total_item_price = $discounted_price * $values [ 'quantity' ];
// Add any product discounts (after tax)
$this -> apply_product_discounts_after_tax ( $values , $total_item_price + $discounted_tax_amount );
// Tax Totals
$this -> tax_total = $this -> tax_total + $discounted_tax_amount ;
// Cart contents total is based on discounted prices and is used for the final total calculation
$this -> cart_contents_total = $this -> cart_contents_total + $total_item_price ;
2011-11-19 20:59:16 +00:00
2011-11-21 11:33:46 +00:00
endforeach ; endif ;
2011-11-19 20:59:16 +00:00
2011-11-21 11:33:46 +00:00
endif ;
// Rounding
if ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'yes' ) $this -> tax_total = round ( $this -> tax_total , 2 );
2011-11-19 20:59:16 +00:00
// Cart Discounts (after tax)
$this -> apply_cart_discounts_after_tax ();
// Only go beyond this point if on the cart/checkout
if ( ! is_checkout () && ! is_cart () && ! defined ( 'WOOCOMMERCE_CHECKOUT' ) && ! is_ajax ()) return ;
2011-08-09 15:16:18 +00:00
2011-10-16 11:34:28 +00:00
// Cart Shipping
2011-11-19 20:59:16 +00:00
if ( $this -> needs_shipping ()) :
$woocommerce -> shipping -> calculate_shipping ();
else :
$woocommerce -> shipping -> reset_shipping ();
endif ;
2011-10-16 11:34:28 +00:00
$this -> shipping_total = $woocommerce -> shipping -> shipping_total ; // Shipping Total
$this -> shipping_tax_total = $woocommerce -> shipping -> shipping_tax ; // Shipping Tax
2011-11-21 11:33:46 +00:00
// VAT exemption done at this point - so all totals are correct before exemption
2011-09-14 14:55:03 +00:00
if ( $woocommerce -> customer -> is_vat_exempt ()) :
2011-11-19 20:59:16 +00:00
$this -> shipping_tax_total = $this -> tax_total = 0 ;
2011-09-14 14:55:03 +00:00
endif ;
2011-10-03 11:27:58 +00:00
// Allow plugins to hook and alter totals before final total is calculated
do_action ( 'woocommerce_calculate_totals' , $this );
2011-09-14 14:55:03 +00:00
2011-11-19 20:59:16 +00:00
/**
* Grand Total
*
* Based on discounted product prices , discounted tax , shipping cost + tax , and any discounts to be added after tax ( e . g . store credit )
*/
$this -> total = $this -> cart_contents_total + $this -> tax_total + $this -> shipping_tax_total + $woocommerce -> shipping -> shipping_total - $this -> discount_total ;
2011-08-09 15:16:18 +00:00
2011-09-06 11:11:22 +00:00
if ( $this -> total < 0 ) $this -> total = 0 ;
2011-08-09 15:16:18 +00:00
}
2011-11-19 20:59:16 +00:00
/**
2011-11-25 19:31:06 +00:00
* Get the total of all order discounts ( after tax discounts )
*/
function get_order_discount_total () {
return $this -> discount_total ;
}
/**
* Get the total of all cart discounts ( before tax discounts )
2011-11-19 20:59:16 +00:00
*/
2011-11-25 19:31:06 +00:00
function get_cart_discount_total () {
return $this -> discount_cart ;
2011-11-19 20:59:16 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* returns whether or not a discount has been applied
*/
function has_discount ( $code ) {
if ( in_array ( $code , $this -> applied_coupons )) return true ;
return false ;
}
/**
* looks through the cart to see if shipping is actually required
*/
function needs_shipping () {
global $woocommerce ;
if ( ! $woocommerce -> shipping -> enabled ) return false ;
if ( ! is_array ( $this -> cart_contents )) return false ;
$needs_shipping = false ;
foreach ( $this -> cart_contents as $cart_item_key => $values ) :
$_product = $values [ 'data' ];
if ( $_product -> needs_shipping () ) :
$needs_shipping = true ;
endif ;
endforeach ;
return $needs_shipping ;
}
/**
* Sees if we need a shipping address
*/
function ship_to_billing_address_only () {
if ( get_option ( 'woocommerce_ship_to_billing_address_only' ) == 'yes' ) return true ; else return false ;
}
/**
* looks at the totals to see if payment is actually required
*/
function needs_payment () {
if ( $this -> total > 0 ) return true ; else return false ;
}
2011-11-09 17:26:45 +00:00
/**
* Check cart items for errors
*/
function check_cart_items () {
2011-11-19 20:59:16 +00:00
global $woocommerce ;
2011-11-09 17:26:45 +00:00
$result = $this -> check_cart_item_stock ();
if ( is_wp_error ( $result )) $woocommerce -> add_error ( $result -> get_error_message () );
}
2011-11-06 13:45:18 +00:00
/**
* looks through the cart to check each item is in stock
*/
function check_cart_item_stock () {
$error = new WP_Error ();
foreach ( $this -> cart_contents as $cart_item_key => $values ) :
$_product = $values [ 'data' ];
if ( $_product -> managing_stock ()) :
if ( $_product -> is_in_stock () && $_product -> has_enough_stock ( $values [ 'quantity' ] )) :
// :)
else :
$error -> add ( 'out-of-stock' , sprintf ( __ ( 'Sorry, we do not have enough "%s" in stock to fulfill your order (%s in stock). Please edit your cart and try again. We apologise for any inconvenience caused.' , 'woothemes' ), $_product -> get_title (), $_product -> stock ) );
return $error ;
endif ;
else :
if ( ! $_product -> is_in_stock ()) :
$error -> add ( 'out-of-stock' , sprintf ( __ ( 'Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.' , 'woothemes' ), $_product -> get_title () ) );
return $error ;
endif ;
endif ;
endforeach ;
return true ;
}
/**
* Gets and formats a list of cart item data + variations for display on the frontend
*/
function get_item_data ( $cart_item , $flat = false ) {
global $woocommerce ;
if ( ! $flat ) $return = '<dl class="variation">' ;
// Variation data
if ( $cart_item [ 'data' ] instanceof woocommerce_product_variation && is_array ( $cart_item [ 'variation' ])) :
$variation_list = array ();
foreach ( $cart_item [ 'variation' ] as $name => $value ) :
if ( ! $value ) continue ;
// If this is a term slug, get the term's nice name
if ( taxonomy_exists ( esc_attr ( str_replace ( 'attribute_' , '' , $name )))) :
$term = get_term_by ( 'slug' , $value , esc_attr ( str_replace ( 'attribute_' , '' , $name )));
if ( ! is_wp_error ( $term ) && $term -> name ) :
$value = $term -> name ;
endif ;
else :
$value = ucfirst ( $value );
endif ;
if ( $flat ) :
$variation_list [] = $woocommerce -> attribute_label ( str_replace ( 'attribute_' , '' , $name )) . ': ' . $value ;
else :
$variation_list [] = '<dt>' . $woocommerce -> attribute_label ( str_replace ( 'attribute_' , '' , $name )) . ':</dt><dd>' . $value . '</dd>' ;
endif ;
endforeach ;
if ( $flat ) :
$return .= implode ( ', ' , $variation_list );
else :
$return .= implode ( '' , $variation_list );
endif ;
endif ;
// Other data - returned as array with name/value values
$other_data = apply_filters ( 'woocommerce_get_item_data' , array (), $cart_item );
if ( $other_data && is_array ( $other_data ) && sizeof ( $other_data ) > 0 ) :
$data_list = array ();
foreach ( $other_data as $data ) :
if ( $flat ) :
$data_list [] = $data [ 'name' ] . ': ' . $data [ 'value' ];
else :
$data_list [] = '<dt>' . $data [ 'name' ] . ':</dt><dd>' . $data [ 'value' ] . '</dd>' ;
endif ;
endforeach ;
if ( $flat ) :
$return .= implode ( ', ' , $data_list );
else :
$return .= implode ( '' , $data_list );
endif ;
endif ;
if ( ! $flat ) $return .= '</dl>' ;
return $return ;
}
/**
* Gets cross sells based on the items in the cart
*
* @ return array cross_sells item ids of cross sells
*/
function get_cross_sells () {
$cross_sells = array ();
$in_cart = array ();
if ( sizeof ( $this -> cart_contents ) > 0 ) : foreach ( $this -> cart_contents as $cart_item_key => $values ) :
if ( $values [ 'quantity' ] > 0 ) :
$cross_sells = array_merge ( $values [ 'data' ] -> get_cross_sells (), $cross_sells );
$in_cart [] = $values [ 'product_id' ];
endif ;
endforeach ; endif ;
$cross_sells = array_diff ( $cross_sells , $in_cart );
return $cross_sells ;
}
/** gets the url to the cart page */
function get_cart_url () {
$cart_page_id = get_option ( 'woocommerce_cart_page_id' );
if ( $cart_page_id ) return get_permalink ( $cart_page_id );
}
/** gets the url to the checkout page */
function get_checkout_url () {
$checkout_page_id = get_option ( 'woocommerce_checkout_page_id' );
if ( $checkout_page_id ) :
if ( is_ssl ()) return str_replace ( 'http:' , 'https:' , get_permalink ( $checkout_page_id ));
return get_permalink ( $checkout_page_id );
endif ;
}
/** gets the url to remove an item from the cart */
function get_remove_url ( $cart_item_key ) {
global $woocommerce ;
$cart_page_id = get_option ( 'woocommerce_cart_page_id' );
if ( $cart_page_id ) return $woocommerce -> nonce_url ( 'cart' , add_query_arg ( 'remove_item' , $cart_item_key , get_permalink ( $cart_page_id )));
}
/**
* Returns the contents of the cart
*/
function get_cart () {
return $this -> cart_contents ;
}
/**
* gets the total ( after calculation )
*/
2011-08-09 15:16:18 +00:00
function get_total () {
2011-09-06 11:11:22 +00:00
return woocommerce_price ( $this -> total );
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
2011-11-21 16:26:06 +00:00
* gets the cart contents total ( after calculation )
2011-11-06 13:45:18 +00:00
*/
2011-08-09 15:16:18 +00:00
function get_cart_total () {
2011-11-22 13:18:33 +00:00
if ( ! $this -> prices_include_tax ) :
2011-11-21 16:26:06 +00:00
return woocommerce_price ( $this -> cart_contents_total );
else :
return woocommerce_price ( $this -> cart_contents_total + $this -> tax_total );
endif ;
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* gets the sub total ( after calculation )
*/
2011-08-09 15:16:18 +00:00
function get_cart_subtotal () {
2011-10-31 10:54:49 +00:00
global $woocommerce ;
2011-08-09 15:16:18 +00:00
2011-11-22 13:18:33 +00:00
// Display ex tax if the option is set, or prices exclude tax
if ( $this -> display_totals_ex_tax || ! $this -> prices_include_tax ) :
2011-08-09 15:16:18 +00:00
2011-11-19 20:59:16 +00:00
$return = woocommerce_price ( $this -> subtotal_ex_tax );
2011-08-09 15:16:18 +00:00
2011-11-22 13:18:33 +00:00
if ( $this -> tax_total > 0 && $this -> prices_include_tax ) :
2011-10-31 10:54:49 +00:00
$return .= ' <small>' . $woocommerce -> countries -> ex_tax_or_vat () . '</small>' ;
2011-08-09 15:16:18 +00:00
endif ;
return $return ;
else :
2011-11-19 20:59:16 +00:00
$return = woocommerce_price ( $this -> subtotal );
2011-08-09 15:16:18 +00:00
2011-11-22 13:18:33 +00:00
if ( $this -> tax_total > 0 && ! $this -> prices_include_tax ) :
2011-10-31 10:54:49 +00:00
$return .= ' <small>' . $woocommerce -> countries -> inc_tax_or_vat () . '</small>' ;
2011-08-09 15:16:18 +00:00
endif ;
return $return ;
endif ;
}
2011-11-22 13:18:33 +00:00
/**
* Get the product row subtotal
*
* Gets the tax etc to avoid rounding issues
*/
function get_product_subtotal ( $price , $tax_rate , $quantity ) {
global $woocommerce ;
2011-11-22 14:22:35 +00:00
2011-11-23 23:19:23 +00:00
if ( get_option ( 'woocommerce_calc_taxes' ) == 'yes' && $tax_rate > 0 && ( get_option ( 'woocommerce_display_cart_prices_excluding_tax' ) == 'yes' && $this -> prices_include_tax ) ) :
2011-11-22 13:18:33 +00:00
$tax_amount = $this -> tax -> calc_tax ( $price * $quantity , $tax_rate , true );
$row_price = ( $price * $quantity ) - round ( $tax_amount , 2 );
$return = woocommerce_price ( $row_price );
$return .= ' <small class="tax_label">' . $woocommerce -> countries -> ex_tax_or_vat () . '</small>' ;
else :
2011-11-23 23:19:23 +00:00
2011-11-22 13:18:33 +00:00
$row_price = $price * $quantity ;
$return = woocommerce_price ( $row_price );
endif ;
return $return ;
}
2011-11-06 13:45:18 +00:00
/**
* gets the cart tax ( after calculation )
*/
2011-08-09 15:16:18 +00:00
function get_cart_tax () {
2011-09-06 11:11:22 +00:00
$cart_total_tax = $this -> tax_total + $this -> shipping_tax_total ;
2011-08-10 17:11:11 +00:00
if ( $cart_total_tax > 0 ) return woocommerce_price ( $cart_total_tax );
2011-08-09 15:16:18 +00:00
return false ;
}
2011-11-06 13:45:18 +00:00
/**
* gets the shipping total ( after calculation )
*/
2011-08-09 15:16:18 +00:00
function get_cart_shipping_total () {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
if ( isset ( $woocommerce -> shipping -> shipping_label )) :
if ( $woocommerce -> shipping -> shipping_total > 0 ) :
2011-08-09 15:16:18 +00:00
2011-11-22 13:18:33 +00:00
// Display ex tax if the option is set, or prices exclude tax
if ( $this -> display_totals_ex_tax || ! $this -> prices_include_tax ) :
2011-08-09 15:16:18 +00:00
2011-09-06 11:11:22 +00:00
$return = woocommerce_price ( $woocommerce -> shipping -> shipping_total );
2011-11-22 13:18:33 +00:00
if ( $this -> shipping_tax_total > 0 && $this -> prices_include_tax ) :
2011-10-31 10:54:49 +00:00
$return .= ' <small>' . $woocommerce -> countries -> ex_tax_or_vat () . '</small>' ;
2011-08-09 15:16:18 +00:00
endif ;
return $return ;
else :
2011-09-06 11:11:22 +00:00
$return = woocommerce_price ( $woocommerce -> shipping -> shipping_total + $woocommerce -> shipping -> shipping_tax );
2011-11-22 13:18:33 +00:00
if ( $this -> shipping_tax_total > 0 && ! $this -> prices_include_tax ) :
2011-10-31 10:54:49 +00:00
$return .= ' <small>' . $woocommerce -> countries -> inc_tax_or_vat () . '</small>' ;
2011-08-09 15:16:18 +00:00
endif ;
return $return ;
endif ;
else :
2011-08-10 17:11:11 +00:00
return __ ( 'Free!' , 'woothemes' );
2011-08-09 15:16:18 +00:00
endif ;
endif ;
}
2011-11-06 13:45:18 +00:00
/**
* gets title of the chosen shipping method
*/
2011-08-09 15:16:18 +00:00
function get_cart_shipping_title () {
2011-09-06 11:11:22 +00:00
global $woocommerce ;
if ( isset ( $woocommerce -> shipping -> shipping_label )) :
2011-10-26 19:10:36 +00:00
return __ ( 'via' , 'woothemes' ) . ' ' . $woocommerce -> shipping -> shipping_label ;
2011-08-09 15:16:18 +00:00
endif ;
return false ;
2011-11-06 13:45:18 +00:00
}
2011-08-09 15:16:18 +00:00
/**
2011-11-19 20:59:16 +00:00
* gets the total ( product ) discount amount - these are applied before tax
*/
function get_discounts_before_tax () {
2011-11-25 19:31:06 +00:00
if ( $this -> discount_cart ) :
return woocommerce_price ( $this -> discount_cart );
2011-11-19 20:59:16 +00:00
endif ;
return false ;
}
/**
* gets the total ( product ) discount amount - these are applied before tax
*/
function get_discounts_after_tax () {
if ( $this -> discount_total ) :
return woocommerce_price ( $this -> discount_total );
endif ;
return false ;
}
/**
* gets the total discount amount - both kinds
2011-08-09 15:16:18 +00:00
*/
function get_total_discount () {
2011-11-25 19:31:06 +00:00
if ( $this -> discount_total || $this -> discount_cart ) :
return woocommerce_price ( $this -> discount_total + $this -> discount_cart );
2011-11-19 20:59:16 +00:00
endif ;
return false ;
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* gets the array of applied coupon codes
*/
function get_applied_coupons () {
return ( array ) $this -> applied_coupons ;
2011-08-09 15:16:18 +00:00
}
2011-11-21 11:33:46 +00:00
/**
* gets the array of applied coupon codes
*/
2011-11-21 17:11:44 +00:00
function remove_coupons ( $type = 0 ) {
if ( $type == 1 ) :
if ( $this -> applied_coupons ) foreach ( $this -> applied_coupons as $index => $code ) :
$coupon = & new woocommerce_coupon ( $code );
if ( $coupon -> apply_before_tax () ) unset ( $this -> applied_coupons [ $index ]);
endforeach ;
$_SESSION [ 'coupons' ] = $this -> applied_coupons ;
elseif ( $type == 2 ) :
if ( $this -> applied_coupons ) foreach ( $this -> applied_coupons as $index => $code ) :
$coupon = & new woocommerce_coupon ( $code );
if ( ! $coupon -> apply_before_tax () ) unset ( $this -> applied_coupons [ $index ]);
endforeach ;
$_SESSION [ 'coupons' ] = $this -> applied_coupons ;
else :
unset ( $_SESSION [ 'coupons' ]);
$this -> applied_coupons = array ();
endif ;
2011-11-21 11:33:46 +00:00
}
2011-08-09 15:16:18 +00:00
}