Magento 2: How to implement First Order Discount?first order discount in magento2Admin only coupon...

My story is written in English, but is set in my home country. What language should I use for the dialogue?

What to do when during a meeting client people start to fight (even physically) with each others?

If the Captain's screens are out, does he switch seats with the co-pilot?

Built-In Shelves/Bookcases - IKEA vs Built

Why does Captain Marvel assume the planet where she lands would recognize her credentials?

2×2×2 rubik's cube corner is twisted!

Who deserves to be first and second author? PhD student who collected data, research associate who wrote the paper or supervisor?

What are the best books to study Neural Networks from a purely mathematical perspective?

Solving "Resistance between two nodes on a grid" problem in Mathematica

Do items de-spawn in Diablo?

Latest web browser compatible with Windows 98

How much stiffer are 23c tires over 28c?

How strictly should I take "Candidates must be local"?

Do I really need to have a scientific explanation for my premise?

Virginia employer terminated employee and wants signing bonus returned

Why would one plane in this picture not have gear down yet?

How are such low op-amp input currents possible?

Rejected in 4th interview round citing insufficient years of experience

How do you like my writing?

Force user to remove USB token

Unreachable code, but reachable with exception

Make a transparent 448*448 image

Can you reject a postdoc offer after the PI has paid a large sum for flights/accommodation for your visit?

How do anti-virus programs start at Windows boot?



Magento 2: How to implement First Order Discount?


first order discount in magento2Admin only coupon code?Magento - Discount price including tax/vatApply free shipping promotion when reordering from admin panelMagento 2 - How to add custom discount in cart programmatically?Which event should I catch if I want a “complete” order?Magento 2 - discount depend on Payment Method does not workHow to add custom extra discount(%) to order or override default coupon code when placed from back end only?Force order status and state to processing after creating shipment using observerCart Price Rules: Minimum Purchase of 2 of the same items to get 15% discount













4















I am planning to give the discount to the customers for their first order purchase. After shipment selection, i want to show the discount in the order summary(discount is only for the first order). Is there any event observer available after shipment selection?. which is the best way to achieve this(programmatically or admin side promotion)?









share





























    4















    I am planning to give the discount to the customers for their first order purchase. After shipment selection, i want to show the discount in the order summary(discount is only for the first order). Is there any event observer available after shipment selection?. which is the best way to achieve this(programmatically or admin side promotion)?









    share



























      4












      4








      4


      2






      I am planning to give the discount to the customers for their first order purchase. After shipment selection, i want to show the discount in the order summary(discount is only for the first order). Is there any event observer available after shipment selection?. which is the best way to achieve this(programmatically or admin side promotion)?









      share
















      I am planning to give the discount to the customers for their first order purchase. After shipment selection, i want to show the discount in the order summary(discount is only for the first order). Is there any event observer available after shipment selection?. which is the best way to achieve this(programmatically or admin side promotion)?







      magento2 checkout event-observer discount promotions





      share














      share












      share



      share








      edited Mar 19 '18 at 4:55









      Teja Bhagavan Kollepara

      2,98141947




      2,98141947










      asked Feb 17 '18 at 7:41









      MidlajMidlaj

      122214




      122214






















          5 Answers
          5






          active

          oldest

          votes


















          4














          Admin panel -> Marketing -> Cart Sales Rules.



          enter image description here



          When you expand the “Conditions” tab, you’ll be able to set when a given discount applies. For example, you can select the cart value option and this way specify that:
          If the cart value is greater than 50 – the discount should be applied.



          enter image description here



          However, the default options don’t cover all possible situations. Let’s imagine that we want to reward our client for the dedication he put in creating an account in our store. We have the following scenario:
          If this is a first order of a given client – the discount should be applied.



          Unfortunately, Magento doesn’t offer this option out-of-the-box



          Custom Cart Sales Rule Conditions



          we will focus on extending the available discount conditions. To understand how the available conditions are collected, you need to look into the MagentoSalesRuleModelRuleConditionCombine class, more specifically into the getNewChildSelectOptions() method. You’ll notice that after the default conditions, the salesrule_rule_condition_combine event is dispatched and then the collected conditions are combined.



          As usual, we will start with creating the foundations of our module:




          app/code/Itdesire/CustomerRule/etc/module.xml




          <?xml version="1.0"?>
          <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
          <module name="Itdesire_CustomerRule" setup_version="1.0.0">
          </module>
          </config>



          app/code/Itdesire/CustomerRule/registration.php




          <?php

          MagentoFrameworkComponentComponentRegistrar::register(
          MagentoFrameworkComponentComponentRegistrar::MODULE,
          'Itdesire_CustomerRule',
          __DIR__
          );


          Next, we will create an observer that will add our condition:




          app/code/Itdesire/CustomerRule/etc/events.xml




          <?xml version="1.0"?>
          <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
          <event name="salesrule_rule_condition_combine">
          <observer name="customer_rule" instance="ItdesireCustomerRuleObserverCustomerConditionObserver" />
          </event>
          </config>



          app/code/Itdesire/CustomerRule/Observer/CustomerConditionObserver.php




             <?php

          namespace ItdesireCustomerRuleObserver;

          /**
          * Class CustomerConditionObserver
          */
          class CustomerConditionObserver implements MagentoFrameworkEventObserverInterface
          {
          /**
          * Execute observer.
          * @param MagentoFrameworkEventObserver $observer
          * @return $this
          */
          public function execute(MagentoFrameworkEventObserver $observer)
          {
          $additional = $observer->getAdditional();
          $conditions = (array) $additional->getConditions();

          $conditions = array_merge_recursive($conditions, [
          $this->getCustomerFirstOrderCondition()
          ]);

          $additional->setConditions($conditions);
          return $this;
          }

          /**
          * Get condition for customer first order.
          * @return array
          */
          private function getCustomerFirstOrderCondition()
          {
          return [
          'label'=> __('Customer first order'),
          'value'=> ItdesireCustomerRuleModelRuleConditionCustomer::class
          ];
          }
          }


          What happens in the observer? We’re fetching other conditions, for example the ones added in other observers, and merge them with ours. As you can see, one condition consists of a name and a value which means that it includes our class that will handle the condition.



          Now, we can move on to the logic responsible for our condition:




          app/code/Itdesire/CustomerRule/etc/di.xml




          <?xml version="1.0"?>
          <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
          <type name="ItdesireCustomerRuleModelRuleConditionCustomer">
          <arguments>
          <argument name="data" xsi:type="array">
          <item name="form_name" xsi:type="string">sales_rule_form</item>
          </argument>
          </arguments>
          </type>
          </config>



          app/code/Itdesire/CustomerRule/Model/Rule/Condition/Customer.php




             <?php

          namespace ItdesireCustomerRuleModelRuleCondition;

          /**
          * Class Customer
          */
          class Customer extends MagentoRuleModelConditionAbstractCondition
          {
          /**
          * @var MagentoConfigModelConfigSourceYesno
          */
          protected $sourceYesno;

          /**
          * @var MagentoSalesModelResourceModelOrderCollectionFactory
          */
          protected $orderFactory;

          /**
          * Constructor
          * @param MagentoRuleModelConditionContext $context
          * @param MagentoConfigModelConfigSourceYesno $sourceYesno
          * @param MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory
          * @param array $data
          */
          public function __construct(
          MagentoRuleModelConditionContext $context,
          MagentoConfigModelConfigSourceYesno $sourceYesno,
          MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory,
          array $data = []
          ) {
          parent::__construct($context, $data);
          $this->sourceYesno = $sourceYesno;
          $this->orderFactory = $orderFactory;
          }

          /**
          * Load attribute options
          * @return $this
          */
          public function loadAttributeOptions()
          {
          $this->setAttributeOption([
          'customer_first_order' => __('Customer first order')
          ]);
          return $this;
          }

          /**
          * Get input type
          * @return string
          */
          public function getInputType()
          {
          return 'select';
          }

          /**
          * Get value element type
          * @return string
          */
          public function getValueElementType()
          {
          return 'select';
          }

          /**
          * Get value select options
          * @return array|mixed
          */
          public function getValueSelectOptions()
          {
          if (!$this->hasData('value_select_options')) {
          $this->setData(
          'value_select_options',
          $this->sourceYesno->toOptionArray()
          );
          }
          return $this->getData('value_select_options');
          }

          /**
          * Validate Customer First Order Rule Condition
          * @param MagentoFrameworkModelAbstractModel $model
          * @return bool
          */
          public function validate(MagentoFrameworkModelAbstractModel $model)
          {
          $customerId = $model->getCustomerId();
          $order = $this->orderFactory->create()
          ->addAttributeToSelect('customer_id')
          ->addFieldToFilter('customer_id',['eq' => $customerId])
          ->getFirstItem();

          $firstOrder = 1;
          if ($order->getId()) {
          $firstOrder = 0;
          }
          $model->setData('customer_first_orde
          r', $firstOrder);
          return parent::validate($model);
          }
          }


          We load the Yesno model in the constructor of our logic that is mainly used as a source_model in the backend. We’ll fetch from it the available values for our select fields. Moreover, we load the factory of order collection that we will use for validating the condition correctness. We need to set the name and label of our condition in the loadAttributeOptions() method. getInputType() defines what will be displayed as an operator for comparing our attribute – the returned select field will allow us to choose “is” or “is not”. Returning a numeric value here would allow you to select available operators for comparing numbers, such as “greater than” or “less than”. getValueElementType() defines the type of the value with which we will compare our values. The returned select will render the field with available options, which we will define in getValueSelectOptions().



          In case we don’t want to define imposed values, we can return text – an input with the option to write a given value will then be displayed (using numeric value and text would allow you to create a condition “if the number of customer’s orders is greater than X – apply the discount”).



          The last method is validate() that we use to check whether the customer has other orders placed with his account, and then we can set the value that will be compared with the one we previously defined.



          Now, we only need to create a discount with our condition






          share|improve this answer
























          • I have use above code for Magento 2.1.6. When i apply coupon code for first order, it apply, display success message but discount not deduct from order total. Do you have any idea?

            – user55548
            Nov 14 '18 at 6:55



















          1














          No Coding required. Create a coupon with the discounts and restrict the coupon to be used once per customer.



          enter image description here






          share|improve this answer































            0















            1. Create coupon code and auto apply the by the observer at any step of the one-page checkout if it is customers 1st or order.

            2. Send a coupon code on customer registration email.






            share|improve this answer


























            • sales_quote_collect_totals_before is this observer is okey??

              – Midlaj
              Feb 17 '18 at 10:09











            • can you just elaborate in code level?.

              – Midlaj
              Feb 19 '18 at 3:48



















            0














            For this feature, we have to customize magento 2 using below steps.




            • Create a cart price rule for your "first time" discount.

            • Add an attribute to the customer object named something like "used_first_coupon". Defaults to 0/false

            • Add an event on customer creation that send the coupon code to the customer.

            • Hook into the coupon applying code where you can check for the first time order base on it you can manipulate the coupon validation.

            • Add an event listener post-order that will mark the customers used_first_coupon attribute as true.






            share|improve this answer































              0














              <?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="MagentoOfflineShippingModelCarrierTablerate" type="CustomerFreeShipModelTablerate" />
              </config>
              Override and Create new di.xml



              After Create The New Model in your Custome module and set this code






              namespace CustomerFreeShipModel;



              use MagentoQuoteModelQuoteAddressRateRequest;



              use MagentoShippingModelRateResult;



              class Shipping extends MagentoShippingModelCarrierAbstractCarrier implements MagentoShippingModelCarrierCarrierInterface
              {



              /**
              * @var string
              */
              protected $_code = 'simpleshipping';



              /**
              * @var MagentoShippingModelRateResultFactory
              */
              protected $_rateResultFactory;

              /**
              * @var MagentoQuoteModelQuoteAddressRateResultMethodFactory
              */
              protected $_rateMethodFactory;

              protected $_session;

              protected $orderFactory;

              /**
              * Shipping constructor.
              *
              * @param MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig
              * @param MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory
              * @param PsrLogLoggerInterface $logger
              * @param MagentoShippingModelRateResultFactory $rateResultFactory
              * @param MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory
              * @param array $data
              */
              public function __construct(
              MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig,
              MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory,
              PsrLogLoggerInterface $logger,
              MagentoShippingModelRateResultFactory $rateResultFactory,
              MagentoCustomerModelSession $session,
              MagentoSalesModelOrderFactory $orderFactory,
              MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory,
              array $data = []
              ) {
              $this->_rateResultFactory = $rateResultFactory;
              $this->_rateMethodFactory = $rateMethodFactory;
              $this->_session = $session;
              $this->orderFactory = $orderFactory;
              parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);
              }

              /**
              * get allowed methods
              * @return array
              */
              public function getAllowedMethods()
              {
              return [$this->_code => $this->getConfigData('name')];
              }

              /**
              * @return float
              */
              // private function getShippingPrice()
              // {
              // $configPrice = $this->getConfigData('price');

              // $shippingPrice = $this->getFinalPriceWithHandlingFee($configPrice);

              // return $shippingPrice;
              // }

              /**
              * @param RateRequest $request
              * @return bool|Result
              */
              public function collectRates(RateRequest $request)
              {
              if (!$this->getConfigFlag('active')) {
              return false;
              }

              if($this->_session->isLoggedIn()){
              $customer_id = $this->_session->getCustomer()->getId();
              //$customer_email = $this->_session->getCustomer()->getEmail();

              //$order = $this->_objectManager->create('MagentoSalesModelOrder')->load($customer_id);

              $order = $this->orderFactory->create()->getCollection()->addAttributeToSelect('customer_id')
              ->addFieldToFilter('customer_id',$customer_id);
              //var_dump($order->getCustomerEmail()); die('uiuiuiuiuiu');
              if(count($order->getData())>0){
              return false;
              }
              }

              /** @var MagentoShippingModelRateResult $result */
              $result = $this->_rateResultFactory->create();

              /** @var MagentoQuoteModelQuoteAddressRateResultMethod $method */
              $method = $this->_rateMethodFactory->create();

              $method->setCarrier($this->_code);
              $method->setCarrierTitle($this->getConfigData('title'));

              $method->setMethod($this->_code);
              $method->setMethodTitle($this->getConfigData('name'));

              //$amount = $this->getShippingPrice();

              $method->setPrice('0');
              $method->setCost('0');

              $result->append($method);

              return $result;
              }


              }






              share|improve this answer

























                Your Answer








                StackExchange.ready(function() {
                var channelOptions = {
                tags: "".split(" "),
                id: "479"
                };
                initTagRenderer("".split(" "), "".split(" "), channelOptions);

                StackExchange.using("externalEditor", function() {
                // Have to fire editor after snippets, if snippets enabled
                if (StackExchange.settings.snippets.snippetsEnabled) {
                StackExchange.using("snippets", function() {
                createEditor();
                });
                }
                else {
                createEditor();
                }
                });

                function createEditor() {
                StackExchange.prepareEditor({
                heartbeatType: 'answer',
                autoActivateHeartbeat: false,
                convertImagesToLinks: false,
                noModals: true,
                showLowRepImageUploadWarning: true,
                reputationToPostImages: null,
                bindNavPrevention: true,
                postfix: "",
                imageUploader: {
                brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
                contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
                allowUrls: true
                },
                onDemand: true,
                discardSelector: ".discard-answer"
                ,immediatelyShowMarkdownHelp:true
                });


                }
                });














                draft saved

                draft discarded


















                StackExchange.ready(
                function () {
                StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f213903%2fmagento-2-how-to-implement-first-order-discount%23new-answer', 'question_page');
                }
                );

                Post as a guest















                Required, but never shown

























                5 Answers
                5






                active

                oldest

                votes








                5 Answers
                5






                active

                oldest

                votes









                active

                oldest

                votes






                active

                oldest

                votes









                4














                Admin panel -> Marketing -> Cart Sales Rules.



                enter image description here



                When you expand the “Conditions” tab, you’ll be able to set when a given discount applies. For example, you can select the cart value option and this way specify that:
                If the cart value is greater than 50 – the discount should be applied.



                enter image description here



                However, the default options don’t cover all possible situations. Let’s imagine that we want to reward our client for the dedication he put in creating an account in our store. We have the following scenario:
                If this is a first order of a given client – the discount should be applied.



                Unfortunately, Magento doesn’t offer this option out-of-the-box



                Custom Cart Sales Rule Conditions



                we will focus on extending the available discount conditions. To understand how the available conditions are collected, you need to look into the MagentoSalesRuleModelRuleConditionCombine class, more specifically into the getNewChildSelectOptions() method. You’ll notice that after the default conditions, the salesrule_rule_condition_combine event is dispatched and then the collected conditions are combined.



                As usual, we will start with creating the foundations of our module:




                app/code/Itdesire/CustomerRule/etc/module.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
                <module name="Itdesire_CustomerRule" setup_version="1.0.0">
                </module>
                </config>



                app/code/Itdesire/CustomerRule/registration.php




                <?php

                MagentoFrameworkComponentComponentRegistrar::register(
                MagentoFrameworkComponentComponentRegistrar::MODULE,
                'Itdesire_CustomerRule',
                __DIR__
                );


                Next, we will create an observer that will add our condition:




                app/code/Itdesire/CustomerRule/etc/events.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
                <event name="salesrule_rule_condition_combine">
                <observer name="customer_rule" instance="ItdesireCustomerRuleObserverCustomerConditionObserver" />
                </event>
                </config>



                app/code/Itdesire/CustomerRule/Observer/CustomerConditionObserver.php




                   <?php

                namespace ItdesireCustomerRuleObserver;

                /**
                * Class CustomerConditionObserver
                */
                class CustomerConditionObserver implements MagentoFrameworkEventObserverInterface
                {
                /**
                * Execute observer.
                * @param MagentoFrameworkEventObserver $observer
                * @return $this
                */
                public function execute(MagentoFrameworkEventObserver $observer)
                {
                $additional = $observer->getAdditional();
                $conditions = (array) $additional->getConditions();

                $conditions = array_merge_recursive($conditions, [
                $this->getCustomerFirstOrderCondition()
                ]);

                $additional->setConditions($conditions);
                return $this;
                }

                /**
                * Get condition for customer first order.
                * @return array
                */
                private function getCustomerFirstOrderCondition()
                {
                return [
                'label'=> __('Customer first order'),
                'value'=> ItdesireCustomerRuleModelRuleConditionCustomer::class
                ];
                }
                }


                What happens in the observer? We’re fetching other conditions, for example the ones added in other observers, and merge them with ours. As you can see, one condition consists of a name and a value which means that it includes our class that will handle the condition.



                Now, we can move on to the logic responsible for our condition:




                app/code/Itdesire/CustomerRule/etc/di.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
                <type name="ItdesireCustomerRuleModelRuleConditionCustomer">
                <arguments>
                <argument name="data" xsi:type="array">
                <item name="form_name" xsi:type="string">sales_rule_form</item>
                </argument>
                </arguments>
                </type>
                </config>



                app/code/Itdesire/CustomerRule/Model/Rule/Condition/Customer.php




                   <?php

                namespace ItdesireCustomerRuleModelRuleCondition;

                /**
                * Class Customer
                */
                class Customer extends MagentoRuleModelConditionAbstractCondition
                {
                /**
                * @var MagentoConfigModelConfigSourceYesno
                */
                protected $sourceYesno;

                /**
                * @var MagentoSalesModelResourceModelOrderCollectionFactory
                */
                protected $orderFactory;

                /**
                * Constructor
                * @param MagentoRuleModelConditionContext $context
                * @param MagentoConfigModelConfigSourceYesno $sourceYesno
                * @param MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory
                * @param array $data
                */
                public function __construct(
                MagentoRuleModelConditionContext $context,
                MagentoConfigModelConfigSourceYesno $sourceYesno,
                MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory,
                array $data = []
                ) {
                parent::__construct($context, $data);
                $this->sourceYesno = $sourceYesno;
                $this->orderFactory = $orderFactory;
                }

                /**
                * Load attribute options
                * @return $this
                */
                public function loadAttributeOptions()
                {
                $this->setAttributeOption([
                'customer_first_order' => __('Customer first order')
                ]);
                return $this;
                }

                /**
                * Get input type
                * @return string
                */
                public function getInputType()
                {
                return 'select';
                }

                /**
                * Get value element type
                * @return string
                */
                public function getValueElementType()
                {
                return 'select';
                }

                /**
                * Get value select options
                * @return array|mixed
                */
                public function getValueSelectOptions()
                {
                if (!$this->hasData('value_select_options')) {
                $this->setData(
                'value_select_options',
                $this->sourceYesno->toOptionArray()
                );
                }
                return $this->getData('value_select_options');
                }

                /**
                * Validate Customer First Order Rule Condition
                * @param MagentoFrameworkModelAbstractModel $model
                * @return bool
                */
                public function validate(MagentoFrameworkModelAbstractModel $model)
                {
                $customerId = $model->getCustomerId();
                $order = $this->orderFactory->create()
                ->addAttributeToSelect('customer_id')
                ->addFieldToFilter('customer_id',['eq' => $customerId])
                ->getFirstItem();

                $firstOrder = 1;
                if ($order->getId()) {
                $firstOrder = 0;
                }
                $model->setData('customer_first_orde
                r', $firstOrder);
                return parent::validate($model);
                }
                }


                We load the Yesno model in the constructor of our logic that is mainly used as a source_model in the backend. We’ll fetch from it the available values for our select fields. Moreover, we load the factory of order collection that we will use for validating the condition correctness. We need to set the name and label of our condition in the loadAttributeOptions() method. getInputType() defines what will be displayed as an operator for comparing our attribute – the returned select field will allow us to choose “is” or “is not”. Returning a numeric value here would allow you to select available operators for comparing numbers, such as “greater than” or “less than”. getValueElementType() defines the type of the value with which we will compare our values. The returned select will render the field with available options, which we will define in getValueSelectOptions().



                In case we don’t want to define imposed values, we can return text – an input with the option to write a given value will then be displayed (using numeric value and text would allow you to create a condition “if the number of customer’s orders is greater than X – apply the discount”).



                The last method is validate() that we use to check whether the customer has other orders placed with his account, and then we can set the value that will be compared with the one we previously defined.



                Now, we only need to create a discount with our condition






                share|improve this answer
























                • I have use above code for Magento 2.1.6. When i apply coupon code for first order, it apply, display success message but discount not deduct from order total. Do you have any idea?

                  – user55548
                  Nov 14 '18 at 6:55
















                4














                Admin panel -> Marketing -> Cart Sales Rules.



                enter image description here



                When you expand the “Conditions” tab, you’ll be able to set when a given discount applies. For example, you can select the cart value option and this way specify that:
                If the cart value is greater than 50 – the discount should be applied.



                enter image description here



                However, the default options don’t cover all possible situations. Let’s imagine that we want to reward our client for the dedication he put in creating an account in our store. We have the following scenario:
                If this is a first order of a given client – the discount should be applied.



                Unfortunately, Magento doesn’t offer this option out-of-the-box



                Custom Cart Sales Rule Conditions



                we will focus on extending the available discount conditions. To understand how the available conditions are collected, you need to look into the MagentoSalesRuleModelRuleConditionCombine class, more specifically into the getNewChildSelectOptions() method. You’ll notice that after the default conditions, the salesrule_rule_condition_combine event is dispatched and then the collected conditions are combined.



                As usual, we will start with creating the foundations of our module:




                app/code/Itdesire/CustomerRule/etc/module.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
                <module name="Itdesire_CustomerRule" setup_version="1.0.0">
                </module>
                </config>



                app/code/Itdesire/CustomerRule/registration.php




                <?php

                MagentoFrameworkComponentComponentRegistrar::register(
                MagentoFrameworkComponentComponentRegistrar::MODULE,
                'Itdesire_CustomerRule',
                __DIR__
                );


                Next, we will create an observer that will add our condition:




                app/code/Itdesire/CustomerRule/etc/events.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
                <event name="salesrule_rule_condition_combine">
                <observer name="customer_rule" instance="ItdesireCustomerRuleObserverCustomerConditionObserver" />
                </event>
                </config>



                app/code/Itdesire/CustomerRule/Observer/CustomerConditionObserver.php




                   <?php

                namespace ItdesireCustomerRuleObserver;

                /**
                * Class CustomerConditionObserver
                */
                class CustomerConditionObserver implements MagentoFrameworkEventObserverInterface
                {
                /**
                * Execute observer.
                * @param MagentoFrameworkEventObserver $observer
                * @return $this
                */
                public function execute(MagentoFrameworkEventObserver $observer)
                {
                $additional = $observer->getAdditional();
                $conditions = (array) $additional->getConditions();

                $conditions = array_merge_recursive($conditions, [
                $this->getCustomerFirstOrderCondition()
                ]);

                $additional->setConditions($conditions);
                return $this;
                }

                /**
                * Get condition for customer first order.
                * @return array
                */
                private function getCustomerFirstOrderCondition()
                {
                return [
                'label'=> __('Customer first order'),
                'value'=> ItdesireCustomerRuleModelRuleConditionCustomer::class
                ];
                }
                }


                What happens in the observer? We’re fetching other conditions, for example the ones added in other observers, and merge them with ours. As you can see, one condition consists of a name and a value which means that it includes our class that will handle the condition.



                Now, we can move on to the logic responsible for our condition:




                app/code/Itdesire/CustomerRule/etc/di.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
                <type name="ItdesireCustomerRuleModelRuleConditionCustomer">
                <arguments>
                <argument name="data" xsi:type="array">
                <item name="form_name" xsi:type="string">sales_rule_form</item>
                </argument>
                </arguments>
                </type>
                </config>



                app/code/Itdesire/CustomerRule/Model/Rule/Condition/Customer.php




                   <?php

                namespace ItdesireCustomerRuleModelRuleCondition;

                /**
                * Class Customer
                */
                class Customer extends MagentoRuleModelConditionAbstractCondition
                {
                /**
                * @var MagentoConfigModelConfigSourceYesno
                */
                protected $sourceYesno;

                /**
                * @var MagentoSalesModelResourceModelOrderCollectionFactory
                */
                protected $orderFactory;

                /**
                * Constructor
                * @param MagentoRuleModelConditionContext $context
                * @param MagentoConfigModelConfigSourceYesno $sourceYesno
                * @param MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory
                * @param array $data
                */
                public function __construct(
                MagentoRuleModelConditionContext $context,
                MagentoConfigModelConfigSourceYesno $sourceYesno,
                MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory,
                array $data = []
                ) {
                parent::__construct($context, $data);
                $this->sourceYesno = $sourceYesno;
                $this->orderFactory = $orderFactory;
                }

                /**
                * Load attribute options
                * @return $this
                */
                public function loadAttributeOptions()
                {
                $this->setAttributeOption([
                'customer_first_order' => __('Customer first order')
                ]);
                return $this;
                }

                /**
                * Get input type
                * @return string
                */
                public function getInputType()
                {
                return 'select';
                }

                /**
                * Get value element type
                * @return string
                */
                public function getValueElementType()
                {
                return 'select';
                }

                /**
                * Get value select options
                * @return array|mixed
                */
                public function getValueSelectOptions()
                {
                if (!$this->hasData('value_select_options')) {
                $this->setData(
                'value_select_options',
                $this->sourceYesno->toOptionArray()
                );
                }
                return $this->getData('value_select_options');
                }

                /**
                * Validate Customer First Order Rule Condition
                * @param MagentoFrameworkModelAbstractModel $model
                * @return bool
                */
                public function validate(MagentoFrameworkModelAbstractModel $model)
                {
                $customerId = $model->getCustomerId();
                $order = $this->orderFactory->create()
                ->addAttributeToSelect('customer_id')
                ->addFieldToFilter('customer_id',['eq' => $customerId])
                ->getFirstItem();

                $firstOrder = 1;
                if ($order->getId()) {
                $firstOrder = 0;
                }
                $model->setData('customer_first_orde
                r', $firstOrder);
                return parent::validate($model);
                }
                }


                We load the Yesno model in the constructor of our logic that is mainly used as a source_model in the backend. We’ll fetch from it the available values for our select fields. Moreover, we load the factory of order collection that we will use for validating the condition correctness. We need to set the name and label of our condition in the loadAttributeOptions() method. getInputType() defines what will be displayed as an operator for comparing our attribute – the returned select field will allow us to choose “is” or “is not”. Returning a numeric value here would allow you to select available operators for comparing numbers, such as “greater than” or “less than”. getValueElementType() defines the type of the value with which we will compare our values. The returned select will render the field with available options, which we will define in getValueSelectOptions().



                In case we don’t want to define imposed values, we can return text – an input with the option to write a given value will then be displayed (using numeric value and text would allow you to create a condition “if the number of customer’s orders is greater than X – apply the discount”).



                The last method is validate() that we use to check whether the customer has other orders placed with his account, and then we can set the value that will be compared with the one we previously defined.



                Now, we only need to create a discount with our condition






                share|improve this answer
























                • I have use above code for Magento 2.1.6. When i apply coupon code for first order, it apply, display success message but discount not deduct from order total. Do you have any idea?

                  – user55548
                  Nov 14 '18 at 6:55














                4












                4








                4







                Admin panel -> Marketing -> Cart Sales Rules.



                enter image description here



                When you expand the “Conditions” tab, you’ll be able to set when a given discount applies. For example, you can select the cart value option and this way specify that:
                If the cart value is greater than 50 – the discount should be applied.



                enter image description here



                However, the default options don’t cover all possible situations. Let’s imagine that we want to reward our client for the dedication he put in creating an account in our store. We have the following scenario:
                If this is a first order of a given client – the discount should be applied.



                Unfortunately, Magento doesn’t offer this option out-of-the-box



                Custom Cart Sales Rule Conditions



                we will focus on extending the available discount conditions. To understand how the available conditions are collected, you need to look into the MagentoSalesRuleModelRuleConditionCombine class, more specifically into the getNewChildSelectOptions() method. You’ll notice that after the default conditions, the salesrule_rule_condition_combine event is dispatched and then the collected conditions are combined.



                As usual, we will start with creating the foundations of our module:




                app/code/Itdesire/CustomerRule/etc/module.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
                <module name="Itdesire_CustomerRule" setup_version="1.0.0">
                </module>
                </config>



                app/code/Itdesire/CustomerRule/registration.php




                <?php

                MagentoFrameworkComponentComponentRegistrar::register(
                MagentoFrameworkComponentComponentRegistrar::MODULE,
                'Itdesire_CustomerRule',
                __DIR__
                );


                Next, we will create an observer that will add our condition:




                app/code/Itdesire/CustomerRule/etc/events.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
                <event name="salesrule_rule_condition_combine">
                <observer name="customer_rule" instance="ItdesireCustomerRuleObserverCustomerConditionObserver" />
                </event>
                </config>



                app/code/Itdesire/CustomerRule/Observer/CustomerConditionObserver.php




                   <?php

                namespace ItdesireCustomerRuleObserver;

                /**
                * Class CustomerConditionObserver
                */
                class CustomerConditionObserver implements MagentoFrameworkEventObserverInterface
                {
                /**
                * Execute observer.
                * @param MagentoFrameworkEventObserver $observer
                * @return $this
                */
                public function execute(MagentoFrameworkEventObserver $observer)
                {
                $additional = $observer->getAdditional();
                $conditions = (array) $additional->getConditions();

                $conditions = array_merge_recursive($conditions, [
                $this->getCustomerFirstOrderCondition()
                ]);

                $additional->setConditions($conditions);
                return $this;
                }

                /**
                * Get condition for customer first order.
                * @return array
                */
                private function getCustomerFirstOrderCondition()
                {
                return [
                'label'=> __('Customer first order'),
                'value'=> ItdesireCustomerRuleModelRuleConditionCustomer::class
                ];
                }
                }


                What happens in the observer? We’re fetching other conditions, for example the ones added in other observers, and merge them with ours. As you can see, one condition consists of a name and a value which means that it includes our class that will handle the condition.



                Now, we can move on to the logic responsible for our condition:




                app/code/Itdesire/CustomerRule/etc/di.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
                <type name="ItdesireCustomerRuleModelRuleConditionCustomer">
                <arguments>
                <argument name="data" xsi:type="array">
                <item name="form_name" xsi:type="string">sales_rule_form</item>
                </argument>
                </arguments>
                </type>
                </config>



                app/code/Itdesire/CustomerRule/Model/Rule/Condition/Customer.php




                   <?php

                namespace ItdesireCustomerRuleModelRuleCondition;

                /**
                * Class Customer
                */
                class Customer extends MagentoRuleModelConditionAbstractCondition
                {
                /**
                * @var MagentoConfigModelConfigSourceYesno
                */
                protected $sourceYesno;

                /**
                * @var MagentoSalesModelResourceModelOrderCollectionFactory
                */
                protected $orderFactory;

                /**
                * Constructor
                * @param MagentoRuleModelConditionContext $context
                * @param MagentoConfigModelConfigSourceYesno $sourceYesno
                * @param MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory
                * @param array $data
                */
                public function __construct(
                MagentoRuleModelConditionContext $context,
                MagentoConfigModelConfigSourceYesno $sourceYesno,
                MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory,
                array $data = []
                ) {
                parent::__construct($context, $data);
                $this->sourceYesno = $sourceYesno;
                $this->orderFactory = $orderFactory;
                }

                /**
                * Load attribute options
                * @return $this
                */
                public function loadAttributeOptions()
                {
                $this->setAttributeOption([
                'customer_first_order' => __('Customer first order')
                ]);
                return $this;
                }

                /**
                * Get input type
                * @return string
                */
                public function getInputType()
                {
                return 'select';
                }

                /**
                * Get value element type
                * @return string
                */
                public function getValueElementType()
                {
                return 'select';
                }

                /**
                * Get value select options
                * @return array|mixed
                */
                public function getValueSelectOptions()
                {
                if (!$this->hasData('value_select_options')) {
                $this->setData(
                'value_select_options',
                $this->sourceYesno->toOptionArray()
                );
                }
                return $this->getData('value_select_options');
                }

                /**
                * Validate Customer First Order Rule Condition
                * @param MagentoFrameworkModelAbstractModel $model
                * @return bool
                */
                public function validate(MagentoFrameworkModelAbstractModel $model)
                {
                $customerId = $model->getCustomerId();
                $order = $this->orderFactory->create()
                ->addAttributeToSelect('customer_id')
                ->addFieldToFilter('customer_id',['eq' => $customerId])
                ->getFirstItem();

                $firstOrder = 1;
                if ($order->getId()) {
                $firstOrder = 0;
                }
                $model->setData('customer_first_orde
                r', $firstOrder);
                return parent::validate($model);
                }
                }


                We load the Yesno model in the constructor of our logic that is mainly used as a source_model in the backend. We’ll fetch from it the available values for our select fields. Moreover, we load the factory of order collection that we will use for validating the condition correctness. We need to set the name and label of our condition in the loadAttributeOptions() method. getInputType() defines what will be displayed as an operator for comparing our attribute – the returned select field will allow us to choose “is” or “is not”. Returning a numeric value here would allow you to select available operators for comparing numbers, such as “greater than” or “less than”. getValueElementType() defines the type of the value with which we will compare our values. The returned select will render the field with available options, which we will define in getValueSelectOptions().



                In case we don’t want to define imposed values, we can return text – an input with the option to write a given value will then be displayed (using numeric value and text would allow you to create a condition “if the number of customer’s orders is greater than X – apply the discount”).



                The last method is validate() that we use to check whether the customer has other orders placed with his account, and then we can set the value that will be compared with the one we previously defined.



                Now, we only need to create a discount with our condition






                share|improve this answer













                Admin panel -> Marketing -> Cart Sales Rules.



                enter image description here



                When you expand the “Conditions” tab, you’ll be able to set when a given discount applies. For example, you can select the cart value option and this way specify that:
                If the cart value is greater than 50 – the discount should be applied.



                enter image description here



                However, the default options don’t cover all possible situations. Let’s imagine that we want to reward our client for the dedication he put in creating an account in our store. We have the following scenario:
                If this is a first order of a given client – the discount should be applied.



                Unfortunately, Magento doesn’t offer this option out-of-the-box



                Custom Cart Sales Rule Conditions



                we will focus on extending the available discount conditions. To understand how the available conditions are collected, you need to look into the MagentoSalesRuleModelRuleConditionCombine class, more specifically into the getNewChildSelectOptions() method. You’ll notice that after the default conditions, the salesrule_rule_condition_combine event is dispatched and then the collected conditions are combined.



                As usual, we will start with creating the foundations of our module:




                app/code/Itdesire/CustomerRule/etc/module.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
                <module name="Itdesire_CustomerRule" setup_version="1.0.0">
                </module>
                </config>



                app/code/Itdesire/CustomerRule/registration.php




                <?php

                MagentoFrameworkComponentComponentRegistrar::register(
                MagentoFrameworkComponentComponentRegistrar::MODULE,
                'Itdesire_CustomerRule',
                __DIR__
                );


                Next, we will create an observer that will add our condition:




                app/code/Itdesire/CustomerRule/etc/events.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
                <event name="salesrule_rule_condition_combine">
                <observer name="customer_rule" instance="ItdesireCustomerRuleObserverCustomerConditionObserver" />
                </event>
                </config>



                app/code/Itdesire/CustomerRule/Observer/CustomerConditionObserver.php




                   <?php

                namespace ItdesireCustomerRuleObserver;

                /**
                * Class CustomerConditionObserver
                */
                class CustomerConditionObserver implements MagentoFrameworkEventObserverInterface
                {
                /**
                * Execute observer.
                * @param MagentoFrameworkEventObserver $observer
                * @return $this
                */
                public function execute(MagentoFrameworkEventObserver $observer)
                {
                $additional = $observer->getAdditional();
                $conditions = (array) $additional->getConditions();

                $conditions = array_merge_recursive($conditions, [
                $this->getCustomerFirstOrderCondition()
                ]);

                $additional->setConditions($conditions);
                return $this;
                }

                /**
                * Get condition for customer first order.
                * @return array
                */
                private function getCustomerFirstOrderCondition()
                {
                return [
                'label'=> __('Customer first order'),
                'value'=> ItdesireCustomerRuleModelRuleConditionCustomer::class
                ];
                }
                }


                What happens in the observer? We’re fetching other conditions, for example the ones added in other observers, and merge them with ours. As you can see, one condition consists of a name and a value which means that it includes our class that will handle the condition.



                Now, we can move on to the logic responsible for our condition:




                app/code/Itdesire/CustomerRule/etc/di.xml




                <?xml version="1.0"?>
                <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
                <type name="ItdesireCustomerRuleModelRuleConditionCustomer">
                <arguments>
                <argument name="data" xsi:type="array">
                <item name="form_name" xsi:type="string">sales_rule_form</item>
                </argument>
                </arguments>
                </type>
                </config>



                app/code/Itdesire/CustomerRule/Model/Rule/Condition/Customer.php




                   <?php

                namespace ItdesireCustomerRuleModelRuleCondition;

                /**
                * Class Customer
                */
                class Customer extends MagentoRuleModelConditionAbstractCondition
                {
                /**
                * @var MagentoConfigModelConfigSourceYesno
                */
                protected $sourceYesno;

                /**
                * @var MagentoSalesModelResourceModelOrderCollectionFactory
                */
                protected $orderFactory;

                /**
                * Constructor
                * @param MagentoRuleModelConditionContext $context
                * @param MagentoConfigModelConfigSourceYesno $sourceYesno
                * @param MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory
                * @param array $data
                */
                public function __construct(
                MagentoRuleModelConditionContext $context,
                MagentoConfigModelConfigSourceYesno $sourceYesno,
                MagentoSalesModelResourceModelOrderCollectionFactory $orderFactory,
                array $data = []
                ) {
                parent::__construct($context, $data);
                $this->sourceYesno = $sourceYesno;
                $this->orderFactory = $orderFactory;
                }

                /**
                * Load attribute options
                * @return $this
                */
                public function loadAttributeOptions()
                {
                $this->setAttributeOption([
                'customer_first_order' => __('Customer first order')
                ]);
                return $this;
                }

                /**
                * Get input type
                * @return string
                */
                public function getInputType()
                {
                return 'select';
                }

                /**
                * Get value element type
                * @return string
                */
                public function getValueElementType()
                {
                return 'select';
                }

                /**
                * Get value select options
                * @return array|mixed
                */
                public function getValueSelectOptions()
                {
                if (!$this->hasData('value_select_options')) {
                $this->setData(
                'value_select_options',
                $this->sourceYesno->toOptionArray()
                );
                }
                return $this->getData('value_select_options');
                }

                /**
                * Validate Customer First Order Rule Condition
                * @param MagentoFrameworkModelAbstractModel $model
                * @return bool
                */
                public function validate(MagentoFrameworkModelAbstractModel $model)
                {
                $customerId = $model->getCustomerId();
                $order = $this->orderFactory->create()
                ->addAttributeToSelect('customer_id')
                ->addFieldToFilter('customer_id',['eq' => $customerId])
                ->getFirstItem();

                $firstOrder = 1;
                if ($order->getId()) {
                $firstOrder = 0;
                }
                $model->setData('customer_first_orde
                r', $firstOrder);
                return parent::validate($model);
                }
                }


                We load the Yesno model in the constructor of our logic that is mainly used as a source_model in the backend. We’ll fetch from it the available values for our select fields. Moreover, we load the factory of order collection that we will use for validating the condition correctness. We need to set the name and label of our condition in the loadAttributeOptions() method. getInputType() defines what will be displayed as an operator for comparing our attribute – the returned select field will allow us to choose “is” or “is not”. Returning a numeric value here would allow you to select available operators for comparing numbers, such as “greater than” or “less than”. getValueElementType() defines the type of the value with which we will compare our values. The returned select will render the field with available options, which we will define in getValueSelectOptions().



                In case we don’t want to define imposed values, we can return text – an input with the option to write a given value will then be displayed (using numeric value and text would allow you to create a condition “if the number of customer’s orders is greater than X – apply the discount”).



                The last method is validate() that we use to check whether the customer has other orders placed with his account, and then we can set the value that will be compared with the one we previously defined.



                Now, we only need to create a discount with our condition







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered May 23 '18 at 6:39









                Pramod KharadePramod Kharade

                1,7271028




                1,7271028













                • I have use above code for Magento 2.1.6. When i apply coupon code for first order, it apply, display success message but discount not deduct from order total. Do you have any idea?

                  – user55548
                  Nov 14 '18 at 6:55



















                • I have use above code for Magento 2.1.6. When i apply coupon code for first order, it apply, display success message but discount not deduct from order total. Do you have any idea?

                  – user55548
                  Nov 14 '18 at 6:55

















                I have use above code for Magento 2.1.6. When i apply coupon code for first order, it apply, display success message but discount not deduct from order total. Do you have any idea?

                – user55548
                Nov 14 '18 at 6:55





                I have use above code for Magento 2.1.6. When i apply coupon code for first order, it apply, display success message but discount not deduct from order total. Do you have any idea?

                – user55548
                Nov 14 '18 at 6:55













                1














                No Coding required. Create a coupon with the discounts and restrict the coupon to be used once per customer.



                enter image description here






                share|improve this answer




























                  1














                  No Coding required. Create a coupon with the discounts and restrict the coupon to be used once per customer.



                  enter image description here






                  share|improve this answer


























                    1












                    1








                    1







                    No Coding required. Create a coupon with the discounts and restrict the coupon to be used once per customer.



                    enter image description here






                    share|improve this answer













                    No Coding required. Create a coupon with the discounts and restrict the coupon to be used once per customer.



                    enter image description here







                    share|improve this answer












                    share|improve this answer



                    share|improve this answer










                    answered May 5 '18 at 5:48









                    Yogesh AgarwalYogesh Agarwal

                    712316




                    712316























                        0















                        1. Create coupon code and auto apply the by the observer at any step of the one-page checkout if it is customers 1st or order.

                        2. Send a coupon code on customer registration email.






                        share|improve this answer


























                        • sales_quote_collect_totals_before is this observer is okey??

                          – Midlaj
                          Feb 17 '18 at 10:09











                        • can you just elaborate in code level?.

                          – Midlaj
                          Feb 19 '18 at 3:48
















                        0















                        1. Create coupon code and auto apply the by the observer at any step of the one-page checkout if it is customers 1st or order.

                        2. Send a coupon code on customer registration email.






                        share|improve this answer


























                        • sales_quote_collect_totals_before is this observer is okey??

                          – Midlaj
                          Feb 17 '18 at 10:09











                        • can you just elaborate in code level?.

                          – Midlaj
                          Feb 19 '18 at 3:48














                        0












                        0








                        0








                        1. Create coupon code and auto apply the by the observer at any step of the one-page checkout if it is customers 1st or order.

                        2. Send a coupon code on customer registration email.






                        share|improve this answer
















                        1. Create coupon code and auto apply the by the observer at any step of the one-page checkout if it is customers 1st or order.

                        2. Send a coupon code on customer registration email.







                        share|improve this answer














                        share|improve this answer



                        share|improve this answer








                        edited Mar 19 '18 at 4:55









                        Teja Bhagavan Kollepara

                        2,98141947




                        2,98141947










                        answered Feb 17 '18 at 8:03









                        Arun TyagiArun Tyagi

                        374




                        374













                        • sales_quote_collect_totals_before is this observer is okey??

                          – Midlaj
                          Feb 17 '18 at 10:09











                        • can you just elaborate in code level?.

                          – Midlaj
                          Feb 19 '18 at 3:48



















                        • sales_quote_collect_totals_before is this observer is okey??

                          – Midlaj
                          Feb 17 '18 at 10:09











                        • can you just elaborate in code level?.

                          – Midlaj
                          Feb 19 '18 at 3:48

















                        sales_quote_collect_totals_before is this observer is okey??

                        – Midlaj
                        Feb 17 '18 at 10:09





                        sales_quote_collect_totals_before is this observer is okey??

                        – Midlaj
                        Feb 17 '18 at 10:09













                        can you just elaborate in code level?.

                        – Midlaj
                        Feb 19 '18 at 3:48





                        can you just elaborate in code level?.

                        – Midlaj
                        Feb 19 '18 at 3:48











                        0














                        For this feature, we have to customize magento 2 using below steps.




                        • Create a cart price rule for your "first time" discount.

                        • Add an attribute to the customer object named something like "used_first_coupon". Defaults to 0/false

                        • Add an event on customer creation that send the coupon code to the customer.

                        • Hook into the coupon applying code where you can check for the first time order base on it you can manipulate the coupon validation.

                        • Add an event listener post-order that will mark the customers used_first_coupon attribute as true.






                        share|improve this answer




























                          0














                          For this feature, we have to customize magento 2 using below steps.




                          • Create a cart price rule for your "first time" discount.

                          • Add an attribute to the customer object named something like "used_first_coupon". Defaults to 0/false

                          • Add an event on customer creation that send the coupon code to the customer.

                          • Hook into the coupon applying code where you can check for the first time order base on it you can manipulate the coupon validation.

                          • Add an event listener post-order that will mark the customers used_first_coupon attribute as true.






                          share|improve this answer


























                            0












                            0








                            0







                            For this feature, we have to customize magento 2 using below steps.




                            • Create a cart price rule for your "first time" discount.

                            • Add an attribute to the customer object named something like "used_first_coupon". Defaults to 0/false

                            • Add an event on customer creation that send the coupon code to the customer.

                            • Hook into the coupon applying code where you can check for the first time order base on it you can manipulate the coupon validation.

                            • Add an event listener post-order that will mark the customers used_first_coupon attribute as true.






                            share|improve this answer













                            For this feature, we have to customize magento 2 using below steps.




                            • Create a cart price rule for your "first time" discount.

                            • Add an attribute to the customer object named something like "used_first_coupon". Defaults to 0/false

                            • Add an event on customer creation that send the coupon code to the customer.

                            • Hook into the coupon applying code where you can check for the first time order base on it you can manipulate the coupon validation.

                            • Add an event listener post-order that will mark the customers used_first_coupon attribute as true.







                            share|improve this answer












                            share|improve this answer



                            share|improve this answer










                            answered May 5 '18 at 5:34









                            Kandarp B PatelKandarp B Patel

                            1706




                            1706























                                0














                                <?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="MagentoOfflineShippingModelCarrierTablerate" type="CustomerFreeShipModelTablerate" />
                                </config>
                                Override and Create new di.xml



                                After Create The New Model in your Custome module and set this code






                                namespace CustomerFreeShipModel;



                                use MagentoQuoteModelQuoteAddressRateRequest;



                                use MagentoShippingModelRateResult;



                                class Shipping extends MagentoShippingModelCarrierAbstractCarrier implements MagentoShippingModelCarrierCarrierInterface
                                {



                                /**
                                * @var string
                                */
                                protected $_code = 'simpleshipping';



                                /**
                                * @var MagentoShippingModelRateResultFactory
                                */
                                protected $_rateResultFactory;

                                /**
                                * @var MagentoQuoteModelQuoteAddressRateResultMethodFactory
                                */
                                protected $_rateMethodFactory;

                                protected $_session;

                                protected $orderFactory;

                                /**
                                * Shipping constructor.
                                *
                                * @param MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig
                                * @param MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory
                                * @param PsrLogLoggerInterface $logger
                                * @param MagentoShippingModelRateResultFactory $rateResultFactory
                                * @param MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory
                                * @param array $data
                                */
                                public function __construct(
                                MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig,
                                MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory,
                                PsrLogLoggerInterface $logger,
                                MagentoShippingModelRateResultFactory $rateResultFactory,
                                MagentoCustomerModelSession $session,
                                MagentoSalesModelOrderFactory $orderFactory,
                                MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory,
                                array $data = []
                                ) {
                                $this->_rateResultFactory = $rateResultFactory;
                                $this->_rateMethodFactory = $rateMethodFactory;
                                $this->_session = $session;
                                $this->orderFactory = $orderFactory;
                                parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);
                                }

                                /**
                                * get allowed methods
                                * @return array
                                */
                                public function getAllowedMethods()
                                {
                                return [$this->_code => $this->getConfigData('name')];
                                }

                                /**
                                * @return float
                                */
                                // private function getShippingPrice()
                                // {
                                // $configPrice = $this->getConfigData('price');

                                // $shippingPrice = $this->getFinalPriceWithHandlingFee($configPrice);

                                // return $shippingPrice;
                                // }

                                /**
                                * @param RateRequest $request
                                * @return bool|Result
                                */
                                public function collectRates(RateRequest $request)
                                {
                                if (!$this->getConfigFlag('active')) {
                                return false;
                                }

                                if($this->_session->isLoggedIn()){
                                $customer_id = $this->_session->getCustomer()->getId();
                                //$customer_email = $this->_session->getCustomer()->getEmail();

                                //$order = $this->_objectManager->create('MagentoSalesModelOrder')->load($customer_id);

                                $order = $this->orderFactory->create()->getCollection()->addAttributeToSelect('customer_id')
                                ->addFieldToFilter('customer_id',$customer_id);
                                //var_dump($order->getCustomerEmail()); die('uiuiuiuiuiu');
                                if(count($order->getData())>0){
                                return false;
                                }
                                }

                                /** @var MagentoShippingModelRateResult $result */
                                $result = $this->_rateResultFactory->create();

                                /** @var MagentoQuoteModelQuoteAddressRateResultMethod $method */
                                $method = $this->_rateMethodFactory->create();

                                $method->setCarrier($this->_code);
                                $method->setCarrierTitle($this->getConfigData('title'));

                                $method->setMethod($this->_code);
                                $method->setMethodTitle($this->getConfigData('name'));

                                //$amount = $this->getShippingPrice();

                                $method->setPrice('0');
                                $method->setCost('0');

                                $result->append($method);

                                return $result;
                                }


                                }






                                share|improve this answer






























                                  0














                                  <?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="MagentoOfflineShippingModelCarrierTablerate" type="CustomerFreeShipModelTablerate" />
                                  </config>
                                  Override and Create new di.xml



                                  After Create The New Model in your Custome module and set this code






                                  namespace CustomerFreeShipModel;



                                  use MagentoQuoteModelQuoteAddressRateRequest;



                                  use MagentoShippingModelRateResult;



                                  class Shipping extends MagentoShippingModelCarrierAbstractCarrier implements MagentoShippingModelCarrierCarrierInterface
                                  {



                                  /**
                                  * @var string
                                  */
                                  protected $_code = 'simpleshipping';



                                  /**
                                  * @var MagentoShippingModelRateResultFactory
                                  */
                                  protected $_rateResultFactory;

                                  /**
                                  * @var MagentoQuoteModelQuoteAddressRateResultMethodFactory
                                  */
                                  protected $_rateMethodFactory;

                                  protected $_session;

                                  protected $orderFactory;

                                  /**
                                  * Shipping constructor.
                                  *
                                  * @param MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig
                                  * @param MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory
                                  * @param PsrLogLoggerInterface $logger
                                  * @param MagentoShippingModelRateResultFactory $rateResultFactory
                                  * @param MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory
                                  * @param array $data
                                  */
                                  public function __construct(
                                  MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig,
                                  MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory,
                                  PsrLogLoggerInterface $logger,
                                  MagentoShippingModelRateResultFactory $rateResultFactory,
                                  MagentoCustomerModelSession $session,
                                  MagentoSalesModelOrderFactory $orderFactory,
                                  MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory,
                                  array $data = []
                                  ) {
                                  $this->_rateResultFactory = $rateResultFactory;
                                  $this->_rateMethodFactory = $rateMethodFactory;
                                  $this->_session = $session;
                                  $this->orderFactory = $orderFactory;
                                  parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);
                                  }

                                  /**
                                  * get allowed methods
                                  * @return array
                                  */
                                  public function getAllowedMethods()
                                  {
                                  return [$this->_code => $this->getConfigData('name')];
                                  }

                                  /**
                                  * @return float
                                  */
                                  // private function getShippingPrice()
                                  // {
                                  // $configPrice = $this->getConfigData('price');

                                  // $shippingPrice = $this->getFinalPriceWithHandlingFee($configPrice);

                                  // return $shippingPrice;
                                  // }

                                  /**
                                  * @param RateRequest $request
                                  * @return bool|Result
                                  */
                                  public function collectRates(RateRequest $request)
                                  {
                                  if (!$this->getConfigFlag('active')) {
                                  return false;
                                  }

                                  if($this->_session->isLoggedIn()){
                                  $customer_id = $this->_session->getCustomer()->getId();
                                  //$customer_email = $this->_session->getCustomer()->getEmail();

                                  //$order = $this->_objectManager->create('MagentoSalesModelOrder')->load($customer_id);

                                  $order = $this->orderFactory->create()->getCollection()->addAttributeToSelect('customer_id')
                                  ->addFieldToFilter('customer_id',$customer_id);
                                  //var_dump($order->getCustomerEmail()); die('uiuiuiuiuiu');
                                  if(count($order->getData())>0){
                                  return false;
                                  }
                                  }

                                  /** @var MagentoShippingModelRateResult $result */
                                  $result = $this->_rateResultFactory->create();

                                  /** @var MagentoQuoteModelQuoteAddressRateResultMethod $method */
                                  $method = $this->_rateMethodFactory->create();

                                  $method->setCarrier($this->_code);
                                  $method->setCarrierTitle($this->getConfigData('title'));

                                  $method->setMethod($this->_code);
                                  $method->setMethodTitle($this->getConfigData('name'));

                                  //$amount = $this->getShippingPrice();

                                  $method->setPrice('0');
                                  $method->setCost('0');

                                  $result->append($method);

                                  return $result;
                                  }


                                  }






                                  share|improve this answer




























                                    0












                                    0








                                    0







                                    <?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="MagentoOfflineShippingModelCarrierTablerate" type="CustomerFreeShipModelTablerate" />
                                    </config>
                                    Override and Create new di.xml



                                    After Create The New Model in your Custome module and set this code






                                    namespace CustomerFreeShipModel;



                                    use MagentoQuoteModelQuoteAddressRateRequest;



                                    use MagentoShippingModelRateResult;



                                    class Shipping extends MagentoShippingModelCarrierAbstractCarrier implements MagentoShippingModelCarrierCarrierInterface
                                    {



                                    /**
                                    * @var string
                                    */
                                    protected $_code = 'simpleshipping';



                                    /**
                                    * @var MagentoShippingModelRateResultFactory
                                    */
                                    protected $_rateResultFactory;

                                    /**
                                    * @var MagentoQuoteModelQuoteAddressRateResultMethodFactory
                                    */
                                    protected $_rateMethodFactory;

                                    protected $_session;

                                    protected $orderFactory;

                                    /**
                                    * Shipping constructor.
                                    *
                                    * @param MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig
                                    * @param MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory
                                    * @param PsrLogLoggerInterface $logger
                                    * @param MagentoShippingModelRateResultFactory $rateResultFactory
                                    * @param MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory
                                    * @param array $data
                                    */
                                    public function __construct(
                                    MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig,
                                    MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory,
                                    PsrLogLoggerInterface $logger,
                                    MagentoShippingModelRateResultFactory $rateResultFactory,
                                    MagentoCustomerModelSession $session,
                                    MagentoSalesModelOrderFactory $orderFactory,
                                    MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory,
                                    array $data = []
                                    ) {
                                    $this->_rateResultFactory = $rateResultFactory;
                                    $this->_rateMethodFactory = $rateMethodFactory;
                                    $this->_session = $session;
                                    $this->orderFactory = $orderFactory;
                                    parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);
                                    }

                                    /**
                                    * get allowed methods
                                    * @return array
                                    */
                                    public function getAllowedMethods()
                                    {
                                    return [$this->_code => $this->getConfigData('name')];
                                    }

                                    /**
                                    * @return float
                                    */
                                    // private function getShippingPrice()
                                    // {
                                    // $configPrice = $this->getConfigData('price');

                                    // $shippingPrice = $this->getFinalPriceWithHandlingFee($configPrice);

                                    // return $shippingPrice;
                                    // }

                                    /**
                                    * @param RateRequest $request
                                    * @return bool|Result
                                    */
                                    public function collectRates(RateRequest $request)
                                    {
                                    if (!$this->getConfigFlag('active')) {
                                    return false;
                                    }

                                    if($this->_session->isLoggedIn()){
                                    $customer_id = $this->_session->getCustomer()->getId();
                                    //$customer_email = $this->_session->getCustomer()->getEmail();

                                    //$order = $this->_objectManager->create('MagentoSalesModelOrder')->load($customer_id);

                                    $order = $this->orderFactory->create()->getCollection()->addAttributeToSelect('customer_id')
                                    ->addFieldToFilter('customer_id',$customer_id);
                                    //var_dump($order->getCustomerEmail()); die('uiuiuiuiuiu');
                                    if(count($order->getData())>0){
                                    return false;
                                    }
                                    }

                                    /** @var MagentoShippingModelRateResult $result */
                                    $result = $this->_rateResultFactory->create();

                                    /** @var MagentoQuoteModelQuoteAddressRateResultMethod $method */
                                    $method = $this->_rateMethodFactory->create();

                                    $method->setCarrier($this->_code);
                                    $method->setCarrierTitle($this->getConfigData('title'));

                                    $method->setMethod($this->_code);
                                    $method->setMethodTitle($this->getConfigData('name'));

                                    //$amount = $this->getShippingPrice();

                                    $method->setPrice('0');
                                    $method->setCost('0');

                                    $result->append($method);

                                    return $result;
                                    }


                                    }






                                    share|improve this answer















                                    <?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="MagentoOfflineShippingModelCarrierTablerate" type="CustomerFreeShipModelTablerate" />
                                    </config>
                                    Override and Create new di.xml



                                    After Create The New Model in your Custome module and set this code






                                    namespace CustomerFreeShipModel;



                                    use MagentoQuoteModelQuoteAddressRateRequest;



                                    use MagentoShippingModelRateResult;



                                    class Shipping extends MagentoShippingModelCarrierAbstractCarrier implements MagentoShippingModelCarrierCarrierInterface
                                    {



                                    /**
                                    * @var string
                                    */
                                    protected $_code = 'simpleshipping';



                                    /**
                                    * @var MagentoShippingModelRateResultFactory
                                    */
                                    protected $_rateResultFactory;

                                    /**
                                    * @var MagentoQuoteModelQuoteAddressRateResultMethodFactory
                                    */
                                    protected $_rateMethodFactory;

                                    protected $_session;

                                    protected $orderFactory;

                                    /**
                                    * Shipping constructor.
                                    *
                                    * @param MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig
                                    * @param MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory
                                    * @param PsrLogLoggerInterface $logger
                                    * @param MagentoShippingModelRateResultFactory $rateResultFactory
                                    * @param MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory
                                    * @param array $data
                                    */
                                    public function __construct(
                                    MagentoFrameworkAppConfigScopeConfigInterface $scopeConfig,
                                    MagentoQuoteModelQuoteAddressRateResultErrorFactory $rateErrorFactory,
                                    PsrLogLoggerInterface $logger,
                                    MagentoShippingModelRateResultFactory $rateResultFactory,
                                    MagentoCustomerModelSession $session,
                                    MagentoSalesModelOrderFactory $orderFactory,
                                    MagentoQuoteModelQuoteAddressRateResultMethodFactory $rateMethodFactory,
                                    array $data = []
                                    ) {
                                    $this->_rateResultFactory = $rateResultFactory;
                                    $this->_rateMethodFactory = $rateMethodFactory;
                                    $this->_session = $session;
                                    $this->orderFactory = $orderFactory;
                                    parent::__construct($scopeConfig, $rateErrorFactory, $logger, $data);
                                    }

                                    /**
                                    * get allowed methods
                                    * @return array
                                    */
                                    public function getAllowedMethods()
                                    {
                                    return [$this->_code => $this->getConfigData('name')];
                                    }

                                    /**
                                    * @return float
                                    */
                                    // private function getShippingPrice()
                                    // {
                                    // $configPrice = $this->getConfigData('price');

                                    // $shippingPrice = $this->getFinalPriceWithHandlingFee($configPrice);

                                    // return $shippingPrice;
                                    // }

                                    /**
                                    * @param RateRequest $request
                                    * @return bool|Result
                                    */
                                    public function collectRates(RateRequest $request)
                                    {
                                    if (!$this->getConfigFlag('active')) {
                                    return false;
                                    }

                                    if($this->_session->isLoggedIn()){
                                    $customer_id = $this->_session->getCustomer()->getId();
                                    //$customer_email = $this->_session->getCustomer()->getEmail();

                                    //$order = $this->_objectManager->create('MagentoSalesModelOrder')->load($customer_id);

                                    $order = $this->orderFactory->create()->getCollection()->addAttributeToSelect('customer_id')
                                    ->addFieldToFilter('customer_id',$customer_id);
                                    //var_dump($order->getCustomerEmail()); die('uiuiuiuiuiu');
                                    if(count($order->getData())>0){
                                    return false;
                                    }
                                    }

                                    /** @var MagentoShippingModelRateResult $result */
                                    $result = $this->_rateResultFactory->create();

                                    /** @var MagentoQuoteModelQuoteAddressRateResultMethod $method */
                                    $method = $this->_rateMethodFactory->create();

                                    $method->setCarrier($this->_code);
                                    $method->setCarrierTitle($this->getConfigData('title'));

                                    $method->setMethod($this->_code);
                                    $method->setMethodTitle($this->getConfigData('name'));

                                    //$amount = $this->getShippingPrice();

                                    $method->setPrice('0');
                                    $method->setCost('0');

                                    $result->append($method);

                                    return $result;
                                    }


                                    }







                                    share|improve this answer














                                    share|improve this answer



                                    share|improve this answer








                                    edited 1 min ago

























                                    answered 19 mins ago









                                    hirokapuriyahirokapuriya

                                    213




                                    213






























                                        draft saved

                                        draft discarded




















































                                        Thanks for contributing an answer to Magento Stack Exchange!


                                        • Please be sure to answer the question. Provide details and share your research!

                                        But avoid



                                        • Asking for help, clarification, or responding to other answers.

                                        • Making statements based on opinion; back them up with references or personal experience.


                                        To learn more, see our tips on writing great answers.




                                        draft saved


                                        draft discarded














                                        StackExchange.ready(
                                        function () {
                                        StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f213903%2fmagento-2-how-to-implement-first-order-discount%23new-answer', 'question_page');
                                        }
                                        );

                                        Post as a guest















                                        Required, but never shown





















































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown

































                                        Required, but never shown














                                        Required, but never shown












                                        Required, but never shown







                                        Required, but never shown







                                        Popular posts from this blog

                                        “%fieldName is a required field.”, in Magento2 REST API Call for GET Method Type The Next...

                                        How to change City field to a dropdown in Checkout step Magento 2Magento 2 : How to change UI field(s)...

                                        夢乃愛華...