Beispiel #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(string UserID, int BLZ, int HBCIVersion, string Message)
        {
            try
            {
                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(BLZ, bpd);
                BPD.Parse_BPD(bpd);

                // UPD
                SaveUPD(BLZ, UserID, upd);
                UPD.Parse_UPD(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)
                            {
                                int i;
                                if (!string.IsNullOrEmpty(value) && int.TryParse(value, out 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(Segment.HIRMS))
                            {
                                Segment.HIRMS = TAN;
                            }
                            else
                            {
                                if (!TANf.Contains(Segment.HIRMS))
                                {
                                    throw new Exception($"Invalid HIRMS/Tan-Mode {Segment.HIRMS} detected. Please choose one of the allowed modes: {TANf}");
                                }
                            }
                            Segment.HIRMSf = TANf;

                            // Parsing TAN processes
                            if (!String.IsNullOrEmpty(Segment.HIRMS))
                            {
                                Parse_TANProcesses(bpd);
                            }
                        }
                    }

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

                    if (item.Contains("HISYN"))
                    {
                        var ID = item.Substring(item.IndexOf("+") + 1);
                        Segment.HISYN = 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)
                        {
                            Segment.HNHBS = "2";
                        }
                        else
                        {
                            Segment.HNHBS = Convert.ToString(Convert.ToInt16(MSG) + 1);
                        }
                    }

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

                        Segment.HISALS = SEG;

                        Segment.HISALSf = item;
                    }

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

                        Segment.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(Segment.HKKAZ))
                            {
                                Segment.HKKAZ = VER;
                            }
                            else
                            {
                                if (int.Parse(VER) > int.Parse(Segment.HKKAZ))
                                {
                                    Segment.HKKAZ = VER;
                                }
                            }
                        }
                    }

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

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

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

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

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