Question

J'ai utilisé cette PayPal / Paiement extension de frais pour ajouter une charge pour un mode de paiement.

entrer image description ici

Le problème est que la taxe (21%) n'est pas calculé pour la charge de paiement. Le plugin ne supporte pas. Pourriez-vous me donner quelques conseils comment pourrais-je prolonger le plug-in de sorte que la taxe est calculée pour la charge de paiement et inclus dans la ligne d'impôt (on peut le voir dans l'image).

EDIT: Je crois, c'est la classe où je dois modifier la méthode Collect:

class FlyWebdesign_PaypalFee_Model_Sales_Quote_Address_Total_Paymentcharge extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
    public function __construct()
    {
        $this->setCode('payment_charge');
    }

    public function collect(Mage_Sales_Model_Quote_Address $address)
    {
        $address->setPaymentCharge(0);
        $address->setBasePaymentCharge(0);

        $items = $address->getAllItems();
        if (!count($items)) {
            return $this;
        }

        $paymentMethod = $address->getQuote()->getPayment()->getMethod();
        if ($paymentMethod) { 
            $amount = Mage::helper('paymentcharge')->getPaymentCharge($paymentMethod, $address->getQuote());
            $address->setPaymentCharge($amount);
            $address->setBasePaymentCharge($amount);
        }

        $address->setGrandTotal($address->getGrandTotal() + $address->getPaymentCharge());
        $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBasePaymentCharge());
        return $this;
    }

    public function fetch(Mage_Sales_Model_Quote_Address $address)
    {
        $amount = $address->getPaymentCharge();
        if (($amount!=0)) {
            $address->addTotal(array(
                'code' => $this->getCode(),
                'title' => Mage::helper('sales')->__('Payment Charge'),
                'full_info' => array(),
                'value' => $amount
            ));
        }
        return $this;
    }
}

Probablement aussi ces classes doit être adaptée:

FlyWebdesign_PaypalFee_Model_Sales_Order_Creditmemo_Total_Paymentcharge
FlyWebdesign_PaypalFee_Model_Sales_Order_Invoice_Total_Paymentcharge
Était-ce utile?

La solution

Allright, ce que j'ai

J'ai modifié FlyWebdesign_PaypalFee_Model_Sales_Quote_Address_Total_Paymentcharge comme celui-ci (voir les quatre commentaires CLIME marqués):

<?php

/**
 * @category   FlyWebdesign
 * @package    FlyWebdesign_PaypalFee
 */
class FlyWebdesign_PaypalFee_Model_Sales_Quote_Address_Total_Paymentcharge extends Mage_Sales_Model_Quote_Address_Total_Abstract
{
    protected $_calculator = null;

    public function __construct()
    {
        $this->setCode('payment_charge');
        $this->_calculator  = Mage::getSingleton('tax/calculation');
    }

    public function collect(Mage_Sales_Model_Quote_Address $address)
    {
        $address->setPaymentCharge(0);
        $address->setBasePaymentCharge(0);

        $items = $address->getAllItems();
        if (!count($items)) {
            return $this;
        }

        $paymentMethod = $address->getQuote()->getPayment()->getMethod();
        if ($paymentMethod) { 
            $amount = Mage::helper('paymentcharge')->getPaymentCharge($paymentMethod, $address->getQuote());
            $address->setPaymentCharge($amount);
            $address->setBasePaymentCharge($amount);

            /* clime: tax calculation start */
            $calc               = $this->_calculator;
            $store              = $address->getQuote()->getStore();
            $addressTaxRequest  = $calc->getRateRequest(
                $address->getQuote()->getShippingAddress(),
                $address->getQuote()->getBillingAddress(),
                $address->getQuote()->getCustomerTaxClassId(),
                $store
            );

            $paymentTaxClass = Mage::getStoreConfig('payment/'.$paymentMethod.'/payment_tax_class');
            $addressTaxRequest->setProductClassId($paymentTaxClass);

            $rate          = $calc->getRate($addressTaxRequest);
            $taxAmount     = $calc->calcTaxAmount($amount, $rate, false, true);
            $baseTaxAmount = $calc->calcTaxAmount($amount, $rate, false, true);

            $address->setPaymentTaxAmount($taxAmount);
            $address->setBasePaymentTaxAmount($baseTaxAmount);

            $address->setTaxAmount($address->getTaxAmount() + $taxAmount);
            $address->setBaseTaxAmount($address->getBaseTaxAmount() + $baseTaxAmount);
            /* clime: tax calculation end */
        }
        //clime: tax added
        $address->setGrandTotal($address->getGrandTotal() + $address->getPaymentCharge() + $address->getPaymentTaxAmount());
        //clime: tax added
        $address->setBaseGrandTotal($address->getBaseGrandTotal() + $address->getBasePaymentCharge() + $address->getBasePaymentTaxAmount()); 

        return $this;
    }

    public function fetch(Mage_Sales_Model_Quote_Address $address)
    {
        $amount = $address->getPaymentCharge();
        if (($amount!=0)) {
            $address->addTotal(array(
                'code' => $this->getCode(),
                'title' => Mage::helper('sales')->__('Payment Charge'),
                'full_info' => array(),
                'value' => $amount
            ));
        }
        return $this;
    }
}

J'ai modifié le system.xml de plug-in pour ajouter le champ admin classe d'impôt pour les frais de paiement. Ensuite, je n'ai pas réellement changé classes du plugin Creditmemo_Total_Paymentcharge et Invoice_Total_Paymentcharge comme je l'avais à l'esprit auparavant, mais je dois ajouter les réécritures suivantes dans config.xml de plug-in (dans la section modèles):

        <sales>
            <rewrite>
                <order_invoice_total_tax>FlyWebdesign_PaypalFee_Model_Sales_Order_Invoice_Total_Tax</order_invoice_total_tax>
                <order_creditmemo_total_tax>FlyWebdesign_PaypalFee_Model_Sales_Order_Creditmemo_Total_Tax</order_creditmemo_total_tax>
            </rewrite>
        </sales>

Dans ces deux nouveaux fichiers (copies des fichiers source Magento d'origine - l'un d'entre eux étant: /app/code/core/Mage/Sales/Model/Order/Invoice/Total/Tax.php), j'ai ajouté le suivant dans la méthode Collect de order_invoice_total_tax:

    if ($this->_canIncludePaymentTax($invoice)) {
        $totalTax           += $order->getPaymentTaxAmount();
        $baseTotalTax       += $order->getBasePaymentTaxAmount();
        $invoice->setPaymentTaxAmount($order->getPaymentTaxAmount());
        $invoice->setBasePaymentTaxAmount($order->getBasePaymentTaxAmount());
    }

Et je également ajouté cette méthode à la classe.

protected function _canIncludePaymentTax($invoice)
{
    $includePaymentTax = true;
    /**
     * Check payment amount in previous invoices
     */
    foreach ($invoice->getOrder()->getInvoiceCollection() as $previusInvoice) {
        if ($previusInvoice->getPaymentAmount() && !$previusInvoice->isCanceled()) {
            $includePaymentTax = false;
        }
    }
    return $includePaymentTax;
}

J'ai ajouté cette méthode dans Collect de l'autre classe order_creditmemo_total_tax:

if ($invoice = $creditmemo->getInvoice()) {
    $paymentTaxAmount     = $invoice->getPaymentTaxAmount();
    $basePaymentTaxAmount = $invoice->getBasePaymentTaxAmount();
    $totalTax            += $paymentTaxAmount;
    $baseTotalTax        += $basePaymentTaxAmount;
} else {
    $paymentTaxAmount     = $order->getPaymentTaxAmount();
    $basePaymentTaxAmount = $order->getBasePaymentTaxAmount();
    $totalTax            += $paymentTaxAmount;
    $baseTotalTax        += $basePaymentTaxAmount;
}
$creditmemo->setPaymentTaxAmount($paymentTaxAmount);
$creditmemo->setBasePaymentTaxAmount($basePaymentTaxAmount);

J'ai aussi besoin de faire le script de mise à niveau SQL suivante pour le plug-in

<?php
/* @var $installer Mage_Customer_Model_Entity_Setup */

$installer = $this;
$installer->startSetup();

$installer->addAttribute('quote_address', 'payment_tax_amount', array('type' => 'decimal'));
$installer->addAttribute('quote_address', 'base_payment_tax_amount', array('type' => 'decimal'));
$installer->addAttribute('order', 'payment_tax_amount', array('type' => 'decimal'));
$installer->addAttribute('order', 'base_payment_tax_amount', array('type' => 'decimal'));
$installer->addAttribute('invoice', 'payment_tax_amount', array('type' => 'decimal'));
$installer->addAttribute('invoice', 'base_payment_tax_amount', array('type' => 'decimal'));
$installer->addAttribute('creditmemo', 'payment_tax_amount', array('type' => 'decimal'));
$installer->addAttribute('creditmemo', 'base_payment_tax_amount', array('type' => 'decimal'));

$installer->endSetup();

Et j'ajouté ceci dans le config.xml plugin - section <fieldsets><sales_convert_quote_address>

        <payment_tax_amount><to_order>*</to_order></payment_tax_amount>
        <base_payment_tax_amount><to_order>*</to_order></base_payment_tax_amount>

En ce qui concerne mes tests va, cela fonctionne pour moi. Cependant, il y a encore quelques problèmes non résolus (potentiels) que je voudrais résoudre.

  • problème potentiel avec le montant du paiement spécifié si la devise de base ne sont pas monnaie du magasin (pas sûr comment magento se comportera dans ce cas)

  • montant indiqué dans l'admin est toujours considéré comme hors taxe (il n'y a pas possibilité de le changer)

  • taxe pour les frais de paiement ne se produit pas dans le Sommaire de l'impôt (si activé) comme une ligne sur son propre

BTW ma version Magento est 1.7.0.2

Autres conseils

J'ai trouvé ma solution, pour un dev similaire.

Il y a un

    $this->_addAmount($address->getExtraTaxAmount());
    $this->_addBaseAmount($address->getBaseExtraTaxAmount());

dans Mage_Tax_Model_Sales_Total_Quote_Tax

il suffit d'appeler

    $address->setExtraTaxAmount($address->getExtraTaxAmount() + $taxFeeAmount);
    $address->setBaseExtraTaxAmount($address->getBaseExtraTaxAmount() + $taxBaseFeeAmount);

dans vos totaux personnalisés

Hm, il serait peut-être préférable de rechercher des solutions de contournement.

  1. Vous pouvez modifiy magento achats règles de prix de panier pour ajouter des frais Insted de rabais http://php.quicoto.com/extra-fee-shopping-cart-price-rules-magento/

  2. Ensuite, vous pouvez ajouter une règle disant: si le mode de paiement est, ajouter des frais au panier. Ces frais seront dsiplayed même que vos frais de paiement. Vous pouvez traduire ce domaine.

De cette façon, la taxe sera calculée pour les frais aussi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top