/// <summary> /// Request tan medium name /// </summary> /// <param name="connectionDetails">ConnectionDetails object must atleast contain the fields: Url, HBCIVersion, UserId, Pin, Blz</param> /// <returns> /// TAN Medium Name /// </returns> public async Task <HBCIDialogResult <List <string> > > RequestTANMediumName() { HKTAN.SegmentId = "HKTAB"; HBCIDialogResult result = await InitializeConnection(); if (!result.IsSuccess) { return(result.TypedResult <List <string> >()); } // Should not be needed when processing HKTAB //result = ProcessSCA(connectionDetails, result, tanDialog); //if (!result.IsSuccess) // return result.TypedResult<List<string>>(); string BankCode = await Transaction.HKTAB(this); result = new HBCIDialogResult <List <string> >(Helper.Parse_BankCode(BankCode), BankCode); if (!result.IsSuccess) { return(result.TypedResult <List <string> >()); } // Should not be needed when processing HKTAB //result = ProcessSCA(connectionDetails, result, tanDialog); //if (!result.IsSuccess) // return result.TypedResult<List<string>>(); BankCode = result.RawData; string BankCode_ = "HITAB" + Helper.Parse_String(BankCode, "'HITAB", "'"); return(result.TypedResult(Helper.Parse_TANMedium(BankCode_))); }
/// <summary> /// Account balance /// </summary> /// <param name="tanDialog">The TAN Dialog</param> /// <returns>The balance for this account</returns> public async Task <HBCIDialogResult <AccountBalance> > Balance(TANDialog tanDialog) { HBCIDialogResult result = await InitializeConnection(); if (!result.IsSuccess) { return(result.TypedResult <AccountBalance>()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <AccountBalance>()); } // Success string BankCode = await Transaction.HKSAL(this); result = new HBCIDialogResult(Helper.Parse_BankCode(BankCode), BankCode); if (!result.IsSuccess) { return(result.TypedResult <AccountBalance>()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <AccountBalance>()); } BankCode = result.RawData; AccountBalance balance = Helper.Parse_Balance(BankCode); return(result.TypedResult(balance)); }
/// <summary> /// Get terminated transfers /// </summary> /// <returns> /// Banker's orders /// </returns> public async Task <HBCIDialogResult <List <TerminatedTransfer> > > GetTerminatedTransfers(TANDialog tanDialog) { var result = await InitializeConnection(); if (!result.IsSuccess) { return(result.TypedResult <List <TerminatedTransfer> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <TerminatedTransfer> >()); } // Success string BankCode = await Transaction.HKCSB(this); result = new HBCIDialogResult(Helper.Parse_BankCode(BankCode), BankCode); if (!result.IsSuccess) { return(result.TypedResult <List <TerminatedTransfer> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <TerminatedTransfer> >()); } BankCode = result.RawData; int startIdx = BankCode.IndexOf("HICSB"); if (startIdx < 0) { return(result.TypedResult <List <TerminatedTransfer> >()); } var data = new List <TerminatedTransfer>(); string BankCode_ = BankCode.Substring(startIdx); for (; ;) { var match = Regex.Match(BankCode_, @"HICSB.+?(?<xml><\?xml.+?</Document>)\+(?<orderid>.*?)(\+(?<deleteable>j|n))?(\+(?<modifiable>j|n))?'", RegexOptions.Singleline | RegexOptions.IgnoreCase); if (match.Success) { string xml = match.Groups["xml"].Value; // xml ist UTF-8 xml = Converter.ConvertEncoding(xml, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8); string orderId = match.Groups["orderid"].Value; bool? deleteable = null; if (match.Groups["deleteable"].Success) { deleteable = match.Groups["deleteable"].Value.Equals("j", StringComparison.OrdinalIgnoreCase) ? true : false; } bool?modifiable = null; if (match.Groups["modifiable"].Success) { modifiable = match.Groups["modifiable"].Value.Equals("j", StringComparison.OrdinalIgnoreCase) ? true : false; } var painData = Pain00100103CtData.Create(xml); var item = new TerminatedTransfer(orderId, deleteable, modifiable, painData); data.Add(item); } int endIdx = BankCode_.IndexOf("'"); if (BankCode_.Length <= endIdx + 1) { break; } BankCode_ = BankCode_.Substring(endIdx + 1); startIdx = BankCode_.IndexOf("HICSB"); if (startIdx < 0) { break; } } // Success return(result.TypedResult(data)); }
/// <summary> /// Get banker's orders /// </summary> /// <param name="tanDialog">The TAN dialog</param> /// <returns> /// Banker's orders /// </returns> public async Task <HBCIDialogResult <List <BankersOrder> > > GetBankersOrders(TANDialog tanDialog) { var result = await InitializeConnection(); if (!result.IsSuccess) { return(result.TypedResult <List <BankersOrder> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <BankersOrder> >()); } // Success string BankCode = await Transaction.HKCDB(this); result = new HBCIDialogResult(Helper.Parse_BankCode(BankCode), BankCode); if (!result.IsSuccess) { return(result.TypedResult <List <BankersOrder> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <BankersOrder> >()); } BankCode = result.RawData; int startIdx = BankCode.IndexOf("HICDB"); if (startIdx < 0) { return(result.TypedResult <List <BankersOrder> >()); } var data = new List <BankersOrder>(); string BankCode_ = BankCode.Substring(startIdx); for (; ;) { var match = Regex.Match(BankCode_, @"HICDB.+?(?<xml><\?xml.+?</Document>)\+(?<orderid>.*?)\+(?<firstdate>\d*):(?<turnus>[MW]):(?<rota>\d+):(?<execday>\d+)(:(?<lastdate>\d+))?", RegexOptions.Singleline); if (match.Success) { string xml = match.Groups["xml"].Value; // xml ist UTF-8 xml = Converter.ConvertEncoding(xml, Encoding.GetEncoding("ISO-8859-1"), Encoding.UTF8); string orderId = match.Groups["orderid"].Value; string firstExecutionDateStr = match.Groups["firstdate"].Value; var firstExecutionDate = !string.IsNullOrWhiteSpace(firstExecutionDateStr) ? DateTime.ParseExact(firstExecutionDateStr, "yyyyMMdd", CultureInfo.InvariantCulture) : default(DateTime?); string timeUnitStr = match.Groups["turnus"].Value; var timeUnit = timeUnitStr == "M" ? TimeUnit.Monthly : TimeUnit.Weekly; string rota = match.Groups["rota"].Value; string executionDayStr = match.Groups["execday"].Value; int executionDay = Convert.ToInt32(executionDayStr); string lastExecutionDateStr = match.Groups["lastdate"].Value; var lastExecutionDate = !string.IsNullOrWhiteSpace(lastExecutionDateStr) ? DateTime.ParseExact(lastExecutionDateStr, "yyyyMMdd", CultureInfo.InvariantCulture) : default(DateTime?); var painData = Pain00100103CtData.Create(xml); if (firstExecutionDate.HasValue && executionDay > 0) { var item = new BankersOrder(orderId, painData, firstExecutionDate.Value, timeUnit, rota, executionDay, lastExecutionDate); data.Add(item); } } int endIdx = BankCode_.IndexOf("'"); if (BankCode_.Length <= endIdx + 1) { break; } BankCode_ = BankCode_.Substring(endIdx + 1); startIdx = BankCode_.IndexOf("HICDB"); if (startIdx < 0) { break; } } // Success return(result.TypedResult(data)); }
/// <summary> /// Account transactions in SWIFT-format /// </summary> /// <param name="connectionDetails">ConnectionDetails object must atleast contain the fields: Url, HBCIVersion, UserId, Pin, Blz, Account, IBAN, BIC</param> /// <param name="anonymous"></param> /// <param name="startDate"></param> /// <param name="endDate"></param> /// <returns> /// Transactions /// </returns> public async Task <HBCIDialogResult <List <SwiftStatement> > > Transactions(TANDialog tanDialog, DateTime?startDate = null, DateTime?endDate = null, bool saveMt940File = false) { var result = await InitializeConnection(); if (!result.IsSuccess) { return(result.TypedResult <List <SwiftStatement> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <SwiftStatement> >()); } string startDateStr = startDate?.ToString("yyyyMMdd"); string endDateStr = endDate?.ToString("yyyyMMdd"); // Success string BankCode = await Transaction.HKKAZ(this, startDateStr, endDateStr, null); result = new HBCIDialogResult(Helper.Parse_BankCode(BankCode), BankCode); if (!result.IsSuccess) { return(result.TypedResult <List <SwiftStatement> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <SwiftStatement> >()); } BankCode = result.RawData; var TransactionsMt940 = new StringBuilder(); var TransactionsMt942 = new StringBuilder(); Regex regex = new Regex(@"HIKAZ:.+?@\d+@(?<mt940>.+?)(\+@\d+@(?<mt942>.+?))?('{1,2}H[A-Z]{4}:\d+:\d+)", RegexOptions.Singleline); Match match = regex.Match(BankCode); if (match.Success) { TransactionsMt940.Append(match.Groups["mt940"].Value); TransactionsMt942.Append(match.Groups["mt942"].Value); } string BankCode_ = BankCode; while (BankCode_.Contains("+3040::")) { Helper.Parse_Message(this, BankCode_); string Startpoint = new Regex(@"\+3040::[^:]+:(?<startpoint>[^']+)'").Match(BankCode_).Groups["startpoint"].Value; BankCode_ = await Transaction.HKKAZ(this, startDateStr, endDateStr, Startpoint); result = new HBCIDialogResult(Helper.Parse_BankCode(BankCode_), BankCode_); if (!result.IsSuccess) { return(result.TypedResult <List <SwiftStatement> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <SwiftStatement> >()); } BankCode_ = result.RawData; match = regex.Match(BankCode_); if (match.Success) { TransactionsMt940.Append(match.Groups["mt940"].Value); TransactionsMt942.Append(match.Groups["mt942"].Value); } } var swiftStatements = new List <SwiftStatement>(); swiftStatements.AddRange(MT940.Serialize(TransactionsMt940.ToString(), ConnectionDetails.Account, saveMt940File)); swiftStatements.AddRange(MT940.Serialize(TransactionsMt942.ToString(), ConnectionDetails.Account, saveMt940File, true)); return(result.TypedResult(swiftStatements)); }
/// <summary> /// Account transactions in camt format /// </summary> /// <param name="startDate"></param> /// <param name="endDate"></param> /// <returns> /// Transactions /// </returns> public async Task <HBCIDialogResult <List <CamtStatement> > > Transactions_camt(TANDialog tanDialog, CamtVersion camtVers, DateTime?startDate = null, DateTime?endDate = null, bool saveCamtFile = false) { var result = await InitializeConnection(); if (!result.IsSuccess) { return(result.TypedResult <List <CamtStatement> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <CamtStatement> >()); } // Plain camt message string camt = string.Empty; string startDateStr = startDate?.ToString("yyyyMMdd"); string endDateStr = endDate?.ToString("yyyyMMdd"); // Success string BankCode = await Transaction.HKCAZ(this, startDateStr, endDateStr, null, camtVers); result = new HBCIDialogResult <List <CamtStatement> >(Helper.Parse_BankCode(BankCode), BankCode); if (!result.IsSuccess) { return(result.TypedResult <List <CamtStatement> >()); } result = await ProcessSCA(result, tanDialog); if (!result.IsSuccess) { return(result.TypedResult <List <CamtStatement> >()); } BankCode = result.RawData; var statements = new List <CamtStatement>(); Camt052Parser camt052Parser = null; Camt053Parser camt053Parser = null; var encoding = Encoding.GetEncoding("ISO-8859-1"); string BankCode_ = BankCode; // Es kann sein, dass in der payload mehrere Dokumente enthalten sind int xmlStartIdx = BankCode_.IndexOf("<?xml version="); int xmlEndIdx = BankCode_.IndexOf("</Document>") + "</Document>".Length; while (xmlStartIdx >= 0) { if (xmlStartIdx > xmlEndIdx) { break; } camt = "<?xml version=" + Helper.Parse_String(BankCode_, "<?xml version=", "</Document>") + "</Document>"; switch (camtVers) { case CamtVersion.Camt052: if (camt052Parser == null) { camt052Parser = new Camt052Parser(); } if (saveCamtFile) { // Save camt052 statement to file string camt052f = Camt052File.Save(ConnectionDetails.Account, camt, encoding); // Process the camt052 file camt052Parser.ProcessFile(camt052f); } else { camt052Parser.ProcessDocument(camt, encoding); } statements.AddRange(camt052Parser.statements); break; case CamtVersion.Camt053: if (camt053Parser == null) { camt053Parser = new Camt053Parser(); } if (saveCamtFile) { // Save camt053 statement to file string camt053f = Camt053File.Save(ConnectionDetails.Account, camt, encoding); // Process the camt053 file camt053Parser.ProcessFile(camt053f); } else { camt053Parser.ProcessDocument(camt, encoding); } statements.AddRange(camt053Parser.statements); break; } BankCode_ = BankCode_.Substring(xmlEndIdx); xmlStartIdx = BankCode_.IndexOf("<?xml version"); xmlEndIdx = BankCode_.IndexOf("</Document>") + "</Document>".Length; } BankCode_ = BankCode; while (BankCode_.Contains("+3040::")) { string Startpoint = new Regex(@"\+3040::[^:]+:(?<startpoint>[^']+)'").Match(BankCode_).Groups["startpoint"].Value; BankCode_ = await Transaction.HKCAZ(this, startDateStr, endDateStr, Startpoint, camtVers); result = new HBCIDialogResult <List <CamtStatement> >(Helper.Parse_BankCode(BankCode_), BankCode_); if (!result.IsSuccess) { return(result.TypedResult <List <CamtStatement> >()); } BankCode_ = result.RawData; // Es kann sein, dass in der payload mehrere Dokumente enthalten sind xmlStartIdx = BankCode_.IndexOf("<?xml version="); xmlEndIdx = BankCode_.IndexOf("</Document>") + "</Document>".Length; while (xmlStartIdx >= 0) { if (xmlStartIdx > xmlEndIdx) { break; } camt = "<?xml version=" + Helper.Parse_String(BankCode_, "<?xml version=", "</Document>") + "</Document>"; switch (camtVers) { case CamtVersion.Camt052: // Save camt052 statement to file string camt052f_ = Camt052File.Save(ConnectionDetails.Account, camt); // Process the camt052 file camt052Parser.ProcessFile(camt052f_); // Add all items statements.AddRange(camt052Parser.statements); break; case CamtVersion.Camt053: // Save camt053 statement to file string camt053f_ = Camt053File.Save(ConnectionDetails.Account, camt); // Process the camt053 file camt053Parser.ProcessFile(camt053f_); // Add all items to existing statement statements.AddRange(camt053Parser.statements); break; } BankCode_ = BankCode_.Substring(xmlEndIdx); xmlStartIdx = BankCode_.IndexOf("<?xml version"); xmlEndIdx = BankCode_.IndexOf("</Document>") + "</Document>".Length; } } return(result.TypedResult(statements)); }