Esempio n. 1
0
        /// <summary>
        /// Parsing segment -> UPD, BPD
        /// </summary>
        /// <param name="UserID"></param>
        /// <param name="BLZ"></param>
        /// <param name="HBCIVersion"></param>
        /// <param name="Message"></param>
        /// <returns></returns>
        public static List <HBCIBankMessage> Parse_Segment(FinTsClient client, string Message)
        {
            try
            {
                var connDetails = client.ConnectionDetails;
                List <HBCIBankMessage> result = new List <HBCIBankMessage>();

                string[] values = Message.Split('\'');

                string msg = string.Join(Environment.NewLine, values);

                string bpd = string.Empty;
                string upd = string.Empty;

                var bpaMatch = Regex.Match(msg, @"(HIBPA.+?)\b(HNHBS|HISYN|HIUPA)\b", RegexOptions.Singleline);
                if (bpaMatch.Success)
                {
                    bpd = bpaMatch.Groups[1].Value;
                }

                var upaMatch = Regex.Match(msg, @"(HIUPA.+?)\b(HITAN|HNHBS)\b", RegexOptions.Singleline);
                if (upaMatch.Success)
                {
                    upd = upaMatch.Groups[1].Value;
                }

                // BPD
                SaveBPD(connDetails.Blz, bpd);
                BPD.ParseBpd(bpd);

                // UPD
                SaveUPD(connDetails.Blz, connDetails.UserId, upd);
                UPD.ParseUpd(upd);

                foreach (var item in values)
                {
                    if (item.Contains("HIRMG"))
                    {
                        // HIRMG:2:2+9050::Die Nachricht enthält Fehler.+9800::Dialog abgebrochen+9010::Initialisierung fehlgeschlagen, Auftrag nicht bearbeitet.
                        // HIRMG:2:2+9800::Dialogabbruch.

                        string[] HIRMG_messages = item.Split('+');
                        foreach (var HIRMG_message in HIRMG_messages)
                        {
                            var message = Parse_BankCode_Message(HIRMG_message);
                            if (message != null)
                            {
                                result.Add(message);
                            }
                        }
                    }

                    if (item.Contains("HIRMS"))
                    {
                        // HIRMS:3:2:2+9942::PIN falsch. Zugang gesperrt.'
                        string[] HIRMS_messages = item.Split('+');
                        foreach (var HIRMS_message in HIRMS_messages)
                        {
                            var message = Parse_BankCode_Message(HIRMS_message);
                            if (message != null)
                            {
                                result.Add(message);
                            }
                        }

                        var securityMessage = result.FirstOrDefault(m => m.Code == "3920");
                        if (securityMessage != null)
                        {
                            string message = securityMessage.Message;

                            string TAN  = string.Empty;
                            string TANf = string.Empty;

                            string[] procedures = Regex.Split(message, @"\D+");

                            foreach (string value in procedures)
                            {
                                if (!string.IsNullOrEmpty(value) && int.TryParse(value, out int i))
                                {
                                    if (Convert.ToString(i).StartsWith("9"))
                                    {
                                        if (string.IsNullOrEmpty(TAN))
                                        {
                                            TAN = i.ToString();
                                        }

                                        if (string.IsNullOrEmpty(TANf))
                                        {
                                            TANf = i.ToString();
                                        }
                                        else
                                        {
                                            TANf += $";{i}";
                                        }
                                    }
                                }
                            }
                            if (string.IsNullOrEmpty(client.HIRMS))
                            {
                                client.HIRMS = TAN;
                            }
                            else
                            {
                                if (!TANf.Contains(client.HIRMS))
                                {
                                    throw new Exception($"Invalid HIRMS/Tan-Mode {client.HIRMS} detected. Please choose one of the allowed modes: {TANf}");
                                }
                            }
                            client.HIRMSf = TANf;

                            // Parsing TAN processes
                            if (!string.IsNullOrEmpty(client.HIRMS))
                            {
                                Parse_TANProcesses(client, bpd);
                            }
                        }
                    }

                    if (item.Contains("HNHBK"))
                    {
                        var ID = Parse_String(item.ToString(), "+1+", ":1");
                        client.HNHBK = ID;
                    }

                    if (item.Contains("HISYN"))
                    {
                        var ID = item.Substring(item.IndexOf("+") + 1);
                        client.SystemId = ID;

                        Log.Write("Customer System ID: " + ID);
                    }

                    if (item.Contains("HNHBS"))
                    {
                        var item_ = item + "'";

                        var MSG = Parse_String(item_.Replace("HNHBS:", ""), "+", "'");

                        if (MSG.Equals("0") || MSG == null)
                        {
                            client.HNHBS = "2";
                        }
                        else
                        {
                            client.HNHBS = Convert.ToString(Convert.ToInt16(MSG) + 1);
                        }
                    }

                    if (item.Contains("HISALS"))
                    {
                        var SEG = Parse_String(item.Replace("HISALS:", ""), ":", ":");

                        client.HISALS = SEG;

                        client.HISALSf = item;
                    }

                    if (item.Contains("HITANS"))
                    {
                        var TAN = Parse_String(item.Replace("HITANS:", ""), ":", "+").Replace(":", "+");

                        client.HITANS = TAN;
                    }

                    if (item.Contains("HKKAZ"))
                    {
                        string pattern  = @"HKKAZ;.*?;";
                        Regex  rgx      = new Regex(pattern);
                        string sentence = item;

                        foreach (Match match in rgx.Matches(sentence))
                        {
                            var VER = Parse_String(match.Value, "HKKAZ;", ";");

                            if (string.IsNullOrEmpty(client.HKKAZ))
                            {
                                client.HKKAZ = VER;
                            }
                            else
                            {
                                if (int.Parse(VER) > int.Parse(client.HKKAZ))
                                {
                                    client.HKKAZ = VER;
                                }
                            }
                        }
                    }

                    if (item.Contains("HISPAS"))
                    {
                        if (item.Contains("pain.001.001.03"))
                        {
                            client.HISPAS = 1;
                        }
                        else if (item.Contains("pain.001.002.03"))
                        {
                            client.HISPAS = 2;
                        }
                        else if (item.Contains("pain.001.003.03"))
                        {
                            client.HISPAS = 3;
                        }

                        if (client.HISPAS == 0)
                        {
                            client.HISPAS = 3; // -> Fallback. Most banks accept the newest pain version
                        }
                    }
                }

                // Fallback if HKKAZ is not delivered by BPD (eg. Postbank)
                if (string.IsNullOrEmpty(client.HKKAZ))
                {
                    client.HKKAZ = "5";
                }

                return(result);
            }
            catch (Exception ex)
            {
                Log.Write(ex.ToString());

                throw new InvalidOperationException($"Software error.", ex);
            }
        }
Esempio n. 2
0
        /// <summary>
        /// Parsing segment -> UPD, BPD
        /// </summary>
        /// <param name="UserID"></param>
        /// <param name="BLZ"></param>
        /// <param name="HBCIVersion"></param>
        /// <param name="Message"></param>
        /// <returns></returns>
        public static List <HBCIBankMessage> Parse_Segments(FinTsClient client, string Message)
        {
            try
            {
                var connDetails = client.ConnectionDetails;
                List <HBCIBankMessage> result = new List <HBCIBankMessage>();

                List <string> values = SplitSegments(Message);

                List <Segment> segments = new List <Segment>();
                foreach (var item in values)
                {
                    Segment segment = Parse_Segment(item);
                    if (segment != null)
                    {
                        segments.Add(segment);
                    }
                }

                string msg = string.Join(Environment.NewLine, values);

                string bpd = string.Empty;
                string upd = string.Empty;

                var bpaMatch = Regex.Match(msg, @"(HIBPA.+?)\b(HNHBS|HISYN|HIUPA)\b", RegexOptions.Singleline);
                if (bpaMatch.Success)
                {
                    bpd = bpaMatch.Groups[1].Value;
                }

                var upaMatch = Regex.Match(msg, @"(HIUPA.+?)\b(HITAN|HNHBS)\b", RegexOptions.Singleline);
                if (upaMatch.Success)
                {
                    upd = upaMatch.Groups[1].Value;
                }

                // BPD
                SaveBPD(connDetails.Blz, bpd);
                BPD.ParseBpd(bpd);

                // UPD
                SaveUPD(connDetails.Blz, connDetails.UserId, upd);
                UPD.ParseUpd(upd);

                //Add BIC to Account information (Not retrieved bz UPD??)
                foreach (AccountInformation accInfo in UPD.HIUPD.AccountList)
                {
                    accInfo.AccountBic = connDetails.Bic;
                }

                foreach (var segment in segments)
                {
                    if (segment.Name == "HIRMG")
                    {
                        // HIRMG:2:2+9050::Die Nachricht enthält Fehler.+9800::Dialog abgebrochen+9010::Initialisierung fehlgeschlagen, Auftrag nicht bearbeitet.
                        // HIRMG:2:2+9800::Dialogabbruch.

                        string[] HIRMG_messages = segment.Payload.Split('+');
                        foreach (var HIRMG_message in HIRMG_messages)
                        {
                            var message = Parse_BankCode_Message(HIRMG_message);
                            if (message != null)
                            {
                                result.Add(message);
                            }
                        }
                    }

                    if (segment.Name == "HIRMS")
                    {
                        // HIRMS:3:2:2+9942::PIN falsch. Zugang gesperrt.'
                        string[] HIRMS_messages = segment.Payload.Split('+');
                        foreach (var HIRMS_message in HIRMS_messages)
                        {
                            var message = Parse_BankCode_Message(HIRMS_message);
                            if (message != null)
                            {
                                result.Add(message);
                            }
                        }

                        var securityMessage = result.FirstOrDefault(m => m.Code == "3920");
                        if (securityMessage != null)
                        {
                            string message = securityMessage.Message;

                            string TAN  = string.Empty;
                            string TANf = string.Empty;

                            string[] procedures = Regex.Split(message, @"\D+");

                            foreach (string value in procedures)
                            {
                                if (!string.IsNullOrEmpty(value) && int.TryParse(value, out int i))
                                {
                                    if (Convert.ToString(i).StartsWith("9"))
                                    {
                                        if (string.IsNullOrEmpty(TAN))
                                        {
                                            TAN = i.ToString();
                                        }

                                        if (string.IsNullOrEmpty(TANf))
                                        {
                                            TANf = i.ToString();
                                        }
                                        else
                                        {
                                            TANf += $";{i}";
                                        }
                                    }
                                }
                            }
                            if (string.IsNullOrEmpty(client.HIRMS))
                            {
                                client.HIRMS = TAN;
                            }
                            else
                            {
                                if (!TANf.Contains(client.HIRMS))
                                {
                                    throw new Exception($"Invalid HIRMS/Tan-Mode {client.HIRMS} detected. Please choose one of the allowed modes: {TANf}");
                                }
                            }
                            client.HIRMSf = TANf;

                            // Parsing TAN processes
                            if (!string.IsNullOrEmpty(client.HIRMS))
                            {
                                Parse_TANProcesses(client, bpd);
                            }
                        }
                    }

                    if (segment.Name == "HNHBK")
                    {
                        var ID = Parse_String(segment.Payload, "+1+", ":1");
                        client.HNHBK = ID;
                    }

                    if (segment.Name == "HISYN")
                    {
                        client.SystemId = segment.Payload;
                        Log.Write("Customer System ID: " + client.SystemId);
                    }

                    if (segment.Name == "HNHBS")
                    {
                        if (segment.Payload == null || segment.Payload == "0")
                        {
                            client.HNHBS = 2;
                        }
                        else
                        {
                            client.HNHBS = Convert.ToInt32(segment.Payload) + 1;
                        }
                    }

                    if (segment.Name == "HISALS")
                    {
                        client.HISALS = segment.Version;
                    }

                    if (segment.Name == "HITANS")
                    {
                        if (client.HITANS != 0 && segment.Version == 7)
                        {
                            ; // Ignore HKTAN version 7 if other version is available and version 7 isn't implemented in libfintx
                        }
                        else
                        {
                            client.HITANS = segment.Version;
                        }
                    }

                    if (segment.Name == "HITAN")
                    {
                        client.HITAN = Parse_String(segment.Payload.Replace("?+", "??"), "++", "+").Replace("??", "?+");
                    }

                    if (segment.Name == "HIKAZS")
                    {
                        if (client.HIKAZS == 0)
                        {
                            client.HIKAZS = segment.Version;
                        }
                        else
                        {
                            if (segment.Version > client.HIKAZS)
                            {
                                client.HIKAZS = segment.Version;
                            }
                        }
                    }

                    if (segment.Name == "HISPAS")
                    {
                        if (segment.Payload.Contains("pain.001.001.03"))
                        {
                            client.HISPAS = 1;
                        }
                        else if (segment.Payload.Contains("pain.001.002.03"))
                        {
                            client.HISPAS = 2;
                        }
                        else if (segment.Payload.Contains("pain.001.003.03"))
                        {
                            client.HISPAS = 3;
                        }

                        if (client.HISPAS == 0)
                        {
                            client.HISPAS = 3; // -> Fallback. Most banks accept the newest pain version
                        }
                    }
                }

                // Fallback if HIKAZS is not delivered by BPD (eg. Postbank)
                if (client.HIKAZS == 0)
                {
                    client.HIKAZS = 0;
                }

                return(result);
            }
            catch (Exception ex)
            {
                Log.Write(ex.ToString());

                throw new InvalidOperationException($"Software error.", ex);
            }
        }