Ist es möglich, Steuern auf eine teilweise Rückerstattung der Bestellung zu erstatten?

8

Bei der Ausstellung einer Gutschrift (auch als Rückerstattung bezeichnet) erstattet Magento automatisch Steuern auf Versand und Produkte, ABER NICHT auf Werte, die im Feld "Anpassungsrückerstattung" eingegeben wurden (auch als Teilrückerstattung bezeichnet).

Ist es möglich, Magento so zu konfigurieren, dass automatisch Steuern auf Werte erstattet werden, die im Feld für die Rückerstattung der Anpassung eingegeben wurden?

Referenz: Geben Sie hier die Bildbeschreibung ein

dipole_moment
quelle

Antworten:

3

Den entsprechenden Code finden Sie in der Klasse Mage_Sales_Model_Order_Creditmemo_Total_Tax.

Die Codezeile $part = $creditmemo->getShippingAmount()/$orderShippingAmount;(in Zeile 116) zeigt deutlich, dass diese speziell codiert ist, um nur die Steuern gemäß dem Feld Versandbetrag aus dem creditMemo-Formular zu berechnen.

Die offensichtliche Änderung besteht darin, diesen Code so anzupassen, dass auch das Feld "Anpassungsrückerstattung" verwendet wird.

Sie können diese Klasse nicht neu schreiben, da Magento sie in den CreditMemo-Berechnungen als Teil des Summensammler-Subsystems instanziiert.

Sie können den Kollektor jedoch so anpassen, dass er Ihre eigene Version der Klasse verwendet, damit nicht alles verloren geht.

In Ihrem eigenen Modul platzieren Sie den folgenden Code in der Datei config.xml. Es geht in die <global>Elemente hinein

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

Jetzt erstellen Sie die Klassendatei NAMESPACE/MODULE/Model/Order/Creditmemo/Total/Tax, die die Kerndatei erweitert.

class NAMESPACE_MODULE_Model_Order_Creditmemo_Total_Tax extends Mage_Sales_Model_Order_Creditmemo_Total_Tax

Sie müssen die gesamte Methode "collect" aus der Kernklasse in Ihre neue Datei kopieren.

Fügen Sie den folgenden Code in Zeile 114 hinzu (direkt nach dem Code $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 **/

und stellen Sie die Linie 116 von $part = $creditmemo->getShippingAmount()/$orderShippingAmount;bis ein$part = $adjustment/$orderShippingAmount;

Dadurch wird entweder der Versandbetrag oder der Anpassungsbetrag effektiv in die Berechnung einbezogen.

ProxiBlue
quelle
Vielen Dank! Aber wenn ich das richtig verstehe, funktioniert das nur, wenn Versandkosten anfallen. Ohne Versandkosten funktioniert es nicht.
Simon
6

Das wesentliche Problem ist, dass Magento nicht weiß, welchen Steuerfaktor es verwenden soll. Wenn es keine Produkte gibt, die erstattet werden, gibt es keinen Steuerprozentsatz.

Ich habe das Problem behoben, indem ich nur den höchsten Steuerprozentsatz verwendet habe, den ich in den Produkten finden kann. Sie können sich jederzeit an Ihren Anwendungsfall anpassen.

Die Steuer wird in berechneTaxForRefundAdjustment am Ende der Klasse berechnet.

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
quelle
Ich kann bestätigen, dass dies besser funktioniert als die akzeptierte Antwort für aktuelle Magento-Versionen (1.9.xx).
Daan van den Bergh
@Fabian, Ihre Lösung ist gut, aber warum wird die Zwischensumme der Gutschrift aktualisiert? Als würde ich kein Produkt und keinen Versand zurücksenden, sondern einen bestimmten Betrag über die Anpassungsrückerstattung zurückerstatten, wird der Steuerbetrag vom Anpassungsrückerstattungsbetrag zur Zwischensumme angezeigt.
Yogita
Das tut es nicht. Der Code enthält keine "Zwischensumme"
Fabian Blechschmidt
@FabianBlechschmidt, Sie haben Recht, der Code enthält keine Zwischensumme. Aber wie ich ihn verwende - Ich habe weder Versand noch Artikel erstattet, daher beträgt meine Zwischensumme anfänglich 0,00 USD. Ich erstatte nur "Anpassungsrückerstattung". Nach der Erstellung der Gutschrift, wenn ich diese zur Ansicht öffne, wird der Steuerbetrag in Zwischensumme angezeigt, aber die Zwischensumme sollte Null sein, da ich keinen Artikel erstattet habe. Mein System ist inkl. von Steuern und wenn ich die Nachzahlung erstatte Rückerstattung $ 10,00 ($ 0,65-Steuern). Dann zeigt es mir Zwischensumme = 0,65 $ Anpassungsrückerstattung = 10,00 $ Gesamtsumme Inkl. Steuer = 10,00 USD Steuer = 0,65 USD Gesamtsumme exkl. Steuer = 9,35 USD Warum ist die Zwischensumme Null?
Yogita
Bitte öffnen Sie eine neue Frage, beschreiben Sie, was Sie getan haben, was passiert ist und was Sie erwartet hätten.
Fabian Blechschmidt
0

Da es an Antworten mangelt und das Kopfgeld morgen abläuft, arbeite ich wie folgt:

Geben Sie die Adjustment Refundmit Steuern enthalten.

Beachten Sie die Aufschlüsselung in den Kommentaren für Ihre Referenz und die Kunden.

SR_Magento
quelle