Удалите все налоги в WooCommerce для минимальной суммы корзины и конкретных стран

нам необходимо взимать 0 НДС за заказы в Великобритании, стоимость которых превышает 150 евро, включая сборы за доставку и платежный шлюз, но без 20% обычного НДС.

Таким образом, если британский адрес проживания заказывает что-то по адресу 130, а плата за шлюз доставки и оплаты составляет 9, тогда мы взимаем НДС, поэтому клиент платит 139 + 9 + 20% НДС, но, если заказ равен 130, а сборы за доставку и платежи за шлюз равны 23, поэтому всего 153 без НДС. Мы не взимаем налог.

Я создал это, но, тем не менее, он облагается налогом на доставку, и дополнительные сборы PayPal также облагаются налогом, моя голова на самом деле разбита, я действительно думал, что обращусь за предложениями.



add_action( 'woocommerce_before_calculate_totals','auto_add_tax_for_room', 10, 1 );
function auto_add_tax_for_room( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return; 
    
    $shipping_country = WC()->customer->get_shipping_country();
    $subtotal = 0;
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $subtotal += $cart_item['data']->get_price('edit') * $cart_item['quantity'];
    }
    $subtotal = intval($subtotal);
    

    if($shipping_country!='GB' || $subtotal < 125) return;
    
    $percent = 0;
    // Calculation
    $surcharge = ( $cart->cart_contents_total + $cart->shipping_total ) * $percent / 100;

    // Add the fee (tax third argument disabled: false)
   foreach ( $cart->get_cart() as $cart_item ) {
        // get product price
        $price = $cart_item['data']->get_price();

        $cart_item['data']->set_tax_class( 'Zero rate' ); // Above 2500
    }
    return;
}

person Joe    schedule 12.03.2021    source источник
comment
Я сейчас в этом разбираюсь, спасибо!   -  person Joe    schedule 12.03.2021
comment
Я нашел гораздо более простой способ достичь вашей цели ... Будем признательны за некоторые отзывы о приведенном ниже ответе.   -  person LoicTheAztec    schedule 13.03.2021


Ответы (2)


Хук woocommerce_before_calculate_totals предназначен только для товаров в тележке, а налоговый класс здесь применяется только к товарам, поскольку $cart_item['data'] - это WC_Product Объект.

Если цены на ваши товары установлены без налогов, есть еще одна альтернатива, гораздо более простая, которая уберет все налоги при соблюдении ваших условий.

Вместо этого попробуйте следующее:

add_action( 'woocommerce_calculate_totals', 'set_customer_tax_exempt' );
function set_customer_tax_exempt( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') )
        return;

    $min_amount = 150; // Minimal cart amount
    $countries  = array('GB'); // Defined countries array

    $subtotal   = floatval( $cart->cart_contents_total );
    $shipping   = floatval( $cart->shipping_total );
    $fees       = floatval( $cart->fee_total );
    $total      = $subtotal + $shipping + $fees; // cart total (without taxes including shipping and fees)

    $country    = WC()->customer->get_shipping_country();
    $country    = empty($country) ? WC()->customer->get_billing_country() : $country;
    $vat_exempt = WC()->customer->is_vat_exempt();
    $condition  = in_array( $country, $countries ) && $total >= $min_amount;

    if ( $condition && ! $vat_exempt ) {
        WC()->customer->set_is_vat_exempt( true ); // Set customer tax exempt
    } elseif ( ! $condition && $vat_exempt ) {
        WC()->customer->set_is_vat_exempt( false ); // Remove customer tax exempt
    }
}

add_action( 'woocommerce_thankyou', 'remove_customer_tax_exempt' );
function remove_customer_tax_exempt( $order_id ) {
    if ( WC()->customer->is_vat_exempt() ) {
        WC()->customer->set_is_vat_exempt( false );
    }
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Проверено и работает.

person LoicTheAztec    schedule 12.03.2021
comment
Он работает, но не с методом Paypal и другими способами оплаты, за которые мы взимаем дополнительную плату, при выборе Paypal НДС снова возвращается в норму. - person Joe; 13.03.2021
comment
@Joe В любом случае, это правильный путь ... Я не могу догадаться, как вы рассчитываете комиссию в PayPal, вам не кажется (есть много разных плагинов PayPal, которые вы можете включить в WooCommerce) ... Так что вы должны добавить в свой Задайте вопрос, пожалуйста, о связанных с этим сборах PayPal (и пользовательском коде, если таковой имеется). - person LoicTheAztec; 13.03.2021
comment
Ваше решение было чрезвычайно полезным для моих проблем с WooCommerce. - person Joe; 13.03.2021
comment
@Joe Добро пожаловать! береги себя и хорошего выздоровления. - person LoicTheAztec; 13.03.2021

Благодаря помощи LoicTheAztec я внес некоторые изменения, в конечном итоге использовал следующее, и это помогло исправить проблемы с налогами в Великобритании

add_action( 'woocommerce_before_calculate_totals','auto_add_tax_for_room', 10, 1 );
function auto_add_tax_for_room( $cart ) {
    if ( is_admin() && ! defined('DOING_AJAX') ) return; 
    
    $shipping_country = WC()->customer->get_shipping_country();
    $subtotal = 0;
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $subtotal += $cart_item['data']->get_price('edit') * $cart_item['quantity'];
    }
    $subtotal = intval($subtotal);  

    if($shipping_country!='GB' || $subtotal < 125) return;
    
    $percent = 0;
    // Calculation
    $surcharge = ( $cart->cart_contents_total + $cart->shipping_total ) * $percent / 100;

    // Add the fee (tax third argument disabled: false)
   foreach ( $cart->get_cart() as $cart_item ) {
        // get product price
        $price = $cart_item['data']->get_price();

        $cart_item['data']->set_tax_class( 'Zero rate' ); 
       
    }
    return;
}

function flat_rates_cost( $rates, $package ) {
    $shipping_country = WC()->customer->get_shipping_country();
    
    $subtotal = 0;
    foreach ( WC()->cart->get_cart() as $cart_item ) {
        $subtotal += $cart_item['data']->get_price('edit') * $cart_item['quantity'];
    }
    $subtotal = intval($subtotal);
    
    if($shipping_country!='GB' || $subtotal < 125) return $rates;
    
    foreach ( $rates as $rate_key => $rate ){
        if ( 'free_shipping' !== $rate->method_id ) {
            $has_taxes = false;
            $taxes = [];
 
            // Taxes rate cost (if enabled)
            foreach ($rates[$rate_key]->taxes as $key => $tax){
                if( $tax > 0 ){
                    $has_taxes = true;
                    $taxes[$key] = 0; // Set to 0 (zero)
                }
            }
            if( $has_taxes )
                $rates[$rate_key]->taxes = 0;
        }
    }
    return $rates;
}
add_filter( 'woocommerce_package_rates', 'flat_rates_cost', 10, 2 );

person Joe    schedule 14.03.2021