Cómo agregar una tarifa a los totales de pedidos en Magento 2

39

El siguiente enlace describirá

http://excellencemagentoblog.com/blog/2012/01/27/magento-add-fee-discount-order-total/

agregar tarifa a los totales de pedidos en Magento 1.

Ahora esta funcionalidad se mueve al módulo de Cotización en Magento 2.

Creo que sigue siendo el mismo concepto que los métodos de recopilación y recuperación. ¿Alguien ha intentado esto en Magento 2?

Sivakumar K
fuente
en el conjunto archivado magneto2 desde la cotización hasta el pedido se elimina o no funciona, pero no estoy seguro acerca de recolectar totales
Pradeep Kumar
2
Esta pregunta es demasiado amplia, intenta ser más específico. ¿Qué has intentado hasta ahora?
Sander Mangel
magecomp.com/magento-2-extra-fee.html Extensión GRATUITA
Gaurav Jain
1
Desarrollé un módulo para agregar una tarifa adicional al total del pedido. Esta tarifa adicional se mostrará en orden, factura y tarjeta de crédito. puedes descargar desde GitHub: github.com/mageprince/magento2-extrafee
Prince Patel
Podría usar el siguiente módulo que funciona con todos los métodos de pago y el país de envío: scommerce-mage.com/magento2-surcharge-or-additional-fee.html
user2804

Respuestas:

102

siga los pasos a continuación, lo ayudará, en mi módulo, acabo de agregar la columna de tarifa,
esto agregará una fila en el carrito llamada tarifa total y también la barra lateral en la página de pago
y también agregó la cantidad de tarifa al monto total (valor estático de tarifa que mantuve como 100 ) una vez que el pedido se haya realizado, el total será con tarifa y si está conectado al frente en la vista de orden, puede ver la nueva fila de la tarifa en el bloque total, pero el lado del administrador aún no se implementa si alguien lo implementa, puede publicar esa respuesta

cree sales.xml en la carpeta de su módulo, etc.

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Sales:etc/sales.xsd">
    <section name="quote">
        <group name="totals">

            <item name="fee" instance="Sugarcode\Test\Model\Total\Fee" sort_order="150"/>

        </group>  
    </section>
</config>

app \ code \ Sugarcode \ Test \ view \ frontend \ web \ js \ view \ checkout \ cart \ totals \ fee.js

/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
define(
    [
        'Sugarcode_Test/js/view/checkout/summary/fee'
    ],
    function (Component) {
        'use strict';

        return Component.extend({

            /**
             * @override
             */
            isDisplayed: function () {
                return true;
            }
        });
    }
);

app \ code \ Sugarcode \ Test \ view \ frontend \ web \ js \ view \ checkout \ summary \ fee.js

/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
/*jshint browser:true jquery:true*/
/*global alert*/
define(
    [
        'Magento_Checkout/js/view/summary/abstract-total',
        'Magento_Checkout/js/model/quote',
        'Magento_Catalog/js/price-utils',
        'Magento_Checkout/js/model/totals'
    ],
    function (Component, quote, priceUtils, totals) {
        "use strict";
        return Component.extend({
            defaults: {
                isFullTaxSummaryDisplayed: window.checkoutConfig.isFullTaxSummaryDisplayed || false,
                template: 'Sugarcode_Test/checkout/summary/fee'
            },
            totals: quote.getTotals(),
            isTaxDisplayedInGrandTotal: window.checkoutConfig.includeTaxInGrandTotal || false,
            isDisplayed: function() {
                return this.isFullMode();
            },
            getValue: function() {
                var price = 0;
                if (this.totals()) {
                    price = totals.getSegment('fee').value;
                }
                return this.getFormattedPrice(price);
            },
            getBaseValue: function() {
                var price = 0;
                if (this.totals()) {
                    price = this.totals().base_fee;
                }
                return priceUtils.formatPrice(price, quote.getBasePriceFormat());
            }
        });
    }
);

app \ code \ Sugarcode \ Test \ view \ frontend \ web \ template \ checkout \ summary \ fee.html

<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<!-- ko -->

  <tr class="totals fee excl">
        <th class="mark" scope="row">
            <span class="label" data-bind="text: title"></span>
            <span class="value" data-bind="text: getValue()"></span>
        </th>
        <td class="amount">

            <span class="price"
                  data-bind="text: getValue(), attr: {'data-th': title}"></span>


        </td>
    </tr>   

<!-- /ko -->

app \ code \ Sugarcode \ Test \ view \ frontend \ web \ template \ checkout \ cart \ totals \ fee.html

<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<!-- ko -->
<tr class="totals fee excl">
    <th class="mark" colspan="1" scope="row" data-bind="text: title"></th>
    <td class="amount">
        <span class="price" data-bind="text: getValue()"></span>
    </td>
</tr>
<!-- /ko -->

app \ code \ Sugarcode \ Test \ Model \ Total \ Fee.php

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Sugarcode\Test\Model\Total;


class Fee extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal
{
   /**
     * Collect grand total address amount
     *
     * @param \Magento\Quote\Model\Quote $quote
     * @param \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment
     * @param \Magento\Quote\Model\Quote\Address\Total $total
     * @return $this
     */
    protected $quoteValidator = null; 

    public function __construct(\Magento\Quote\Model\QuoteValidator $quoteValidator)
    {
        $this->quoteValidator = $quoteValidator;
    }
  public function collect(
        \Magento\Quote\Model\Quote $quote,
        \Magento\Quote\Api\Data\ShippingAssignmentInterface $shippingAssignment,
        \Magento\Quote\Model\Quote\Address\Total $total
    ) {
        parent::collect($quote, $shippingAssignment, $total);


        $exist_amount = 0; //$quote->getFee(); 
        $fee = 100; //Excellence_Fee_Model_Fee::getFee();
        $balance = $fee - $exist_amount;

        $total->setTotalAmount('fee', $balance);
        $total->setBaseTotalAmount('fee', $balance);

        $total->setFee($balance);
        $total->setBaseFee($balance);

        $total->setGrandTotal($total->getGrandTotal() + $balance);
        $total->setBaseGrandTotal($total->getBaseGrandTotal() + $balance);


        return $this;
    } 

    protected function clearValues(Address\Total $total)
    {
        $total->setTotalAmount('subtotal', 0);
        $total->setBaseTotalAmount('subtotal', 0);
        $total->setTotalAmount('tax', 0);
        $total->setBaseTotalAmount('tax', 0);
        $total->setTotalAmount('discount_tax_compensation', 0);
        $total->setBaseTotalAmount('discount_tax_compensation', 0);
        $total->setTotalAmount('shipping_discount_tax_compensation', 0);
        $total->setBaseTotalAmount('shipping_discount_tax_compensation', 0);
        $total->setSubtotalInclTax(0);
        $total->setBaseSubtotalInclTax(0);
    }
    /**
     * @param \Magento\Quote\Model\Quote $quote
     * @param Address\Total $total
     * @return array|null
     */
    /**
     * Assign subtotal amount and label to address object
     *
     * @param \Magento\Quote\Model\Quote $quote
     * @param Address\Total $total
     * @return array
     * @SuppressWarnings(PHPMD.UnusedFormalParameter)
     */
    public function fetch(\Magento\Quote\Model\Quote $quote, \Magento\Quote\Model\Quote\Address\Total $total)
    {
        return [
            'code' => 'fee',
            'title' => 'Fee',
            'value' => 100
        ];
    }

    /**
     * Get Subtotal label
     *
     * @return \Magento\Framework\Phrase
     */
    public function getLabel()
    {
        return __('Fee');
    }
}

app \ code \ Sugarcode \ Test \ etc \ module.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/Module/etc/module.xsd">
    <module name="Sugarcode_Test" setup_version="2.0.6" schema_version="2.0.6">
        <sequence>
            <module name="Magento_Sales"/>
            <module name="Magento_Quote"/>
            <module name="Magento_Checkout"/>
        </sequence>
    </module>
</config>

app \ code \ Sugarcode \ Test \ view \ frontend \ layout \ checkout_cart_index.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="checkout.cart.totals">
            <arguments>
                <argument name="jsLayout" xsi:type="array">
                    <item name="components" xsi:type="array">
                        <item name="block-totals" xsi:type="array">
                            <item name="children" xsi:type="array">


                                <item name="fee" xsi:type="array">
                                    <item name="component"  xsi:type="string">Sugarcode_Test/js/view/checkout/cart/totals/fee</item>
                                    <item name="sortOrder" xsi:type="string">20</item>
                                    <item name="config" xsi:type="array">
                                         <item name="template" xsi:type="string">Sugarcode_Test/checkout/cart/totals/fee</item>
                                        <item name="title" xsi:type="string" translate="true">Fee</item>
                                    </item>
                                </item>

                            </item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

app \ code \ Sugarcode \ Test \ view \ frontend \ layout \ checkout_index_index.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="checkout.root">
            <arguments>
                <argument name="jsLayout" xsi:type="array">
                    <item name="components" xsi:type="array">
                        <item name="checkout" xsi:type="array">
                            <item name="children" xsi:type="array">

                                <item name="sidebar" xsi:type="array">
                                    <item name="children" xsi:type="array">
                                        <item name="summary" xsi:type="array">
                                            <item name="children" xsi:type="array">
                                                <item name="totals" xsi:type="array">
                                                    <item name="children" xsi:type="array">
                                                       <item name="fee" xsi:type="array">
                                                            <item name="component"  xsi:type="string">Sugarcode_Test/js/view/checkout/cart/totals/fee</item>
                                                            <item name="sortOrder" xsi:type="string">20</item>
                                                            <item name="config" xsi:type="array">
                                                                 <item name="template" xsi:type="string">Sugarcode_Test/checkout/cart/totals/fee</item>
                                                                <item name="title" xsi:type="string" translate="true">Fee</item>
                                                            </item>
                                                        </item>
                                                    </item>
                                                </item>
                                                <item name="cart_items" xsi:type="array">
                                                    <item name="children" xsi:type="array">
                                                        <item name="details" xsi:type="array">
                                                            <item name="children" xsi:type="array">
                                                                <item name="subtotal" xsi:type="array">
                                                                    <item name="component" xsi:type="string">Magento_Tax/js/view/checkout/summary/item/details/subtotal</item>
                                                                </item>
                                                            </item>
                                                        </item>
                                                    </item>
                                                </item>
                                            </item>
                                        </item>
                                    </item>
                                </item>
                            </item>
                        </item>
                    </item>
                </argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

app \ code \ Sugarcode \ Test \ view \ frontend \ layout \ sales_order_view.xml

<?xml version="1.0"?>
<!--
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */
-->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">

    <body>        
        <referenceContainer name="order_totals">
            <block class="Sugarcode\Test\Block\Sales\Order\Fee" name="fee"/>
        </referenceContainer>
    </body>
</page>

app \ code \ Sugarcode \ Test \ Block \ Sales \ Order \ Fee.php

<?php
/**
 * Copyright © 2015 Magento. All rights reserved.
 * See COPYING.txt for license details.
 */

/**
 * Tax totals modification block. Can be used just as subblock of \Magento\Sales\Block\Order\Totals
 */
namespace Sugarcode\Test\Block\Sales\Order;



class Fee extends \Magento\Framework\View\Element\Template
{
    /**
     * Tax configuration model
     *
     * @var \Magento\Tax\Model\Config
     */
    protected $_config;

    /**
     * @var Order
     */
    protected $_order;

    /**
     * @var \Magento\Framework\DataObject
     */
    protected $_source;

    /**
     * @param \Magento\Framework\View\Element\Template\Context $context
     * @param \Magento\Tax\Model\Config $taxConfig
     * @param array $data
     */
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Tax\Model\Config $taxConfig,
        array $data = []
    ) {
        $this->_config = $taxConfig;
        parent::__construct($context, $data);
    }

    /**
     * Check if we nedd display full tax total info
     *
     * @return bool
     */
    public function displayFullSummary()
    {
        return true;
    }

    /**
     * Get data (totals) source model
     *
     * @return \Magento\Framework\DataObject
     */
    public function getSource()
    {
        return $this->_source;
    } 
    public function getStore()
    {
        return $this->_order->getStore();
    }

      /**
     * @return Order
     */
    public function getOrder()
    {
        return $this->_order;
    }

    /**
     * @return array
     */
    public function getLabelProperties()
    {
        return $this->getParentBlock()->getLabelProperties();
    }

    /**
     * @return array
     */
    public function getValueProperties()
    {
        return $this->getParentBlock()->getValueProperties();
    }

    /**
     * Initialize all order totals relates with tax
     *
     * @return \Magento\Tax\Block\Sales\Order\Tax
     */
     public function initTotals()
    {

        $parent = $this->getParentBlock();
        $this->_order = $parent->getOrder();
        $this->_source = $parent->getSource();

        $store = $this->getStore();

        $fee = new \Magento\Framework\DataObject(
                [
                    'code' => 'fee',
                    'strong' => false,
                    'value' => 100,
                    //'value' => $this->_source->getFee(),
                    'label' => __('Fee'),
                ]
            );

            $parent->addTotal($fee, 'fee');
           // $this->_addTax('grand_total');
            $parent->addTotal($fee, 'fee');


            return $this;
    }

}

una vez que se hayan realizado los pasos anteriores, ejecute el siguiente comando, esto es importante; de ​​lo contrario, faltarán sus archivos js y html en la carpeta pub / static. Entonces ejecute el siguiente comando que creará el archivo js y html en la carpeta pub / static

bin \ magento setup: static-content: deploy

si funciona acepta mi respuesta que ayuda a otros

Pradeep Kumar
fuente
16
escribiste el módulo ... ¡impresionante! +1 por eso
Sander Mangel
44
Oración bien hecha
Amit Bera
44
hola Pradeep Kumar, excelente artículo, pero hay un problema con ese código, agregue dos veces al total general, ¿hay alguna solución para esto?
Sunil Patel
3
¿Alguien ha solucionado el error de dos veces aplicado en el código anterior?
Pallavi el
44
Lo siento, tengo que disculparme. El error "Two Times Fee" probablemente se deba al hecho de que app \ code \ Sugarcode \ Test \ Model \ Total \ Fee.php extiende \ Magento \ Quote \ Model \ Quote \ Address \ Total \ AbstractTotal. Como normalmente tiene dos direcciones en el proceso de pago (facturación y envío), se guardará la cotización dos veces. Hubo un comportamiento similar en M1, desafortunadamente el M1-Fix no es aplicable aquí ...
mybinaryromance
7

Desarrollé un módulo personalizado para agregar una tarifa adicional al pedido.

La tarifa adicional se mostrará en la página del carrito, en la página de pago, en la factura y en la tarjeta de crédito . También puede seleccionar el tipo de precio a fijo y el porcentaje desde la configuración del administrador.

https://github.com/mageprince/magento2-extrafee/

Príncipe Patel
fuente
Cómo agregar una tarifa desde el cuadro de texto prnt.sc/hfsni5
nagendra
¿Esta extensión funcionará para agregar una tarifa solo por algún método de pago en particular?
Piyush
No todavía esta funcionalidad no incluida en este módulo. Agregaré esta funcionalidad en la próxima versión del módulo.
Prince Patel
¿Esta extensión funcionará para agregar una tarifa por cualquier método de pago en particular solo .....
Mano M
Si cambia el valor de la tarifa, la tarifa adicional no se refleja en la página de pago.
Mano M
3

La respuesta de Pradeep es muy útil, pero pierde un punto importante.

Magento's Magento \ Quote \ Model \ QuoteTotalsCollector :: collect () llama dos veces a la función Sugarcode \ Test \ Model \ Total :: collect (), una vez por cada dirección. En ese punto, crea un total combinado que se almacena en la tabla de cotizaciones. No aparece en el pedido, ni en el sitio web en el pago.

Por esta razón, es importante cobrar la tarifa solo una de las veces que se llama a collect (). Esto se puede hacer verificando si hay artículos enviados disponibles:

    $items = $shippingAssignment->getItems();
    if (!count($items)) {
        return $this;
    }

Agregue este código al comienzo de su variante de Sugarcode \ Test \ Model \ Total :: collect ()

Patrick van Bergen
fuente
2
sigue agregando dos veces
nagendra 02 de
¿Algún avance en esto? Todavía está agregando la tarifa dos veces. No puedo hacer que funcione desafortunadamente.
Hallleron
1

por favor comenta

        $total->setGrandTotal($total->getGrandTotal() + $balance);

formulario de aplicación \ code \ Sugarcode \ Test \ Model \ Total \ Fee.php por problema de doble tarifa personalizada

¡¡Espero que te ayude!!

Rutvee Sojitra
fuente