0

I have my own custom discount, and on checkout I can use it. When I place the order, I see that grand total is changed, but me need to show discount. I want to paste it between subtotal and shipping.enter image description here

0

You can override this file in your custom module

vendor/magento/module-sales/Block/Order/Totals.php

and you can override this function _initTotals() only there, you need to create below files.

Create di.xml file here

app/code/Vendor/Module/etc/di.xml

Content for this file is..

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <preference for="Magento\Sales\Block\Order\Totals" type="Vendor\Module\Block\Order\Totals" />
</config>

Create Block file here

app/code/Vendor/Module/Block/Order/Totals.php

Content for this file is..

<?php
namespace Vendor\Module\Block\Order;

use Magento\Sales\Model\Order;

class Totals extends \Magento\Sales\Block\Order\Totals
{
    protected function _initTotals()
    {
        parent::_initTotals();
        $source = $this->getSource();

        $this->_totals = [];
        $this->_totals['subtotal'] = new \Magento\Framework\DataObject(
            ['code' => 'subtotal', 'value' => $source->getSubtotal(), 'label' => __('Subtotal')]
        );


        /*Here you can add your custom code */  
        $this->_totals['custom'] = new \Magento\Framework\DataObject(
            ['code' => 'custom', 'value' => "Custom", 'label' => __('Custom')]
        );
        /*Here you can add your custom code */  

        /**
         * Add shipping
         */
        if (!$source->getIsVirtual() && ((double)$source->getShippingAmount() || $source->getShippingDescription())) {
            $this->_totals['shipping'] = new \Magento\Framework\DataObject(
                [
                    'code' => 'shipping',
                    'field' => 'shipping_amount',
                    'value' => $this->getSource()->getShippingAmount(),
                    'label' => __('Shipping & Handling'),
                ]
            );
        }

        /**
         * Add discount
         */
        if ((double)$this->getSource()->getDiscountAmount() != 0) {
            if ($this->getSource()->getDiscountDescription()) {
                $discountLabel = __('Discount (%1)', $source->getDiscountDescription());
            } else {
                $discountLabel = __('Discount');
            }
            $this->_totals['discount'] = new \Magento\Framework\DataObject(
                [
                    'code' => 'discount',
                    'field' => 'discount_amount',
                    'value' => $source->getDiscountAmount(),
                    'label' => $discountLabel,
                ]
            );
        }

        $this->_totals['grand_total'] = new \Magento\Framework\DataObject(
            [
                'code' => 'grand_total',
                'field' => 'grand_total',
                'strong' => true,
                'value' => $source->getGrandTotal(),
                'label' => __('Grand Total'),
            ]
        );

        /**
         * Base grandtotal
         */
        if ($this->getOrder()->isCurrencyDifferent()) {
            $this->_totals['base_grandtotal'] = new \Magento\Framework\DataObject(
                [
                    'code' => 'base_grandtotal',
                    'value' => $this->getOrder()->formatBasePrice($source->getBaseGrandTotal()),
                    'label' => __('Grand Total to be Charged'),
                    'is_formated' => true,
                ]
            );
        }
        return $this;
    }
}

Hope this will help you!

  • 1
    please use at least a parent::_initTotals combined with some methods for pushing the new element at the right position. With this example you need to take care about every magento update, which may could change the original file. – Ekk4rd Nov 13 at 15:57
  • Approve, if this works for you! Thanks – Kishan Savaliya Nov 13 at 16:12
  • 1
    Thanks you! It's work for me – Віктор Шуст Nov 14 at 9:07
  • You're welcome :) – Kishan Savaliya Nov 14 at 9:08
0

With custom discount you mean, you didnt add a new discount via salesrules or something like this, but added a new total fee, which needs to be applied to the quote totals, to be displayed in the checkout ?

To achieve this you need to create a new total model, and attach it to the totals inside a modules etc/sales.xml.

There are several nice guides how to do this, for example this one:
How to add fee to order totals in Magento 2
or: http://www.blogtreat.com/magento-2-add-extra-fee-to-order-totals/

  • I have column in table 'quote', and when we see success page I add this discount to table 'sales_order', me need only to show it. – Віктор Шуст Nov 13 at 15:42
  • Adding a total should always be done by adding a new total model, any other way is far more complicated, or very bad for further extendability. It sounds like you would only need a very simple model to get/set the discount for an quote/order. – Ekk4rd Nov 13 at 15:49

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.