How To Set Custom Discount Or Fee At Cart In Magento 2 : here i am going to explain , how you can set a discount or fee in cart. it obvious that if you set a discount, you have to subtract the discount amount from the cart price and if you want to set fee on cart price. then it will be added.
1 => first you have to create a sales.xml file on app/code/companyname/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="customdiscount" instance="companyname\module\Model\Quote\Address\Total\CustomDiscount" sort_order="400"/> </group> </section> </config>
2 => create file CustomDiscount.php on this path app\code\companyname\module\Model\Quote\Address\Total
namespace companyname\module\Model\Quote\Address\Total; class CustomDiscount extends \Magento\Quote\Model\Quote\Address\Total\AbstractTotal { /** * @var \Magento\Framework\Pricing\PriceCurrencyInterface */ protected $_priceCurrency; /** * @param \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency [description] */ public function __construct( \Magento\Framework\Pricing\PriceCurrencyInterface $priceCurrency ) { $this->_priceCurrency = $priceCurrency; } 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); $customDiscount = -10; $total->addTotalAmount('customdiscount', $customDiscount); $total->addBaseTotalAmount('customdiscount', $customDiscount); $quote->setCustomDiscount($customDiscount); return $this; } /** * 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' => 'Custom_Discount', 'title' => $this->getLabel(), 'value' => 10 ]; } /** * get label * @return string */ public function getLabel() { return __('Custom Discount'); } }
3 => create file checkout_cart_index.xml on path app\code\companyname\module\view\frontend\layout
<?xml version="1.0"?> <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.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="customdiscount" xsi:type="array"> <item name="component" xsi:type="string">companyname_module/js/view/checkout/summary/custom-discount</item> <item name="sortOrder" xsi:type="string">20</item> <item name="config" xsi:type="array"> <item name="customdiscount" xsi:type="string" translate="true">Custom Discount</item> </item> </item> </item> </item> </item> </argument> </arguments> </referenceBlock> </body> </page>
4 => create another file checkout_index_index.xml on same location.
<?xml version="1.0"?> <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="customdiscount" xsi:type="array"> <item name="component" xsi:type="string">companyname_module/js/view/checkout/cart/totals/custom-discount</item> <item name="sortOrder" xsi:type="string">20</item> <item name="config" xsi:type="array"> <item name="template" xsi:type="string">companyname_module/checkout/cart/totals/custom-discount</item> <item name="title" xsi:type="string" translate="true">Custom Discount</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>
5 => create file custom-discount.js on path app/code/companyname/module/view/frontend/web/js/view/checkout/cart/totals
define( [ 'companyname_module/js/view/checkout/summary/custom-discount' ], function (Component) { 'use strict'; return Component.extend({ /** * @override */ isDisplayed: function () { return true; } }); } );
6 => create file on this path custom-discount.js app/code/companyname/module/view/frontend/web/js/view/checkout/summary
define( [ 'jquery', 'Magento_Checkout/js/view/summary/abstract-total', 'Magento_Checkout/js/model/quote', 'Magento_Checkout/js/model/totals', 'Magento_Catalog/js/price-utils' ], function ($,Component,quote,totals,priceUtils) { "use strict"; return Component.extend({ defaults: { template: 'companyname_module/checkout/summary/custom-discount' }, totals: quote.getTotals(), isDisplayedCustomdiscountTotal : function () { return true; }, getCustomdiscountTotal : function () { var price = 10; return this.getFormattedPrice(price); } }); } );
7 => create file custom-discount.html on path app/code/companyname/module/view/frontend/web/template/checkout/cart/totals
<!-- ko if: isDisplayedCustomdiscountTotal() --> <tr class="totals customdiscount excl"> <th class="mark" colspan="1" scope="row" data-bind="text: title"></th> <td class="amount"> <span class="price" data-bind="text: getCustomdiscountTotal()"></span> </td> </tr> <!-- /ko -->
8 => create file custom-discount.html on path app/code/companyname/module/view/frontend/web/template/checkout/summary
<!-- ko if: isDisplayedCustomdiscountTotal() --> <tr class="totals coupon-discount excl"> <th class="mark" colspan="1" scope="row" data-bind="text: customdiscount"></th> <td class="amount"> <span class="price" data-bind="text: getCustomdiscountTotal(), attr: {'data-th': customdiscount}"></span> </td> </tr> <!-- /ko -->
finally you can see the custom discount amount on your cart and checkout page.
hope so it will help you !
Thank Again.