Domanda

Ho usato questo PayPal / pagamento estensione Fee per aggiungere una carica per un metodo di pagamento.

entrare descrizione dell'immagine qui

Il problema è che imposta (21%) non viene calcolato per Payment Charge. Il plugin non lo supporta. Potreste darmi qualche suggerimento come potrei estendere il plugin in modo che l'imposta è calcolata per la carica di pagamento e inclusa nella fila fiscale (si può vedere nell'immagine).

EDIT: Credo che, questa è la classe dove ho bisogno di modificare il metodo di raccolta:

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;
    }
}

Probabilmente anche queste esigenze classi per essere personalizzato:

FlyWebdesign_PaypalFee_Model_Sales_Order_Creditmemo_Total_Paymentcharge
FlyWebdesign_PaypalFee_Model_Sales_Order_Invoice_Total_Paymentcharge
È stato utile?

Soluzione

Allright, questo è quello che ho ottenuto

Ho modificato FlyWebdesign_PaypalFee_Model_Sales_Quote_Address_Total_Paymentcharge come questo (vedi i quattro commenti segnato climatiche proibitive):

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

Ho modificato system.xml di plugin per aggiungere amministratore classe campo fiscale per la tassa di pagamento. Avanti, non ho effettivamente cambiato le classi del plugin Creditmemo_Total_Paymentcharge e Invoice_Total_Paymentcharge come avevo in mente in precedenza, ma invece ho aggiungere le seguenti riscritture in config.xml del plugin (nella sezione modelli):

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

In questi due nuovi file (copie dei file originali Magento - uno dei quali è: /app/code/core/Mage/Sales/Model/Order/Invoice/Total/Tax.php), ho aggiunto il segue nel metodo di raccolta dei order_invoice_total_tax:

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

E ho aggiunto anche questo metodo per 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;
}

ho aggiunto questo in modo raccogliere dell'altro order_creditmemo_total_tax classe:

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);

Inoltre ho bisogno di fare il seguente script SQL di aggiornamento per il 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();

E ho aggiunto questo in del plugin config.xml - sezione <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>

Per quanto riguarda la mia prova va, questo funziona per me. Tuttavia ci sono ancora alcuni irrisolti (potenziali) problemi che vorrei risolvere.

  • potenziale problema con la quantità di pagamento specificato se la valuta di base non è negozio di moneta (non so come Magento si comporterà in questo caso)

  • importo di cui amministrazione è sempre considerata di escludere fiscale (non esiste alcuna opzione per cambiarlo)

  • Tassa per tassa di pagamento non si verifica in sintesi imposta pieno (se abilitato) come una riga da solo

A proposito la mia versione Magento è 1.7.0.2

Altri suggerimenti

Ho trovato la mia soluzione, per un dev simile.

C'è un

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

in Mage_Tax_Model_Sales_Total_Quote_Tax

quindi basta chiamare

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

nei tuoi Totali personalizzati

Hm, sarebbe forse meglio per cercare soluzioni alternative.

  1. È possibile modifiy Magento lo shopping regole Cart Price aggiungere le tasse invece di sconti http://php.quicoto.com/extra-fee-shopping-cart-price-rules-magento/

  2. Quindi è possibile aggiungere una regola dicendo: se il metodo di pagamento è, aggiunge la tassa al carrello. Quella tassa, sarà visualizzato stessa vostra carica pagamento. È possibile tradurre quel campo.

In questo modo l'imposta sarà calcolata a pagamento anche.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top