public PumbTransaction parsePumbSms(String msg) {
        Matcher m = transactionSmsPattern.matcher(msg);
        if (m.find()) {

            // for (int i = 0; i <= m.groupCount(); i++) {
            // System.out.println("group " + i + " " + m.group(i));
            // }

            PumbTransaction pumbTransaction = new PumbTransaction();
            pumbTransaction.originalMsg = m.group();

            pumbTransaction.card = fetchCardNumber(m, 2);

            pumbTransaction.date = fetchDate(m, 3);

            if (!Strings.isNullOrEmpty(m.group(6))) {
                pumbTransaction.rolledBack = true;
            }

            if (!Strings.isNullOrEmpty(m.group(7))) {
                pumbTransaction.type = PumbTransactionType.forName(m.group(7));
                pumbTransaction.amount = Double.valueOf(m.group(8));
                pumbTransaction.currency = m.group(9);
                pumbTransaction.recipient = m.group(14);

                if (!Strings.isNullOrEmpty(m.group(11))) {
                    pumbTransaction.amountInAccountCurrency = Double.parseDouble(m.group(11));
                    pumbTransaction.accountCurrency = m.group(12);
                }

                pumbTransaction.remaining = Double.valueOf(m.group(16));
                pumbTransaction.remainingCurrency = m.group(17);

                if (!Strings.isNullOrEmpty(m.group(19))) {
                    pumbTransaction.remainingAvailable = Double.valueOf(m.group(19));
                    pumbTransaction.remainingAvailableCurrency = m.group(20);
                }

            } else if (!Strings.isNullOrEmpty(m.group(22))) {
                pumbTransaction.type = PumbTransactionType.forName(m.group(25));// transaction
                                                                                // rejected

                pumbTransaction.amount = Double.valueOf(m.group(22));
                pumbTransaction.currency = m.group(23);
                pumbTransaction.recipient = m.group(24);
                pumbTransaction.reasonRejected = m.group(26);

            } else {
                throw new IllegalArgumentException("unknown type of transaction");
            }
            return pumbTransaction;
        } else if (msg != null && (msg.contains("Shanovnuy") || msg.contains("Shanovnyj"))) {
            return null;
        }
        throw new IllegalArgumentException("message is not matched");
    }