Come rendere tassa su ordinazione imponibili
-
16-10-2019 - |
Domanda
Ho usato questo PayPal / pagamento estensione Fee per aggiungere una carica per un metodo di pagamento.
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
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.
-
È 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/
-
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.