Sales order Inbound

-----------------1----------------------


[DataContractAttribute]


1. public class GoPSORequestContract


{


    private GoPSORequestHeaderContract       requestHeader;


    private GopalSOSalesRequestContract           salesOrderRequest;


    [DataMember("requestHeader")]


    public GopalSORequestHeaderContract parmRequestHeaderContract(GopalSORequestHeaderContract _requestHeader = requestHeader)


    {


        if (!prmIsDefault(_requestHeader))


        {


            requestHeader = _requestHeader;


        }


        return requestHeader;


    }


    [DataMember("salesOrderRequest")]


    public GopalSOSalesRequestContract parmSORequestHeaderContract(GopalSOSalesRequestContract _salesOrderRequest = salesOrderRequest)


    {


    }


}


-----------------2----------------------


    [DataContractAttribute]


public class GopalSORequestHeaderContract


{


    str         senderId;


    str         receiverId;


    str         countryCode;


    str         messageId;


    utcdatetime dateTime;


    str         channelName;




    [DataMember("senderId")]


    public str parmSenderId(str     _value = senderId)


    {


        if (!prmIsDefault(_value))


        {


            senderId = _value;


        }




        return senderId;


    }




    [DataMember("channelName")]


    [DataMember("receiverId")]


    [DataMember("countryCode")]


    [DataMember("messageId")]


    [DataMember("dateTime")]


}


-----------------3----------------------






    [DataContractAttribute]


public class GopalSOSalesRequestContract


{


    private utcdatetime     orderCreationDateTime;


    private str             orderingCustomerAccountNumber;


    private str             customersOrderReference;




    [DataMember("customersOrderReference")]


    public str parmCustomersOrderReference(str      _value = customersOrderReference)


    {


        if (!prmIsDefault(_value))


        {


            customersOrderReference = _value;


        }


        return customersOrderReference;


    }


    [DataMember("orderCreationDateTime")]


    [DataMember("orderingCustomerAccountNumber")]


    [DataMemberAttribute("salesLines"),


    DataCollection(Types::Class, classStr(GopalSORequestLineContract)),


    AifCollectionTypeAttribute('_salesLines', Types::Class, classStr(GopalSORequestLineContract)),


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


    public List parmSalesLines(List _salesLines = salesLines)


    {


        if (!prmIsDefault(_salesLines))


        {


            salesLines = _salesLines;


        }


        return salesLines;


    }




}


-----------------4----------------------


    /// <summary>


/// salesLines Contract


/// </summary>


[DataContractAttribute]


public class GopalSORequestLineContract


{


    private str                 customersOrderReference;


    private real                lineNumber;


    private str                 itemId;


    [DataMember("customersOrderReference")]


    public str parmCustomersOrderReference(str  _value = customersOrderReference)


    {


        if (!prmIsDefault(_value))


        {


            customersOrderReference = _value;


        }




        return customersOrderReference;


    }


    [DataMember("lineNumber")]


    [DataMember("itemId")]


}


-----------------5----------------------


    public GoPResponseRootContract createSalesOrder(GopalSORequestContract  request)


{


    GopalSORequestHeaderContract  requestHeader = new GopalSORequestHeaderContract();


    GopalSOSalesRequestContract   salesOrderRequest = new GopalSOSalesRequestContract();




    GoPResponseRootContract    response = this.createResponse(request);


    GoP3PLBackendLog backendLog;




    requestHeader = request.parmRequestHeaderContract();


    salesOrderRequest = request.parmSORequestHeaderContract();


    infolog.clear();




    str     json = FormJsonSerializer::serializeClass(request);




    backendLog.RefRecId = GopalIntegrationLogTable::create(requestHeader.parmMessageId(), XMLDocDirection::Inbound, #interface, #blank, json, GopalIntegrationResponseStatus::Received, "", #blank, custTable.AccountNum, salesOrderRequest.parmShipToNumber(), salesOrderRequest.parmBillToNumber(), salesOrderRequest.parmOrderingCustomerAccountNumber(), salesOrderRequest.parmCustomersOrderReference(), requestHeader.parmChannelName(),requestHeader.parmCountryCode());


    backendLog.InterfaceName = #interface;


    backendLog.IsProcessed = NoYes::No;


    backendLog.insert();




    return response;


}




private GopResponseRootContract createResponse(GopalSORequestContract  request)


{


    GopResponseHeaderContract          responseHeader;


    GopalSORequestHeaderContract          requestHeader = request.parmRequestHeaderContract();




    responseHeader = new GopResponseHeaderContract();




    responseHeader.parmChannelName(requestHeader.parmChannelName());


    responseHeader.parmCountryCode(requestHeader.parmCountryCode());


    responseHeader.parmDateTime(DateTimeUtil::toStr(requestHeader.parmDateTime()));


    responseHeader.parmMessageId(requestHeader.parmMessageId());


    responseHeader.parmReceiverId(requestHeader.parmReceiverId());


    responseHeader.parmStatus(#Success);


    responseHeader.parmSenderId(requestHeader.parmSenderId());




    GopResponseContract response = new GopResponseContract();


    response.parmId(request.parmSORequestHeaderContract().parmCustomersOrderReference());


    response.parmError(new GopErrorResponseContract());




    GopResponseRootContract    root = new GopResponseRootContract();




    root.parmResponseHeader(responseHeader);


    root.parmResponse(response);




    return root;


}




-----------------6----------------------


    private GopResponseRootContract createResponse(GopalSORequestContract  request)


{


    GopResponseHeaderContract          responseHeader;


    GopalSORequestHeaderContract          requestHeader = request.parmRequestHeaderContract();




    responseHeader = new GopResponseHeaderContract();




    responseHeader.parmChannelName(requestHeader.parmChannelName());


    responseHeader.parmCountryCode(requestHeader.parmCountryCode());


    responseHeader.parmDateTime(DateTimeUtil::toStr(requestHeader.parmDateTime()));


    responseHeader.parmMessageId(requestHeader.parmMessageId());


    responseHeader.parmReceiverId(requestHeader.parmReceiverId());


    responseHeader.parmStatus(#Success);


    responseHeader.parmSenderId(requestHeader.parmSenderId());




    GopResponseContract response = new GopResponseContract();


    response.parmId(request.parmSORequestHeaderContract().parmCustomersOrderReference());


    response.parmError(new GopErrorResponseContract());




    GopResponseRootContract    root = new GopResponseRootContract();




    root.parmResponseHeader(responseHeader);


    root.parmResponse(response);




    return root;


}


-----------------7----------------------


    public class RunnableClass1


{


    LogisticsPostalAddress          postalAddressShipTo;


    CustTable                       custTable;


    List                            error;


    Notes                           holdComments;


   


    #define.interface('SO')


    #define.success('Success')


    #define.failed('Failed')


    #define.blank('')


    #define.newLine(',\n')




    /// <summary>


    /// Service Method


    /// </summary>


    /// <param name = "request">GopalSORequestContract</param>


    /// <returns>GopalSOResponseContract</returns>


    public void process()


    {


        Gop3PLBackendLog backendLog,backendLogLoc;


        




        delete_from backendLogLoc


            where backendLogLoc.InterfaceName == #interface


            && backendLogLoc.IsProcessed == NoYes::Yes;




        while select backendLog


            where backendLog.InterfaceName == #interface


            && backendLog.IsProcessed == NoYes::No


        {


            GopalMulesoftIntegrationLogTable mulesoftIntegrationLogTable = GopalMulesoftIntegrationLogTable::findbyRecId(backendLog.RefRecId,true);


            


            GopalSORequestContract    request = FormJsonSerializer::deserializeObject(classNum(GopalSORequestContract), mulesoftIntegrationLogTable.PayLoadJSON);


            GopalSORequestHeaderContract  requestHeader = new GopalSORequestHeaderContract();


            GopalSOSalesRequestContract   salesOrderRequest = new GopalSOSalesRequestContract();


            GopalSORequestLineContract    salesOrderLine = new GopalSORequestLineContract();




            requestHeader = request.parmRequestHeaderContract();


            salesOrderRequest = request.parmSORequestHeaderContract();


            infolog.clear();




            postalAddressShipTo = null;


            custTable = null;




            holdComments = "";




            error = new List(Types::Class);




            try


            {


                changecompany(requestHeader.parmCountryCode())


                {


                    ttsbegin;


                    if (!this.validateData(request))


                    {


                        throw Exception::CLRError;


                    }




                    SalesTable  salesTable = this.createSalesOrderHeader(salesOrderRequest, requestHeader);




                    List                            requestLineList = salesOrderRequest.parmSalesLines();


                    ListEnumerator                  listEnumRequestLine = requestLineList.getEnumerator();




                    while (listEnumRequestLine.moveNext())


                    {


                        salesOrderLine = listEnumRequestLine.current();




                        this.createSalesLine(salesOrderLine, salesTable);


                    }




                    if (!this.postCreationValidate(salesTable) || holdComments)


                    {


                        holdComments = strFmt("@Gopal:GopSOConfirm", salesTable.SalesId) + #newLine + holdComments;


                        this.mcrPutOrderOnHold(salesTable.SalesId, holdComments);


                        mulesoftIntegrationLogTable.LogDescription = holdComments;


                        mulesoftIntegrationLogTable.ResponseStatus = GopalMulesoftIntegrationResponseStatus::Failure;


                        mulesoftIntegrationLogTable.CustomerNumber = custTable.AccountNum;


                        mulesoftIntegrationLogTable.CustName = custTable.name();


                        mulesoftIntegrationLogTable.LineOfBusinessId = custTable.LineOfBusinessId;


                        mulesoftIntegrationLogTable.SalesOrderNumber = salesTable.SalesId;


                        mulesoftIntegrationLogTable.KeyField = salesTable.SalesId;


                        mulesoftIntegrationLogTable.update();


                    }


                    else


                    {


                        mulesoftIntegrationLogTable.ResponseStatus = GopalMulesoftIntegrationResponseStatus::Success;


                        mulesoftIntegrationLogTable.CustomerNumber = custTable.AccountNum;


                        mulesoftIntegrationLogTable.CustName = custTable.name();


                        mulesoftIntegrationLogTable.LineOfBusinessId = custTable.LineOfBusinessId;


                        mulesoftIntegrationLogTable.SalesOrderNumber = salesTable.SalesId;


                        mulesoftIntegrationLogTable.KeyField = salesTable.SalesId;


                        mulesoftIntegrationLogTable.update();


                    }


                    ttscommit;


                }


            }


            catch


            {


                ttsbegin;


                str log = GopalMulesoftIntegrationLogTable::captureInfoLog();


                mulesoftIntegrationLogTable.LogDescription = log;


                mulesoftIntegrationLogTable.ResponseStatus = GopalMulesoftIntegrationResponseStatus::Failure;


                mulesoftIntegrationLogTable.CustomerNumber = custTable.AccountNum;


                mulesoftIntegrationLogTable.CustName = custTable.name();


                mulesoftIntegrationLogTable.LineOfBusinessId = custTable.LineOfBusinessId;


                mulesoftIntegrationLogTable.update();


                ttscommit;


            }


            ttsbegin;


            backendLog.selectForUpdate(true);


            backendLog.IsProcessed = NoYes::Yes;


            backendLog.update();


            ttscommit;


        }


    }




    




    /// <summary>


    /// Pre data validate method


    /// </summary>


    /// <param name = "request">GopalSORequestContract</param>


    /// <returns>boolean</returns>


    private boolean validateData(GopalSORequestContract  request)


    {


        boolean ret = true;




        GopalSORequestHeaderContract  requestHeader = new GopalSORequestHeaderContract();


        GopalSOSalesRequestContract   salesOrderRequest = new GopalSOSalesRequestContract();


        GopalSORequestLineContract    salesOrderLine = new GopalSORequestLineContract();




        InventLocation              defaultInventLocation;


        


        str                         externalUnit;


        GopCustomerItemXReference  customerItemXReference,customerItemXRefFindCUOM;


        //end




        requestHeader = request.parmRequestHeaderContract();


        salesOrderRequest = request.parmSORequestHeaderContract();




        if (!custTable.AccountNum)


        {


            ret = checkFailed(strFmt("", salesOrderRequest.parmOrderingCustomerAccountNumber()));


        }




        ret = this.validatePOReference(salesOrderRequest.parmCustomersOrderReference(), custTable.AccountNum) && ret;






        List                            requestLineList = salesOrderRequest.parmSalesLines();


        ListEnumerator                  listEnumRequestLine = requestLineList.getEnumerator();


          


        while (listEnumRequestLine.moveNext())


        {


            


        }




        return ret;


    }




    /// <summary>


    /// Create SO Header


    /// </summary>


    /// <param name = "_requestHeader">GopalSOSalesRequestContract</param>


    /// <param name = "_request">GopalSORequestHeaderContract</param>


    /// <returns>SalesTable</returns>


    private SalesTable  createSalesOrderHeader(GopalSOSalesRequestContract  _requestHeader, GopalSORequestHeaderContract  _request)


    {


        #define.SO('SO')


        SalesTable          salesTable;


        GopOrderTypeTable  GopOrderTypeTable;




        str                         externalUnit;


        GopCustomerItemXReference  customerItemXReference;




        InventLocation              defaultInventLocation;


        DirPartyLocation            dirPartyLocation;


        LogisticsPostalAddress      postalAddress, postalAddressBillTo;


        utcdatetime                 validFrom = DateTimeUtil::utcNow();


        utcdatetime                 validTo = DateTimeUtil::utcNow();




        LogisticsLocation                   locationBillTo, locationShipTo;




        select GopOrderTypeTable


            where GopOrderTypeTable.SoForm == NoYes::Yes


            && GopOrderTypeTable.IsDefault == NoYes::Yes;




        NumberSeq numberSeq;


        ttsbegin;






        defaultInventLocation = InventLocation::find(custTable.InventLocation);




        numberSeq = NumberSeq::newGetNum(SalesParameters::numRefSalesId());


        numberSeq.used();


 


        salesTable.SalesId = numberSeq.num();


        salesTable.initValue();


        salesTable.CustAccount = custTable.AccountNum;


        salesTable.initFromCustTable();


        if (_requestHeader.parmCurrencyCode())


        {


            salesTable.CurrencyCode = _requestHeader.parmCurrencyCode() ;


        }


        salesTable.DeliveryPostalAddress = postalAddressShipTo.RecId;


        salesTable.DeliveryName = locationShipTo.Description;


        salesTable.InventSiteId = defaultInventLocation.InventSiteId;


        salesTable.InventLocationId = defaultInventLocation.InventLocationId;


        salesTable.CustomerRef = _requestHeader.parmCustomersOrderReference();




        if (!salesTable.validateWrite())


        {


            throw Exception::Error;


        }


        salesTable.insert();




        if (_requestHeader.parmCustomerCommentsHeader())


        {


            this.createNotes(salesTable, smmParametersTable::find().GopalCustHeaderComment, _requestHeader.parmCustomerCommentsHeader());


        }




        ttsCommit;


       


        return salesTable;


    }




    /// <summary>


    /// Create notes attachement


    /// </summary>


    /// <param name = "table">Table buffer</param>


    /// <param name = "_typeId">Docutype</param>


    /// <param name = "_notes">Notes</param>


    private void createNotes(Common         table, DocuTypeId       _typeId, Notes      _notes)


    {


        DocuRef     docuRef;


        ttsbegin;




        // Code to create notes


        docuRef.initValue();


        docuRef.TypeId = _typeId;


        docuRef.Name = DocuType::find(_typeId).Name;


        docuRef.Notes = _notes;


        docuRef.Restriction = DocuRestriction::External;


        docuRef.RefTableId = table.TableId;


        docuRef.RefRecId = table.RecId;


        docuRef.RefCompanyId = curext();


        docuRef.insert();




        ttscommit;


    }


    /// <summary>


    /// post order creation validation


    /// </summary>


    /// <param name = "_salesTable">salesTable</param>


    /// <returns>true/false</returns>


    private boolean postCreationValidate(SalesTable _salesTable)


    {


        boolean ret = true;


        SalesLine       salesLine;


        Amount          customerLineAmount, salesLineAmount;




        while select forupdate salesLine


            where salesLine.SalesId == _salesTable.SalesId


        {




        }




        if (_salesTable)


        {


            CustCreditLimit custCreditLimit = CustCreditLimit::construct(_salesTable);




            if (!custCreditLimit.check())


            {


                ret = false;


                holdComments += strFmt("@Gopal:GopSalesCreditLimit",_salesTable.SalesId, _salesTable.CustAccount) + #newLine;


            }




            if (!_salesTable.DlvTerm)


            {


                ret = false;


                holdComments += strFmt("@Gopal:GopDlvTermVal",_salesTable.SalesId) + #newLine;


            }




            if (!_salesTable.DlvMode)


            {


                ret = false;


                holdComments += strFmt("@Gopal:GopDlvModeVal",_salesTable.SalesId) + #newLine;


            }




            if (!_salesTable.Payment)


            {


                ret = false;


                holdComments += strFmt("@Gopal:GopPaymTermVal",_salesTable.SalesId) + #newLine;


            }


        }


        return ret;


    }


    private void createSalesLine(GopalSORequestLineContract       _requestSalesLine, SalesTable   _salesTable)


    {


        SalesLine                   salesLine;


        ItemId                      itemId;


        SalesUnit                   salesUnit;


        SalesOrderedQty             salesQty;


        str                         externalUnit;


        GopCustomerItemXReference  customerItemXReference;


        InventLocation              defaultInventLocation;




        //Added as part of AD-FDD-04 Customer and Item X reference


        if(_salesTable.GopCustReqShipDate == dateNull() && _salesTable.GopCustReqReceiptDate == dateNull())


        {


            _salesTable.reread();


            ttsbegin;


            _salesTable.selectForUpdate(true);


            _salesTable.GopCustReqShipDate = _requestSalesLine.parmRequestedShippingDate();


            _salesTable.GopCustReqReceiptDate = _requestSalesLine.parmRequestedShippingDate();


            _salesTable.modifiedField(fieldNum(SalesTable, GopCustReqReceiptDate));


            _salesTable.doUpdate();


            ttscommit;


            _salesTable.reread();


        }




        salesLine.clear();


        salesLine.initFromSalesTable(_salesTable);


        salesLine.DeliveryPostalAddress = postalAddressShipTo.RecId;


        salesLine.SalesId = _salesTable.SalesId;


        salesLine.ItemId = itemId;


        salesLine.SalesQty  = salesQty;


        salesLine.SalesUnit = salesUnit;


        


        if (InventItemSalesSetup::findDefault(itemId).LowestQty && InventItemSalesSetup::findDefault(itemId).LowestQty > salesQty)


        {


        }


        


        QtyMultiples qtyMultiples = InventItemSalesSetup::findDefault(itemId).multipleQty;


        if (qtyMultiples)


        {


            


        }


        




        salesLine.ShippingDateRequested = _requestSalesLine.parmRequestedShippingDate();


        //Added as part of AD-FDD-04 Customer and Item X reference


        salesLine.CustomerRef = _salesTable.CustomerRef;


        //end


        salesLine.createLine(true, true, true, true, true, true);




        salesLine.selectForUpdate(true);


        salesLine.DeliveryPostalAddress = postalAddressShipTo.RecId;


        salesLine.Name  = _requestSalesLine.parmLineDescription();


        salesLine.SalesQty = salesQty;


        salesLine.doUpdate();




        if (_requestSalesLine.parmCustomerLineComments())


        {


            this.createNotes(salesLine, smmParametersTable::find().GopalCustLineComment, _requestSalesLine.parmCustomerLineComments());


        }




        if (_requestSalesLine.parmInvoiceComments())


        {


            this.createNotes(salesLine, smmParametersTable::find().GopalInvLineComment, _requestSalesLine.parmInvoiceComments());


        }




        if(_requestSalesLine.parmSpecialInstructions())


        {


            this.createNotes(salesLine, smmParametersTable::find().GopalLineSpecialInstructions, _requestSalesLine.parmSpecialInstructions());


        }


    }


}

Comments

Popular posts from this blog

Price disc agreement

Sample integration

Create ledger journals in D365FO using X++ + LedgerDimensionACType