Example #1
0
        /// <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()
        {
            HBCIDialogResult result = await InitializeConnection("HKTAB");

            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_)));
        }
Example #2
0
        /// <summary>
        /// Account balance
        /// </summary>
        /// <param name="tanDialog">The TAN Dialog</param>
        /// <returns>The balance for this account</returns>
        public async Task <HBCIDialogResult <AccountBalance> > Balance(TanRequest tanDialog)
        {
            HBCIDialogResult result = await InitializeConnection();

            if (result.HasError)
            {
                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.HasError)
            {
                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));
        }
Example #3
0
        /// <summary>
        /// Get terminated transfers
        /// </summary>
        /// <returns>
        /// Banker's orders
        /// </returns>
        public async Task <HBCIDialogResult <List <TerminatedTransfer> > > GetTerminatedTransfers(TanRequest tanDialog)
        {
            var result = await InitializeConnection();

            if (result.HasError)
            {
                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.HasError)
            {
                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));
        }
Example #4
0
        /// <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(TanRequest tanDialog, DateTime?startDate = null, DateTime?endDate = null, bool saveMt940File = false)
        {
            var result = await InitializeConnection();

            if (result.HasError)
            {
                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.HasError)
            {
                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.HasError)
                {
                    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));
        }
Example #5
0
        /// <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(TanRequest 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.HasError)
            {
                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.HasError)
            {
                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));
        }
Example #6
0
        /// <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));
        }