X++ code to create Price Simulator Custom Service in D365 F&O

Request Class :

[DataContractAttribute("BAS_PriceSimulatorContract")]

class BAS_PriceSimulatorContract

{

    str            itemNumber;

    str            dataAreaId;

    str            channelId;

    TransDateTime  channelDateTime;

    CurrencyCode   currencyCode;

    str            catalogs;

    int            quantity;

    str            customerAccount;

    str            affiliations;

    str            loyalityTiers;

    str            couponCodes;

    str            priceGroups;


    [DataMemberAttribute("itemNumber")]

    public str parmItemNumber(str _itemNumber = itemNumber)

    {

        itemNumber = _itemNumber;

        return itemNumber;

    }


    [DataMemberAttribute("ChannelId")]

    public str parmChannelId(str _channelId = channelId)

    {

        channelId = _channelId;

        return channelId;

    }


    [DataMemberAttribute("ChannelDateTime")]

    public TransDateTime parmChannelDateTime(TransDateTime _channelDateTime = channelDateTime)

    {

        channelDateTime = _channelDateTime;

        return channelDateTime;

    }


    [DataMemberAttribute("CurrencyCode")]

    public str parmCurrencyCode(str _currencyCode = currencyCode)

    {

        currencyCode = _currencyCode;

        return currencyCode;

    }


    [DataMemberAttribute("Quantity")]

    public int parmQuantity(int _quantity = quantity)

    {

        quantity = _quantity;

        return quantity;

    }


    [DataMemberAttribute("Catalogs")]

    public str parmCatalogs(str _catalogs = catalogs)

    {

        catalogs = _catalogs;

        return catalogs;

    }


    [DataMemberAttribute("CustomerAccount")]

    public str parmCustomerAccount(str _customerAccount = customerAccount)

    {

        customerAccount = _customerAccount;

        return customerAccount;

    }


    [DataMemberAttribute("Affiliations")]

    public str parmAffiliations(str _affiliations = affiliations)

    {

        affiliations = _affiliations;

        return affiliations;

    }


    [DataMemberAttribute("Loyaltytiers")]

    public str parmLoyaltytiers(str _loyalityTiers = loyalityTiers)

    {

        loyalityTiers = _loyalityTiers;

        return loyalityTiers;

    }


    [DataMemberAttribute("Couponcodes")]

    public str parmCouponcodes(str _couponCodes = couponCodes)

    {

        couponCodes = _couponCodes;

        return couponCodes;

    }


    [DataMemberAttribute("Pricegroups")]

    public str parmPricegroups(str _priceGroups = priceGroups)

    {

        priceGroups = _priceGroups;

        return priceGroups;

    }


    [DataMemberAttribute("dataAreaId")]

    public str parmdataAreaId(str _dataAreaId = dataAreaId)

    {

        dataAreaId = _dataAreaId;

        return dataAreaId;

    }


}


Response Class :

[DataContractAttribute("BAS_PriceSimulatorContractResponse")]

class BAS_PriceSimulatorContractResponse

{

    ItemId              itemId;

    Name                 name;

    UnitOfMeasureSymbol unitOfMeasure;

    Price               originalPrice;

    Price               discountprice;

    Price               discountamount;

    DiscPct             discountPercentage;

    [DataMember('ItemId')]

    public ItemId parmItemId(ItemId _itemId = itemId)

    {

        itemId = _itemId;

        return itemId;

    }


    [DataMember('Name')]

    public Name parmName(Name _name = name)

    {

        name = _name;

        return name;

    }


    [DataMember('Unit')]

    public UnitOfMeasureSymbol parmUnitOfMeasureRecId(UnitOfMeasureSymbol _unitOfMeasure = unitOfMeasure)

    {

        unitOfMeasure = _unitOfMeasure;

        return unitOfMeasure;

    }


    [DataMember('Original Price')]

    public Price parmPrice(Price _originalPrice = originalPrice)

    {

        originalPrice = _originalPrice;

        return originalPrice;

    }


    [DataMember('Sales Price')]

    public Price parmDiscountPrice(Price _discountprice = discountprice)

    {

        discountprice = _discountprice;

        return discountprice;

    }


    [DataMember('Discount Amount')]

    public Price parmDiscountAmount(Price _discountamount = discountamount)

    {

        discountamount = _discountamount;

        return discountamount;

    }


    [DataMember('Discount Percentage')]

    public DiscPct parmDiscPct(DiscPct _discountPercentage = discountPercentage)

    {

        discountPercentage = _discountPercentage;

        return discountPercentage;

    }


    private static BAS_PriceSimulatorContractResponse construct()

    {

        return new BAS_PriceSimulatorContractResponse();

    }


    public static BAS_PriceSimulatorContractResponse newFromTableRecord(RetailDiscountOffer   _discountOffer,RetailDiscountLineOffer _lineOffer, EcoResProduct _ecoResProduct,real _price, InventTable _inventTable , InventTableModule _inventTableModule,real _discountamount , real _salesprice)

    {

        BAS_PriceSimulatorContractResponse  contract = BAS_PriceSimulatorContractResponse::construct();

        contract.parmItemId(_ecoResProduct.DisplayProductNumber);

        contract.parmName(_ecoResProduct.productName());

        contract.parmUnitOfMeasureRecId(_inventTableModule.UnitId);

        contract.parmPrice(_salesprice);

        contract.parmDiscountPrice(_price);

        contract.parmDiscPct(_lineOffer.discPct);

        contract.parmDiscountAmount(_discountamount);

        return contract;


    }


    public static BAS_PriceSimulatorContractResponse newFromTableRecord1(RetailPeriodicDiscountLine _discountLine,RetailMultibuyDiscountLine _multiBuyDiscount, EcoResProduct _ecoResProduct,real _price1, InventTable _inventTable1 , InventTableModule _inventTableModule1,real _discountamount1 , real _salesprice1)

    {

        BAS_PriceSimulatorContractResponse  contract = BAS_PriceSimulatorContractResponse::construct();

        contract.parmItemId(_ecoResProduct.DisplayProductNumber);

        contract.parmName(_discountLine.Name);

        contract.parmUnitOfMeasureRecId(_inventTableModule1.UnitId);

        contract.parmPrice(_salesprice1);

        contract.parmDiscountPrice(_price1);

        contract.parmDiscPct(_multiBuyDiscount.priceDiscPct);

        contract.parmDiscountAmount(_discountamount1);

        return contract;


    }


    public static BAS_PriceSimulatorContractResponse newFromTableRecord2(RetailDiscountLineOffer _lineOffer, EcoResProduct _ecoResProduct,real _price1, InventTable _inventTable1 , InventTableModule _inventTableModule1,real _discountamount1 , real _salesprice1)

    {

        BAS_PriceSimulatorContractResponse  contract = BAS_PriceSimulatorContractResponse::construct();

        contract.parmItemId(_inventTable1.ItemId);

        contract.parmName(_ecoResProduct.productName());

        contract.parmUnitOfMeasureRecId(_inventTableModule1.UnitId);

        contract.parmPrice(_salesprice1);

        contract.parmDiscountPrice(_price1);

        contract.parmDiscPct(_lineOffer.discPct);

        contract.parmDiscountAmount(_discountamount1);

        return contract;


    }


    public static BAS_PriceSimulatorContractResponse newFromTableRecord3(RetailPeriodicDiscount _periodicDiscount,RetailDiscountLineMixAndMatch _mixAndMatch, EcoResProduct _ecoResProduct,real _price1, InventTable _inventTable1 , InventTableModule _inventTableModule1,real _discountamount1 , real _salesprice1)

    {

        BAS_PriceSimulatorContractResponse  contract = BAS_PriceSimulatorContractResponse::construct();

        contract.parmItemId(_ecoResProduct.DisplayProductNumber);

        contract.parmName(_ecoResProduct.productName());

        contract.parmUnitOfMeasureRecId(_inventTableModule1.UnitId);

        contract.parmPrice(_salesprice1);

        contract.parmDiscountPrice(_price1);

        contract.parmDiscPct(_periodicDiscount.DiscountPercentValue);

        contract.parmDiscountAmount(_discountamount1);

        return contract;


    }


    public static BAS_PriceSimulatorContractResponse newFromTableRecord4(RetailDiscountLineOffer _offer,EcoResProduct _ecoResProduct,real _price1, InventTable _inventTable1 , InventTableModule _inventTableModule1,real _discountamount1 , real _salesprice1)

    {

        BAS_PriceSimulatorContractResponse  contract = BAS_PriceSimulatorContractResponse::construct();

        contract.parmItemId(_ecoResProduct.DisplayProductNumber);

        contract.parmName(_ecoResProduct.productName());

        contract.parmUnitOfMeasureRecId(_inventTableModule1.UnitId);

        contract.parmPrice(_salesprice1);

        contract.parmDiscountPrice(_price1);

        contract.parmDiscPct(_offer.discPct);

        contract.parmDiscountAmount(_discountamount1);

        return contract;


    }


}


Helper Class :

class BAS_PriceSimulatorHelper

{

    [AifCollectionTypeAttribute('return', Types::Class, classStr(BAS_PriceSimulatorContractResponse))]

    public List getcalculation(str _itemNumber , str _dataAreaId, str _channelId, TransDateTime _channelDateTime, CurrencyCode _currencyCode , str _catalogs, str _customerAccount,  str _affiliations,  str _loyalityTiers, str  _couponCodes,  str priceGroups , int _quantity)

    {

        str itemNumber       = _itemNumber;

        str dataAreaId       = _dataAreaId;

        str channelId        = _channelId;

        str currencyCode     = _currencyCode;

        int quantity         = _quantity;

        List                 priceSimulatorList  = new List(Types::Class);

        changecompany(dataAreaId)

        {

            RetailDiscountLineMixAndMatch    maxAndMatch;

            RetailPeriodicDiscountLine       discountLine1,discountLine2,discountLine3;

            RetailDiscountLineOffer          discountLine,discountLine5,discountLine4;

            InventTableModule                inventTableModule,inventTableModule1,inventTableModule2,inventTableModule3,inventTableModule4;

            RetailGroupMemberLine            memberLine,memberLine1,memberLine2,memberLine3;

            InventTable                      inventTable,inventTable1,inventTable2,inventTable3,inventTable4;

            EcoResProduct                    ecoResProduct,ecoResProduct1,ecoResProduct2,ecoResProduct3,ecoResProduct4,ecoResProduct5;

            RetailMultibuyDiscountLine       retailMultiBuyDiscountLine;

            RetailDiscountOffer              discountOffer;

            RetailPeriodicDiscount           periodicDiscount,periodicDiscount1,periodicDiscount2,periodicDiscount3,periodicDiscount4,periodicDiscount5;

            RetailDiscountThresholdTiers     thresholdTiers;

            RetailDiscountPriceGroup         priceGroup,priceGroup1,priceGroup2,priceGroup3,priceGroup4,priceGroup5;

            RetailChannelPriceGroup          priceGroupEntity,priceGroupEntity1,priceGroupEntity2,priceGroupEntity3,priceGroupEntity4,priceGroupEntity5;

            RetailChannelTable               channelTable,channelTable1,channelTable2,channelTable3,channelTable4,channelTable5;

            

            // normal discount query

            select Name,discPct,OfferId from discountLine order by discPct desc

            join memberLine

            where discountLine.RetailGroupMemberLine == memberLine.RecId

            join periodicDiscount3

            where periodicDiscount3.OfferId == discountLine.OfferId

            join priceGroup2

            where priceGroup2.OfferId == discountLine.OfferId

            join priceGroupEntity

            where priceGroupEntity.PriceGroup == priceGroup2.PriceDiscGroup

            join channelTable

            where channelTable.RecId == priceGroupEntity.RetailChannel

            join DisplayProductNumber from ecoResProduct

                    where ecoResProduct.RecId == memberLine.Product

                && ecoResProduct.DisplayProductNumber == itemNumber

                && channelTable.inventLocation == channelId

            && periodicDiscount3.CurrencyCode == currencyCode;


            // Discount with quantity limit

            select QuantityLimit from discountOffer order by QuantityLimit desc

                join periodicDiscount

                    where discountOffer.OfferId == periodicDiscount.OfferId

                join priceGroup

                    where priceGroup.OfferId == periodicDiscount.OfferId

                join priceGroupEntity1

                    where priceGroupEntity1.PriceGroup == priceGroup.PriceDiscGroup

                join channelTable1

                    where channelTable1.RecId == priceGroupEntity1.RetailChannel

                join * from discountLine2

                    where periodicDiscount.OfferId == discountLine2.OfferId

                join discPct from discountLine5 order by discPct desc

                    where discountLine5.RecId == discountLine2.RecId

                join memberLine2

                    where discountLine2.RetailGroupMemberLine == memberLine2.RecId

                join ecoResProduct2

                    where ecoResProduct2.RecId == memberLine2.Product

                         && ecoResProduct2.DisplayProductNumber == itemNumber

                         && channelTable1.inventLocation == channelId

                && periodicDiscount.CurrencyCode == currencyCode;


            // Quantity Discount

            select Name from discountLine1

                join memberLine1

                    where discountLine1.RetailGroupMemberLine == memberLine1.RecId

            join periodicDiscount4

            where periodicDiscount4.OfferId == discountLine1.OfferId

                join ecoResProduct1

                    where ecoResProduct1.RecId == memberLine1.Product

                join qtyLowest,priceDiscPct from retailMultiBuyDiscountLine order by priceDiscPct desc

                    where retailMultiBuyDiscountLine.multibuyId == discountLine1.OfferId

                join priceGroup3

                    where priceGroup3.OfferId == discountLine1.OfferId

                join priceGroupEntity3

                    where priceGroupEntity3.PriceGroup == priceGroup3.PriceDiscGroup

                join channelTable2

                    where channelTable2.RecId == priceGroupEntity3.RetailChannel

                            && ecoResProduct1.DisplayProductNumber == itemNumber

                            && channelTable2.inventLocation == channelId

                            && periodicDiscount4.CurrencyCode == currencyCode;


            //Mix and Match Discount

            select DiscountPercentValue from periodicDiscount1 order by DiscountPercentValue desc

              join * from discountLine2

                  where periodicDiscount1.OfferId == discountLine2.OfferId

              join priceGroup1

                  where priceGroup1.OfferId == periodicDiscount1.OfferId

              join memberLine3

                   where discountLine2.RetailGroupMemberLine == memberLine3.RecId

              join priceGroup4

                  where priceGroup4.OfferId == discountLine2.OfferId

              join priceGroupEntity4

                  where priceGroupEntity4.PriceGroup == priceGroup4.PriceDiscGroup

              join channelTable3

                  where channelTable3.RecId == priceGroupEntity4.RetailChannel

              join ecoResProduct3

                  where ecoResProduct3.RecId == memberLine3.Product

              join numberOfItemsNeeded from maxAndMatch

                  where maxAndMatch.RecId == discountLine2.RecId

                    && ecoResProduct3.DisplayProductNumber == itemNumber

                    && channelTable3.inventLocation == channelId

                    && maxAndMatch.numberOfItemsNeeded != 0

                && periodicDiscount1.CurrencyCode == currencyCode;


            if(discountLine.RecId == 0 && discountOffer.RecId == 0 && discountLine1.RecId == 0 && periodicDiscount1.RecId == 0)

            {

                select * from inventTable4

                        where inventTable4.ItemId == itemNumber;

                select UnitId from inventTableModule4

                        where inventTableModule4.ItemId == itemNumber;

                select * from ecoResProduct4 where ecoResProduct4.DisplayProductNumber == itemNumber;

                real salesprice4 = inventTable4.salesPcsPrice() * quantity;

                real price4 = salesprice4 - (salesprice4 * (discountLine5.discPct / 100));

                real discountAmount4 = salesprice4 - price4;

                BAS_PriceSimulatorContractResponse priceSimulatorData5 = new BAS_PriceSimulatorContractResponse();

                priceSimulatorData5 = BAS_PriceSimulatorContractResponse::newFromTableRecord4(discountLine,ecoResProduct4,price4,inventTable4,inventTableModule4,discountAmount4,salesprice4);

                priceSimulatorList.addEnd(priceSimulatorData5);


            }


           else  if ( quantity <= discountOffer.QuantityLimit && retailMultiBuyDiscountLine.priceDiscPct < discountLine5.discPct && periodicDiscount1.DiscountPercentValue <= retailMultiBuyDiscountLine.priceDiscPct )

            {

                select * from inventTable

                        where inventTable.ItemId == itemNumber;

                select UnitId from inventTableModule

                        where inventTableModule.ItemId == itemNumber;

                real salesprice = inventTable.salesPcsPrice() * quantity;

                real price = salesprice - (salesprice * (discountLine5.discPct / 100));

                real discountAmount = salesprice - price;

                BAS_PriceSimulatorContractResponse priceSimulatorData1 = new BAS_PriceSimulatorContractResponse();

                priceSimulatorData1 = BAS_PriceSimulatorContractResponse::newFromTableRecord(discountOffer,discountLine,ecoResProduct2,price,inventTable,inventTableModule,discountAmount,salesprice);

                priceSimulatorList.addEnd(priceSimulatorData1);

            }

            else if (quantity mod 2 == 0 && quantity >= maxAndMatch.numberOfItemsNeeded && periodicDiscount1.DiscountPercentValue > retailMultiBuyDiscountLine.priceDiscPct && periodicDiscount1.DiscountPercentValue > discountLine.discPct  )

            {

                select * from inventTable3

                        where inventTable3.ItemId == itemNumber;

                select UnitId from inventTableModule3

                        where inventTableModule3.ItemId == itemNumber;

                real salesprice3 = inventTable3.salesPcsPrice() * quantity;

                real price3 = salesprice3 - (salesprice3 * (periodicDiscount1.DiscountPercentValue / 100));

                real discountAmount3 = salesprice3 - price3;

                BAS_PriceSimulatorContractResponse priceSimulatorData2 = new BAS_PriceSimulatorContractResponse();

                priceSimulatorData2 = BAS_PriceSimulatorContractResponse::newFromTableRecord3(periodicDiscount1,maxAndMatch,ecoResProduct,price3,inventTable3,inventTableModule3,discountAmount3,salesprice3);

                priceSimulatorList.addEnd(priceSimulatorData2);

            }

            else if ( quantity >= retailMultiBuyDiscountLine.qtyLowest && retailMultiBuyDiscountLine.priceDiscPct >= discountLine5.discPct)

            {

                select * from inventTable1

                        where inventTable1.ItemId == itemNumber;

                select UnitId from inventTableModule1

                        where inventTableModule1.ItemId == itemNumber;

                real salesprice1 = inventTable1.salesPcsPrice() * quantity;

                real price1 = salesprice1 - (salesprice1 * (retailMultiBuyDiscountLine.priceDiscPct / 100));

                real discountAmount1 = salesprice1 - price1;

                BAS_PriceSimulatorContractResponse priceSimulatorData2 = new BAS_PriceSimulatorContractResponse();

                priceSimulatorData2 = BAS_PriceSimulatorContractResponse::newFromTableRecord1(discountLine1,retailMultiBuyDiscountLine,ecoResProduct1,price1,inventTable1,inventTableModule1,discountAmount1,salesprice1);

                priceSimulatorList.addEnd(priceSimulatorData2);


                //info (strFmt("normal discount with quantity limit - %1,%2", discountLine.discPct,discountOffer.QuantityLimit));

            }

            else

            {

                select * from inventTable2

                        where inventTable2.ItemId == itemNumber;

                select UnitId from inventTableModule2

                        where inventTableModule2.ItemId == itemNumber;


                select * from ecoResProduct5 where  ecoResProduct5.DisplayProductNumber == itemNumber;

                real salesprice2 = inventTable2.salesPcsPrice() * quantity;

                real price2 = salesprice2 - (salesprice2 * (discountLine.discPct / 100));

                real discountAmount2 = salesprice2 - price2;

                BAS_PriceSimulatorContractResponse priceSimulatorData3 = new BAS_PriceSimulatorContractResponse();

                priceSimulatorData3 = BAS_PriceSimulatorContractResponse::newFromTableRecord2(discountLine,ecoResProduct5,price2,inventTable2,inventTableModule2,discountAmount2,salesprice2);

                priceSimulatorList.addEnd(priceSimulatorData3);

            }

            return priceSimulatorList;

        }

    }


}


Service Class :

class BAS_PriceSimulatorService

{

    [AifCollectionTypeAttribute('return', Types::Class, classStr(BAS_PriceSimulatorContractResponse))]  // name of the response contract class

    // service method

    public List getpricesimulator(BAS_PriceSimulatorContract _contract) // name of the contract class

    {

        BAS_PriceSimulatorHelper priceSimulatorData = new BAS_PriceSimulatorHelper();

        str             itemId             = _contract.parmItemNumber();

        str             dataAreaId         = _contract.parmDataAreaId();

        str             channelId          = _contract.parmChannelId();

        TransDateTime   channelDateTime    = _contract.parmChannelDateTime();

        CurrencyCode    currencyCode       = _contract.parmCurrencyCode();

        str             catalogs           = _contract.parmCatalogs();

        str             customerAccount    = _contract.parmCustomerAccount();

        str             affiliations       = _contract.parmAffiliations();

        str             loyalityTiers      = _contract.parmLoyaltytiers();

        str             couponCodes        = _contract.parmCouponcodes();

        str             priceGroups        = _contract.parmPricegroups();

        int             quantity           = _contract.parmQuantity();

        List            priceSimulatorList = new List(Types::Class);

        priceSimulatorList                 = priceSimulatorData.getcalculation(itemId,dataAreaId,channelId,channelDateTime,currencyCode,catalogs,customerAccount,affiliations,loyalityTiers,couponCodes,priceGroups,quantity);

        return priceSimulatorList;   

    }

}


Comments

Popular posts from this blog

how to post trade agreement journals automatically using x++ code

How to Create a wizard in x++ d365

x++ code to submit and approve and reject the invent movement workflow in d365 F&O