Обходной путь для добавления отрицательной платы за корзину в woocommerce - PullRequest
0 голосов
/ 03 мая 2020

В настоящее время я успешно получаю список и сумму всех товаров, возвращенных из предыдущего заказа клиентов, и отображаю их при оформлении заказа.

Total Refunds should match Refunded form previous order

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

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

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

Получить сумму всех возвратов из последнего заказа :

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 . '&nbsp;';  ?>
                        <?php echo  '&times;&nbsp;'. ($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 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...