class ULT_HistoryRequestContract
{
private str legalEntity;
private str allocationAccount;
private Date fromDate;
private Date toDate;
private str transactionType;
private int sortBy;
private int Page;
private int limit;
[DataMember("LegalEntity")]
public str parmLegalEntity(str _legalEntity = legalEntity)
{
legalEntity = _legalEntity;
return legalEntity;
}
[DataMember("AllocationAccount")]
public str parmAllocationAccount(str _allocationAccount = allocationAccount)
{
allocationAccount = _allocationAccount;
return allocationAccount;
}
[DataMember("FromDate")]
public Date parmFromDate(Date _fromDate = fromDate)
{
fromDate = _fromDate;
return fromDate;
}
[DataMember("ToDate")]
public Date parmToDate(Date _toDate = toDate)
{
toDate = _toDate;
return toDate;
}
[DataMember("TransactionType")]
public str parmTransactionType(str _transactionType = transactionType)
{
transactionType = _transactionType;
return transactionType;
}
[DataMember("SortBy")]
public int parmSortBy(int _sortBy = sortBy)
{
sortBy = _sortBy;
return sortBy;
}
[DataMember("Page")]
public int parmPage(int _page = page)
{
page = _page;
return page;
}
[DataMember("Limit")]
public int parmLimit(int _limit = limit)
{
limit = _limit;
return limit;
}
}
-------------------------------------------------------
[DataContract]
class ULT_HistoryResponseContract
{
private ULT_HistoryResponseHeaderContract headerResponse;
private List linesResponse = new List(Types::Class);
[DataMember("Header")]
public ULT_HistoryResponseHeaderContract parmHeader(ULT_HistoryResponseHeaderContract _headerResponse = headerResponse)
{
headerResponse = _headerResponse;
return headerResponse;
}
[DataMember("Transactions"),
AifCollectionType("_linesResponse", Types::Class, classStr(ULT_HistoryResponseLineContract)),
AifCollectionType("return", Types::Class, classStr(ULT_HistoryResponseLineContract))]
public List parmLines(List _linesResponse = linesResponse)
{
linesResponse = _linesResponse;
return linesResponse;
}
}
-------------------------------------------------------------------
[DataContract]
class ULT_HistoryResponseHeaderContract
{
private boolean queryStatus;
private real allocationAccountBalance;
private int transactionCount;
private str errorType;
private str errorDescription;
[DataMember("QueryStatus")]
public boolean parmQueryStatus(boolean _queryStatus = queryStatus)
{
queryStatus = _queryStatus;
return queryStatus;
}
[DataMember("AllocationAccountBalance")]
public real parmAllocationAccountBalance(real _allocationAccountBalance = allocationAccountBalance)
{
allocationAccountBalance = _allocationAccountBalance;
return allocationAccountBalance;
}
[DataMember("TransactionCount")]
public int parmTransactionCount(int _transactionCount = transactionCount)
{
transactionCount = _transactionCount;
return transactionCount;
}
[DataMember("ErrorType")]
public str parmErrorType(str _errorType = errorType)
{
errorType = _errorType;
return errorType;
}
[DataMember("ErrorDescription")]
public str parmErrorDescription(str _errorDescription = errorDescription)
{
errorDescription = _errorDescription;
return errorDescription;
}
public void setResponse(boolean _queryStatus, real _allocationAccountBalance, int _transactionCount, str _errorType, str _errorDescription)
{
this.parmQueryStatus(_queryStatus);
this.parmAllocationAccountBalance(_allocationAccountBalance);
this.parmTransactionCount(_transactionCount);
this.parmErrorType(_errorType);
this.parmErrorDescription(_errorDescription);
}
}
-----------------------------------------------------------------------
[DataContract]
class ULT_HistoryResponseLineContract
{
private str type;
private TransDate transDate;
private str voucher;
private str description;
private str businessProcessReferenceId;
private real volume;
private str gjaeRecId;
[DataMember("Type")]
public str parmType(str _type = type)
{
type = _type;
return type;
}
[DataMember("TransDate")]
public TransDate parmTransDate(TransDate _transDate = transDate)
{
transDate = _transDate;
return transDate;
}
[DataMember("Voucher")]
public str parmVoucher(str _voucher = voucher)
{
voucher = _voucher;
return voucher;
}
[DataMember("Description")]
public str parmDescription(str _description = description)
{
description = _description;
return description;
}
[DataMember("BusinessProcessReferenceId")]
public str parmBusinessProcessReferenceId(str _businessProcessReferenceId = businessProcessReferenceId)
{
businessProcessReferenceId = _businessProcessReferenceId;
return businessProcessReferenceId;
}
[DataMember("Volume")]
public real parmVolume(real _volume = volume)
{
volume = _volume;
return volume;
}
[DataMember("RecordId")]
public str parmRecId(str _gjaeRecId = gjaeRecId)
{
gjaeRecId = _gjaeRecId;
return gjaeRecId;
}
}
------------------------------------------------------------------------------
public class ULT_HistoryService
{
ULT_HistoryResponseContract respoHnse;
ULT_HistoryResponseHeaderContract headerResponse;
GeneralJournalAccountEntry generalJournalAccountEntry;
str operationStatus;
str errorType, errorTypeDate, missingPayloadfields;
str errorDescription, errorDescriptionDate, errorDateDescriptions;
real allocationAccountBalance;
int transactionCount, i;
public ULT_HistoryResponseContract getRetrieveAllocationTrans(ULT_HistoryRequestContract _request)
{
ULT_allocationDetailsView allocationDetailsView;
headerResponse = new ULT_HistoryResponseHeaderContract ();
response = new ULT_HistoryResponseContract();
Query query = new Query();
QueryRun queryRun;
QueryBuildDataSource qbds;
try
{
if (this.requestIsNotEmpty(_request))
{
changecompany(_request.parmLegalEntity())
{
qbds = query.addDataSource(tableNum(ULT_allocationDetailsView));
qbds.addRange(fieldNum(ULT_allocationDetailsView, TransactionHistory)).value(SysQuery::value(NoYes::Yes));
qbds.addRange(fieldNum(ULT_allocationDetailsView, GeneralJournalEntrySubledgerVoucher)).value(SysQuery::valueNotEmptyString());
switch (_request.parmSortBy())
{
case enum2int(ULT_SortBy::None):
qbds.addSortField(fieldNum(ULT_allocationDetailsView, GJAERecId), SortOrder::Ascending);
break;
case enum2int(ULT_SortBy::DateNewToOld):
qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingDate), SortOrder::Descending);
break;
case enum2int(ULT_SortBy::DateOldToNew):
qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingDate), SortOrder::Ascending);
break;
case enum2int(ULT_SortBy::VolumeLowToHigh):
qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingCurrencyAmount), SortOrder::Ascending);
break;
case enum2int(ULT_SortBy::VolumeHighToLow):
qbds.addSortField(fieldNum(ULT_allocationDetailsView, AccountingCurrencyAmount), SortOrder::Descending);
break;
case enum2int(ULT_SortBy::TransactionTypeAToZ):
qbds.addSortField(fieldNum(ULT_allocationDetailsView, WaterTransType), SortOrder::Ascending);
break;
case enum2int(ULT_SortBy::TransactionTypeZToA):
qbds.addSortField(fieldNum(ULT_allocationDetailsView, WaterTransType), SortOrder::Descending);
break;
}
qbds.addRange(fieldNum(ULT_allocationDetailsView, DIMENSIONATTRIBUTENAME)).value(ULT_AllocationTradeConstants::allocationAccountConst);
qbds.addRange(fieldNum(ULT_allocationDetailsView, DimensionAttributeLevelValueViewDisplayValue)).value(_request.parmAllocationAccount());
qbds.addRange(fieldNum(ULT_allocationDetailsView, AccountingDate)).value(SysQuery::range(_request.parmFromDate(), _request.parmToDate()));
if (_request.parmTransactionType())
{
qbds.addRange(fieldNum(ULT_allocationDetailsView, WaterTransType)).value(SysQuery::value(_request.parmTransactionType()));
}
else
{
qbds.addRange(fieldNum(ULT_allocationDetailsView, WaterTransType)).value(SysQuery::valueNotEmptyString());
}
queryRun = new QueryRun(query);
if (_request.parmPage() !=0)
{
queryRun.enablePositionPaging(true);
queryRun.addPageRange(_request.parmPage(), _request.parmLimit());
}
while (queryRun.next())
{
allocationDetailsView = queryRun.get(tableNum(ULT_AllocationDetailsView));
ULT_HistoryResponseLineContract lineResponse = new ULT_HistoryResponseLineContract();
select firstonly generalJournalAccountEntry
where generalJournalAccountEntry.RecId == allocationDetailsView.GJAERecId;
finTagConfiguration finTagConfiguration;
FinTagColumnNameValueView finTagColumnNameValueView;
select firstonly FinTagColumnName, RecId from finTagConfiguration
where finTagConfiguration.TagName == ULT_AllocationTradeConstants::applicationIdConst
&& finTagConfiguration.Active == noyes::Yes;
if (finTagConfiguration.RecId)
{
select firstonly finTagColumnNameValueView
where finTagColumnNameValueView.FinTagColumnName == finTagConfiguration.FinTagColumnName
&& finTagColumnNameValueView.FinTag == generalJournalAccountEntry.FinTag;
}
lineResponse.parmType(allocationDetailsView.WaterTransType);
lineResponse.parmBusinessProcessReferenceId(finTagColumnNameValueView.TagValue);
lineResponse.parmTransDate(allocationDetailsView.AccountingDate);
lineResponse.parmVoucher(allocationDetailsView.GeneralJournalEntrySubledgerVoucher);
lineResponse.parmDescription(allocationDetailsView.Text);
lineResponse.parmVolume(allocationDetailsView.AccountingCurrencyAmount);
lineResponse.parmRecId(int642Str(allocationDetailsView.GJAERecId));
response.parmLines().addEnd(lineResponse);
transactionCount++;
}
allocationAccountBalance = ULT_AllocationTradeBalance::allocationHistoryBalance(_request.parmAllocationAccount(), _request.parmFromDate(), _request.parmToDate());
headerResponse.setResponse(NoYes::Yes, allocationAccountBalance, transactionCount, ULT_AllocationTradeConstants::empty, ULT_AllocationTradeConstants::empty);
}
}
}
catch (Exception::Deadlock)
{
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_DeadLock", "@ULTExtension:ULT_ErrorOccurredInEndpoint");
}
catch (Exception::UpdateConflict)
{
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_UpdateConflict", "@ULTExtension:ULT_ErrorOccurredInEndpoint");
}
catch(Exception::DuplicateKeyException)
{
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_DuplicateKeyException", "@ULTExtension:ULT_ErrorOccurredInEndpoint");
}
catch(Exception::CLRError)
{
System.Exception ex = CLRInterop::getLastException();
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_CLRInterop", ex.Message);
}
catch
{
headerResponse.parmQueryStatus(NoYes::No);
if (!headerResponse.parmErrorType())
{
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, enum2Str(Exception::Error), ULT_ResponseErrorLog::getErrorMessage());
}
}
response.parmHeader(headerResponse);
return response;
}
private boolean requestIsNotEmpty(ULT_HistoryRequestContract _request)
{
boolean ret;
try
{
if (CompanyInfo::findDataArea(_request.parmLegalEntity()) &&
_request.parmAllocationAccount() &&
_request.parmFromDate() &&
_request.parmToDate())
{
changecompany(_request.parmLegalEntity())
{
if (!this.validateDimensions(ULT_AllocationTradeConstants::allocationAccountConst, _request.parmAllocationAccount()))
{
missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_AllocationAccount" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_AllocationAccount";
errorDescription = (!errorDescription) ? "@ULTExtension:ULT_AllocationAccount" + ULT_AllocationTradeConstants::empty+ _request.parmAllocationAccount():
errorDescription + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_AllocationAccount" + ULT_AllocationTradeConstants::empty+
_request.parmAllocationAccount();
i++;
}
if (_request.parmSortBy() != enum2int(ULT_SortBy::DateNewToOld) && _request.parmSortBy() != enum2int(ULT_SortBy::DateOldToNew) &&
_request.parmSortBy() != enum2int(ULT_SortBy::VolumeLowToHigh) && _request.parmSortBy() != enum2int(ULT_SortBy::VolumeHighToLow) &&
_request.parmSortBy() != enum2int(ULT_SortBy::TransactionTypeAToZ) && _request.parmSortBy() != enum2int(ULT_SortBy::TransactionTypeZToA) &&
_request.parmSortBy() != enum2int(ULT_SortBy::None))
{
missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_SortBy" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_SortBy";
errorDescription = (!errorDescription) ? "@ULTExtension:ULT_SortBy" + ULT_AllocationTradeConstants::empty+ int2Str(_request.parmSortBy()):
errorDescription + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_SortBy" + ULT_AllocationTradeConstants::empty+
int2Str(_request.parmSortBy());
i++;
}
if (_request.parmTransactionType())
{
ULT_WaterTransTypeTable WaterTransTypeTable;
select firstonly WaterTransTypeTable
where WaterTransTypeTable.TransType == _request.parmTransactionType();
if (!WaterTransTypeTable.RecId)
{
missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_WaterTransType" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_WaterTransType";
errorDescription = (!errorDescription) ? "@ULTExtension:ULT_WaterTransType" + ULT_AllocationTradeConstants::empty+ _request.parmTransactionType():
errorDescription + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_WaterTransType" + ULT_AllocationTradeConstants::empty+
_request.parmTransactionType();
i++;
}
}
}
if (i == 1)
{
errorDescription = (!errorDateDescriptions) ? errorDescription + ULT_AllocationTradeConstants::empty +
ULT_AllocationTradeConstants::doesNotExistConst : errorDateDescriptions;
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, missingPayloadfields,
strReplace(errorDescription, ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));
}
else if (i > 1)
{
errorDescription = (!errorDateDescriptions) ? errorDescription + ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::doNotExistConst :
errorDescription + ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::doNotExistConst +
ULT_AllocationTradeConstants::separator + errorDateDescriptions;
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, missingPayloadfields ,
strReplace(errorDescription, ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));
}
else
{
if (_request.parmPage() >0 && _request.parmLimit() <=0)
{
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_LIMIT", "@ULTExtension:ULT_LimitValid");
i++;
}
if (_request.parmToDate() < _request.parmFromDate())
{
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, "@ULTExtension:ULT_FromDateAndToDate", "@SYS16982");
i++;
}
else
{
ret = true;
}
}
}
else
{
if (!_request.parmLegalEntity())
{
missingPayloadfields = "@ULTExtension:ULT_LegalEntity";
i++;
}
else if (!CompanyInfo::findDataArea(_request.parmLegalEntity()))
{
missingPayloadfields = "@ULTExtension:ULT_LegalEntity";
errorDescription = missingPayloadfields + ULT_AllocationTradeConstants::empty+ _request.parmLegalEntity() +
ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::doesNotExistConst;
i++;
}
if (!_request.parmAllocationAccount() && !errorDescription)
{
missingPayloadfields = (!missingPayloadfields) ? "@ULTExtension:ULT_AllocationAccount" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@ULTExtension:ULT_AllocationAccount";
i++;
}
if (!_request.parmFromDate() && !errorDescription)
{
missingPayloadfields = (!missingPayloadfields) ? "@SYS24050" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@SYS24050";
i++;
}
if (!_request.parmToDate() && !errorDescription)
{
missingPayloadfields = (!missingPayloadfields) ? "@SYS80662" : missingPayloadfields + ULT_AllocationTradeConstants::separator + "@SYS80662";
i++;
}
errortype = missingPayloadfields;
if (i == 1)
{
missingPayloadfields = (errorDescription) ? errorDescription: missingPayloadfields + ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::isMandatoryConst;
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, errortype,
strReplace(missingPayloadfields,ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));
}
else
{
missingPayloadfields = (errorDescription) ? errorDescription : missingPayloadfields + ULT_AllocationTradeConstants::empty + ULT_AllocationTradeConstants::areMandatoryConst;
headerResponse.setResponse(NoYes::No, allocationAccountBalance, transactionCount, errortype,
strReplace(missingPayloadfields,ULT_AllocationTradeConstants::semiColonConst, ULT_AllocationTradeConstants::commaConst));
}
ret = false;
}
}
catch
{
headerResponse.parmQueryStatus(NoYes::No);
}
return ret;
}
public RefRecId validateDimensions(Name _dimensionAttributeName, str _displayValue)
{
DimensionAttribute dimensionAttribute;
RecId dimFinancialCategoryRecid;
DimensionFinancialTag dimensionFinancialTag;
dimensionAttribute = DimensionAttribute::findByName(_dimensionAttributeName);
dimFinancialCategoryRecid = dimensionAttribute.financialTagCategory();
select firstonly RecId from dimensionFinancialTag
where dimensionFinancialTag.FinancialTagCategory == dimFinancialCategoryRecid
&& dimensionFinancialTag.Value == _displayValue;
return dimensionFinancialTag.RecId;
}
}