Techno-Functional Dynamics 365 Data Model Tutorial Part 16 of 25 – Create Sales Quotation Process

Techno-Functional Dynamics 365 Data Model Tutorial Part 16 of 25 – Create Sales Quotation Process

TechnoFunctional Dynamics 365 Data Model Tutorial

Create a Sales Quotation Process

A ‘Sales Quotation’ or business sale quote is a formal business document. It allows a potential buyer/customer to view the cost involved in purchasing a specific service or product. Actually, it is generally used by suppliers or resellers to initiate a business transaction cycle. Moreover, a professional ‘Sales Quotation’ contains an itemized list of products and services. Also, it states the price per item, terms of sale, and acceptable payment methods. So, before making a purchase, a sales quote is furnished at the request of a prospective buyer who is interested in knowing the cost of a certain product/service, or both. Indeed, learning how to Create Sales Quotation is ideal.

A ‘Sales Quotation’ is a formal document. However, it is not a legally binding contract. Instead, it is a document to establish a mutual understanding between two business entities. Doing that, once the quote is accepted/agreed upon, the Seller and the Customer commits to making a transaction at the stated prices and conditions.

Going forward, Follow-up is an integral and important part of the sales process. Moreover, not following through results is a missed opportunity for conversion. Actually, Follow-up is one of the significant factors in a sales process that helps convert a quote into an actual sale. A follow-up activity is about demonstrating your interest and seriousness to your buyers regarding the intended transaction. Once you have shared the ‘Sales Quotation’, the team should follow up within 2-3 working days to inquire regarding feedback, intentions, or concerns. It is a good method to stay on their radar and increase your chance of winning the deal.

Now, let’s see how to create a Sales Quotation inside Dynamics 365:

Quick Functional Recap

STEP 1

Go to Sales and marketing > Sales quotations > All quotations.

Create Sales Quotation. Dynamics 365 Techno-Functional Tutorial (16 of 25)

STEP 2

Click on New

Create Sales Quotation. Dynamics 365 Techno-Functional Tutorial (16 of 25)

STEP 3

In the Account type field, select an option.

In the Customer account field, enter or select a value.

Click OK.

Click Yes.

Create Sales Quotation. Dynamics 365 Techno-Functional Tutorial (16 of 25)

STEP 4

In the Line details, select item and enter the quantity of the item

Create Sales Quotation. Dynamics 365 Techno-Functional Tutorial (16 of 25)


STEP 5

Go to the Quotation tab. There, click on the Send quotation tab to send the quotation.

STEP 6

To confirm the quotation, go to the Follow up Tab. There, Click on Confirm button to confirm the sales quotation. Doing that, a dialog box will come up. After it happens, click on OK.

Quick Technical Recap

1. SalesQuotationTable

Contains sales quotation header details

Data Field Data Type Description
QUOTATIONID nvarchar Primary Key identifier for the Sales Quotation.
CONFIRMDATE datetime Date of confirmation of the sales quotation
CUSTACCOUNT nvarchar The customer account number
CUSTPURCHASEORDER nvarchar In case the Sales Quotation is accepted, this is the purchase order number

2. SalesQuotationLine

Contains sales quotation Line details

Data Field Data Type Description
INVENTRAANSID String Primary key identifier for the sales quotation line table
NAME String Name of the sales quotation
PRICEUNIT Real Price of the item’s unit in the quotation
QUOTATIONID String Foreign key of the SalesQuotationTable
ITEMID String Foreign key of the InventTable

3. LogisticPostalAddress

The LogisticsPostalAddress table contains addresses in the system that could be associated with various entities:

Data Field Data Type Description
RECID Int64 Primary Key Identifier for the Logistic Postal Address table
ADDRESS String The customer’s address
CITY String The customer’s City of residence
ZIPCODE String The customer’s Zip code

4. InventTable

The InventTable table contains information about items:

Data Field Data Type Description
ITEMID String Primary key identifier for the Item table
HEIGHT Real The item’s height
WIDTH Real The item’s width
ITEMTYPE Enum The enumeration that identifies whether an item is an Inventory, Non-inventory or if it’s a service.

5. InventTransOrigin

Data Field Data Type Description
RECID Int64 Primary key identifier for Invent Trans Origin Table
REFERENCECATEGORY Enum An enumeration that denotes the category of the reference
INVENTRAANSID String Foreign key of the SalesQuotationLine table

ERD – Entity Relationship Diagram

This is the ERD for the Sales Quotation process:

Code

This code is used to create a sales order quotation in X++.

  
    static void CreateSalesQuotation(Args _args)
    {
        AxSalesQuotationTable       axSalesQuotationTable;
        AxSalesQuotationLine        axSalesQuotationLine ;
        SalesQuotationTable         salesQuotationTable;
        SalesQuotationLine          salesQuotationLine;
        CustTable                   custTable;
        InventTable                 inventTable;
        SalesQty                    salesQty;
        SalesPrice                  salesPrice;
        SalesLineDisc               salesLineDisc;
        SalesLinePercent            salesLinePercent;
        container                   conItems = ["ItemA","Dell","HP"];
        int                         i =0;
        InventDim                   inventDim;
        SalesQuotationEditLinesForm salesQuotationEditLinesForm;
        ParmId                      parmId;
        SalesQuotationUpdate        salesQuotationUpdate;
        ;
 
        salesQty                    = 10;
        SalesPrice                  = 100;
        salesLineDisc               = 1;
        salesLinePercent            = 1;
        axSalesQuotationTable =  new AxSalesQuotationTable();
        axSalesQuotationTable.parmCustAccount('Jaga');
        axSalesQuotationTable.parmCurrencyCode('USD');
        axSalesQuotationTable.save();
 
        for(i = 1; i<= conLen(conItems); i++)
        {
            axSalesQuotationLine =  new AxSalesQuotationLine();//::construct(smmQuotationLine);
 
            axSalesQuotationLine.axSalesQuotationTable(axSalesQuotationTable);
 
            axSalesQuotationLine.parmQuotationId(axSalesQuotationTable.parmQuotationId());
            axSalesQuotationLine.axSalesQuotationTable(axSalesQuotationTable);
            axSalesQuotationLine.parmItemId(conPeek(conItems,i));
 
            axSalesQuotationLine.parmSalesQty(salesQty);
            axSalesQuotationLine.parmSalesPrice(SalesPrice);
            axSalesQuotationLine.parmLineDisc(SalesLineDisc);
            axSalesQuotationLine.parmLinePercent(SalesLinePercent);
            inventDim.InventSiteId      = "1";
            inventDim.InventLocationId  = "11";
 

            axSalesQuotationLine.parmInventDimId('002504');
            axSalesQuotationLine.parmcurrencyCode('USD');
            axSalesQuotationLine.save();
        }
 
        //Quotation status -- sent
        if(!axSalesQuotationTable.salesQuotationTable()) return;
        salesQuotationEditLinesForm =
     SalesQuotationEditLinesForm::construct(DocumentStatus::Quotation); //DocumentStatus
        parmId                      = salesQuotationEditLinesForm.parmId();
 

        salesQuotationEditLinesForm.initParmSalesQuotationTable(axSalesQuotationTable.salesQuotationTable());
 
        salesQuotationEditLinesForm.parmId(parmId);
        salesQuotationEditLinesForm.parmTransDate(systemdateget());
 
        salesQuotationEditLinesForm.prePromptInit();
 
        salesQuotationEditLinesForm.initParameters(NoYes::No, //printFormletter,
                                                NoYes::No, //transferHours2Forecast,
                                                NoYes::No, //transferExpenses2Forecast,
                                                NoYes::No, //transferFees2Forecast,
                                                NoYes::No, //transferItems2Forecast,
                                                'Competency', //reasonCode,
                                                NoYes::No);   //usePrintManagement)
        salesQuotationEditLinesForm.run();
 
        /// Quotation status -- Confirmation
        if(!axSalesQuotationTable.salesQuotationTable())
         return;
        salesQuotationEditLinesForm =
            SalesQuotationEditLinesForm::construct(DocumentStatus::Confirmation); //DocumentStatus
        //Quotation o Confirm
        parmId                      = salesQuotationEditLinesForm.parmId();
 

        salesQuotationEditLinesForm.initParmSalesQuotationTable(axSalesQuotationTable.salesQuotationTable());
 
        salesQuotationEditLinesForm.parmId(parmId);
        salesQuotationEditLinesForm.parmTransDate(systemdateget());
 
        salesQuotationEditLinesForm.prePromptInit();
 
        salesQuotationEditLinesForm.initParameters(NoYes::No, //printFormletter,
                                                NoYes::No, //transferHours2Forecast,
                                                NoYes::No, //transferExpenses2Forecast,
                                                NoYes::No, //transferFees2Forecast,
                                                NoYes::No, //transferItems2Forecast,
                                                'Competency', //reasonCode,
                                                NoYes::No);   //usePrintManagement)
        salesQuotationEditLinesForm.run();
 
    }

 

Summary

In this blog post you have:

  • Learned about the ‘Sales Quotation’ Process
  • Familiarized yourself with the step by step ‘Sales Quotation’ creation process
  • Looked at executable code, tables, and ERD for the process
  • Understood the importance of the tables SalesQuotationTable, SalesQuotationLine, LogisticPostalAddress, InventTable and InventTransOrigin

We sincerely hope that you enjoyed part 16 of our exciting series on the Dynamics 365 data model. We aim to provide quality service at all times.  And as always, if you need to reach me, you know how to get in touch by reaching out to me here.  — Brandon Ahmad, founder of InstructorBrandon and Dynatuners

Leave a Reply

Your email address will not be published. Required fields are marked *