У нас есть особый случай, когда мы выставляем нашим клиентам счет на оплату после получения заказа, вместо того, чтобы заставлять их платить во время оформления заказа. Стоимость доставки рассчитывается вручную и добавляется к заказу, а затем мы добавляем комиссию кредитной карты в размере 3% от общей суммы.
Чтобы автоматизировать этот процесс, я создал скрипт, который вычисляет комиссию в размере 3% после того, как стоимость доставки была установлена через серверную часть, и автоматически добавляет эту позицию в заказ. Это работает, когда мы добавим стоимость доставки и нажмем кнопку «Сохранить/пересчитать» в первый раз.
add_action( 'woocommerce_order_after_calculate_totals', "custom_order_after_calculate_totals", 10, 2);
function custom_order_after_calculate_totals($and_taxes, $order) {
if ( did_action( 'woocommerce_order_after_calculate_totals' ) >= 2 )
return;
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$percentage = 0.03;
$total = $order->get_total();
$surcharge = $total * $percentage;
$feeArray = array(
'name' => '3% CC Fee',
'amount' => wc_format_decimal($surcharge),
'taxable' => false,
'tax_class' => ''
);
//Get fees
$fees = $order->get_fees();
if(empty($fees)){
//Add fee
$fee_object = (object) wp_parse_args( $feeArray );
$order->add_fee($fee_object);
} else {
//Update fee
foreach($fees as $item_id => $item_fee){
if($item_fee->get_name() == "3% CC Fee"){
$order->update_fee($item_id,$feeArray);
}
}
}
}
Если мы случайно добавим неправильную стоимость доставки и попытаемся обновить ее, этот код снова сработает и обновит плату, однако $total
не получит новую сумму заказа из обновленной стоимости доставки, поэтому плата не изменится. Как ни странно, если я пытаюсь удалить пункт сбора, рассчитывается новый сбор и добавляется обратно с правильной суммой сбора.
Кто-нибудь знает, как я могу это решить?