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