Work on calc_tax
This commit is contained in:
parent
98ddb3bbc5
commit
c2e1258d04
|
@ -579,7 +579,7 @@ function woocommerce_order_totals_meta_box($post) {
|
|||
<ul class="totals">
|
||||
|
||||
<li class="left">
|
||||
<label><?php _e( 'Sales Tax:', 'woocommerce' ); ?></label>
|
||||
<label><?php _e( 'Sales Tax:', 'woocommerce' ); ?> <a class="tips" data-tip="<?php _e( 'Total tax for line items + fees.', 'woocommerce' ); ?>" href="#">[?]</a></label>
|
||||
<input type="text" id="_order_tax" name="_order_tax" placeholder="0.00" value="<?php
|
||||
if ( isset( $data['_order_tax'][0] ) )
|
||||
echo esc_attr( $data['_order_tax'][0] );
|
||||
|
|
|
@ -263,7 +263,8 @@ jQuery( function($){
|
|||
var total = 0;
|
||||
|
||||
fields.each(function(){
|
||||
total = total + parseFloat( $(this).val() );
|
||||
if ( $(this).val() )
|
||||
total = total + parseFloat( $(this).val() );
|
||||
});
|
||||
|
||||
var formatted_total = accounting.formatMoney( total, {
|
||||
|
@ -302,35 +303,50 @@ jQuery( function($){
|
|||
var city = $('#_billing_city').val();
|
||||
}
|
||||
|
||||
$items.each(function( idx ){
|
||||
// Get items and values
|
||||
var calculate_items = {};
|
||||
|
||||
$items.each( function() {
|
||||
|
||||
var $row = $(this);
|
||||
|
||||
var data = {
|
||||
action: 'woocommerce_calc_line_taxes',
|
||||
order_item_id: $row.find('input.order_item_id').val(),
|
||||
line_subtotal: $row.find('input.line_subtotal').val(),
|
||||
line_total: $row.find('input.line_total').val(),
|
||||
tax_class: $row.find('select.tax_class').val(),
|
||||
country: country,
|
||||
state: state,
|
||||
postcode: postcode,
|
||||
city: city,
|
||||
security: woocommerce_writepanel_params.calc_totals_nonce
|
||||
};
|
||||
var item_id = $row.find('input.order_item_id').val();
|
||||
var line_subtotal = $row.find('input.line_subtotal').val();
|
||||
var line_total = $row.find('input.line_total').val();
|
||||
var tax_class = $row.find('select.tax_class').val();
|
||||
|
||||
$.post( woocommerce_writepanel_params.ajax_url, data, function(response) {
|
||||
calculate_items[ item_id ] = {};
|
||||
calculate_items[ item_id ].line_subtotal = line_subtotal;
|
||||
calculate_items[ item_id ].line_total = line_total;
|
||||
calculate_items[ item_id ].tax_class = tax_class;
|
||||
} );
|
||||
|
||||
result = jQuery.parseJSON( response );
|
||||
$row.find('input.line_subtotal_tax').val( result.line_subtotal_tax ).change();
|
||||
$row.find('input.line_tax').val( result.line_tax ).change();
|
||||
var data = {
|
||||
action: 'woocommerce_calc_line_taxes',
|
||||
items: calculate_items,
|
||||
shipping: accounting.unformat( $('#_order_shipping').val() ),
|
||||
country: country,
|
||||
state: state,
|
||||
postcode: postcode,
|
||||
city: city,
|
||||
security: woocommerce_writepanel_params.calc_totals_nonce
|
||||
};
|
||||
|
||||
if (idx == ($items.size() - 1)) {
|
||||
$('.woocommerce_order_items_wrapper').unblock();
|
||||
}
|
||||
$.post( woocommerce_writepanel_params.ajax_url, data, function( response ) {
|
||||
|
||||
});
|
||||
result = jQuery.parseJSON( response );
|
||||
|
||||
$items.each( function() {
|
||||
var $row = $(this);
|
||||
var item_id = $row.find('input.order_item_id').val();
|
||||
|
||||
$row.find('input.line_tax').val( result['item_taxes'][ item_id ]['line_tax'] ).change();
|
||||
$row.find('input.line_subtotal_tax').val( result['item_taxes'][ item_id ]['line_subtotal_tax'] ).change();
|
||||
} );
|
||||
|
||||
$('#_order_shipping_tax').val( result['shipping_tax'] ).change();
|
||||
|
||||
$('.woocommerce_order_items_wrapper').unblock();
|
||||
});
|
||||
|
||||
} else {
|
||||
|
@ -338,9 +354,9 @@ jQuery( function($){
|
|||
}
|
||||
return false;
|
||||
}).hover(function() {
|
||||
$('#order_items_list input.line_subtotal_tax, #order_items_list input.line_tax').css('background-color', '#d8c8d2');
|
||||
$('#order_items_list input.line_subtotal_tax, #order_items_list input.line_tax, #_order_shipping_tax, #_order_tax').css('background-color', '#d8c8d2');
|
||||
}, function() {
|
||||
$('#order_items_list input.line_subtotal_tax, #order_items_list input.line_tax').css('background-color', '');
|
||||
$('#order_items_list input.line_subtotal_tax, #order_items_list input.line_tax, #_order_shipping_tax, #_order_tax').css('background-color', '');
|
||||
});
|
||||
|
||||
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -1101,52 +1101,112 @@ function woocommerce_calc_line_taxes() {
|
|||
|
||||
$tax = new WC_Tax();
|
||||
|
||||
$base_tax_amount = 0;
|
||||
$line_tax_amount = 0;
|
||||
$taxes = $tax_rows = $item_taxes = $shipping_taxes = array();
|
||||
|
||||
$country = strtoupper( esc_attr( $_POST['country'] ) );
|
||||
$state = strtoupper( esc_attr( $_POST['state'] ) );
|
||||
$postcode = strtoupper( esc_attr( $_POST['postcode'] ) );
|
||||
$city = sanitize_title( esc_attr( $_POST['city'] ) );
|
||||
|
||||
$line_subtotal = isset( $_POST['line_subtotal'] ) ? esc_attr( $_POST['line_subtotal'] ) : 0;
|
||||
$line_total = esc_attr( $_POST['line_total'] );
|
||||
$items = $_POST['items'];
|
||||
$shipping = $_POST['shipping'];
|
||||
|
||||
$item_id = esc_attr( $_POST['order_item_id'] );
|
||||
$tax_class = esc_attr( $_POST['tax_class'] );
|
||||
// Calculate sales tax first
|
||||
if ( sizeof( $items ) > 0 ) {
|
||||
foreach( $items as $item_id => $item ) {
|
||||
|
||||
if ( ! $item_id || $tax_class == '0' )
|
||||
return;
|
||||
$item_id = absint( $item_id );
|
||||
$line_subtotal = isset( $item['line_subtotal'] ) ? esc_attr( $item['line_subtotal'] ) : '';
|
||||
$line_total = esc_attr( $item['line_total'] );
|
||||
$tax_class = esc_attr( $item['tax_class'] );
|
||||
|
||||
// Get product details
|
||||
if ( get_post_type( $item_id ) == 'product' ) {
|
||||
$_product = new WC_Product( $item_id );
|
||||
$item_tax_status = $_product->get_tax_status();
|
||||
} else {
|
||||
$item_tax_status = 'taxable';
|
||||
if ( ! $item_id || $tax_class == '0' )
|
||||
continue;
|
||||
|
||||
// Get product details
|
||||
if ( get_post_type( $item_id ) == 'product' ) {
|
||||
$_product = new WC_Product( $item_id );
|
||||
$item_tax_status = $_product->get_tax_status();
|
||||
} else {
|
||||
$item_tax_status = 'taxable';
|
||||
}
|
||||
|
||||
// Only calc if taxable
|
||||
if ( $item_tax_status == 'taxable' ) {
|
||||
|
||||
$tax_rates = $tax->find_rates( array(
|
||||
'country' => $country,
|
||||
'state' => $state,
|
||||
'postcode' => $postcode,
|
||||
'city' => $city,
|
||||
'tax_class' => $tax_class
|
||||
) );
|
||||
|
||||
$line_subtotal_taxes = $tax->calc_tax( $line_subtotal, $tax_rates, false );
|
||||
$line_taxes = $tax->calc_tax( $line_total, $tax_rates, false );
|
||||
|
||||
$line_subtotal_tax = rtrim( rtrim( number_format( array_sum( $line_subtotal_taxes ), 4, '.', '' ), '0' ), '.' );
|
||||
$line_tax = rtrim( rtrim( number_format( array_sum( $line_taxes ), 4, '.', '' ), '0' ), '.' );
|
||||
|
||||
if ( $line_subtotal_tax < 0 )
|
||||
$line_subtotal_tax = 0;
|
||||
|
||||
if ( $line_tax < 0 )
|
||||
$line_tax = 0;
|
||||
|
||||
$item_taxes[ $item_id ] = array(
|
||||
'line_subtotal_tax' => $line_subtotal_tax,
|
||||
'line_tax' => $line_tax
|
||||
);
|
||||
|
||||
// Sum the item taxes
|
||||
foreach ( array_keys( $taxes + $line_taxes ) as $key )
|
||||
$taxes[ $key ] = ( isset( $line_taxes[ $key ] ) ? $line_taxes[ $key ] : 0 ) + ( isset( $taxes[ $key ] ) ? $taxes[ $key ] : 0 );
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if ( $item_tax_status == 'taxable' ) {
|
||||
// Now calculate shipping tax
|
||||
$matched_tax_rates = array();
|
||||
|
||||
$tax_rates = $tax->find_rates( array(
|
||||
'country' => $country,
|
||||
'state' => $state,
|
||||
'postcode' => $postcode,
|
||||
'city' => $city,
|
||||
'tax_class' => $tax_class
|
||||
) );
|
||||
$tax_rates = $tax->find_rates( array(
|
||||
'country' => $country,
|
||||
'state' => $state,
|
||||
'postcode' => $postcode,
|
||||
'city' => $city,
|
||||
'tax_class' => ''
|
||||
) );
|
||||
|
||||
$line_subtotal_tax_amount = rtrim( rtrim( number_format( array_sum( $tax->calc_tax( $line_subtotal, $tax_rates, false ) ), 4, '.', '' ), '0' ), '.' );
|
||||
$line_tax_amount = rtrim( rtrim( number_format( array_sum( $tax->calc_tax( $line_total, $tax_rates, false ) ), 4, '.', '' ), '0' ), '.' );
|
||||
if ( $tax_rates )
|
||||
foreach ( $tax_rates as $key => $rate )
|
||||
if ( isset( $rate['shipping'] ) && $rate['shipping'] == 'yes' )
|
||||
$matched_tax_rates[ $key ] = $rate;
|
||||
|
||||
$shipping_taxes = $tax->calc_shipping_tax( $shipping, $matched_tax_rates );
|
||||
$shipping_tax = rtrim( rtrim( number_format( array_sum( $shipping_taxes ), 2, '.', '' ), '0' ), '.' );
|
||||
|
||||
// Now merge to keep tax rows
|
||||
foreach ( array_keys( $taxes + $shipping_taxes ) as $key ) {
|
||||
|
||||
$is_compound = $tax->is_compound( $key ) ? 1 : 0;
|
||||
|
||||
$cart_tax = isset( $taxes[ $key ] ) ? $taxes[ $key ] : 0;
|
||||
$shipping_tax = isset( $shipping_taxes[ $key ] ) ? $shipping_taxes[ $key ] : 0;
|
||||
|
||||
$tax_rows[] = array(
|
||||
'label' => $tax->get_rate_label( $key ),
|
||||
'compound' => $is_compound,
|
||||
'cart_tax' => woocommerce_format_total( $cart_tax ),
|
||||
'shipping_tax' => woocommerce_format_total( $shipping_tax )
|
||||
);
|
||||
}
|
||||
|
||||
if ( $line_subtotal_tax_amount < 0 ) $line_subtotal_tax_amount = 0;
|
||||
if ( $line_tax_amount < 0 ) $line_tax_amount = 0;
|
||||
|
||||
// Return
|
||||
echo json_encode( array(
|
||||
'line_subtotal_tax' => $line_subtotal_tax_amount,
|
||||
'line_tax' => $line_tax_amount
|
||||
'item_taxes' => $item_taxes,
|
||||
'shipping_tax' => $shipping_tax,
|
||||
'tax_rows' => $tax_rows
|
||||
) );
|
||||
|
||||
// Quit out
|
||||
|
|
Loading…
Reference in New Issue