Có thể hoàn thuế trên một khoản hoàn lại một phần đơn đặt hàng?


8

Khi phát hành Ghi nhớ tín dụng (còn gọi là hoàn tiền), Magento sẽ tự động hoàn thuế cho vận chuyển và sản phẩm NHƯNG KHÔNG đối với các giá trị được nhập trong trường "Hoàn tiền điều chỉnh" (còn gọi là hoàn trả một phần).

Có thể định cấu hình Magento để nó tự động hoàn thuế cho các giá trị được nhập trong trường hoàn lại điều chỉnh không?

Tài liệu tham khảo: nhập mô tả hình ảnh ở đây

Câu trả lời:


3

Bạn sẽ tìm thấy mã liên quan đến điều này trong lớp Mage_Sales_Model_Order_Creditmemo_Total_Tax .

Dòng mã $part = $creditmemo->getShippingAmount()/$orderShippingAmount; (nằm ở dòng 116) cho thấy rõ điều này được mã hóa cụ thể để chỉ tính thuế theo trường vận chuyển hàng hóa từ biểu mẫu creditMemo.

Thay đổi rõ ràng là điều chỉnh mã đó để sử dụng trường "Hoàn tiền điều chỉnh".

Bạn thực sự không thể viết lại lớp này, do cách magento khởi tạo nó như là một phần của hệ thống con bộ sưu tập tổng, trong các tính toán của creditmemo.

Tuy nhiên, bạn có thể điều chỉnh trình thu thập để sử dụng phiên bản lớp của riêng bạn, vì vậy tất cả không bị mất.

Vì vậy, trong mô-đun của riêng bạn, bạn sẽ đặt đoạn mã sau vào tệp config.xml. Nó đi vào bên trong các <global>yếu tố

<global>
    <sales>
      <order_creditmemo>
         <totals>
            <tax>
              <class>NAMESPACE_MODULE/order_creditmemo_total_tax</class>
              <after>subtotal</after>
            </tax>
         </totals>
      </order_creditmemo>
   </sales>
<global>

Bây giờ bạn sẽ tạo tệp lớp NAMESPACE/MODULE/Model/Order/Creditmemo/Total/Tax, mở rộng tệp lõi.

class NAMESPACE_MODULE_Model_Order_Creditmemo_Total_Tax extends Mage_Sales_Model_Order_Creditmemo_Total_Tax

Bạn sẽ cần sao chép toàn bộ phương thức 'thu thập' tạo thành lớp lõi vào tệp mới của bạn.

Thêm mã sau vào dòng 114 (ngay sau mã $shippingDelta = $baseOrderShippingAmount - $baseOrderShippingRefundedAmount)

 /** adjust to also calculate tax on the adjustment value **/
            $adjustment = ($creditmemo->getAdjustment() > 0)?$creditmemo->getAdjustment():$creditmemo->getShippingAmount();
            if($creditmemo->getAdjustment() > 0 && $creditmemo->getShippingAmount() > 0) {
                $adjustment = $creditmemo->getAdjustment() + $creditmemo->getShippingAmount();
            }
            /** end adjustment **/

và điều chỉnh dòng 116 từ $part = $creditmemo->getShippingAmount()/$orderShippingAmount;đến$part = $adjustment/$orderShippingAmount;

Điều này sau đó sẽ sử dụng hiệu quả Số tiền vận chuyển hoặc Số tiền điều chỉnh trong tính toán.


Cảm ơn! Nhưng nếu tôi hiểu chính xác, điều này chỉ hoạt động nếu có chi phí vận chuyển. Nó sẽ không hoạt động mà không có chi phí vận chuyển.
Simon

6

Vấn đề quan trọng là, magento đó không biết nên sử dụng yếu tố thuế nào. Khi không có sản phẩm nào được hoàn lại, không có phần trăm thuế.

Tôi đã khắc phục vấn đề bằng cách chỉ sử dụng tỷ lệ thuế cao nhất tôi có thể tìm thấy trong các sản phẩm, thoải mái điều chỉnh theo trường hợp sử dụng của bạn.

Thuế được tính theo tính toánTaxForRefundAdjustment ở cuối lớp.

cấu hình

<?xml version="1.0"?>
<config>
    <modules>
        <Project_RefundPartialCreditmemoWithTax>
            <version>1.0.0</version>
        </Project_RefundPartialCreditmemoWithTax>
    </modules>
    <global>
        <models>
            <project_refundpartialcreditmemowithtax>
                 <class>Project_RefundPartialCreditmemoWithTax_Model</class>
            </project_refundpartialcreditmemowithtax>
        </models>
        <sales>
          <order_creditmemo>
             <totals>
                <tax>
                  <class>project_refundpartialcreditmemowithtax/order_creditmemo_total_tax</class>
                </tax>
             </totals>
          </order_creditmemo>
       </sales>
    </global>
</config>

ứng dụng / mã / cục bộ / Dự án / RefundPartialCreditmemoWithTax / Model / Order / Creditmemo / Total / Tax.php

<?php

class Project_RefundPartialCreditmemoWithTax_Model_Order_Creditmemo_Total_Tax
    extends Mage_Sales_Model_Order_Creditmemo_Total_Tax
{
    public function collect(Mage_Sales_Model_Order_Creditmemo $creditmemo)
    {
        $shippingTaxAmount = 0;
        $baseShippingTaxAmount = 0;
        $totalHiddenTax = 0;
        $baseTotalHiddenTax = 0;

        $order = $creditmemo->getOrder();

        list($totalTax, $baseTotalTax) = $this->calculateTaxForRefundAdjustment($creditmemo);

        /** @var $item Mage_Sales_Model_Order_Creditmemo_Item */
        foreach ($creditmemo->getAllItems() as $item) {
            $orderItem = $item->getOrderItem();
            if ($orderItem->isDummy()) {
                continue;
            }
            $orderItemTax = $orderItem->getTaxInvoiced();
            $baseOrderItemTax = $orderItem->getBaseTaxInvoiced();
            $orderItemHiddenTax = $orderItem->getHiddenTaxInvoiced();
            $baseOrderItemHiddenTax = $orderItem->getBaseHiddenTaxInvoiced();
            $orderItemQty = $orderItem->getQtyInvoiced();

            if (($orderItemTax || $orderItemHiddenTax) && $orderItemQty) {
                /**
                 * Check item tax amount
                 */

                $tax = $orderItemTax - $orderItem->getTaxRefunded();
                $baseTax = $baseOrderItemTax - $orderItem->getTaxRefunded();
                $hiddenTax = $orderItemHiddenTax - $orderItem->getHiddenTaxRefunded();
                $baseHiddenTax = $baseOrderItemHiddenTax - $orderItem->getBaseHiddenTaxRefunded();
                if (!$item->isLast()) {
                    $availableQty = $orderItemQty - $orderItem->getQtyRefunded();
                    $tax = $creditmemo->roundPrice($tax / $availableQty * $item->getQty());
                    $baseTax = $creditmemo->roundPrice($baseTax / $availableQty * $item->getQty(), 'base');
                    $hiddenTax = $creditmemo->roundPrice($hiddenTax / $availableQty * $item->getQty());
                    $baseHiddenTax = $creditmemo->roundPrice($baseHiddenTax / $availableQty * $item->getQty(), 'base');
                }

                $item->setTaxAmount($tax);
                $item->setBaseTaxAmount($baseTax);
                $item->setHiddenTaxAmount($hiddenTax);
                $item->setBaseHiddenTaxAmount($baseHiddenTax);

                $totalTax += $tax;
                $baseTotalTax += $baseTax;
                $totalHiddenTax += $hiddenTax;
                $baseTotalHiddenTax += $baseHiddenTax;
            }
        }

        $invoice = $creditmemo->getInvoice();

        if ($invoice) {
            //recalculate tax amounts in case if refund shipping value was changed
            if ($order->getBaseShippingAmount() && $creditmemo->getBaseShippingAmount()) {
                $taxFactor = $creditmemo->getBaseShippingAmount() / $order->getBaseShippingAmount();
                $shippingTaxAmount = $invoice->getShippingTaxAmount() * $taxFactor;
                $baseShippingTaxAmount = $invoice->getBaseShippingTaxAmount() * $taxFactor;
                $totalHiddenTax += $invoice->getShippingHiddenTaxAmount() * $taxFactor;
                $baseTotalHiddenTax += $invoice->getBaseShippingHiddenTaxAmount() * $taxFactor;
                $shippingTaxAmount = $creditmemo->roundPrice($shippingTaxAmount);
                $baseShippingTaxAmount = $creditmemo->roundPrice($baseShippingTaxAmount, 'base');
                $totalHiddenTax = $creditmemo->roundPrice($totalHiddenTax);
                $baseTotalHiddenTax = $creditmemo->roundPrice($baseTotalHiddenTax, 'base');
                $totalTax += $shippingTaxAmount;
                $baseTotalTax += $baseShippingTaxAmount;
            }
        } else {
            $orderShippingAmount = $order->getShippingAmount();
            $baseOrderShippingAmount = $order->getBaseShippingAmount();

            $baseOrderShippingRefundedAmount = $order->getBaseShippingRefunded();

            $shippingTaxAmount = 0;
            $baseShippingTaxAmount = 0;
            $shippingHiddenTaxAmount = 0;
            $baseShippingHiddenTaxAmount = 0;

            $shippingDelta = $baseOrderShippingAmount - $baseOrderShippingRefundedAmount;

            if ($shippingDelta > $creditmemo->getBaseShippingAmount()) {
                $part = $creditmemo->getShippingAmount() / $orderShippingAmount;
                $basePart = $creditmemo->getBaseShippingAmount() / $baseOrderShippingAmount;
                $shippingTaxAmount = $order->getShippingTaxAmount() * $part;
                $baseShippingTaxAmount = $order->getBaseShippingTaxAmount() * $basePart;
                $shippingHiddenTaxAmount = $order->getShippingHiddenTaxAmount() * $part;
                $baseShippingHiddenTaxAmount = $order->getBaseShippingHiddenTaxAmount() * $basePart;
                $shippingTaxAmount = $creditmemo->roundPrice($shippingTaxAmount);
                $baseShippingTaxAmount = $creditmemo->roundPrice($baseShippingTaxAmount, 'base');
                $shippingHiddenTaxAmount = $creditmemo->roundPrice($shippingHiddenTaxAmount);
                $baseShippingHiddenTaxAmount = $creditmemo->roundPrice($baseShippingHiddenTaxAmount, 'base');
            } elseif ($shippingDelta == $creditmemo->getBaseShippingAmount()) {
                $shippingTaxAmount = $order->getShippingTaxAmount() - $order->getShippingTaxRefunded();
                $baseShippingTaxAmount = $order->getBaseShippingTaxAmount() - $order->getBaseShippingTaxRefunded();
                $shippingHiddenTaxAmount = $order->getShippingHiddenTaxAmount()
                    - $order->getShippingHiddenTaxRefunded();
                $baseShippingHiddenTaxAmount = $order->getBaseShippingHiddenTaxAmount()
                    - $order->getBaseShippingHiddenTaxRefunded();
            }
            $totalTax += $shippingTaxAmount;
            $baseTotalTax += $baseShippingTaxAmount;
            $totalHiddenTax += $shippingHiddenTaxAmount;
            $baseTotalHiddenTax += $baseShippingHiddenTaxAmount;
        }

        $allowedTax = $order->getTaxInvoiced() - $order->getTaxRefunded() - $creditmemo->getTaxAmount();
        $allowedBaseTax = $order->getBaseTaxInvoiced() - $order->getBaseTaxRefunded()
            - $creditmemo->getBaseTaxAmount();
        $allowedHiddenTax = $order->getHiddenTaxInvoiced() + $order->getShippingHiddenTaxAmount()
            - $order->getHiddenTaxRefunded() - $order->getShippingHiddenTaxRefunded();
        $allowedBaseHiddenTax = $order->getBaseHiddenTaxInvoiced() + $order->getBaseShippingHiddenTaxAmount()
            - $order->getBaseHiddenTaxRefunded() - $order->getBaseShippingHiddenTaxRefunded();


        $totalTax = min($allowedTax, $totalTax);
        $baseTotalTax = min($allowedBaseTax, $baseTotalTax);
        $totalHiddenTax = min($allowedHiddenTax, $totalHiddenTax);
        $baseTotalHiddenTax = min($allowedBaseHiddenTax, $baseTotalHiddenTax);

        $creditmemo->setTaxAmount($creditmemo->getTaxAmount() + $totalTax);
        $creditmemo->setBaseTaxAmount($creditmemo->getBaseTaxAmount() + $baseTotalTax);
        $creditmemo->setHiddenTaxAmount($totalHiddenTax);
        $creditmemo->setBaseHiddenTaxAmount($baseTotalHiddenTax);

        $creditmemo->setShippingTaxAmount($shippingTaxAmount);
        $creditmemo->setBaseShippingTaxAmount($baseShippingTaxAmount);

        $creditmemo->setGrandTotal($creditmemo->getGrandTotal() + $totalTax + $totalHiddenTax);
        $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() + $baseTotalTax + $baseTotalHiddenTax);
        return $this;
    }

    /**
     * @param Mage_Sales_Model_Order_Creditmemo $creditmemo
     * @return array
     */
    private function calculateTaxForRefundAdjustment(Mage_Sales_Model_Order_Creditmemo $creditmemo)
    {
        /** @var Mage_Sales_Model_Resource_Order_Item_Collection $orderItems */
        $orderItems = $creditmemo->getOrder()->getItemsCollection();
        $taxPercentage = 0;
        foreach ($orderItems as $item) {
            $taxPercentage = max($taxPercentage, $item->getTaxPercent() / 100);
        }

        $totalAdjustment = $creditmemo->getAdjustmentPositive() - $creditmemo->getAdjustmentNegative();
        $baseTotalAdjustment = $creditmemo->getBaseAdjustmentPositive() - $creditmemo->getBaseAdjustmentNegative();

        // Adjustment values already include tax in my case. Modify calculation if you're entering values without tax
        $totalAdjustmentTax = $totalAdjustment / ($taxPercentage + 1) * $taxPercentage;
        $baseTotalAdjustmentTax = $baseTotalAdjustment / ($taxPercentage + 1) * $taxPercentage;

        $creditmemo->setGrandTotal($creditmemo->getGrandTotal() - $totalAdjustmentTax);
        $creditmemo->setBaseGrandTotal($creditmemo->getBaseGrandTotal() - $baseTotalAdjustmentTax);

        return [$totalAdjustmentTax, $baseTotalAdjustmentTax];
    }
}

Tôi có thể xác nhận điều này hoạt động tốt hơn câu trả lời được chấp nhận cho các phiên bản Magento gần đây (1.9.xx).
Daan van den Bergh

@Fabian, Giải pháp của bạn rất tốt nhưng tại sao nó lại cập nhật tổng phụ của bản ghi nhớ tín dụng?, Như thể tôi không trả lại bất kỳ sản phẩm nào và giao hàng nhưng hoàn lại một số tiền thông qua Điều chỉnh Hoàn tiền sau đó nó hiển thị số tiền thuế từ số tiền hoàn lại điều chỉnh thành tổng phụ.
Yogita

Nó không. mã không tạo ra "tổng phụ"
Fabian Blechschmidt

@FabianBlechschmidt, Bạn nói đúng, mã không chứa tổng phụ, nhưng cách tôi sử dụng - Tôi không hoàn lại tiền vận chuyển hoặc các mặt hàng, vì vậy tổng phụ của tôi ban đầu là 0,00 đô la, tôi chỉ hoàn lại tiền "Điều chỉnh hoàn lại tiền". Sau khi tạo bản ghi nhớ tín dụng khi tôi mở để xem, Nó sẽ hiển thị cho tôi số tiền thuế trong tổng số phụ nhưng tổng phụ sẽ bằng 0 vì tôi không hoàn trả bất kỳ mục nào. Hệ thống của tôi là inc. tiền thuế và khi tôi hoàn lại tiền hoàn trả $ 10,00 ($ 0,65-Thuế). Sau đó, nó hiển thị cho tôi Subtotal = $ 0,65 Hoàn tiền điều chỉnh = $ 10,00 Tổng cộng bao gồm. Thuế = $ 10,00 Thuế = $ 0,65 Tổng cộng Thuế = $ 9,35 Tại sao Tổng phụ bằng 0?
Yogita

Vui lòng mở một câu hỏi mới, mô tả những gì bạn đã làm, những gì đã xảy ra và những gì bạn sẽ được mong đợi.
Fabian Blechschmidt

0

Với việc thiếu trả lời và tiền thưởng hết hạn vào ngày mai, công việc của tôi là như sau:

Nhập Adjustment Refundvới các loại thuế bao gồm.

Lưu ý phân tích trong các ý kiến ​​để bạn tham khảo và khách hàng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.