class AT_DeferralLinesImportService extends SysOperationServiceBase
{
LedgerJournalTable LedgerjournalTable;
str errorMsg;
Voucher voucher;
int infologStartLine;
LedgerDimensionAccount ledgerDimension;
CustInvoiceJour custInvoiceJour;
CustInvoiceTable custInvoiceTable;
RecordInsertList transInsertList = new RecordInsertList(tableNum(LedgerJournalTrans));
public void process()
{
AT_DeferralLinesImport deferral, deferralUpdate;
voucher ='';
this.CreateJournal();
while select deferral
where deferral.Status == AT_DeferralStatus::Created
&& deferral.Type == 'Ledger'
{
infologStartLine = infologLine();
try
{
this.createvoucher(deferral);
update_recordset deferralUpdate setting Status = AT_DeferralStatus::Processed,ErrorMessage ='',
JournalNum = ledgerjournalTable.JournalNum, Voucher =voucher
where deferralUpdate.Account == deferral.Account
&& deferralUpdate.RecId == deferral.RecId;
}
catch
{
this.addErrorMsg(this.getInfologStr(infologStartLine));
update_recordset deferralUpdate setting Status = AT_DeferralStatus::Failed,
ErrorMessage = strFmt("Process failed for Account-%1--%2",deferralUpdate.Account, errorMsg)
where deferralUpdate.Account == deferral.Account
&& deferralUpdate.RecId == deferral.RecId;
continue;
}
}
while select deferral
where deferral.Status == AT_DeferralStatus::Created
&& deferral.Type == 'Customer'
{
infologStartLine = infologLine();
try
{
this.createFreeTextInvoice(deferral);
update_recordset deferralUpdate setting Status = AT_DeferralStatus::Processed,ErrorMessage ='',
JournalNum = int642Str (custInvoiceTable.Recid)
where deferralUpdate.Account == deferral.Account
&& deferralUpdate.RecId == deferral.RecId;
}
catch
{
this.addErrorMsg(this.getInfologStr(infologStartLine));
update_recordset deferralUpdate setting Status = AT_DeferralStatus::Failed,
ErrorMessage = strFmt("Process failed for Account-%1--%2",deferralUpdate.Account, errorMsg)
where deferralUpdate.Account == deferral.Account
&& deferralUpdate.RecId == deferral.RecId;
continue;
}
}
}
public void createFreeTextInvoice(AT_DeferralLinesImport Deferral)
{
custInvoiceTable.clear();
CustInvoiceTrans custInvoiceTrans;
CustPostInvoice custPostInvoice;
CustInvoiceLine custInvoiceLine;
RecordInsertList invoiceLineList;
LedgerJournalTrans journalTransData;
CustTable custTable = CustTable::find(conPeek(list2Con(strSplit(Deferral.Account, "-")),1));
//InvoiceId invoice;
//MainAccountRecId mainAccount;
ledgerDimension =0;
//Creation of Invoice header and lines from sales invoice.
custInvoiceTable.initFromCustTable(custTable);
custInvoiceTable.InvoiceDate = Deferral.TransactionDate;
custInvoiceTable.DefaultDimension = this.updateDimension(Deferral.Account);
CustInvoiceTable.ESSupplyType = ESSupplyType::B2B;
custInvoiceTable.insert();
custInvoiceLine.initValue();
custInvoiceLine.initFromCustInvoiceTable(custInvoiceTable);
custInvoiceLine.Description = strFmt(' Deferral journal has been created against account%1',Deferral.Account);
custInvoiceLine.TaxGroup = custTable.TaxGroup;
// custInvoiceLine.TaxItemGroup = salesLine.TaxItemGroup;
custInvoiceLine.Quantity = 1;
custInvoiceLine.AmountCur = Deferral.Amount;
custInvoiceLine.ParentRecId = custInvoiceTable.RecId;
custInvoiceLine.DefaultDimension = this.getDefaultDimension(Deferral.OffsetAccount);
custInvoiceLine.LedgerDimension = AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.OffsetAccount);
custInvoiceLine.lineNum = CustInvoiceLine::lastLineNum_W(custInvoiceLine.ParentRecId);
custInvoiceLine.insert();
/*
custPostInvoice = new CustPostInvoice(custInvoiceTable);
custPostInvoice.run();
custInvoiceTable = custPostInvoice.parmCustInvoiceTable();
*/
this.updateDeferralData(Deferral,journalTransData,custInvoiceTrans,custInvoiceLine.SourceDocumentLine);
}
public void updateDeferralData(AT_DeferralLinesImport Deferral, LedgerJournalTrans journalTrans, CustInvoiceTrans custInvoiceLine,int64 SourceDocumentLine =0)
{
SubBillDeferralTransactionLineDeferral deferralTable;
AccountingDistribution AccountingDistribution;
if(journalTrans)
{
deferralTable = SubBillDeferralTransactionLineDeferral::findByLedgerJournalTrans(journalTrans.RecId, true);
}
else if(SourceDocumentLine)
{
select firstonly AccountingDistribution
where AccountingDistribution.SourceDocumentLine == SourceDocumentLine;
deferralTable = SubBillDeferralTransactionLineDeferral::findByTransRecId(AccountingDistribution.RecId,SubBillDeferralSourceRecType::AccountingDistribution, true);
}
if(deferralTable)
{
ttsbegin;
deferralTable.SubBillDeferralScheduleFromTemplate = Deferral.SubBillDeferralScheduleFromTemplate;
deferralTable.SubBillDeferralStartDate = Deferral.StartDate;
deferralTable.SubBillDeferralEndDate = Deferral.EndDate;
if(Deferral.RecognitionAccount !='')
{
deferralTable.SubBillDeferralRecognitionAccount = AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.RecognitionAccount);
deferralTable.SubBillDeferralInitialRecAcct = deferralTable.SubBillDeferralRecognitionAccount;
deferralTable.SubBillDeferralRecOffAcct = deferralTable.SubBillDeferralRecognitionAccount;
}
else
{
deferralTable.SubBillDeferralRecognitionAccount =0;
}
deferralTable.update();
ttscommit;
}
}
private str getInfologStr(int _infologStartLine)
{
SysInfologEnumerator enumerator;
SysInfologMessageStruct msgStruct;
str error;
container infologData;
int infologCurrentLine = infologLine();
if (infologCurrentLine > _infologStartLine)
{
infologData = infolog.copy(_infologStartLine + 1, infologCurrentLine);
}
if (infologData)
{
enumerator = SysInfologEnumerator::newData(infologData);
while (enumerator.moveNext())
{
msgStruct = new SysInfologMessageStruct(enumerator.currentMessage());
error = strfmt("@SYS324543", error, msgStruct.message());
}
}
return error;
}
private void addErrorMsg(str _errorMsg)
{
errorMsg += _errorMsg;
}
void CreateJournal()
{
select firstonly LedgerjournalTable
where LedgerjournalTable.AT_IsFromIntegration == NoYes::Yes
&& LedgerjournalTable.Posted == NoYes::No;
if(!LedgerjournalTable)
{
ttsBegin;
LedgerJournalName journalName ;
select firstonly journalName
where journalName.Name =='General Journal';
LedgerjournalTable.JournalName = 'GenJrn';//HKGMarketPlaceSetup::find(custAccount).CustPaymentJournalNameId;
ledgerjournalTable.initFromLedgerJournalName();
ledgerjournalTable.JournalType = LedgerJournalType::Daily;//Added daily journal type
ledgerjournalTable.JournalNum = JournalTableData::newTable(ledgerjournalTable).nextJournalId();
JournalTableData::newTable(LedgerjournalTable).nextJournalId();
LedgerjournalTable.AT_IsFromIntegration = NoYes::Yes;
ledgerjournalTable.insert();
ttscommit;
}
}
void createvoucher(AT_DeferralLinesImport Deferral)
{
CustInvoiceTrans custInvoiceLine;
LedgerJournalTrans ledgerJournalTrans;
NumberSeq numberSeq;
numberSeq = NumberSeq::newGetVoucherFromId(LedgerjournalName::find(ledgerjournalTable.JournalName).NumberSequenceTable);
ledgerjournalTrans.initValue();
ledgerDimension =0;
ledgerjournalTrans.Voucher = numberSeq.voucher();
voucher = ledgerjournalTrans.Voucher;
ledgerjournalTrans.JournalNum = ledgerjournalTable.JournalNum;
ledgerjournalTrans.AccountType = LedgerJournalACType::Ledger;
ledgerjournalTrans.Company = curext();
ledgerjournalTrans.TransDate = Deferral.TransactionDate; //DateTimeUtil::getSystemDate(DateTimeUtil::getUserPreferredTimeZone());//today();
if(Deferral.Type == 'Customer')
{
ledgerjournalTrans.AccountType = LedgerJournalACType::Cust;
ledgerjournalTrans.DefaultDimension = this.updateDimension(Deferral.Account);
ledgerjournalTrans.LedgerDimension = ledgerDimension;
}
else
{
ledgerjournalTrans.LedgerDimension = AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.Account);
}
// ledgerjournalTrans.parmAccount(custAccount,LedgerjournalTrans.AccountType);
// ledgerjournalTrans.DefaultDimension = CustTable::find(custAccount).DefaultDimension;
ledgerjournalTrans.AmountCurCredit = Deferral.Amount;//Commented InvoiceAmount
// ledgerjournalTrans.MarkedInvoice = _CustInvoiceJour.InvoiceId;//Added
// ledgerJournalTrans.PostingProfile = CustParameters::find().HKG_MarketPalcePostingProfile;//HKGMarketPlaceSetup::find(custAccount).CustPostingProfile;
ledgerjournalTrans.OffsetAccountType = LedgerJournalACType::Ledger;//Added
ledgerjournalTrans.OffsetLedgerDimension =AT_DeferralLinesImportService::resolveLedgerDimFromDisplay(Deferral.OffsetAccount);
// ledgerjournalTrans.OffsetLedgerDimension = LedgerJournalName::find(ledgerjournalTable.JournalName).OffsetLedgerDimension;//Added
ledgerjournalTrans.Txt = strFmt(' Deferral journal has been created against account%1',Deferral.Account);
ledgerJournalTrans.insert();
// transInsertList.add(ledgerjournalTrans);
this.updateDeferralData(Deferral, ledgerJournalTrans,custInvoiceLine);
/*
Select firstonly custtrans
where custTrans.Invoice == _CustInvoiceJour.InvoiceId;
Select firstonly custtransopen
where custTransOpen.RefRecId == custtrans.RecId
&& custTransOpen.AccountNum == custTrans.AccountNum;
if(Custtransopen.RecId)
{
manager = CustVendOpenTransManager::construct(ledgerJournalTrans);
manager.updateTransMarked(custTransOpen,true);
manager.updateSettleAmount(custTransOpen,_CustInvoiceJour.InvoiceAmount);
ledgerJournalTransSettle.data(ledgerJournalTrans);
ledgerJournalTransSettle.selectForUpdate(true);
ledgerJournalTransSettle.SettleVoucher = SettlementType::SelectedTransact;
ledgerJournalTransSettle.update();
}
*/
}
public static DimensionDynamicAccount resolveLedgerDimFromDisplay(str _displayValue)
{
LedgerAccountDimensionResolver resolver;
DimensionDynamicAccount ledgerDimension;
// Build resolver from the display string (system will parse according to account structure)
resolver = LedgerAccountDimensionResolver::newResolver(_displayValue);
// Resolve and save
ledgerDimension = resolver.resolve();
if (!ledgerDimension)
{
throw error(strFmt("Invalid account string: %1", _displayValue));
}
return ledgerDimension; // This is the LedgerDimension (RecId in DimensionAttributeValueCombination)
}
public recid updateDimension(str newValue)
{
DimensionAttributeValueSetStorage davss;
DimensionAttribute dimAttr;
DimensionAttributeValue dimValue;
container splitResult;
str mainAccount, costCenter, department, document, location, SBU, SBU1;
// Split string
splitResult = list2Con(strSplit(newValue, "-"));
mainAccount = conPeek(splitResult, 1);
costCenter = conPeek(splitResult, 2);
department = conPeek(splitResult, 3);
document = conPeek(splitResult, 4);
location = conPeek(splitResult, 5);
SBU = conPeek(splitResult, 6);
SBU1 = conPeek(splitResult, 7);
davss = new DimensionAttributeValueSetStorage();
// CostCenter
dimAttr = DimensionAttribute::findByName("CostCategory");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, costCenter, true, true);
davss.addItem(dimValue);
// Department
dimAttr = DimensionAttribute::findByName("Department");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, department, true, true);
davss.addItem(dimValue);
// Document
dimAttr = DimensionAttribute::findByName("Document_Type");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, document, true, true);
davss.addItem(dimValue);
// Location
dimAttr = DimensionAttribute::findByName("Org_Location");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, location, true, true);
davss.addItem(dimValue);
// SBU
dimAttr = DimensionAttribute::findByName("SBU");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU, true, true);
davss.addItem(dimValue);
// SBU1
dimAttr = DimensionAttribute::findByName("SBU1");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU1, true, true);
davss.addItem(dimValue);
EnumName accountTypeEnumType ='LedgerJournalACType';
DimensionAttributeValueCombination davc;
// Save and return DefaultDimension (without MainAccount)
LedgerDimensionAccount defaultDimension = davss.save();
ledgerDimension = LedgerDynamicAccountHelper::getDynamicAccountFromAccountNumberEnumModule(mainAccount, 1, enumName2Id(accountTypeEnumType), ModuleInventCustVend::Cust);
davc = DimensionAttributeValueCombination::find(ledgerDimension);
ledgerDimension =davc.RecId;
return defaultDimension;
}
public recid getDefaultDimension(str newValue)
{
DimensionAttributeValueSetStorage davss;
DimensionAttribute dimAttr;
DimensionAttributeValue dimValue;
container splitResult;
str mainAccount, costCenter, department, document, location, SBU, SBU1;
// Split string
splitResult = list2Con(strSplit(newValue, "-"));
mainAccount = conPeek(splitResult, 1);
costCenter = conPeek(splitResult, 2);
department = conPeek(splitResult, 3);
document = conPeek(splitResult, 4);
location = conPeek(splitResult, 5);
SBU = conPeek(splitResult, 6);
SBU1 = conPeek(splitResult, 7);
davss = new DimensionAttributeValueSetStorage();
// CostCenter
dimAttr = DimensionAttribute::findByName("CostCategory");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, costCenter, true, true);
davss.addItem(dimValue);
// Department
dimAttr = DimensionAttribute::findByName("Department");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, department, true, true);
davss.addItem(dimValue);
// Document
dimAttr = DimensionAttribute::findByName("Document_Type");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, document, true, true);
davss.addItem(dimValue);
// Location
dimAttr = DimensionAttribute::findByName("Org_Location");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, location, true, true);
davss.addItem(dimValue);
// SBU
dimAttr = DimensionAttribute::findByName("SBU");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU, true, true);
davss.addItem(dimValue);
// SBU1
dimAttr = DimensionAttribute::findByName("SBU1");
dimValue = DimensionAttributeValue::findByDimensionAttributeAndValue(dimAttr, SBU1, true, true);
davss.addItem(dimValue);
EnumName accountTypeEnumType ='LedgerJournalACType';
DimensionAttributeValueCombination davc;
// Save and return DefaultDimension (without MainAccount)
LedgerDimensionAccount defaultDimension = davss.save();
return defaultDimension;
}
}
For further actions, you may consider blocking this person and/or reporting abuse
Top comments (0)