Cómo hacer que la tarifa de aduana gravable
-
16-10-2019 - |
Pregunta
he utilizado este PayPal / Pago Cuota de extensión añadir un cargo por un método de pago.
El problema es que el impuesto (21%) no se calcula para la carga de pago. El plug-in no lo soporta. ¿Me podría dar algunas pistas de cómo podría extender el plugin para que el impuesto se calcula para la carga de pago y se incluye en la fila de impuestos (se puede ver en la imagen).
EDIT: Creo, esta es la clase en la que tengo que modificar el método de cobro revertido:
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;
}
}
probablemente también estas necesidades clases para ser personalizadas:
FlyWebdesign_PaypalFee_Model_Sales_Order_Creditmemo_Total_Paymentcharge
FlyWebdesign_PaypalFee_Model_Sales_Order_Invoice_Total_Paymentcharge
Solución
De acuerdo, esto es lo que tengo
He modificado FlyWebdesign_PaypalFee_Model_Sales_Quote_Address_Total_Paymentcharge como esto (ver los comentarios marcada cuatro clime):
<?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;
}
}
He modificado system.xml de plugin para agregar la clase de impuestos campo de administración de la tarifa de pago. A continuación, en realidad no he cambiado de clase del plugin Creditmemo_Total_Paymentcharge y Invoice_Total_Paymentcharge como que tenía en mente con anterioridad, pero en cambio tengo añadir las siguientes reescrituras en config.xml de plug-in (en la sección modelos):
<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>
En estos dos nuevos archivos (copias de los archivos de origen originales Magento - una de ellas es: /app/code/core/Mage/Sales/Model/Order/Invoice/Total/Tax.php), he añadido el siguiente en método de colecta de order_invoice_total_tax:
if ($this->_canIncludePaymentTax($invoice)) {
$totalTax += $order->getPaymentTaxAmount();
$baseTotalTax += $order->getBasePaymentTaxAmount();
$invoice->setPaymentTaxAmount($order->getPaymentTaxAmount());
$invoice->setBasePaymentTaxAmount($order->getBasePaymentTaxAmount());
}
Y también añadió este método a la clase.
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;
}
I de añadir este en método de colecta de la otra order_creditmemo_total_tax clase:
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);
También es necesario hacer la siguiente secuencia de comandos SQL de actualización para el plugin
<?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();
Y añadí esto en Plugin de config.xml - sección <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 lo que a mi prueba va, esto funciona para mí. Sin embargo todavía hay algunos problemas sin resolver (potenciales) que me gustaría resolver.
-
problema potencial con el monto de pago específico si la moneda base no es tienda de la moneda (no sé cómo se comportará de Magento en tal caso)
-
cantidad especificada en la administración, se considerará siempre excluir el impuesto (no hay opción para cambiarlo)
-
Impuesto de tasa por pago no se produce en el resumen total de impuestos (si está activado) como una fila en su propia
Por cierto mi versión de Magento 1.7.0.2 es
Otros consejos
He encontrado mi solución, para un dev similar.
Hay un
$this->_addAmount($address->getExtraTaxAmount());
$this->_addBaseAmount($address->getBaseExtraTaxAmount());
en Mage_Tax_Model_Sales_Total_Quote_Tax
lo que acaba de llamar
$address->setExtraTaxAmount($address->getExtraTaxAmount() + $taxFeeAmount);
$address->setBaseExtraTaxAmount($address->getBaseExtraTaxAmount() + $taxBaseFeeAmount);
en sus totales personalizados
Hm, sería tal vez mejor para buscar soluciones.
-
Puede modifiy Magento compras reglas carrito precio a tasas de descuentos en restaurantes en vez http://php.quicoto.com/extra-fee-shopping-cart-price-rules-magento/
-
A continuación, puede añadir una regla que dice: si el método de pago es, añade la tarifa a la cesta de la compra. Esta tasa será dsiplayed mismo que su carga de pago. Puede traducir ese campo.
De este modo se calcula el impuesto para la tarifa también.