Cách thêm phí để đặt hàng tổng số trong Magento 2


39

Các liên kết sau đây sẽ mô tả

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

để thêm phí để đặt hàng tổng số trong Magento 1.

Bây giờ chức năng này được chuyển sang mô-đun Trích dẫn trong Magento 2.

Tôi nghĩ rằng vẫn còn khái niệm như phương pháp thu thập và tìm nạp. Có ai đã thử điều này trong Magento 2 chưa?


trong tập tin Magneto2 từ trích dẫn đến đơn đặt hàng bị xóa hoặc không hoạt động, nhưng tôi không chắc chắn về việc thu thập tổng số
Pradeep Kumar

2
Câu hỏi này quá rộng, hãy cố gắng cụ thể hơn. Bạn đã thử những gì cho đến nay?
Sander Mangel

magecomp.com/magento-2-extra-fee.html Tiện ích mở rộng MIỄN PHÍ
Gaurav Jain

1
Tôi đã phát triển mô-đun để thêm phí để đặt hàng tổng số. Khoản phí bổ sung này sẽ hiển thị theo thứ tự, hóa đơn và tín dụng. bạn có thể tải xuống từ GitHub: github.com/mageprince/magento2-extrafee
Hoàng tử Patel

Có thể sử dụng mô-đun sau hoạt động với tất cả các phương thức thanh toán và quốc gia giao hàng - sc Commerce-mage.com/magento2-surcharge-or-additable-fee.html
user2804

Câu trả lời:


102

hãy làm theo các bước dưới đây, nó sẽ giúp bạn, trong mô-đun của tôi, tôi vừa thêm cột phí,
điều này sẽ thêm một hàng trong tổng phí gọi là phí và thanh bên trong trang thanh toán
và cũng thêm số tiền phí vào tổng số tiền (giá trị tĩnh tôi giữ là 100 ) một khi đơn hàng được đặt tổng cộng sẽ có phí và nếu bạn đã đăng nhập ở phía trước trong chế độ xem theo thứ tự, bạn có thể thấy hàng mới của phí trong tổng khối nhưng phía quản trị viên chưa thực hiện nếu ai đó thực hiện, bạn có thể đăng câu trả lời đó

tạo thư mục bán hàng trong thư mục mô-đun của bạn

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

ứng dụng \ 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;
            }
        });
    }
);

ứng dụng \ code \ Sugarcode \ Test \ view \ frontend \ web \ js \ view \ checkout \ Tóm tắt \ 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());
            }
        });
    }
);

ứng dụng \ code \ Sugarcode \ Test \ view \ frontend \ web \ template \ checkout \ Tóm tắt \ 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 -->

ứng dụng \ 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 -->

ứng dụng \ code \ Sugarcode \ Test \ Model \ Total \ Charge.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');
    }
}

ứng dụng \ 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>

ứng dụng \ 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>

ứng dụng \ 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>

ứng dụng \ 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>

ứng dụng \ code \ Sugarcode \ Test \ Block \ Sales \ Order \ Charge.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;
    }

}

Một khi các bước trên được thực hiện, hãy chạy bên dưới lệnh này, điều này rất quan trọng, các tệp js & html của bạn sẽ bị thiếu trong thư mục pub / static. Vì vậy, chạy bên dưới lệnh sẽ tạo tập tin js và html trong thư mục pub / static

bin \ magento setup: static-content: triển khai

nếu công việc chấp nhận câu trả lời của tôi giúp người khác


16
bạn đã viết ra mô-đun ... ấn tượng! +1 cho điều đó
Sander Mangel

4
cũng được thực hiện praseep
Amit Bera

4
Xin chào Pradeep Kumar, bài viết tuyệt vời, nhưng có một vấn đề với mã đó, phí cộng hai lần vào tổng số lớn, có giải pháp nào cho việc này không?
Sunil Patel

3
Có ai đã sửa lỗi hai lần áp dụng phí trong mã trên chưa?
Pallavi

4
Tôi xin lỗi, tôi phải xin lỗi. "Phí hai lần" có lẽ là do ứng dụng \ code \ Sugarcode \ Test \ Model \ Total \ Charge.php kéo dài \ Magento \ Trích dẫn \ Model \ Trích dẫn \ Địa chỉ \ Total \ Tóm tắt. Như bạn thường có hai Địa chỉ trong Checkout (Thanh toán và Giao hàng), lưu trữ Trích dẫn được gọi hai lần. Có một hành vi tương tự ở M1, tiếc là M1-Fix không được áp dụng ở đây ...
mybinaryromance

7

Tôi đã phát triển một mô-đun tùy chỉnh để thêm phí để đặt hàng.

Khoản phí bổ sung sẽ hiển thị trên trang giỏ hàng, trang thanh toán, hóa đơn và tín dụng . Bạn cũng có thể chọn loại giá để cố định và tỷ lệ phần trăm từ cấu hình quản trị viên.

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


Cách thêm phí từ hộp văn bản prnt.sc/hfsni5
nagendra

Tiện ích mở rộng này có hoạt động để thêm phí cho bất kỳ phương thức thanh toán cụ thể nào không?
Piyush

Không có chức năng này vẫn không được bao gồm trong mô-đun này. Tôi sẽ thêm chức năng này trong phiên bản tiếp theo của mô-đun.
Hoàng tử Patel

Tiện ích mở rộng này có hoạt động để thêm phí cho bất kỳ phương thức thanh toán cụ thể nào không .....
Mano M

nếu thay đổi giá trị phí, phí bổ sung không phản ánh trong trang thanh toán.
Mano M

3

Câu trả lời của Pradeep rất hữu ích, nhưng bỏ lỡ một điểm quan trọng.

Hàm Sugarcode \ Test \ Model \ Total :: coll () được Magento's Magento gọi là hai lần \ Trích dẫn \ Model \ quoteTotalsCollector :: coll (), một lần cho mỗi địa chỉ. Tại thời điểm đó, nó tạo ra tổng cộng được lưu trữ trong bảng báo giá. Nó không hiển thị theo thứ tự, cũng như trên trang web trong thanh toán.

Vì lý do này, điều quan trọng là thu phí chỉ trong một lần mà thu () được gọi. Điều này có thể được thực hiện bằng cách kiểm tra nếu có bất kỳ mặt hàng nào được vận chuyển:

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

Thêm mã này vào đầu biến thể Sugarcode \ Test \ Model \ Total :: coll ()


2
vẫn thêm hai lần
nagendra

Bất kỳ cập nhật về điều này? Nó vẫn đang thêm phí hai lần. Không thể làm cho nó hoạt động không may.
hallleron


1

hãy bình luận

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

biểu mẫu ứng dụng \ code \ Sugarcode \ Test \ Model \ Total \ Charge.php cho vấn đề phí tùy chỉnh gấp đôi

Hy vọng nó sẽ giúp bạn !!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.