public static BankStatementFileImport construct(BankStatementFormat _importFormat) { BankStatementFileImport fileImport; // MOD BEGIN if (_importFormat.VKIsG4S) { fileImport = new VKBankStatementFileImportG4S(); } else { fileImport = new BankStatementFileImport(); } // MOD END fileImport.parmImportFormat(_importFormat); return fileImport; }Main import VKBankStatementFileImportG4S class:
class VKBankStatementFileImportG4S extends BankStatementFileImport { BankStmtISODocument bankStmtISODocument; BankStmtISOAccountStatement accountStatement; List transList; UtcDateTime fromDateTime; } protected utcDateTime convertDate(str _date, str _format) { utcDateTime ret; System.Globalization.CultureInfo culture = System.Globalization.CultureInfo::get_InvariantCulture(); try { ret = System.DateTime::ParseExact(_date, _format, culture); } catch { // do nothing } return ret; } protected void doImport() { // standard classes use AIF, so we need to at least initialize importResults importResults = new AifImportResults(); this.readFile(); this.processData(); } protected BankStmtISODocument getImportBankDocument() { if (!bankStmtISODocument) { // An error occurred while importing data. throw error("@SYS96977"); } return bankStmtISODocument; } protected void importHeader() { BankStmtISOGroupHeader bankStmtISOGroupHeader; BankStmtISOCashBalance cashBalance; accountStatement.clear(); bankStmtISODocument.clear(); bankStmtISOGroupHeader.clear(); bankStmtISOGroupHeader.initValue(); bankStmtISOGroupHeader.MessageIdentification = NumberSeq::newGetNum(BankParameters::numRefBankStatementDownloadId(), true).num(); bankStmtISOGroupHeader.CreationDateTime = DateTimeUtil::getSystemDateTime(); bankStmtISOGroupHeader.insert(); bankStmtISODocument.initValue(); bankStmtISODocument.FormatName = importFormat.FormatId; bankStmtISODocument.GroupHeader = bankStmtISOGroupHeader.RecId; bankStmtISODocument.insert(); accountStatement.initValue(); accountStatement.BankStmtISODocument = bankStmtISODocument.RecId; accountStatement.Identification = NumberSeq::newGetNum(BankParameters::numRefBankStatementId(), true).num(); accountStatement.AccountCurrency = CompanyInfo::standardCurrency(); accountStatement.BankStatementType = BankStatementType::Reconciliation; accountStatement.TotalEntriesNumberOfEntries = transList.elements(); if (fromDateTime) { accountStatement.FromDateTime = fromDateTime; } accountStatement.insert(); cashBalance.clear(); cashBalance.initValue(); cashBalance.BankStmtISOAccountStatement = accountStatement.RecId; cashBalance.BankStatementBalanceType = BankStatementBalanceType::Opening; cashBalance.insert(); cashBalance.clear(); cashBalance.initValue(); cashBalance.BankStmtISOAccountStatement = accountStatement.RecId; cashBalance.BankStatementBalanceType = BankStatementBalanceType::Closing; cashBalance.insert(); cashBalance.clear(); cashBalance.initValue(); cashBalance.BankStmtISOAccountStatement = accountStatement.RecId; cashBalance.BankStatementBalanceType = BankStatementBalanceType::NetAmount; cashBalance.insert(); } public void new() { transList = new List(Types::Class); super(); } protected void processData() { ListIterator li; VKStatementTransContract contract; BankStmtISOReportEntry reportEntry; if (transList.elements()) { this.importHeader(); li = new ListIterator(transList); while (li.more()) { contract = li.value(); reportEntry.clear(); reportEntry.initValue(); if (DebitCredit::Credit == contract.parmDebitCredit()) { reportEntry.editCreditAmount(true, contract.parmAmount()); } else { reportEntry.editDebitAmount(true, contract.parmAmount()); } reportEntry.BankStmtISOAccountStatement = accountStatement.RecId; reportEntry.BookingDateTime = contract.parmBookingDateTime(); reportEntry.AdditionalEntryInformation = contract.parmDescription(); reportEntry.ReferenceNumber = contract.parmReferenceNumber(); reportEntry.insert(); li.next(); } } else { throw error("Transactions not found."); } } protected void readFile() { #File #define.Credits('CR') #define.Debits('DR') #define.FromDate('From Date:') #define.DateCredited('Date Credited') #define.DateDebited('Date Debited') Io io; container recordCon; str recordType; date transDate; str fromDateStr = '', amountStr, transactionType; boolean transactionBegin = false; int fromDateLen = strLen(#FromDate); VKStatementTransContract contract; BankStmtISOMax500Text description; BankStmtISOMax500Text referenceNumber; Amount amount; BankStatementBookingDate bookingDateTime; io = new CommaTextIo(initialFile, #IO_Read); if(!io || io.status() != IO_Status::Ok) { throw error("@SYS19358"); } while (io.status() == IO_Status::Ok) { recordCon = io.read(); if (recordCon) { transactionType = ''; recordType = conPeek(recordCon, 2); if (conLen(recordCon) > 26) { transactionType = conPeek(recordCon, 7); if (transactionType && transactionType != #Credits && transactionType != #Debits) { transactionType = ''; } } if (!recordType) { transactionBegin = false; continue; } if (recordType == #DateCredited || recordType == #DateDebited) { transactionBegin = true; continue; } if (!fromDateStr && #FromDate == subStr(recordType, 0, fromDateLen)) { fromDateStr = subStr(recordType, fromDateLen + 1, strLen(recordType) - fromDateLen); fromDateStr = strLTrim(fromDateStr); fromDateTime= this.convertDate(fromDateStr, 'dd MMM yyyy'); if (!fromDateTime) { fromDateTime= this.convertDate(fromDateStr, 'd MMM yyyy'); } continue; } if (transactionType) { transDate = str2DateDMY(strReplace(recordType, '/', '')); description = conPeek(recordCon, 4); referenceNumber = conPeek(recordCon, 9); amountStr = conPeek(recordCon, 26); bookingDateTime = DateTimeUtil::newDateTime(transDate, 0, DateTimeUtil::getCompanyTimeZone()); amountStr = strRem(amountStr, '£,'); amount = str2num(amountStr); contract = VKStatementTransContract::construct(); contract.parmAmount(amount); contract.parmBookingDateTime(bookingDateTime); contract.parmDebitCredit((transactionType == #Credits) ? DebitCredit::Credit : DebitCredit::Debit); contract.parmDescription(description); contract.parmReferenceNumber(referenceNumber); transList.addEnd(contract); } } } }
class VKStatementTransContract { DebitCredit debitCredit; Amount amount; BankStatementBookingDate bookingDateTime; BankStmtISOMax500Text referenceNumber; BankStmtISOMax500Text description; } public Amount parmAmount(Amount _amount = 0) { if (!prmisDefault(_amount)) { amount = _amount; } return amount; } public BankStatementBookingDate parmBookingDateTime(BankStatementBookingDate _bookingDateTime = DateTimeUtil::minValue()) { if (!prmisDefault(_bookingDateTime)) { bookingDateTime = _bookingDateTime; } return bookingDateTime; } public DebitCredit parmDebitCredit(DebitCredit _debitCredit = DebitCredit::Credit) { if (!prmisDefault(_debitCredit)) { debitCredit = _debitCredit; } return debitCredit; } public BankStmtISOMax500Text parmDescription(BankStmtISOMax500Text _description = '') { if (!prmisDefault(_description)) { description = _description; } return description; } public BankStmtISOMax500Text parmReferenceNumber(BankStmtISOMax500Text _referenceNumber = '') { if (!prmisDefault(_referenceNumber)) { referenceNumber = _referenceNumber; } return referenceNumber; } static public VKStatementTransContract construct() { return new VKStatementTransContract(); }
DaxOnline.org is free platform that allows you to quickly store and reuse snippets, notes, articles related to Dynamics AX.
Authors are allowed to set their own AdSense units and "buy me a coffee" link.
Join us.