See the code
/// <summary> /// The <c>LedgerJournalEntryPost</c> class creates and posts to general ledger transactions specified in /// the <c>LedgerJournalEntryContract</c> contract class. /// </summary> class LedgerJournalEntryPost extends RunBaseBatch { LedgerJournalEntryContract ledgerJournalEntryContract; LedgerJournalEntryPostStatusContract ledgerJournalEntryPostStatusContract; Set studentTransRecIdPostedSet; #IntegrationServiceFaults /// <summary> /// Checks if the Ledger journal can be posted or not. /// </summary> /// <param name="_ledgerJournalTable"> /// Record of the <c>LedgerJournalTable</c> table to verify. /// </param> /// <returns> /// True if Ledger journal can be posted; otherwise, false. /// </returns> protected boolean canPostLedgerJournal(LedgerJournalTable _ledgerJournalTable) { LedgerJournalTrans ledgerJournalTrans; VendPaymModeTable vendPaymModeTable; select firstOnly RecId from ledgerJournalTrans where ledgerJournalTrans.JournalNum == _ledgerJournalTable.JournalNum; if (!ledgerJournalTrans.RecId) { return false; } if (_ledgerJournalTable.JournalType == LedgerJournalType::Payment) { select firstOnly RecId from ledgerJournalTrans where ledgerJournalTrans.JournalNum == _ledgerJournalTable.JournalNum && ledgerJournalTrans.AccountType == LedgerJournalACType::Vend && ledgerJournalTrans.OffsetAccountType == LedgerJournalACType::Bank && (!ledgerJournalTrans.BankChequeNum || ledgerJournalTrans.PaymentStatus != CustVendPaymStatus::Sent) exists join vendPaymModeTable where vendPaymModeTable.PaymMode == ledgerJournalTrans.PaymMode && vendPaymModeTable.PaymentType == PaymentType::Check; if(ledgerJournalTrans.RecId) { return false; } } return true; } /// <summary> /// Creates a ledger journal for the specified ledger journal entry. /// </summary> /// <param name="_ledgerJourEntryLines"> /// List of <c>LedgerJournalEntryLineContract</c> contract classes. /// </param> /// <param name="_journalEntryType"> /// The type of the journal to create. /// </param> /// <returns> /// Created <c>LedgerJournalTable</c> table. /// </returns> protected LedgerJournalTable createJournal(List _ledgerJourEntryLines, JournalEntryType _journalEntryType) { LedgerJournalTable ledgerJournalTable; LedgerJournalCreate ledgerJournalCreate; LedgerJournalEntryContract entryContract; entryContract = new LedgerJournalEntryContract(); entryContract.parmLedgerJourEntryLines(_ledgerJourEntryLines); ledgerJournalCreate = LedgerJournalCreate::construct(entryContract, _journalEntryType); ledgerJournalCreate.run(); ledgerJournalTable = ledgerJournalCreate.parmLedgerJournalTable(); return ledgerJournalTable; } /// <summary> /// Finds or creates a ledger journal for the specified ledger journal entry. /// </summary> /// <param name="_ledgerJourEntryLines"> /// List of <c>LedgerJournalEntryLineContract</c> contract classes. /// </param> /// <param name="_journalEntryType"> /// The type of the journal entry. /// </param> /// <param name="_paymentType"> /// The payment type of the journal entry. /// </param> /// <returns> /// Found or created <c>LedgerJournalTable</c> table. /// </returns> protected LedgerJournalTable findOrCreateJournal(List _ledgerJourEntryLines, JournalEntryType _journalEntryType, SISPaymentType _paymentType) { LedgerJournalTable ledgerJournalTable; ledgerJournalTable = this.findRelatedJournal(_ledgerJourEntryLines, _journalEntryType, _paymentType); if (!ledgerJournalTable) { ledgerJournalTable = this.createJournal(_ledgerJourEntryLines, _journalEntryType); } return ledgerJournalTable; } /// <summary> /// Finds the ledger journal for the specified ledger journal entry. /// </summary> /// <param name="_ledgerJourEntryLines"> /// List of <c>LedgerJournalEntryLineContract</c> contract classes. /// </param> /// <param name="_journalEntryType"> /// The type of the journal entry. /// </param> /// <param name="_paymentType"> /// The payment type of the journal entry. /// </param> /// <returns> /// Found <c>LedgerJournalTable</c> table. /// </returns> protected LedgerJournalTable findRelatedJournal(List _ledgerJourEntryLines, JournalEntryType _journalEntryType, SISPaymentType _paymentType) { LedgerJournalEntryLineContract ledgerJournalEntryLineContract; ListEnumerator ledgerJourEntryLinesEnum; LedgerJournalTable ledgerJournalTable; if (StudentTrans::isBankChequeProcess(_journalEntryType, _paymentType)) { ledgerJourEntryLinesEnum = _ledgerJourEntryLines.getEnumerator(); while (ledgerJourEntryLinesEnum.moveNext()) { ledgerJournalEntryLineContract = ledgerJourEntryLinesEnum.current(); //if (ledgerJournalEntryLineContract.parmBankChequeNum()) //{ ledgerJournalTable = ledgerJournalTable.FindByStudentTransIdInSIS(ledgerJournalEntryLineContract.parmTransIdInSIS(), ledgerJournalEntryLineContract.parmJournalEntryType()); if (ledgerJournalTable) { return ledgerJournalTable; } //} } } return ledgerJournalTable; } /// <summary> /// Initializes the map of transaction types and transactions from /// the <c>LedgerJournalEntryContract</c> contract class. /// </summary> /// <returns> /// An instance of the map of transaction types and transactions. /// </returns> public Map getJournalEntryLinesMap() { List entryLineList; ListEnumerator ledgerJournalEntryLinesEnum; LedgerJournalEntryLineContract entryLineContract; container entryTypeKeyCon; int transGroupCounter; Map entryLinesMap = new Map(Types::Container, Types::Class); #define.TransGroupUniqueIdentifier("TransGroupUniqueIdentifier") ledgerJournalEntryLinesEnum = ledgerJournalEntryContract.parmLedgerJourEntryLines().getEnumerator(); while (ledgerJournalEntryLinesEnum.moveNext()) { entryLineContract = ledgerJournalEntryLinesEnum.current(); if (StudentTrans::isBankChequeProcess(entryLineContract.parmJournalEntryType(), entryLineContract.parmSISPaymentType()) && entryLineContract.parmMasterChequeGroup()) { entryTypeKeyCon = [entryLineContract.parmJournalEntryType(), entryLineContract.parmSISPaymentType(), entryLineContract.parmMasterChequeGroup()]; } else { transGroupCounter++; entryTypeKeyCon = [entryLineContract.parmJournalEntryType(), entryLineContract.parmSISPaymentType(), strFmt("%1%2", #TransGroupUniqueIdentifier, transGroupCounter)]; } if (!entryLinesMap.exists(entryTypeKeyCon)) { entryLineList = new List(Types::Class); entryLineList.addEnd(entryLineContract); entryLinesMap.insert(entryTypeKeyCon, entryLineList); } else { entryLineList = entryLinesMap.lookup(entryTypeKeyCon); entryLineList.addEnd(entryLineContract); entryLinesMap.insert(entryTypeKeyCon, entryLineList); } } return entryLinesMap; } /// <summary> /// Gets student transaction SIS Ids. /// </summary> /// <param name="_ledgerJourEntryLines"> /// List of <c>LedgerJournalEntryLineContract</c> contract classes. /// </param> /// <returns> /// Container of student transaction SIS Ids. /// </returns> protected container getStudentTransIds(List _ledgerJourEntryLines) { LedgerJournalEntryLineContract ledgerJournalEntryLineContract; container ret; ListEnumerator ledgerJournalEntryLinesEnum = _ledgerJourEntryLines.getEnumerator(); while (ledgerJournalEntryLinesEnum.moveNext()) { ledgerJournalEntryLineContract = ledgerJournalEntryLinesEnum.current(); ret += ledgerJournalEntryLineContract.parmTransIdInSIS(); } return ret; } /// <summary> /// Initializes <c>LedgerJournalEntryPostStatusContract</c> contract class. /// </summary> protected void initEntryPostStatusContract() { ledgerJournalEntryPostStatusContract = new LedgerJournalEntryPostStatusContract(); ledgerJournalEntryPostStatusContract.parmPostedJournals(new List(Types::String)); ledgerJournalEntryPostStatusContract.initializeMessages(); } public static void markPostedTrans(Map _postedTransMap) { new SISIntegrationServiceAdapter().sendPostedStudentTrans(_postedTransMap); } public void new() { super(); studentTransRecIdPostedSet = new Set(Types::Int64); } /// <summary> /// Gets or sets the value of the <c>LedgerJournalEntryContract</c> class parameter. /// </summary> /// <param name="_ledgerJournalEntryContract"> /// The new value of the <c>LedgerJournalEntryContract</c> class parameter; optional. /// </param> /// <returns> /// The current value of the <c>LedgerJournalEntryContract</c> class parameter. /// </returns> public LedgerJournalEntryContract parmLedgerJournalEntryContract(LedgerJournalEntryContract _ledgerJournalEntryContract = ledgerJournalEntryContract) { ledgerJournalEntryContract = _ledgerJournalEntryContract; return ledgerJournalEntryContract; } /// <summary> /// Gets or sets the value of the <c>LedgerJournalEntryPostStatusContract</c> class parameter. /// </summary> /// <param name="_ledgerJournalEntryPostStatusContract"> /// The new value of the <c>LedgerJournalEntryPostStatusContract</c> class parameter; optional. /// </param> /// <returns> /// The current value of the <c>LedgerJournalEntryPostStatusContract</c> class parameter. /// </returns> public LedgerJournalEntryPostStatusContract parmLedgerJournalEntryPostStatusContract(LedgerJournalEntryPostStatusContract _ledgerJournalEntryPostStatusContract = ledgerJournalEntryPostStatusContract) { ledgerJournalEntryPostStatusContract = _ledgerJournalEntryPostStatusContract; return ledgerJournalEntryPostStatusContract; } /// <summary> /// Gets or sets the value of the <c>studentTransRecIdPostedSet</c> parameter. /// </summary> /// <param name="_studentTransRecIdPostedSet"> /// The new value of the <c>studentTransRecIdPostedSet</c> parameter; optional. /// </param> /// <returns> /// The current value of the <c>studentTransRecIdPostedSet</c> parameter. /// </returns> public Set parmStudentTransRecIdPostedSet(Set _studentTransRecIdPostedSet = studentTransRecIdPostedSet) { studentTransRecIdPostedSet = _studentTransRecIdPostedSet; return studentTransRecIdPostedSet; } /// <summary> /// Posts the ledger journal. /// </summary> /// <param name="_ledgerJournalTable"> /// Ledger journal to post. /// </param> protected void postJournal(LedgerJournalTable _ledgerJournalTable) { LedgerJournalCheckPost ledgerJournalCheckPost; LedgerJournalTable ledgerJournalTable; if (!_ledgerJournalTable) { throw error("@1401"); } ledgerJournalCheckPost = LedgerJournalCheckPost::newLedgerJournalTable(_ledgerJournalTable, NoYes::Yes); if (this.canPostLedgerJournal(_ledgerJournalTable)) { ledgerJournalCheckPost.parmSkipBlockedForManualEntryCheck(true); ledgerJournalCheckPost.runOperation(); } ledgerJournalTable = ledgerJournalTable::find(_ledgerJournalTable.JournalNum); if (!ledgerJournalTable.Posted) { throw error("@1402"); } } /// <summary> /// Posts student transactions. /// </summary> /// <param name="_journalNum"> /// Ledger journal Id. /// </param> /// <param name="_ledgerJourEntryLines"> /// List of <c>LedgerJournalEntryLineContract</c> contract classes. /// </param> protected void postStudentTrans(LedgerJournalId _journalNum, List _ledgerJourEntryLines) { LedgerJournalEntryLineContract ledgerJournalEntryLineContract; StudentTrans studentTrans; container mapKey; ListEnumerator ledgerJournalEntryLinesEnum = _ledgerJourEntryLines.getEnumerator(); Map transLedgerJournalIdMap = new Map(Types::Container, Types::Class); Set journalNumSet = new Set(Types::String); journalNumSet.add(_journalNum); while (ledgerJournalEntryLinesEnum.moveNext()) { ledgerJournalEntryLineContract = ledgerJournalEntryLinesEnum.current(); mapKey = [ledgerJournalEntryLineContract.parmTransIdInSIS(), ledgerJournalEntryLineContract.parmJournalEntryType()]; transLedgerJournalIdMap.insert(mapKey, journalNumSet); studentTrans = StudentTrans::find(ledgerJournalEntryLineContract.parmTransIdInSIS(), ledgerJournalEntryLineContract.parmJournalEntryType(), true); studentTrans.Posted = true; if(studentTrans.SISPaymentType == SISPaymentType::Check) studentTrans.PendingChequeInSIS = false; if (!studentTrans.validateWrite()) { throw error("@SYS18447"); } studentTrans.updateSkipDatabaseLog(true); if (studentTrans.isValidForFundSourceTrans()) { if (FundSourceTrans::findByStudentTrans(studentTrans.RecId)) { FundSourceTrans::updateExist(studentTrans); } else { FundSourceTrans::create(studentTrans); } } if (StudentAccountingParameters::isCampusNexusMode()) { LedgerJournalEntryPost::markPostedTrans(transLedgerJournalIdMap); } studentTransRecIdPostedSet.add(studentTrans.RecId); } } /// <summary> /// Executes business logic of the class. /// </summary> public void run() { LedgerJournalTable ledgerJournalTable; JournalEntryType journalEntryType; SISPaymentType paymentType; AifInfoLog aifInfoLog; List ledgerJourEntryLines; Name groupName; boolean exceptionThrown; MapEnumerator entryLinesMapEnum; this.initEntryPostStatusContract(); entryLinesMapEnum = this.getJournalEntryLinesMap().getEnumerator(); while (entryLinesMapEnum.moveNext()) { [journalEntryType, paymentType, groupName] = entryLinesMapEnum.currentKey(); ledgerJourEntryLines = entryLinesMapEnum.currentValue(); aifInfoLog = new AifInfoLog(); try { ttsBegin; this.validateLedgerJourEntryLines(ledgerJourEntryLines); ledgerJournalTable = this.findOrCreateJournal(ledgerJourEntryLines, journalEntryType, paymentType); this.postJournal(ledgerJournalTable); this.postStudentTrans(ledgerJournalTable.JournalNum, ledgerJourEntryLines); ttsCommit; if (ledgerJournalTable.Posted) { ledgerJournalEntryPostStatusContract.parmPostedJournals().addEnd(ledgerJournalTable.JournalNum); } } catch (Exception::Error) { exceptionThrown = true; this.updateEntryPostStatus(aifInfoLog, LedgerJournalCreatePostStatus::Error, this.getStudentTransIds(ledgerJourEntryLines)); } catch (Exception::CLRError) { exceptionThrown = true; error(AifUtil::getClrErrorMessage()); this.updateEntryPostStatus(aifInfoLog, LedgerJournalCreatePostStatus::Error, this.getStudentTransIds(ledgerJourEntryLines)); } catch { exceptionThrown = true; this.updateEntryPostStatus(aifInfoLog, LedgerJournalCreatePostStatus::Error, this.getStudentTransIds(ledgerJourEntryLines)); } } if (!exceptionThrown && !ledgerJournalEntryPostStatusContract.parmPostedJournals().empty()) { ledgerJournalEntryPostStatusContract.parmStatus(LedgerJournalCreatePostStatus::Posted); } } /// <summary> /// Updates <c>LedgerJournalEntryPostStatusContract</c> contract class. /// </summary> /// <param name="_aifInfoLog"> /// An object of <c>AifInfoLog</c> class. /// </param> /// <param name="_postStatus"> /// Operation status. /// </param> /// <param name="_studentTransIdCon"> /// Container of student transaction SIS Ids. /// </param> protected void updateEntryPostStatus(AifInfoLog _aifInfoLog, LedgerJournalCreatePostStatus _postStatus, container _studentTransIdCon) { SysInfologEnumerator infologEnum; if (!ledgerJournalEntryPostStatusContract) { this.initEntryPostStatusContract(); } ledgerJournalEntryPostStatusContract.parmStatus(_postStatus); AifFault::fault(strFmt("@1403", "@141", con2str(_studentTransIdCon, ', ')), #LedgerJournalTableCreationFailed); infologEnum = SysInfologEnumerator::newData(_aifInfoLog.getInfoLogData()); while (infologEnum.moveNext()) { ledgerJournalEntryPostStatusContract.addMessage(IntegrationServiceProvider::trimLeadingTabs(infologEnum.currentMessage())); } } /// <summary> /// Validates ledger journal entry lines. /// </summary> /// <param name="_ledgerJourEntryLines"> /// List of <c>LedgerJournalEntryLineContract</c> contract classes. /// </param> protected void validateLedgerJourEntryLines(List _ledgerJourEntryLines) { LedgerJournalEntryLineContract ledgerJournalEntryLineContract; StudentTrans studentTrans; ListEnumerator ledgerJournalEntryLinesEnum = _ledgerJourEntryLines.getEnumerator(); while (ledgerJournalEntryLinesEnum.moveNext()) { ledgerJournalEntryLineContract = ledgerJournalEntryLinesEnum.current(); studentTrans = StudentTrans::find(ledgerJournalEntryLineContract.parmTransIdInSIS(), ledgerJournalEntryLineContract.parmJournalEntryType()); if (studentTrans.Posted) { throw error(strfmt("@1399", studentTrans.description())); } if (StudentTrans::isBankChequeProcess(studentTrans.JournalEntryType, studentTrans.SISPaymentType) && !studentTrans.BankChequeNum) { throw error(strFmt("@1400", studentTrans.description())); } } } /// <summary> /// Creates a new instance of the <c>LedgerJournalEntryPost</c> class. /// </summary> /// <param name="_ledgerJournalEntryContract"> /// Value of the <c>LedgerJournalEntryContract</c> contract class. /// </param> /// <returns> /// Created instance of the <c>LedgerJournalEntryPost</c> class. /// </returns> public static server LedgerJournalEntryPost construct(LedgerJournalEntryContract _ledgerJournalEntryContract) { LedgerJournalEntryPost ledgerJournalEntryPost = new LedgerJournalEntryPost(); ledgerJournalEntryPost.parmLedgerJournalEntryContract(_ledgerJournalEntryContract); return ledgerJournalEntryPost; } /// <summary> /// Creates an object of <c>LedgerJournalEntryContract</c> contract class. /// </summary> /// <param name="_studentTransRecIdPacked"> /// Packed set of <c>StudentTrans</c> record Ids. /// </param> /// <returns> /// An object of <c>LedgerJournalEntryContract</c> contract class. /// </returns> public static server LedgerJournalEntryContract createJournalEntryContractList(container _studentTransRecIdPacked) { StudentTrans studentTrans; StudentTrans studentTransMasterCheque; LedgerJournalEntryContract ledgerJournalEntryContract = new LedgerJournalEntryContract(); Set masterChequeGroup = new Set(Types::String); Set studentTransRecIdSet = Set::create(_studentTransRecIdPacked); SetEnumerator se = studentTransRecIdSet.getEnumerator(); ledgerJournalEntryContract.parmLedgerJourEntryLines(new List(Types::Class)); while (se.moveNext()) { studentTrans = StudentTrans::findRecId(se.current()); if (studentTrans.MasterChequeGroup && !masterChequeGroup.in(studentTrans.MasterChequeGroup)) { masterChequeGroup.add(studentTrans.MasterChequeGroup); while select studentTransMasterCheque where studentTransMasterCheque.MasterChequeGroup == studentTrans.MasterChequeGroup { ledgerJournalEntryContract.parmLedgerJourEntryLines().addEnd(studentTransMasterCheque.ledgerJournalEntryLineContract()); } } else if (!studentTrans.MasterChequeGroup) { ledgerJournalEntryContract.parmLedgerJourEntryLines().addEnd(studentTrans.ledgerJournalEntryLineContract()); } } return ledgerJournalEntryContract; } /// <summary> /// Performs transaction posting from user interface. /// </summary> /// <param name="_args"> /// Parameters object. /// </param> public static void main(Args _args) { LedgerJournalEntryPost ledgerJournalEntryPost; StudentTrans studentTrans; FormDataSource ds; Set studentTransRecIdSet = new Set(Types::Int64); if (!_args || !_args.dataset()) { throw Error(Error::wrongUseOfFunction(funcName())); } if (FormDataUtil::isFormDataSource(_args.record())) { ds = FormDataUtil::getFormDataSource(_args.record()); studentTrans = ds.getFirst(true) ? ds.getFirst(true) : ds.cursor(); while (studentTrans) { studentTransRecIdSet.add(studentTrans.RecId); studentTrans = ds.getNext(); } } else { studentTrans = _args.record(); studentTransRecIdSet.add(studentTrans.RecId); } ledgerJournalEntryPost = LedgerJournalEntryPost::newFromLedgerJournalEntryContract(LedgerJournalEntryPost::createJournalEntryContractList(studentTransRecIdSet.pack())); ledgerJournalEntryPost.runOperation(); info(strFmt("@561", ledgerJournalEntryPost.parmStudentTransRecIdPostedSet().elements())); if (ds) { ds.research(true); } } /// <summary> /// Creates a new instance of the <c>LedgerJournalEntryPost</c> class and initilizes its parameters. /// </summary> /// <param name="_ledgerJournalEntryContract"> /// Value of the <c>LedgerJournalEntryContract</c> contract class. /// </param> /// <returns> /// Created instance of the <c>LedgerJournalEntryPost</c> class. /// </returns> public static server LedgerJournalEntryPost newFromLedgerJournalEntryContract(LedgerJournalEntryContract _ledgerJournalEntryContract) { LedgerJournalEntryPost ledgerJournalEntryPost = new LedgerJournalEntryPost(); LedgerJournalEntryPost::validateLedgerJournalEntryContract(_ledgerJournalEntryContract); ledgerJournalEntryPost.parmLedgerJournalEntryContract(_ledgerJournalEntryContract); return ledgerJournalEntryPost; } /// <summary> /// Validates the <c>LedgerJournalEntryContract</c> contract class. /// </summary> /// <param name="_ledgerJournalEntryContract"> /// An instance of the <c>LedgerJournalEntryContract</c> contract class. /// </param> public static void validateLedgerJournalEntryContract(LedgerJournalEntryContract _ledgerJournalEntryContract) { if (!_ledgerJournalEntryContract) { throw error(strFmt("@35", classStr(LedgerJournalEntryContract))); } if (!_ledgerJournalEntryContract.parmLedgerJourEntryLines() || _ledgerJournalEntryContract.parmLedgerJourEntryLines().empty()) { throw error("@36"); } } protected boolean canRunInNewSession() { return false; } }
No comments:
Post a Comment