/// <summary>

/// ASN Request sending OB service

/// </summary>

public class testASNRequestOBService extends SysOperationServiceBase

{

    #define.interface('3PL ASN Outbound')


    /// <summary>

    /// To process TPF data

    /// </summary>

    public void process()

    {

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

        HCLTPFCreationTable tPFCreationTable;

        testASNRequestOBContract request;

        str Json;


        while select tPFCreationTable

            where tPFCreationTable.RetryCount < maxRetryCount

            && tPFCreationTable.TPFStatus == HCLTPFStatus::Confirm

        {

            try

            {

                request = this.createRequest(tPFCreationTable);

                Json = FormJsonSerializer::serializeClass(request);


                if(!this.validateRequest(request))

                {

                    throw Exception::CLRError;

                }

                else

                {

                    this.sendToAPI(request);

                }

            }

            catch

            {

                HCLTPFCreationTable tpfTable = HCLTPFCreationTable::find(request.parmASNHeaderOBContract().parmOrderNumber(),true);

                ttsbegin;

                tpfTable.RetryCount += 1;

                tpfTable.update();

                ttscommit;


                str log = HCLMulesoftIntegrationLogTable::captureInfoLog();

                HCLMulesoftIntegrationLogTable::createLog(request.parmRequestHeaderContract().parmMessageId(),

                                                    XMLDocDirection::Outbound,

                                                    #interface,

                request.parmASNHeaderOBContract().parmOrderNumber(),

                                                    json,

                                                    HCLMulesoftIntegrationResponseStatus::Failure,

                                                    log);

            }

        }

    }


    /// <summary>

    /// Method to create ASN request

    /// </summary>

    /// <param name = "_tpfCreationTable">TPFCreationTable</param>

    /// <returns>request</returns>

    public testASNRequestOBContract createRequest(HCLTPFCreationTable _tpfCreationTable)

    {

        HCLTPFCreationLine tPFCreationLine;

        InventLocation inventLocation = InventLocation::find(_tpfCreationTable.Warehouse);

        testASNRequestOBContract request = new testASNRequestOBContract();

        testRequestHeaderContract requestHeader = new testRequestHeaderContract();

        testASNHeaderOBContract asnHeader = new testASNHeaderOBContract();

        testASNLinesOBContract asnLine;

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

        #ISOCountryRegionCodes


        str formatDate(TransDate     _date)

        {

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

            return formatDate;

        }


        requestHeader.parmChannelName();

        requestHeader.parmCountryCode(curExt());

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

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


        if(inventLocation.testWarehouse)

        {

            requestHeader.parmReceiverId(inventLocation.testWarehouseCode);


            if(inventLocation.testWarehouseCode == "@HCL:testDHLsssLabel" || inventLocation.testWarehouseCode == "@HCL:testDHLNZLabel")

            {

                if(this.isProduction())

                {

                    requestHeader.parmSenderId("@HCL:testtestentumDHLsss");

                }

                else

                {

                    requestHeader.parmSenderId("@HCL:testtestentumDHLsssT");

                }

            }

            else

            {

                requestHeader.parmSenderId("@HCL:testtestentum");

            }

        }


        asnHeader.parmConfirmedDeliveryDate(formatDate(_tpfCreationTable.ExpectedReceiptDate));

        asnHeader.parmContainerNumber(_tpfCreationTable.TPFContainer);

        asnHeader.parmLegalEntityCode(curExt());

        asnHeader.parmOrderNumber(_tpfCreationTable.TPFCreationID);

        asnHeader.parmOrderType(_tpfCreationTable.testOrderType);

        asnHeader.parmOrderUniqueReference(_tpfCreationTable.TPFCreationID);

        asnHeader.parmReceivingWarehouseId(_tpfCreationTable.Warehouse);

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

        {

            asnHeader.parmSupplierCompany("@HCL:test100");

            asnHeader.parmCompanyType("@SYS9455");

            asnHeader.parmStatus("@SYS301608");

        }


        inventLocation = InventLocation::find(_tpfCreationTable.Warehouse);

        LogisticsPostalAddress logisticsPostalAddress = inventLocation.logisticsPostalAddress();

        

        asnHeader.parmDeliveryAddressCity(logisticsPostalAddress.City);

        asnHeader.parmDeliveryAddressCountyId(logisticsPostalAddress.CountryRegionId);

        asnHeader.parmDeliveryAddressDescription(LogisticsLocation::find(logisticsPostalAddress.Location).Description);

        asnHeader.parmDeliveryAddressStateId(logisticsPostalAddress.State);

        asnHeader.parmDeliveryAddressStreet(logisticsPostalAddress.Street);

        asnHeader.parmDeliveryAddressZipCode(logisticsPostalAddress.ZipCode);


        while select tPFCreationLine

            where tPFCreationLine.TPFCreationID == _tpfCreationTable.TPFCreationID

        {

            InventTableModule inventTableModule = InventTableModule::find(tPFCreationLine.ItemId,ModuleInventPurchSales::Invent);

            asnLine = new testASNLinesOBContract();

            asnLine.parmItemNumber(tPFCreationLine.ItemId);

            asnLine.parmLineDescription(tPFCreationLine.ItemName);

            asnLine.parmLineNumber(real2int(tPFCreationLine.TPFLineNum));

            if(VendTable::find(tPFCreationLine.OrderAccount).VendGroup == "@HCL:Ico")

            {

                if(tPFCreationLine.PurchUnit != inventTableModule.UnitId)

                {

                    asnLine.parmOrderedPurchaseQuantity(this.convertQty(tPFCreationLine.ReceivedQty,tPFCreationLine.PurchUnit,inventTableModule.UnitId,tPFCreationLine.ItemId));

                }

                else

                {

                    asnLine.parmOrderedPurchaseQuantity(tPFCreationLine.ReceivedQty);

                }

            }

            else

            {

                if(tPFCreationLine.PurchUnit != inventTableModule.UnitId)

                {

                    asnLine.parmOrderedPurchaseQuantity(this.convertQty(tPFCreationLine.OrderQty,tPFCreationLine.PurchUnit,inventTableModule.UnitId,tPFCreationLine.ItemId));

                }

                else

                {

                    asnLine.parmOrderedPurchaseQuantity(tPFCreationLine.OrderQty);

                }

            }

            asnLine.parmProductStatus(InventDim::find(PurchLine::find(tPFCreationLine.Purchid,real2int(tPFCreationLine.PurchLineNum)).InventDimId).InventStatusId);

            asnLine.parmPurchaseOrderNumber(tPFCreationLine.Purchid);

            asnLine.parmQuantityAdjusted(0);//need to check


            asnLines.addEnd(asnLine);

        }


        asnHeader.parmAsnLinesArray(asnLines);


        request.parmRequestHeaderContract(requestHeader);

        request.parmASNHeaderOBContract(asnHeader);


        return request;

    }


    /// <summary>

    /// Method to send request to API

    /// </summary>

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

    public void sendToAPI(testASNRequestOBContract _request)

    {

        str Json = FormJsonSerializer::serializeClass(_request);

        HCLMulesoftIntegrationParameterOptions  options;

        HCLTPFCreationTable tpfCreationTable = HCLTPFCreationTable::find(_request.parmASNHeaderOBContract().parmOrderNumber(),true);

        RetailWebResponse webResponse;


        if (this.isProduction())

        {

            select firstonly options

                where options.SourceType == HCLSourceType::ASN3PL &&

                      options.Environment == HCLEnvironment::Prod;

        }

        else

        {

            select firstonly options

                where options.SourceType == HCLSourceType::ASN3PL &&

                options.Environment == HCLEnvironment::Test;

        }


        if(options)

        {

            webResponse = testAPIHelper::sendToAPI(options.URL, options.ClientId, options.ClientSecret, Json, "@HCL:testPost");

            ttsbegin;

            if (webResponse.parmHttpStatus() == 200)

            {

                HCLMulesoftIntegrationLogTable::createLog(_request.parmRequestHeaderContract().parmMessageId(),

                                                        XMLDocDirection::Outbound,

                                                        #interface,

                _request.parmASNHeaderOBContract().parmOrderNumber(),

                                                        Json,

                                                        HCLMulesoftIntegrationResponseStatus::Success,

                                                        '');


                tpfCreationTable.TPFStatus = HCLTPFStatus::Sent;

                tpfCreationTable.TPFSendDate = DateTimeUtil::getSystemDateTime();

                tpfCreationTable.update();

            }

            else

            {

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

                HCLMulesoftIntegrationLogTable::createLog(_request.parmRequestHeaderContract().parmMessageId(),

                                                        XMLDocDirection::Outbound,

                                                        #interface,

                _request.parmASNHeaderOBContract().parmOrderNumber(),

                                                        Json,

                                                        HCLMulesoftIntegrationResponseStatus::Failure,

                                                        response.parmResponse().parmError().parmErrorDescription());


                tpfCreationTable.RetryCount += 1;

                tpfCreationTable.update();

            }

            ttscommit;

        }

        else

        {

            throw Error("@HCL:testMulesoftParamCheck");

        }

    }


    /// <summary>

    /// Method to identify is this production environment or not

    /// </summary>

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

    private boolean isProduction()

    {

        boolean ret = false;

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

        str url = env.Infrastructure.HostUrl;


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

        {

            ret = true;

        }


        return ret;

    }


    /// <summary>

    /// Method to validate request details

    /// </summary>

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

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

    private boolean validateRequest(testASNRequestOBContract _request)

    {

        boolean ret = true;

        testRequestHeaderContract header = new testRequestHeaderContract();

        testASNHeaderOBContract asnHeader = new testASNHeaderOBContract();

        testASNLinesOBContract asnLine = new testASNLinesOBContract();

        ListEnumerator asnLinesEnumerator;


        header = _request.parmRequestHeaderContract();

        asnHeader = _request.parmASNHeaderOBContract();

        asnLinesEnumerator = asnHeader.parmAsnLinesArray().getEnumerator();


        if(!header.parmSenderId())

        {

            ret = checkFailed("@HCL:testSenderIdCheck");

        }


        if(!header.parmReceiverId())

        {

            ret = checkFailed("@HCL:testReceiverIdCheck");

        }


        if(!asnHeader.parmOrderType())

        {

            checkFailed("@HCL:testOrderTypeCheck");

        }


        if(header.parmReceiverId() == "@HCL:testFC")

        {

            if(!asnHeader.parmDeliveryAddressCity())

            {

                ret = checkFailed("@HCL:testDelAddressCityCheck");

            }


            if(!asnHeader.parmDeliveryAddressStateId())

            {

                ret = checkFailed("@HCL:testDelAddressStateCheck");

            }


            if(!asnHeader.parmDeliveryAddressStreet())

            {

                ret = checkFailed("@HCL:testDelAddressStreetCheck");

            }

        }


        while(asnLinesEnumerator.moveNext())

        {

            asnLine = asnLinesEnumerator.current();


            if(asnLine.parmOrderedPurchaseQuantity() == 0)

            {

                ret = checkFailed(strFmt("@HCL:testPOLN" + "@SYS303273" + "@HCL:testOrderedQtyCheck",asnLine.parmPurchaseOrderNumber(),asnLine.parmLineNumber()));

            }


            if(header.parmReceiverId() != "@HCL:testFC")

            {

                if(!asnLine.parmProductStatus())

                {

                    ret = checkFailed(strFmt("@HCL:testPOLN" + "@SYS303273" + "@HCL:testProductStatusCheck",asnLine.parmPurchaseOrderNumber(),asnLine.parmLineNumber()));

                }

            }

        }

        return ret;

    }


    /// <summary>

    /// get converted Qty

    /// </summary>

    /// <param name = "_qty">qty</param>

    /// <param name = "_fromUnitId">FromUnitId</param>

    /// <param name = "_toUnitId">ToUnitId</param>

    /// <param name = "_itemId">ItemId</param>

    /// <returns>Qty</returns>

    public Qty convertQty(Qty _qty, UnitOfMeasureSymbol _fromUnitId, UnitOfMeasureSymbol _toUnitId, ItemId _itemId)

    {

        Qty qty;

        qty = EcoResProductUnitConverter::convertForReleasedProduct(_itemId,InventTable::getInventDimId(_itemId),_qty,UnitOfMeasure::findBySymbol(_fromUnitId).RecId,UnitOfMeasure::findBySymbol(_toUnitId).RecId,NoYes::Yes);

        return qty;

    }


}

Comments

Popular posts from this blog

Create ledger journals in D365FO using X++ + LedgerDimensionACType

Excel Import into D365 using x++ code

Sales invoice report