В настоящее время я успешно получаю список и сумму всех товаров, возвращенных из предыдущего заказа клиентов, и отображаю их при оформлении заказа.
![Total Refunds should match Refunded form previous order](https://i.stack.imgur.com/bTyZu.png)
Затем я делаю дисконтирование текущего заказа на эту сумму (добавляя в качестве отрицательной комиссии за корзину). Я столкнулся с тем, что, как мне кажется, является известной проблемой с налогом на отрицательные комиссионные за корзину. Из текущих постов по данному вопросу мне пока не удалось найти обходной путь.
Интересно, что сумма, на которую вычитается отрицательный сбор, является нечетной суммой и зависит от количества товаров в корзине, даже если отрицательный сбор рассчитывается из предыдущего заказа, поэтому я не могу определить как рассчитывается дисперсия.
Любые предложения о том, как справиться с этим. Я думаю, я мог бы записать сумму возврата в пользовательское поле при возврате, а затем загрузить ее в качестве платы при оформлении заказа, но это кажется сложным способом достижения конечной цели
Получить сумму всех возвратов из последнего заказа :
function add_last_order_refund_total_at_checkout($cart_object){
if ( is_admin() && ! defined( 'DOING_AJAX' ) )
return;
$user_id = get_current_user_id(); // The current user ID
$customer = new WC_Customer( $user_id );
$last_order = $customer->get_last_order();
$order_id = $last_order;
// Get the WC_Order Object instance (from the order ID)
$order = wc_get_order( $order_id );
// Get the Order refunds (array of refunds)
$order_refunds = $order->get_refunds();
$total_to_refund = $order->get_total_refunded()*(-1);//WIP need to check which items have tax
if (!empty($order_refunds)) WC()->cart->add_fee( 'Refunds from previous order', $total_to_refund );
}
add_action( 'woocommerce_cart_calculate_fees', 'add_last_order_refund_total_at_checkout', 10, 1 );
Отображение списка товаров, возвращенных с последнего заказа и общей суммы, и отображение при оформлении заказа:
function the_refunded_tems(){
$user_id = get_current_user_id(); // The current user ID
$customer = new WC_Customer( $user_id );
$last_order = $customer->get_last_order();
$order_id = $last_order;
// Get the WC_Order Object instance (from the order ID)
$order = wc_get_order( $order_id );
// Get the Order refunds (array of refunds)
$order_refunds = $order->get_refunds();
if ($order_refunds){
?>
<div class="refund-checkout-table">
<h4>Refunds from previous order:</h4>
<table class="refunded-items-at-checkout">
<tbody>
<?php
// Loop through the order refunds array
foreach( $order_refunds as $refund ){
// Loop through the order refund line items
foreach( $refund->get_items() as $item_id => $item ){
## --- Using WC_Order_Item_Product methods --- ##
$refunded_quantity = $item->get_quantity(); // Quantity: zero or negative integer
$refunded_name = $item->get_name(); // Quantity: zero or negative integer
$refunded_line_subtotal = $item->get_subtotal(); // line subtotal: zero or negative number
$refunded_line_tax = $item->get_subtotal_tax();
// Get the original refunded item ID
$refunded_item_id = $item->get_meta('_refunded_item_id'); // line subtotal: zero or negative number
$total_to_refund = $order->get_total_refunded();
?>
<tr class="">
<td class="checkout-refund-product-name">
<?php echo $refunded_name . ' '; ?>
<?php echo '× '. ($refunded_quantity*-1) ;?>
</td>
<td class="checkout-refund-product-total">
<?php echo round((($refunded_line_subtotal+$refunded_line_tax)*-1),2); ?>
</td>
</tr>
<?php
}
}
?>
</tbody>
<tfoot>
<tr class="checkout-refund-total">
<th><?php esc_html_e( 'Total Refunds', 'woocommerce' ); ?></th>
<td><?php echo $total_to_refund; ?></td>
</tr>
</tfoot>
</table>
</div>
<?php
}//end if has refunds
}
add_action( 'woocommerce_checkout_order_review', 'the_refunded_tems', 10 );