วิธีเพิ่มค่าธรรมเนียมในการสั่งซื้อผลรวมใน Magento 2


39

ลิงค์ต่อไปนี้จะอธิบาย

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

เพื่อเพิ่มค่าธรรมเนียมในการสั่งซื้อผลรวมใน Magento 1

ตอนนี้ฟังก์ชั่นนี้ถูกย้ายไปที่โมดูล Quoteใน Magento 2

ฉันคิดว่าแนวคิดเดียวกันยังคงเหมือนวิธีรวบรวมและดึงข้อมูล มีใครลองสิ่งนี้ใน Magento 2 บ้างไหม?


ใน magneto2 ที่ยื่นจากการอ้างถึงคำสั่งถูกลบหรือไม่ทำงาน แต่ฉันไม่แน่ใจเกี่ยวกับการรวบรวมผลรวม
Pradeep Kumar

2
คำถามนี้กว้างเกินไปโปรดพยายามเจาะจงให้มากขึ้น คุณลองทำอะไรไปแล้ว?
Sander Mangel

magecomp.com/magento-2-extra-fee.htmlส่วนขยายฟรี
Gaurav Jain

1
ฉันพัฒนาโมดูลเพื่อเพิ่มค่าธรรมเนียมพิเศษในการสั่งซื้อทั้งหมด ค่าธรรมเนียมพิเศษนี้จะแสดงตามลำดับใบแจ้งหนี้และเครดิต คุณสามารถดาวน์โหลดได้จาก GitHub: github.com/mageprince/magento2-extrafee
Prince Patel

สามารถใช้โมดูลต่อไปนี้ซึ่งทำงานร่วมกับวิธีการชำระเงินและประเทศที่จัดส่งทั้งหมด - scommerce-mage.com/magento2-surcharge-or-additional-fee.html
user2804

คำตอบ:


101

ทำตามขั้นตอนด้านล่างมันจะช่วยให้คุณในโมดูลของฉันฉันเพิ่งเพิ่มคอลัมน์ค่าธรรมเนียม
นี้จะเพิ่มหนึ่งแถวในรถเข็นรวมเรียกว่าค่าธรรมเนียมและแถบด้านข้างในหน้าเช็คเอาต์
และยังเพิ่มจำนวนค่าธรรมเนียมเป็นจำนวนเงินทั้งหมด ) เมื่อคำสั่งซื้อถูกวางไว้ทั้งหมดจะมีค่าใช้จ่ายและหากคุณลงชื่อเข้าใช้แบบ fronted order คุณจะเห็นแถวใหม่ของค่าธรรมเนียมในบล็อกทั้งหมด แต่ผู้ดูแลระบบยังไม่ได้ดำเนินการถ้ามีคนดำเนินการคุณสามารถโพสต์คำตอบนั้นได้

สร้าง sales.xml ในโฟลเดอร์โมดูล ฯลฯ ของคุณ

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

แอปพลิเค \ รหัส \ Sugarcode \ Test \ มุมมอง \ ส่วนหน้า \ เว็บ \ js \ มุมมอง \ เช็คเอาท์ \ \ ผลรวม \ 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;
            }
        });
    }
);

แอปพลิเค \ รหัส \ Sugarcode \ Test \ มุมมอง \ ส่วนหน้า \ เว็บ \ js \ มุมมอง \ เช็คเอาท์ \ สรุป \ 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());
            }
        });
    }
);

แอปพลิเค \ รหัส \ Sugarcode \ Test \ มุมมอง \ ส่วนหน้า \ เว็บ \ แม่แบบ \ เช็คเอาท์ \ สรุป \ 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 -->

แอปพลิเค \ รหัส \ Sugarcode \ Test \ มุมมอง \ ส่วนหน้า \ เว็บ \ แม่แบบ \ เช็คเอาท์ \ รถเข็น \ รวม \ 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 -->

แอปพลิเค \ รหัส \ Sugarcode \ Test \ รุ่น \ รวม \ 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');
    }
}

แอปพลิเค \ รหัส \ 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>

แอปพลิเค \ รหัส \ Sugarcode \ Test \ มุมมอง \ ส่วนหน้า \ รูปแบบ \ 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>

แอปพลิเค \ รหัส \ Sugarcode \ Test \ มุมมอง \ ส่วนหน้า \ รูปแบบ \ 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>

แอปพลิเค \ รหัส \ Sugarcode \ Test \ มุมมอง \ ส่วนหน้า \ รูปแบบ \ 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>

แอปพลิเค \ รหัส \ Sugarcode \ Test \ บล็อก \ ขาย \ สั่งซื้อ \ 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;
    }

}

เมื่อขั้นตอนข้างต้นเสร็จสิ้นแล้วให้รันคำสั่งด้านล่างสิ่งนี้เป็นสิ่งสำคัญหากไฟล์ js & html ของคุณจะหายไปจากโฟลเดอร์ pub / static ดังนั้นเรียกใช้คำสั่งด้านล่างซึ่งจะสร้างไฟล์ js และ html ในโฟลเดอร์ pub / static

การตั้งค่า bin \ magento: เนื้อหาคงที่: ปรับใช้

หากผลงานยอมรับคำตอบของฉันซึ่งช่วยคนอื่น


16
คุณเขียนโมดูลออกมา ... น่าประทับใจ! +1 สำหรับสิ่งนั้น
Manger Sander

4
praseep ทำได้ดีมาก
Amit Bera

4
สวัสดี Pradeep Kumar บทความที่ดี แต่มีปัญหาหนึ่งกับรหัสนั้นค่าธรรมเนียมเพิ่มขึ้นสองเท่าในยอดรวมทั้งหมดมีวิธีแก้ไขปัญหานี้หรือไม่?
Sunil Patel

3
มีใครแก้ไขข้อผิดพลาดที่ใช้สองครั้งในรหัสด้านบนหรือไม่
Pallavi

4
ฉันขอโทษที่ฉันต้องขอโทษ "ค่าธรรมเนียมสองครั้ง" -Bug เป็นไปได้มากที่สุดเนื่องจาก app \ code \ Sugarcode \ Test \ Model \ Total \ Fee.php ขยาย \ Magento \ Quote \ Model \ Quote \ ที่อยู่ \ Total \ AbstractTotal ตามปกติคุณจะมีที่อยู่สองแห่งในการชำระเงิน (การเรียกเก็บเงินและการจัดส่ง) การบันทึกใบเสนอราคาจะได้รับการเรียกสองครั้ง มีพฤติกรรมที่คล้ายกันใน M1 แต่น่าเสียดายที่ M1-Fix ไม่สามารถใช้งานได้ที่นี่ ...
mybinaryromance

7

ฉันพัฒนาโมดูลที่กำหนดเองเพื่อเพิ่มค่าธรรมเนียมพิเศษในการสั่งซื้อ

ค่าธรรมเนียมพิเศษจะแสดงบนหน้ารถเข็น, หน้าชำระเงินใบแจ้งหนี้และใบรับ นอกจากนี้คุณยังสามารถเลือกประเภทราคาเป็นคงที่และเปอร์เซ็นต์จากการกำหนดค่าผู้ดูแล

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


วิธีเพิ่มค่าธรรมเนียมจากกล่องข้อความprnt.sc/hfsni5
nagendra

ส่วนขยายนี้จะเพิ่มค่าธรรมเนียมสำหรับวิธีการชำระเงินใด ๆ โดยเฉพาะเท่านั้นหรือไม่
Piyush

ยังไม่มีฟังก์ชั่นนี้ไม่รวมอยู่ในโมดูลนี้ ฉันจะเพิ่มฟังก์ชันการทำงานนี้ในโมดูลรุ่นถัดไป
เจ้าชาย Patel

ส่วนขยายนี้จะใช้งานเพื่อเพิ่มค่าธรรมเนียมสำหรับวิธีการชำระเงินใด ๆ เท่านั้นหรือไม่
Mano M

หากมีการเปลี่ยนแปลงมูลค่าค่าธรรมเนียมค่าธรรมเนียมเพิ่มเติมจะไม่แสดงในหน้าเช็คเอาต์
Mano M

3

คำตอบของ Pradeep มีประโยชน์มาก แต่พลาดจุดสำคัญไป

ฟังก์ชั่น Sugarcode \ Test \ Model \ Total :: collect () เรียกว่าสองครั้งโดย Magento's Magento \ Quote \ Model \ QuoteTotalsCollector :: collect () หนึ่งครั้งสำหรับแต่ละที่อยู่ ณ จุดนั้นจะสร้างผลรวมรวมที่เก็บไว้ในตารางใบเสนอราคา มันไม่ปรากฏในการสั่งซื้อหรือในเว็บไซต์ในการเช็คเอาท์

ด้วยเหตุผลนี้จึงเป็นเรื่องสำคัญที่จะต้องเรียกเก็บค่าธรรมเนียมในเวลาเดียวเท่านั้นที่เรียกเก็บ () สิ่งนี้สามารถทำได้โดยการตรวจสอบว่ามีรายการที่จัดส่งใด ๆ :

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

เพิ่มรหัสนี้ที่จุดเริ่มต้นของตัวแปรของคุณ Sugarcode \ Test \ Model \ Total :: รวบรวม ()


2
ยังคงเพิ่มสองครั้ง
nagendra

มีการอัพเดทอะไรบ้าง? มันยังคงเพิ่มค่าธรรมเนียมสองครั้ง ไม่สามารถทำงานได้
hallleron


1

โปรดแสดงความคิดเห็น

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

แอปแบบฟอร์ม\ code \ Sugarcode \ Test \ Model \ Total \ Fee.phpสำหรับปัญหาค่าธรรมเนียมที่กำหนดเองสองครั้ง

หวังว่ามันจะช่วยคุณ !!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.