Я пытаюсь создать частичное возмещение за заказ программно.Также важно рассчитать налог, но пока кажется, что ничего не работает правильно, и я не могу понять, почему.
Я хочу нажать кнопку, и функция "ceb_wc_refund_order" будет вызываться с $ order_id,количество и причина.$ qty обычно равен 1. Проблема в том, что в заказе всегда содержится только ОДИН элемент, но, например, 3 раза.Теперь я хочу вернуть только один из этих пунктов.
Я знаю, как сделать это вручную, поэтому в основном я хочу добиться следующего, но программно:
В данный момент код, по-видимому, успешно создает возмещение, а также количество товара является правильным.Но сумма возмещения - это цена товара * количество, а также налог не возвращается.
Я знаю, что мой код пока не приводит к моей цели.Я не нашел много в интернете об этом ... Вы можете мне помочь?
function ceb_wc_refund_order( $order_id, $qty, $refund_reason = '') {
$order = wc_get_order( $order_id );
// If it's something else such as a WC_Order_Refund, we don't want that.
if( ! is_a( $order, 'WC_Order') ) {
return new WP_Error( 'wc-order', __( 'Provided ID is not a WC Order', 'yourtextdomain' ) );
}
if( 'refunded' == $order->get_status() ) {
return new WP_Error( 'wc-order', __( 'Order has been already refunded', 'yourtextdomain' ) );
}
// Get Items
$order_items = $order->get_items();
// Refund Amount
$refund_amount = 0;
// Prepare line items which we are refunding
$line_items = array();
if ( $order_items ) {
foreach( $order_items as $item_id => $item ) {
$item_meta = $order->get_item_meta($item_id);
$tax_data = $item_meta['_line_tax'];
$refund_tax = $tax_data;
$refund_amount = wc_format_decimal($refund_amount) + wc_format_decimal($item_meta['_line_total'][0]);
$line_items[$item_id] = array(
'qty' => $qty,
'refund_total' => wc_format_decimal($item_meta['_line_total'][0]),
'refund_tax' => $refund_tax);
}
}
// ...
$refund = wc_create_refund( array(
'amount' => $refund_amount,
'reason' => $refund_reason,
'order_id' => $order_id,
'line_items' => $line_items,
'refund_payment' => false
));
return $refund;
}