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