Проблема округления налогов при наличии нескольких классов налогов в woocommerce

У меня проблема с округлением сумм налоговых классов в WooCommerce 3.2.3 на WordPress 4.8.3.

Суммы каждого из 2 классов налогов правильно отображаются с двумя десятичными знаками при отображении на странице корзины и оформления заказа.
Однако при вычислении общей суммы корзины суммы налогового класса складываются вместе в сумму промежуточного итога налога, используя 4 значения десятичной точки, а затем округляются.
Это может вызвать ошибку округления 0,01, как объяснено в примере ниже, где, если вы добавите промежуточный итог позиции вместе с отображаемыми суммами налоговых классов, вы получите 221,61 €, а не отображается 221,62 €.


Пример (цены без налога, доставка не включена):
Продукт XXX (относится к налоговому классу 19%): 161,28 €
Продукт YYY (относится к 7% налоговому классу): 27,75 €
Итого по продукту = 189,03 €

MwSt. 19% 30,64 €
MwSt. 7% 1,94 €

Общая сумма корзины: 221,62 €


Вопрос:
Как заставить WooCommerce использовать 2 десятичных знака для сумм налоговых классов при сложении их вместе для расчета общей суммы корзины?


Настроить:

  • мы используем плагин «WooCommerce Germanized» версии 1.9.5. Проблема существует и без нее.
  • мы используем плагин калькулятора доставки, и проблема существует с и без него.
  • отключил все плагины безрезультатно.
  • проверено с двадцатью семнадцатой темой, с тем же результатом.
  • Магазин находится в Германии и продается компаниям и частным клиентам, поэтому цены вводятся без учета налогов.
  • продукты связаны с налоговым классом 19% или 7%.
  • валюта евро с использованием 2 десятичных знаков.
  • для параметра «Отображать итоги по налогам» установлено значение «Детализировано».
  • цены вводятся без учета налога.
  • цены указаны без учета налогов.

Я понимаю причину использования точности 4dp в вычислениях, но в нашем случае это не требуется.

Я добавил отладочный вывод в код WC и увидел, что суммы отдельных классов налога в приведенном выше примере хранятся с 4 десятичными знаками:
MwSt. 19% 30,6432
MwSt. 7% 1,9425

Сумма налога здесь составляет 32,5857, округленная до 32,59 € при расчете итоговой суммы корзины, в отличие от 32,58 €, вызывая разница 0,01.

В поисках решения этой проблемы я обнаружил множество различных проблем с расчетом налогов, но не совсем схожий вариант использования.

Я пытался изменить код WooCommerce, но мне не удалось найти правильное место в WooCommerce, где я мог бы установить / жестко закодировать точное вычисление для использования 2dp, а не 4dp, но это, возможно, было бы не самым идеальным решением в любом случае ,

Примечание. Если я изменю настройку «Отображать сумму налога» на «Итого» вместо «Детализировано», то отображаемая промежуточная сумма налога 32,59 €.

В этой настройке общая сумма в корзине 221,62 € равна сумме перечисленных промежуточных итогов, но клиент требует, чтобы налоги отображались по отдельности.

Извините за длинное описание. По моему недавнему опыту, это необходимо для правильного объяснения вопросов, связанных с исчислением налогов.

У кого-нибудь есть предложения по решению этой проблемы?

Большое спасибо за ваш совет и время!

Маскета

1

Решение

Сначала вы должны искать, как рассчитывается налог в WooCommerce … Если вы идете в WooCommerce WC_Cart код класса, вы увидите, что WC_Tax класс несет ответственность за это …

В исходном коде WC_Tax методы, которые делают расчеты (с соответствующими доступными крючками фильтра изменить эти расчеты):

  • calc_tax() с доступным фильтрующим крючком woocommerce_calc_tax.
  • calc_shipping_tax() с доступным фильтрующим крючком woocommerce_calc_shipping_tax.
  • round() с доступным фильтрующим крючком woocommerce_tax_round.
  • calc_inclusive_tax() с доступным фильтрующим крючком woocommerce_price_inc_tax_amount.
  • calc_exclusive_tax() с доступным фильтрующим крючком woocommerce_price_ex_tax_amount.
  • и может быть некоторые другие …

Вот пример, чтобы изменить round() поведение вернуть округление до .5 центов:

add_filter( 'woocommerce_tax_round', 'euro_5cent_rounding' );
function euro_5cent_rounding( $in ) {
return round( $in / 5, 2 ) * 5;
}

Код находится в файле function.php вашей активной дочерней темы или активной темы (или также в любом файле плагина).

Поскольку ваша проблема очень специфична и ее трудно воспроизвести, вам нужно будет найти, какой хук поможет решить вашу проблему …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]