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