Sample integration

Header Class

[DataContractAttribute]

public class gopLInventoryMovementOb

{

    private gopLInventoryMovementRequestHeaderContract   requestHeader;

    private gopLInventoryMovmentObHeader                 inventoryMovmentHeader;


    [DataMember("requestHeader")]

    public gopLInventoryMovementRequestHeaderContract parmgopLInventoryMovementRequestHeaderContract(gopLInventoryMovementRequestHeaderContract _requestHeader = requestHeader)

    {

        if (!prmIsDefault(_requestHeader))

        {

            requestHeader = _requestHeader;

        }


        return requestHeader;

    }


    [DataMemberAttribute('inventoryMovmentHeader')]

    public gopLInventoryMovmentObHeader parmgoplInventoryMovmentHeader(gopLInventoryMovmentObHeader _inventoryMovmentHeader = inventoryMovmentHeader)

    {

        InventoryMovmentHeader = _InventoryMovmentHeader;

    

        return InventoryMovmentHeader;

    }


}

_____

[DataContractAttribute]

public class gopInventoryMovementRequestHeaderContract

{

    str senderId;

    str receiverId;

    str countryCode;

    str messageId;

    str dateTime;


    [DataMember("senderId")]

    public str parmSenderId(str _value = senderId)

    {

        if (!prmIsDefault(_value))

        {

            senderId = _value;

        }

        return senderId;

    }


    [DataMember("receiverId")]

    public str parmReceiverId(str _value = receiverId)

    {

        if (!prmIsDefault(_value))

        {

            receiverId = _value;

        }

        return receiverId;

    }


    [DataMember("countryCode")]

    public str parmCountryCode(str _value = countryCode)

    {

        if (!prmIsDefault(_value))

        {

            countryCode = _value;

        }

        return countryCode;

    }


    [DataMember("messageId")]

    public str parmMessageId(str _value = messageId)

    {

        if (!prmIsDefault(_value))

        {

            messageId = _value;

        }

        return messageId;

    }


    [DataMember("dateTime")]

    public str parmDateTime(str _value = dateTime)

    {

        if (!prmIsDefault(_value))

        {

            dateTime = _value;

        }

        return dateTime;

    }


}

_____



------------Header class for inventoryMovmentHeader--------

[DataContractAttribute('inventoryMovmentHeader')]

public class gopInventoryMovmentObHeader

{

    private Num                 orderUniqueReference;

    private InventJournalId     journalNumber;

    private JournalDescription  description;

    private SelectableDataArea  legalEntityCode;

    private List                inventoryMovmentLines;


    [DataMemberAttribute('orderUniqueReference')]

    public Num parmOrderUniqueReference(Num _orderUniqueReference = orderUniqueReference)

    {

        orderUniqueReference = _orderUniqueReference;

    

        return orderUniqueReference;

    }


    [DataMemberAttribute('journalNumber')]

    public str parmJournalNumber(str _journalNumber = journalNumber)

    {

        journalNumber = _journalNumber;

    

        return journalNumber;

    }


    [DataMemberAttribute('description')]

    public JournalDescription parmDescription(JournalDescription _description = description)

    {

        description = _description;

    

        return description;

    }


    [DataMemberAttribute('legalEntityCode')]

    public SelectableDataArea parmLegalEntityCode(SelectableDataArea _legalEntityCode = legalEntityCode)

    {

        legalEntityCode = _legalEntityCode;

    

        return legalEntityCode;

    }


    [DataMemberAttribute('inventoryMovmentLines'),

        AifCollectionTypeAttribute("_inventoryMovmentLines", Types::Class, classStr(gopInventoryMovementObLines)),

        AifCollectionTypeAttribute("return", Types::Class, classStr(gopInventoryMovementObLines))]

    public List parmInventoryMovmentLines(List _inventoryMovmentLines = inventoryMovmentLines)

    {

        inventoryMovmentLines = _inventoryMovmentLines;

    

        return inventoryMovmentLines;

    }


}

---------Lines---------

[DataContractAttribute('inventoryMovmentLines')]

public class gopInventoryMovementObLines

{

    private str                 transactionDate;

    private ItemId              itemNumber;

    private LineNum             lineNumber;

    private InventQty           orderQuantity;

    private InventSerialId      itemSerialNumber;

    private InventBatchId       itemBatchNumber;

    private WHSInventStatusId   productStatus;

    private InventLocationId    warehouseId;

    private str                 exipryDate;

    


    [DataMemberAttribute('transactionDate')]

    public str parmTransactionDate(str _transactionDate= transactionDate)

    {

        transactionDate = _transactionDate;

    

        return transactionDate;

    }


    [DataMemberAttribute('itemNumber')]

    public ItemId parmItemNumber(ItemId _itemNumber = itemNumber)

    {

        itemNumber = _itemNumber;

    

        return itemNumber;

    }


    [DataMemberAttribute('lineNumber')]

    public LineNum parmLineNumber(LineNum _lineNumber = lineNumber)

    {

        lineNumber = _lineNumber;

    

        return lineNumber;

    }


    [DataMemberAttribute('orderQuantity')]

    public InventQty parmOrderQuantity(InventQty _orderQuantity = orderQuantity)

    {

        orderQuantity = _orderQuantity;

    

        return orderQuantity;

    }


    [DataMemberAttribute('itemSerialNumber')]

    public InventSerialId parmItemSerialNumber(InventSerialId _itemSerialNumber = itemSerialNumber)

    {

        itemSerialNumber = _itemSerialNumber;

    

        return itemSerialNumber;

    }


    [DataMemberAttribute('itemBatchNumber')]

    public InventSerialId parmItemBatchNumber(InventSerialId _itemBatchNumber = itemBatchNumber)

    {

        itemBatchNumber = _itemBatchNumber;

    

        return itemBatchNumber;

    }


    [DataMemberAttribute('productStatus')]

    public WHSInventStatusId parmProductStatus(WHSInventStatusId _productStatus = productStatus)

    {

        productStatus = _productStatus;

    

        return productStatus;

    }


    [DataMemberAttribute('warehouseId')]

    public WHSInventStatusId parmWarehouseId(WHSInventStatusId _warehouseId = warehouseId)

    {

        warehouseId = _warehouseId;

    

        return warehouseId;

    }


    [DataMemberAttribute('exipryDate')]

    public str parmExipryDate(str _exipryDate= exipryDate)

    {

        exipryDate = _exipryDate;

    

        return exipryDate;

    }


}


-----Service class____

public class gopInventoryMovementObService  extends SysOperationServiceBase

{

    #define.interface('3PL Inventory Movement Outbound')

    #isoCountryRegionCodes

    public void process()

    {


        InventJournalTable  inventJournalTable;

        str                 Json;

        ReqRetryCount maxRetryCount = solvIntegrationParameters::find().MaxRetryCount;


        while select inventJournalTable

            where inventJournalTable.gopApplicable == NoYes::Yes

            && inventJournalTable.SolvIsSoSentTo3Pl == NoYes::No

            && inventJournalTable.Posted == NoYes::Yes

            && inventJournalTable.SolvRetryCount3Pl < maxRetryCount

        {

            gopInventoryMovementOb request;

            try

            {

                request = this.createRequest(inventJournalTable);

                Json = FormJsonSerializer::serializeClass(request);

                if (request)

                {

                    if(!request.parmgopInventoryMovmentHeader().parmInventoryMovmentLines().empty())

                    {

                        this.sendToAPI(request,inventJournalTable.RecId);

                    }

                    else

                    {

                        continue;

                    }

                }

                else

                {

                    throw Exception::CLRError;

                }

                

            }

            catch

            {

                str log = GopalMulesoftIntegrationLogTable::captureInfoLog();

                GopalMulesoftIntegrationLogTable::createLog(request.parmgopInventoryMovementRequestHeaderContract().parmMessageId(),

                                                        XMLDocDirection::Outbound,

                                                        #interface,

                request.parmgopInventoryMovmentHeader().parmOrderUniqueReference(),

                                                        json,

                                                        GopalMulesoftIntegrationResponseStatus::Failure,

                                                        log,'','','','','','','',request.parmgopInventoryMovementRequestHeaderContract().parmCountryCode());

            }

        }

    }


    private gopInventoryMovementOb createRequest(InventJournalTable  _inventJournalTable)

    {

        gopInventoryMovementOb request = new gopInventoryMovementOb();


        gopInventoryMovementRequestHeaderContract requestHeader = this.createRequestHeader();

        gopInventoryMovmentObHeader invMomementHeader = this.createMovementJournalHeader(_inventJournalTable);

        

        request.parmgopInventoryMovementRequestHeaderContract(requestHeader);

        request.parmgopInventoryMovmentHeader(invMomementHeader);


        return request;

    }


    private gopInventoryMovementRequestHeaderContract createRequestHeader()

    {

        gopInventoryMovementRequestHeaderContract requestHeader = new gopInventoryMovementRequestHeaderContract();

        

        requestHeader.parmCountryCode(curExt());

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

        requestHeader.parmMessageId(strrem(guid2str(newguid()), '{}'));


        if(SysCountryRegionCode::isLegalEntityInCountryRegion([#isoCO]))

        {

            requestHeader.parmReceiverId("@Gopal:BOMI");

        }

        else if(SysCountryRegionCode::isLegalEntityInCountryRegion([#isoCL]))

        {

            requestHeader.parmReceiverId("@Gopal:KN");

        }

        else

        {

            requestHeader.parmReceiverId("");

        }

        

        requestHeader.parmSenderId("@Gopal:SolvSolventum");


        return requestHeader;

    }


    private gopInventoryMovmentObHeader createMovementJournalHeader(InventJournalTable  _inventJournalTable)

    {

        gopInventoryMovmentObHeader invMomementHeader = new gopInventoryMovmentObHeader();


        invMomementHeader.parmOrderUniqueReference(this.getUniqueReferenceNumber(_inventJournalTable.JournalId));

        invMomementHeader.parmJournalNumber(_inventJournalTable.JournalId);

        invMomementHeader.parmDescription(_inventJournalTable.Description);

        invMomementHeader.parmLegalEntityCode(curExt());


        this.createMovementJournalLines(invMomementHeader);


        return invMomementHeader;

    }


    private str getUniqueReferenceNumber(JournalId _journalNumber)

    {

        int j = 2;

        str uniqueRef;

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

        {

            GopalMulesoftIntegrationLogTable mulesoftLog;

            select firstonly mulesoftLog

            where mulesoftLog.KeyField == strFmt("%1-0%2",_journalNumber,i)

            && mulesoftLog.InterfaceName == #interface;


            if(mulesoftLog)

            {

                j = j+1;

            }

            else

            {

                uniqueRef = strFmt("%1-0%2",_journalNumber,i);

            }

        }

        return uniqueRef;

    }


    private void createMovementJournalLines(gopInventoryMovmentObHeader _invMomementHeader)

    {

        InventJournalTrans  inventJournalTrans;

        InventDim           inventDim;

        InventLocation      inventLocation;

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

        gopInventoryMovementObLines movementJournalLines;


        str formatDate(TransDate     _date)

        {

            str formatDate = date2Str(_date, 321, 2, DateSeparator::Hyphen, 2, DateSeparator::Hyphen, 4);

            return formatDate;

        }


        JournalId journalNumber = _invMomementHeader.parmJournalNumber();

        while select inventJournalTrans order by LineNum

            where inventJournalTrans.JournalId == journalNumber

            && inventJournalTrans.gopApplicable == NoYes::Yes

            join inventDim where inventDim.inventDimId == inventJournalTrans.InventDimId

            exists join inventLocation

            where inventLocation.InventLocationId == inventDim.InventLocationId

            && inventLocation.SolvWarehouse == NoYes::Yes

        {

            movementJournalLines = new gopInventoryMovementObLines();


            movementJournalLines.parmTransactionDate(formatDate(inventJournalTrans.TransDate));

            movementJournalLines.parmItemNumber(inventJournalTrans.ItemId);

            movementJournalLines.parmLineNumber(inventJournalTrans.LineNum);

            

            movementJournalLines.parmItemSerialNumber(inventDim.inventSerialId);

            movementJournalLines.parmItemBatchNumber(inventDim.inventBatchId);

            movementJournalLines.parmProductStatus(inventDim.InventStatusId);

            movementJournalLines.parmWarehouseId(inventDim.InventLocationId);

            movementJournalLines.parmExipryDate(formatDate(InventBatch::find(inventDim.inventBatchId,inventJournalTrans.ItemId).expDate));


            UnitOfMeasureSymbol inventoryUnit = inventJournalTrans.inventTable().inventUnitId();

            

            InventQty qtyLoc = inventJournalTrans.Unit != inventoryUnit ?

                UnitOfMeasureConverter::convert(inventJournalTrans.Qty,UnitOfMeasure::findBySymbol(inventJournalTrans.Unit).RecId,UnitOfMeasure::findBySymbol(inventoryUnit).RecId,NoYes::Yes)

                : inventJournalTrans.Qty;


            movementJournalLines.parmOrderQuantity(qtyLoc);

            

            journalLines.addEnd(movementJournalLines);

        }


        _invMomementHeader.parmInventoryMovmentLines(journalLines);

    }


    public void sendToAPI(gopInventoryMovementOb _request, RefRecId _recid)

    {

        str Json = FormJsonSerializer::serializeClass(_request);

        GopalMulesoftIntegrationParameterOptions options;

        InventJournalTable inventJournalTable = InventJournalTable::findByRecId(_recid,true);

        RetailWebResponse webResponse;


        if (this.isProduction())

        {

            select firstonly options

                where options.SourceType == GopalSourceType::InventoryMovement &&

                      options.Environment == GopalEnvironment::Prod;

        }

        else

        {

            select firstonly options

                where options.SourceType == GopalSourceType::InventoryMovement &&

                options.Environment == GopalEnvironment::Test;

        }


        if(options)

        {

            webResponse = SolvAPIHelper::sendToAPI(options.URL, options.ClientId, options.ClientSecret, Json, "@Gopal:SolvPost");

            ttsbegin;

            if (webResponse.parmHttpStatus() == 200)

            {

                GopalMulesoftIntegrationLogTable::createLog(_request.parmgopInventoryMovementRequestHeaderContract().parmMessageId(),

                                                        XMLDocDirection::Outbound,

                                                        #interface,

                _request.parmgopInventoryMovmentHeader().parmOrderUniqueReference(),

                                                        Json,

                                                        GopalMulesoftIntegrationResponseStatus::Success,

                                                        '','','','','','','','',_request.parmgopInventoryMovementRequestHeaderContract().parmCountryCode());


                inventJournalTable.SolvIsSoSentTo3Pl = NoYes::Yes;

                inventJournalTable.doUpdate();

            }

            else

            {

                SolvResponseRootContract response = FormJsonSerializer::deserializeObject(classNum(SolvResponseRootContract), webResponse.parmData());

                GopalMulesoftIntegrationLogTable::createLog(_request.parmgopInventoryMovementRequestHeaderContract().parmMessageId(),

                                                        XMLDocDirection::Outbound,

                                                        #interface,

                _request.parmgopInventoryMovmentHeader().parmOrderUniqueReference(),

                                                        Json,

                                                        GopalMulesoftIntegrationResponseStatus::Failure,

                                                        response.parmResponse().parmError().parmErrorDescription(),'','','','','','','',_request.parmgopInventoryMovementRequestHeaderContract().parmCountryCode());

            }

            ttscommit;

        }

        else

        {

            throw Error("@Gopal:SolvMulesoftParamCheck");

        }

    }


    private boolean isProduction()

    {

        boolean ret = false;

        var env = Microsoft.Dynamics.ApplicationPlatform.Environment.EnvironmentFactory::GetApplicationEnvironment();

        str url = env.Infrastructure.HostUrl;


        if (URL == @"https://solventum-prod.operations.dynamics.com")

        {

            ret = true;

        }


        return ret;

    }


}

----- Read and Send API------

/// <summary>

/// API helper

/// </summary>

public static class GOPAPIHelper

{

    /// <summary>

    /// send to API

    /// </summary>

    /// <param name = "_url">URL</param>

    /// <param name = "_clientId">Client id</param>

    /// <param name = "_clientSecret">client secret</param>

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

    /// <param name = "_method">method</param>

    /// <returns>RetailWebResponse</returns>

    public static RetailWebResponse sendToAPI(URL        _url, String255     _clientId, String255        _clientSecret, Notes        _json, str     _method)

    {

        #define.clientId("client_id")

        #define.clientSecret("client_secret")

        System.Net.HttpWebRequest request = null;

        System.Net.HttpWebResponse response = null;

        CLRObject webResponse;

        System.Net.WebHeaderCollection headers;

        System.IO.MemoryStream stream;

        Binary requestContent;

        str responseData;

        System.Exception ex;

        System.Net.WebException webException;

        RetailWebResponse retailWebResponse;

        int httpStatusCode;

        str contentType;


        try

        {

            ttsbegin;

            request = System.Net.WebRequest::Create(_url) as System.Net.HttpWebRequest;

            request.set_Method(_method);

            request.AllowAutoRedirect   = false;


            headers = request.get_Headers();

            headers.Add(#clientId, _clientId);

            headers.Add(#clientSecret, _clientSecret);


            request.set_Headers(headers);


            request.set_ContentType(@"application/json");


            System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();


            System.Byte[] bytes = encoding.GetBytes(_json);

            if (bytes)

            {

                SolvAPIHelper::writeRequestData(request, bytes);

            }


            webResponse = request.GetResponse();

            response = webResponse as System.Net.HttpWebResponse;

            ttscommit;

        }

        catch (ex)

        {

            ex = ClrInterop::getLastException();

            if (ex != null)

            {

                ex = ex.get_InnerException();

                if ((ex != null) && (ex is System.Net.WebException))

                {

                    webException = ex as System.Net.WebException;

                    webResponse = webException.get_Response();

                    response = webResponse as System.Net.HttpWebResponse;

                }

            }

        }


        responseData = SolvAPIHelper::readResponseData(response);

        response.Close();


        httpStatusCode = response.get_StatusCode();


        if (httpStatusCode >= 300 && httpStatusCode <= 399)

        {

            retailWebResponse = SolvAPIHelper::sendToAPI(response.GetResponseHeader("Location"), _clientId, _clientSecret, _json, _method);

            return retailWebResponse;

        }


        contentType = response.get_ContentType();

        retailWebResponse = new RetailWebResponse(httpStatusCode, responseData, contentType);


        return retailWebResponse;

    }


    /// <summary>

    /// read response data

    /// </summary>

    /// <param name = "response">response</param>

    /// <returns>string</returns>

    private static str readResponseData(System.Net.HttpWebResponse response)

    {

        int batchSize = 1024;

        System.IO.Stream receiveStream;

        System.IO.StreamReader readStream;

        System.Text.Encoding encode;

        System.Char[] read;

        System.Text.StringBuilder sb;

        System.String readString;

        str contentEncoding;


        int countRead;


        if (response == null)

        {

            return "";

        }


        receiveStream = response.GetResponseStream();

        contentEncoding = response.get_ContentEncoding();

        if (contentEncoding)

        {

            encode = System.Text.Encoding::GetEncoding(contentEncoding);

        }

        else

        {

            encode = new System.Text.UTF8Encoding();

        }


        readStream = new System.IO.StreamReader(receiveStream, encode);

        read = new System.Char[batchSize]();


        countRead = readStream.Read(read, 0, batchSize);


        sb = new System.Text.StringBuilder();

        while (countRead > 0)

        {

            readString = new System.String(read, 0, countRead);

            sb.Append(readString);

            countRead = readStream.Read(read, 0, batchSize);

        }


        readStream.Close();


        return sb.ToString();

    }


    /// <summary>

    /// Request

    /// </summary>

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

    /// <param name = "_bytes">Bytes</param>

    private static void writeRequestData(System.Net.HttpWebRequest _request, System.Byte[] _bytes)

    {

        System.IO.Stream stream;


        _request.set_ContentLength(_bytes.get_Length());


        stream = _request.GetRequestStream();

        stream.Write(_bytes, 0, _bytes.get_Length());

        stream.Close();

    }


}

Comments

Popular posts from this blog

Create ledger journals in D365FO using X++ + LedgerDimensionACType

Excel Import into D365 using x++ code

Sales invoice report