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
Post a Comment