Comment ajouter des frais au total des commandes dans Magento 2

39

Le lien suivant décrira

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

ajouter des frais aux commandes totales dans Magento 1.

Maintenant, cette fonctionnalité est déplacée vers le module Quote dans Magento 2.

Je pense toujours au même concept que les méthodes de collecte et de récupération. Est-ce que quelqu'un a déjà essayé cela dans Magento 2?

Sivakumar K
la source
dans magneto2 filedset de devis à la commande est supprimé ou ne fonctionne pas, mais je ne suis pas sûr de collecter des totaux
Pradeep Kumar
2
Cette question est trop large, essayez d’être plus précis. Qu'avez-vous essayé jusqu'à présent?
Sander Mangel
magecomp.com/magento-2-extra-fee.html Extension GRATUITE
Gaurav Jain
1
J'ai développé le module pour ajouter des frais supplémentaires au total de la commande. Ces frais supplémentaires s'afficheront dans l'ordre, la facture et le crédit. vous pouvez télécharger depuis GitHub: github.com/mageprince/magento2-extrafee
Prince Patel
Pourrait utiliser le module suivant qui fonctionne avec tous les modes de paiement et pays d'expédition - scommerce-mage.com/magento2-surcharge-or-additional-fee.html
user2804

Réponses:

102

suivez les étapes ci-dessous cela vous aidera, dans mon module, je viens d’ajouter une colonne de frais,
cela ajoutera une ligne dans le total du panier appelé frais et barre latérale dans la page de paiement,
ainsi que le montant des frais ajouté au montant total (valeur statique des frais ) une fois que la commande est passée, le total sera facturé. Si vous êtes connecté en vue de la commande, vous pouvez voir la nouvelle ligne de la redevance en bloc total, mais le côté administrateur n'est pas encore implémenté si quelqu'un l'implémente, vous pouvez poster cette réponse.

créer sales.xml dans votre dossier module 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 \ Modèle \ 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;
    }

}

une fois que les étapes ci-dessus sont terminées, exécutez la commande ci-dessous, il est important que vos fichiers js & html soient absents du dossier pub / static. Alors exécutez la commande ci-dessous qui créera un fichier js et html dans le dossier pub / static

bin \ magento setup: contenu statique: deploy

si les travaux acceptent ma réponse qui aide les autres

Pradeep Kumar
la source
16
vous avez écrit le module ... impressionnant! +1 pour cela
Sander Mangel
4
praseep bien fait
Amit Bera
4
bonjour Pradeep Kumar, excellent article, mais il y a un problème avec ce code: les frais s'ajoutent deux fois au total général, existe-t-il une solution pour cela?
Sunil Patel
3
Quelqu'un a-t-il corrigé le bogue appliqué aux deux frais de temps dans le code ci-dessus?
Pallavi
4
Je suis désolé, je dois m'excuser. Le bug "Two Times Fee" est probablement dû au fait que app \ code \ Sugarcode \ Test \ Modèle \ Total \ Fee.php s'étend à \ Magento \ Quote \ Modèle \ Quote \ Adresse \ Total \ AbstractTotal. Comme vous avez normalement deux adresses à la caisse (facturation et expédition), la sauvegarde du devis est appelée deux fois. Il y avait un comportement similaire dans M1, malheureusement le M1-Fix n'est pas applicable ici ...
mybinaryromance
7

J'ai développé un module personnalisé pour ajouter des frais supplémentaires à la commande.

Les frais supplémentaires s'afficheront sur la page du panier, la page de paiement, la facture et le crédit . Vous pouvez également sélectionner un type de prix fixe et un pourcentage dans la configuration de l'administrateur.

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

Prince Patel
la source
Comment ajouter des frais dans la zone de texte prnt.sc/hfsni5
Nagendra
Cette extension fonctionnera-t-elle uniquement pour ajouter des frais pour un mode de paiement particulier?
Piyush
Non, cette fonctionnalité n'est toujours pas incluse dans ce module. Je vais ajouter cette fonctionnalité dans la prochaine version du module.
Prince Patel
Cette extension fonctionnera-t-elle uniquement pour ajouter des frais pour un mode de paiement particulier ...
Mano M
si la valeur des frais de modification est modifiée, les frais supplémentaires ne sont pas reflétés dans la page de paiement.
Mano M
3

La réponse de Pradeep est très utile, mais manque un point important.

La fonction Sugarcode \ Test \ Modèle \ Total :: collect () est appelée deux fois par Magento \ Quote \ Model \ QuoteTotalsCollector :: collect (), une fois pour chaque adresse. À ce stade, il crée un total combiné qui est stocké dans la table de devis. Il n'apparaît pas dans la commande, ni sur le site Web dans la caisse.

Pour cette raison, il est important de collecter les frais uniquement lors de l'appel de collect (). Cela peut être fait en vérifiant si des articles livrés sont disponibles:

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

Ajoutez ce code au début de votre variante de Sugarcode \ Test \ Model \ Total :: collect ()

Patrick van Bergen
la source
2
toujours ajouter deux fois
Nagendra
Une mise à jour pour ceci? Il ajoute encore les frais deux fois. Je ne peux pas le faire fonctionner malheureusement.
Hallleron
1

commentez s'il vous plaît

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

formulaire app \ code \ Sugarcode \ Test \ Modèle \ Total \ Fee.php pour une émission de double taxe personnalisée

J'espère que cela vous aidera !!

Rutvee Sojitra
la source