Apakah mungkin untuk mengembalikan pajak atas pengembalian sebagian pesanan?

8

Saat mengeluarkan Memo Kredit (alias pengembalian uang), Magento secara otomatis mengembalikan pajak atas pengiriman dan produk, tetapi TIDAK pada nilai yang dimasukkan dalam bidang "Penyesuaian pengembalian dana" (alias pengembalian sebagian).

Apakah mungkin untuk mengonfigurasi Magento sehingga secara otomatis mengembalikan pajak atas nilai yang dimasukkan dalam bidang pengembalian penyesuaian?

Referensi: masukkan deskripsi gambar di sini

momen dipol
sumber

Jawaban:

3

Anda akan menemukan kode yang berhubungan dengan ini di kelas Mage_Sales_Model_Order_Creditmemo_Total_Tax.

Baris kode $part = $creditmemo->getShippingAmount()/$orderShippingAmount;(terletak di baris 116) dengan jelas menunjukkan bahwa kode ini dikodekan khusus untuk hanya menghitung pajak sesuai dengan bidang shippingAmount dari formulir creditMemo.

Perubahan yang jelas adalah menyesuaikan kode itu untuk juga menggunakan bidang "Adjustment refund".

Anda tidak dapat benar-benar menulis ulang kelas ini, karena cara magento membuat instance sebagai bagian dari subsistem kolektor total, dalam perhitungan creditmemo.

Namun Anda dapat menyesuaikan kolektor untuk menggunakan versi kelas Anda sendiri, sehingga semuanya tidak hilang.

Jadi, dalam modul Anda sendiri, Anda akan menempatkan kode berikut di config.xml. Itu masuk ke dalam <global>elemen

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

Sekarang Anda akan membuat file kelas NAMESPACE/MODULE/Model/Order/Creditmemo/Total/Tax, yang memperpanjang file inti.

class NAMESPACE_MODULE_Model_Order_Creditmemo_Total_Tax extends Mage_Sales_Model_Order_Creditmemo_Total_Tax

Anda perlu menyalin seluruh metode `kumpulkan 'dari kelas inti ke file baru Anda.

Tambahkan kode berikut di baris 114 (tepat setelah kode $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 **/

dan sesuaikan garis 116 dari $part = $creditmemo->getShippingAmount()/$orderShippingAmount;ke$part = $adjustment/$orderShippingAmount;

Ini kemudian akan secara efektif menggunakan Jumlah Pengiriman atau Jumlah Penyesuaian dalam perhitungan.

ProxiBlue
sumber
Terima kasih! Tetapi jika saya mengerti benar, ini hanya berfungsi jika ada biaya pengiriman. Ini tidak akan berfungsi tanpa biaya pengiriman.
Simon
6

Masalahnya adalah, Magento itu tidak tahu faktor pajak apa yang digunakan. Ketika tidak ada produk yang dikembalikan, tidak ada persentase pajak.

Saya memperbaiki masalah dengan hanya menggunakan persentase pajak tertinggi yang dapat saya temukan dalam produk, jangan ragu untuk menyesuaikan dengan kasus penggunaan Anda.

Pajak dihitung dalam CalculTaxForRefundAdjustment di akhir kelas.

config.xml

<?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>

app / code / local / Project / 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];
    }
}
Fabian Blechschmidt
sumber
Saya dapat mengonfirmasi ini berfungsi lebih baik daripada jawaban yang diterima untuk versi Magento terbaru (1.9.xx).
Daan van den Bergh
@Fabian, Solusi Anda baik tetapi mengapa pembaruan subtotal dari memo kredit ?, Seolah-olah saya tidak mengembalikan produk dan pengiriman tetapi mengembalikan sejumlah uang melalui Adjustment Refund maka itu menunjukkan jumlah pajak dari penyesuaian jumlah pengembalian dana ke subtotal.
Yogita
Tidak. kode tidak bertentangan dengan "subtotal"
Fabian Blechschmidt
@FabianBlechschmidt, Anda benar, kode tidak mengandung subtotal, Tapi bagaimana saya menggunakannya - Saya tidak mengembalikan biaya pengiriman atau barang, jadi subtotal saya awalnya $ 0,00, saya hanya mengembalikan "Adjustment Refund". Setelah pembuatan memo kredit ketika saya membukanya untuk dilihat, itu akan menunjukkan jumlah pajak dalam subtotal tetapi subtotalnya harus nol karena saya tidak mengembalikan barang apa pun. Sistem saya termasuk pajak dan ketika saya mengembalikan Pengembalian uang pengganti $ 10.00 ($ 0,65-Pajak). Kemudian tunjukkan pada saya Subtotal = $ 0,65 Pengembalian Dana Penyesuaian = $ 10,00 Total keseluruhan termasuk Pajak = $ 10,00 Pajak = $ 0,65 Total keseluruhan Tidak termasuk Pajak = $ 9,35 Mengapa Subtotal nol?
Yogita
Silakan buka pertanyaan baru, jelaskan apa yang telah Anda lakukan, apa yang terjadi dan apa yang Anda harapkan.
Fabian Blechschmidt
0

Dengan tidak adanya balasan dan karunia kedaluwarsa besok, pekerjaan saya adalah sebagai berikut:

Masukkan Adjustment Refunddengan termasuk pajak.

Perhatikan rincian komentar untuk referensi Anda dan pelanggan.

SR_Magento
sumber