x++ code to create call center order through custom service

 Creation Of Call Center Orders through Postman

Request Contract Class:

[DataContractAttribute("BASMSCreationOfCallCenterOrdersRequestContract")]

class BASMSCreationOfCallCenterOrdersRequestContract

{

    str             custAccount;

    str             dataAreaId;

    str             siteId;

    str             warehouse;

    int             numberOfOrders;

    str             orderStatus;

    List            itemsList,paymentsList;


    [DataMemberAttribute("CustAccount")]

    public str parmCustAccount(str _custAccount = custAccount)

    {

        custAccount = _custAccount;

        return custAccount;

    }


    [DataMemberAttribute("DataAreaId")]

    public str parmDataAreaId(str _dataAreaId = dataAreaId)

    {

        dataAreaId = _dataAreaId;

        return dataAreaId;

    }


    [DataMemberAttribute("Site")]

    public str parmSiteId(str _siteId = siteId)

    {

        siteId = _siteId;

        return siteId;

    }


    [DataMemberAttribute("WareHouse")]

    public str parmWarehouse(str _warehouse = warehouse)

    {

        warehouse = _warehouse;

        return warehouse;

    }


    [DataMemberAttribute("numberOfOrders")]

    public int parmNumberOfOrders(int _numberOfOrders = numberOfOrders)

    {

        numberOfOrders = _numberOfOrders;

        return numberOfOrders;

    }


    [DataMemberAttribute("OrderStatus")]

    public str parmOrderStatus(str _orderStatus = orderStatus)

    {

        orderStatus = _orderStatus;

        return orderStatus;

    }


    [DataMemberAttribute("ItemsList"),

        DataCollectionAttribute(Types::Class, classStr(BASMSCallCenterItemListRequestContract)),

         AifCollectionTypeAttribute('_itemsList', Types::Class, classStr(BASMSCallCenterItemListRequestContract)),

    AifCollectionTypeAttribute('return', Types::Class, classStr(BASMSCallCenterItemListRequestContract))]

    public List parmItemsList(List _itemsList = itemsList)

    {

        if(!prmIsDefault(_itemsList))

        {

            itemsList = _itemsList;

        }

        return itemsList;

    }


    [DataMemberAttribute("PaymentsList"),

        DataCollectionAttribute(Types::Class, classStr(BASMSCallCenterPaymentListRequestContract)),

         AifCollectionTypeAttribute('_paymentsList', Types::Class, classStr(BASMSCallCenterPaymentListRequestContract)),

    AifCollectionTypeAttribute('return', Types::Class, classStr(BASMSCallCenterPaymentListRequestContract))]

    public List parmPaymentsList(List _paymentsList = paymentsList)

    {

        if(!prmIsDefault(_paymentsList))

        {

            paymentsList = _paymentsList;

        }

        return paymentsList;

    }

ItemListRequestContract Class:

/// <summary>

/// CallCenterItemListRequestContract

/// </summary>

[DataContractAttribute('BASMSCallCenterItemListRequestContract')]

class BASMSCallCenterItemListRequestContract

{

    str             itemId;

    int             quantity;

    str             itemBarCode;

    [DataMemberAttribute("itemId")]

    public str parmItemId(str _itemId = itemId)

    {

        itemId = _itemId;

        return itemId;

    }

    [DataMemberAttribute("quantity")]

    public int parmQuantity(int _quantity = quantity)

    {

        quantity = _quantity;

        return quantity;

    }

    [DataMemberAttribute("ItemBarCode")]

    public str parmItemBarCode(str _itemBarCode = itemBarCode)

    {

        itemBarCode = _itemBarCode;

        return itemBarCode;

    }

}

PaymentListRequestContract Class:

/// <summary>

/// CallCenterPaymentListRequestContract

///  parmPaymentMethod and parmGiftCardNumber

/// </summary>

[DataContractAttribute('BASMSCallCenterPaymentListRequestContract')]

class BASMSCallCenterPaymentListRequestContract

{

    str  paymentMethod;

    [DataMemberAttribute("PaymentMethod")]

    public str parmPaymentMethod(str _paymentMethod = paymentMethod)

    {

        paymentMethod = _paymentMethod;

        return paymentMethod;

    }

}

Response Contract Class:

/// <summary>

/// contract to set the values to be sent as a response to the service contract

/// </summary>

[DataContractAttribute("BASMSCreationOfCallCenterOrdersResponseContract")]

class BASMSCreationOfCallCenterOrdersResponseContract

{

    SalesId                     salesId;

    SalesStatus                 salesStatus;

    [DataMember('SalesId')]

    public SalesId parmSalesId(SalesId _salesId = salesId)

    {

        salesId = _salesId;

        return salesId;

    }

    [DataMember('SalesStatus')]

    public SalesStatus parmSalesStatus(SalesStatus _salesStatus = salesStatus)

    {

        salesStatus = _salesStatus;

        return salesStatus;

    }


    private static BASMSCreationOfCallCenterOrdersResponseContract construct()

    {

        return new BASMSCreationOfCallCenterOrdersResponseContract();

    }

    /// <summary>

    /// sets the values of the objects in the contract class

    /// </summary>

    /// <param name = "_salesTable">

    /// Record used to set the values

    /// </param>

    /// <param name = "salesOrderLineDetailsList">

    /// List of the line details for the sales order

    /// </param>

    /// <returns>

    /// set of objects for the <c>BASMSSalesOrderDetailsResponseContract</c> contract

    ///</returns>

    public static BASMSCreationOfCallCenterOrdersResponseContract newFromTableRecord(SalesOrderHeaderV2Entity   _salesTableEntity,SalesStatus ss)

    {

        BASMSCreationOfCallCenterOrdersResponseContract  contract = BASMSCreationOfCallCenterOrdersResponseContract::construct();

        contract.parmSalesId(_salesTableEntity.SalesOrderNumber);

        contract.parmSalesStatus(ss);     

        return contract;

    }

}

Helper Class:

/// <summary>

/// Helper class to get the required records for response contract

/// </summary>

class BASMSCreationOfCallCenterOrdersReadHelperClass

{

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

    public List callCenterOrderCreation(str _custAccount, str _dataAreaId, str _site, str _warehouse, int _numberOfOrders, str _orderStatus, List _itemsList, List _paymentsList )

    {

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

        changecompany(_dataAreaId)

        {

            SalesOrderHeaderV2Entity salesTableEntity;

            for(int i=1; i<=_numberOfOrders;i++)

            {

                // Sales Order Header Creation

                ttsbegin;

                salesTableEntity.initValue();

                salesTableEntity.OrderingCustomerAccountNumber = _custAccount;

                salesTableEntity.insert();

                ttscommit;

                this.insertItemValues(salesTableEntity.SalesOrderNumber,_itemsList);

                this.createCallCenterPaymentRecord(salesTableEntity.SalesOrderNumber,_paymentsList);

                this.updateSalesStatus(salesTableEntity.SalesOrderNumber,_orderStatus);

                Salestable saleaT = SalesTable::find(salesTableEntity.SalesOrderNumber);


                BASMSCreationOfCallCenterOrdersResponseContract releasedItemData = new BASMSCreationOfCallCenterOrdersResponseContract();

                releasedItemData = BASMSCreationOfCallCenterOrdersResponseContract::newFromTableRecord(salesTableEntity,saleaT.SalesStatus);

                callCenterOrderList.addEnd(releasedItemData);

            }

        }

        return callCenterOrderList;

    }

    public void insertItemValues(SalesId salesId,List itemList)

    {

        SalesOrderLineV2Entity   salesLineEntity;

        ListIterator    listEnum = new ListIterator(itemList);

        while(listEnum.more())

        {

            BASMSCallCenterItemListRequestContract itemsData = listEnum.value();

            ttsbegin;

            salesLineEntity.clear();

            salesLineEntity.initValue();

            salesLineEntity.SalesOrderNumber     = salesId;

            salesLineEntity.ItemNumber           = itemsData.parmItemId();

            salesLineEntity.OrderedSalesQuantity = itemsData.parmQuantity();

            salesLineEntity.insert();

            ttscommit;

            listEnum.next();

        }

    }

    public void createCallCenterPaymentRecord(SalesId salesId,List paymentsList)

    {

        MCRCustPaymTable         mcrCustPaymTable;

        SalesOrderLineV2Entity   soLineEntity;     

        SalesTable         salesTableBuf     = SalesTable::find(salesId);

        CurrencyCode       currency          = salesTableBuf.CurrencyCode;

        MCRCustPaymStatus  mcrCustPaymStatus = MCRCustPaymStatus::NotSubmitted;

        salesTableBuf.calculateTieredCharges();

        SalesTotals        salesTotals       = salesTotals::construct(salesTableBuf,SalesUpdate::All);

        real               totalAmount       = salesTotals.totalAmount();

        ListIterator       listEnum   = new ListIterator(paymentsList);

       info(Strfmt("Net Amount %1",salesTotals.totalAmount()));

        while(listEnum.more())

        {

            BASMSCallCenterPaymentListRequestContract itemsData = listEnum.value();

            if(itemsData.parmPaymentMethod() == "CreditCard")

            {

                try

                {

                    CreditCardCust     creditCardCust    = CreditCardCust::findByUniqueCardId('f2379fe0-706f-45e4-8bdd-fda9a4820bbe');             

                    ttsbegin;

                    mcrCustPaymTable.clear();

                    mcrCustPaymTable.Channel         = salesTableBuf.retailSalesTable().RetailChannel;

                    mcrCustPaymTable.CurrencyCode    = currency;

                    mcrCustPaymTable.TenderTypeId    = "3";

                    mcrCustPaymTable.RefTableId      = salesTableBuf.TableId;

                    mcrCustPaymTable.RefRecId        = salesTableBuf.RecId;

                    mcrCustPaymTable.CustAccount     = salesTableBuf.CustAccount;

                    mcrCustPaymTable.CardTypeId      = 'Visa';

                    mcrCustPaymTable.Status          = mcrCustPaymStatus;

                    mcrCustPaymTable.PaymInfoTableId = creditCardCust.TableId;

                    mcrCustPaymTable.PaymInfoRecId   = creditCardCust.RecId;

                    mcrCustPaymTable.CustPaymType    = MCRCustPaymTable::getMCRTypeFromTender(mcrCustPaymTable.TenderTypeId,

                    mcrCustPaymTable.Channel,mcrCustPaymTable.CardTypeId);

                    switch (mcrCustPaymStatus)

                    {

                        case MCRCustPaymStatus::NotSubmitted:

                        case MCRCustPaymStatus::Authorized:


                            mcrCustPaymTable.Amount = CurrencyExchange::round(totalAmount, currency);

                            break;

                    }

                    mcrCustPaymTable.insert();

                    ttscommit;

                    MCRSalesOrderTotals mcrSalesOrderTotals = new MCRSalesOrderTotals(salesTableBuf, true);

                    //complete

                    MCREndOrder::endOrder(salesTableBuf.SalesId, true, mcrSalesOrderTotals, false);

                }

                catch

                {

                    Error("Error during Call Center payment ");

                }

            }

            else if(itemsData.parmPaymentMethod() == 'Cash')

            {

                try

                {

                    ttsbegin;

                    mcrCustPaymTable.clear();

                    mcrCustPaymTable.Channel        = salesTableBuf.retailSalesTable().RetailChannel;

                    mcrCustPaymTable.CurrencyCode   = currency;

                    mcrCustPaymTable.TenderTypeId   = "1";

                    mcrCustPaymTable.RefTableId     = salesTableBuf.TableId;

                    mcrCustPaymTable.RefRecId       = salesTableBuf.RecId;

                    mcrCustPaymTable.CustAccount    = salesTableBuf.CustAccount;

                    mcrCustPaymTable.CardTypeId     = "Cash";

                    mcrCustPaymTable.Status         = mcrCustPaymStatus;

                    mcrCustPaymTable.CustPaymType   = MCRCustPaymTable::getMCRTypeFromTender(mcrCustPaymTable.TenderTypeId,

                mcrCustPaymTable.Channel,mcrCustPaymTable.CardTypeId);

                    switch (mcrCustPaymStatus)

                    {

                        case MCRCustPaymStatus::NotSubmitted:

                        case MCRCustPaymStatus::Authorized:


                            mcrCustPaymTable.Amount = CurrencyExchange::round(totalAmount, currency);

                            break;

                    }

                    mcrCustPaymTable.insert();

                    ttscommit;

                    MCRSalesOrderTotals mcrSalesOrderTotals = new MCRSalesOrderTotals(salesTableBuf, true);

                    salesTableBuf.payment(true);

                    //complete

                    MCREndOrder::endOrder(salesTableBuf.SalesId, true, mcrSalesOrderTotals, false);

                }

                catch

                {

                    Error("Error during Call Center payment ");

                }

            }

            else if(itemsData.parmPaymentMethod() == 'Check')

            {

                try

                {

                    ttsbegin;

                    mcrCustPaymTable.clear();

                    mcrCustPaymTable.Channel        = salesTableBuf.retailSalesTable().RetailChannel;

                    mcrCustPaymTable.CurrencyCode   = currency;

                    mcrCustPaymTable.TenderTypeId   = "2";

                    mcrCustPaymTable.RefTableId     = salesTableBuf.TableId;

                    mcrCustPaymTable.RefRecId       = salesTableBuf.RecId;

                    mcrCustPaymTable.CustAccount    = salesTableBuf.CustAccount;

                    mcrCustPaymTable.CardTypeId     = 'Check';

                    mcrCustPaymTable.Status         = mcrCustPaymStatus;

                    mcrCustPaymTable.CheckNumber    = "1234";

                    mcrCustPaymTable.CustPaymType   = MCRCustPaymTable::getMCRTypeFromTender(mcrCustPaymTable.TenderTypeId,

                    mcrCustPaymTable.Channel,mcrCustPaymTable.CardTypeId);

                    switch (mcrCustPaymStatus)

                    {

                        case MCRCustPaymStatus::NotSubmitted:

                        case MCRCustPaymStatus::Authorized:


                            mcrCustPaymTable.Amount = CurrencyExchange::round(totalAmount, currency);

                            break;

                    }

                    mcrCustPaymTable.insert();

                    ttscommit;

                    MCRSalesOrderTotals mcrSalesOrderTotals = new MCRSalesOrderTotals(salesTableBuf, true);

                    //complete

                    MCREndOrder::endOrder(salesTableBuf.SalesId, true, mcrSalesOrderTotals, false);

                }

                catch

                {

                    Error("Error during Call Center payment ");

                }

            }

            else if(itemsData.parmPaymentMethod() == 'GiftCard')

            {

                try

                {

                    RetailGiftCardTable retailGiftCardTable = RetailGiftCardTable::find("GC12345",false);

                    ttsbegin;

                    mcrCustPaymTable.clear();

                    mcrCustPaymTable.Channel         = salesTableBuf.retailSalesTable().RetailChannel;

                    mcrCustPaymTable.CurrencyCode    = currency;

                    mcrCustPaymTable.TenderTypeId    = "8";

                    mcrCustPaymTable.RefTableId      = salesTableBuf.TableId;

                    mcrCustPaymTable.RefRecId        = salesTableBuf.RecId;

                    mcrCustPaymTable.CustAccount     = salesTableBuf.CustAccount;

                    mcrCustPaymTable.CardTypeId      = 'GiftCard';

                    mcrCustPaymTable.Status          = mcrCustPaymStatus;

                    mcrCustPaymTable.IsPrepay        = NoYes::Yes;

                    mcrCustPaymTable.PaymInfoTableId = retailGiftCardTable.TableId;

                    mcrCustPaymTable.PaymInfoRecId   = retailGiftCardTable.RecId;

                    mcrCustPaymTable.CustPaymType    = MCRCustPaymTable::getMCRTypeFromTender(mcrCustPaymTable.TenderTypeId,

                    mcrCustPaymTable.Channel,mcrCustPaymTable.CardTypeId);


                    switch (mcrCustPaymStatus)

                    {

                        case MCRCustPaymStatus::NotSubmitted:

                        case MCRCustPaymStatus::Authorized:


                            mcrCustPaymTable.Amount = CurrencyExchange::round(totalAmount, currency);

                            break;

                    }

                    mcrCustPaymTable.insert();

                    ttscommit;

                    MCRSalesOrderTotals mcrSalesOrderTotals = new MCRSalesOrderTotals(salesTableBuf, true);

                    //complete

                    MCREndOrder::endOrder(salesTableBuf.SalesId, true, mcrSalesOrderTotals, false);

                    //        retailGiftCardTransactions.insert();

                }

                catch

                {

                    Error("Error during Call Center payment ");

                }

            }

            listEnum.next();

        }

    }

    public void updateSalesStatus(SalesId salesId,str _orderStatus)

    {

        //Updating sales order by SalesFromLetter class

        SalesFormLetter salesFormLetter;


        //Posting SO Confirmation,

        if(_orderStatus == enum2Str(DocumentStatus::Confirmation))

        {

            salesFormLetter = SalesFormLetter::construct(DocumentStatus::Confirmation);

            salesFormLetter.update(SalesTable::find(salesId));

        }

        //Posting Packing slip

        else if(_orderStatus == enum2Str(DocumentStatus::PackingSlip))

        {

            salesFormLetter = SalesFormLetter::construct(DocumentStatus::PackingSlip);

            salesFormLetter.update(SalesTable::find(salesId));

        }

        //Posting SO Invoice

        else if(_orderStatus == enum2Str(DocumentStatus::Invoice))

        {

            salesFormLetter = SalesFormLetter::construct(DocumentStatus::Invoice);

            salesFormLetter.update(SalesTable::find(salesId));

        }

    }

}

Service Class:

/// <summary>

/// Service class for all sales related custom services

/// BASMSCallCenterService

/// </summary>

class BASMSCallCenterService extends SysOperationServiceBase

{

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

    public List callCenterSalesOrder(BASMSCreationOfCallCenterOrdersRequestContract _contract)

    {

        BASMSCreationOfCallCenterOrdersReadHelperClass callCenterOrder = new BASMSCreationOfCallCenterOrdersReadHelperClass();


        str       custAccount    = _contract.parmCustAccount();

        str       dataAreaId     = _contract.parmDataAreaId();

        str       siteId         = _contract.parmSiteId();

        str       warehouse      = _contract.parmWarehouse();

        int       numberOfOrders = _contract.parmNumberOfOrders();

        str       orderStatus    = _contract.parmOrderStatus();

        List      itemsList      = _contract.parmItemsList();

        List      paymentsList   = _contract.parmPaymentsList();

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

        itemValueList = callCenterOrder.callCenterOrderCreation(custAccount,dataAreaId,siteId,warehouse,numberOfOrders,orderStatus,itemsList,paymentsList);

        return itemValueList;

    }

}

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