sms-transaction-parser
Version:
Parse SMS for transactions to extract relevant information.
265 lines (260 loc) • 8.89 kB
JavaScript
function _wrapRegExp() {
_wrapRegExp = function (re, groups) {
return new BabelRegExp(re, void 0, groups);
};
var _super = RegExp.prototype,
_groups = new WeakMap();
function BabelRegExp(re, flags, groups) {
var _this = new RegExp(re, flags);
return _groups.set(_this, groups || _groups.get(re)), _setPrototypeOf(_this, BabelRegExp.prototype);
}
function buildGroups(result, re) {
var g = _groups.get(re);
return Object.keys(g).reduce(function (groups, name) {
var i = g[name];
if ("number" == typeof i) groups[name] = result[i];else {
for (var k = 0; void 0 === result[i[k]] && k + 1 < i.length;) k++;
groups[name] = result[i[k]];
}
return groups;
}, Object.create(null));
}
return _inherits(BabelRegExp, RegExp), BabelRegExp.prototype.exec = function (str) {
var result = _super.exec.call(this, str);
if (result) {
result.groups = buildGroups(result, this);
var indices = result.indices;
indices && (indices.groups = buildGroups(indices, this));
}
return result;
}, BabelRegExp.prototype[Symbol.replace] = function (str, substitution) {
if ("string" == typeof substitution) {
var groups = _groups.get(this);
return _super[Symbol.replace].call(this, str, substitution.replace(/\$<([^>]+)>/g, function (_, name) {
var group = groups[name];
return "$" + (Array.isArray(group) ? group.join("$") : group);
}));
}
if ("function" == typeof substitution) {
var _this = this;
return _super[Symbol.replace].call(this, str, function () {
var args = arguments;
return "object" != typeof args[args.length - 1] && (args = [].slice.call(args)).push(buildGroups(args, _this)), substitution.apply(this, args);
});
}
return _super[Symbol.replace].call(this, str, substitution);
}, _wrapRegExp.apply(this, arguments);
}
function _extends() {
_extends = Object.assign ? Object.assign.bind() : function (target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key];
}
}
}
return target;
};
return _extends.apply(this, arguments);
}
function _inherits(subClass, superClass) {
if (typeof superClass !== "function" && superClass !== null) {
throw new TypeError("Super expression must either be null or a function");
}
subClass.prototype = Object.create(superClass && superClass.prototype, {
constructor: {
value: subClass,
writable: true,
configurable: true
}
});
Object.defineProperty(subClass, "prototype", {
writable: false
});
if (superClass) _setPrototypeOf(subClass, superClass);
}
function _setPrototypeOf(o, p) {
_setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function _setPrototypeOf(o, p) {
o.__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
function _objectWithoutPropertiesLoose(source, excluded) {
if (source == null) return {};
var target = {};
var sourceKeys = Object.keys(source);
var key, i;
for (i = 0; i < sourceKeys.length; i++) {
key = sourceKeys[i];
if (excluded.indexOf(key) >= 0) continue;
target[key] = source[key];
}
return target;
}
var TransactionType = {
MPesaSentTo: 'M-PESA-SENT',
MPesaPaidTo: 'M-PESA-PAID',
MShwariDeposit: 'M-SHWARI-DEPOSIT',
MShwariWithdraw: 'M-SHWARI-WITHDRAW',
MPesaWithdraw: 'M-PESA-WITHDRAW',
MPesaDeposit: 'M-PESA-DEPOSIT'
};
var FailedParsing = {
NoMatch: 'NO-MATCH',
NoTransactionType: 'NO-TRANSACTION-TYPE',
NoResult: 'NO-RESULT'
};
var transactionTypeWithPattern = [{
type: TransactionType.MPesaSentTo,
keyPhrase: 'sent to',
regex: /*#__PURE__*/_wrapRegExp(/([A-Z0-9]+)(?: Confirmed\.)? Ksh([\d,]+.\d{2}) (sent) to (.+) on (\d{1,2}\/\d{1,2}\/\d{2}) at (\d{1,2}:\d{2} [AP]M).+M\x2DPESA balance is Ksh([\d,]+.\d{2}).+ [Tt]ransaction cost, Ksh([\d,]+.\d{2})/, {
reference: 1,
amount: 2,
transactionType: 3,
recipient: 4,
date: 5,
time: 6,
balance: 7,
transactionCost: 8
})
}, {
type: TransactionType.MPesaPaidTo,
keyPhrase: 'paid to',
regex: /*#__PURE__*/_wrapRegExp(/([A-Z0-9]+)(?: Confirmed\.)? Ksh([\d,]+.\d{2}) (paid) to (.+) on (\d{1,2}\/\d{1,2}\/\d{2}) at (\d{1,2}:\d{2} [AP]M).+M\x2DPESA balance is Ksh([\d,]+.\d{2}).+ [Tt]ransaction cost, Ksh([\d,]+.\d{2})/, {
reference: 1,
amount: 2,
transactionType: 3,
recipient: 4,
date: 5,
time: 6,
balance: 7,
transactionCost: 8
})
}, {
type: TransactionType.MPesaWithdraw,
keyPhrase: 'Withdraw',
regex: /*#__PURE__*/_wrapRegExp(/([A-Z0-9]+)(?: Confirmed\.)on (\d{1,2}\/\d{1,2}\/\d{2}) at (\d{1,2}:\d{2} [AP]M)(Withdraw) Ksh([\d,]+.\d{2}) from (.+) New M\x2DPESA balance is Ksh([\d,]+.\d{2}).+Transaction cost(?:, )?Ksh(?:\s|\S)([\d,]+.\d{2})/, {
reference: 1,
date: 2,
time: 3,
transactionType: 4,
amount: 5,
agent: 6,
balance: 7,
transactionCost: 8
})
}, {
type: TransactionType.MShwariDeposit,
keyPhrase: 'transferred to M-Shwari',
regex: /*#__PURE__*/_wrapRegExp(/([A-Z0-9]+)(?: Confirmed\.)Ksh([\d,]+.\d{2}) (transferred) to (.+) on (\d{1,2}\/\d{1,2}\/\d{2}) at (\d{1,2}:\d{2} [AP]M).+M\x2DPESA balance is Ksh([\d,]+.\d{2}).+ M\x2DShwari saving account balance is Ksh([\d,]+.\d{2}).+Transaction cost Ksh(?:\s|\S)([\d,]+.\d{2})/, {
reference: 1,
amount: 2,
transactionType: 3,
account: 4,
date: 5,
time: 6,
balance: 7,
mShwariBalance: 8,
transactionCost: 9
})
}, {
type: TransactionType.MShwariWithdraw,
keyPhrase: 'transferred from M-Shwari',
regex: /*#__PURE__*/_wrapRegExp(/([A-Z0-9]+)(?: Confirmed\.)Ksh([\d,]+.\d{2}) (transferred) from (.+) on (\d{1,2}\/\d{1,2}\/\d{2}) at (\d{1,2}:\d{2} [AP]M). M\x2DShwari balance is Ksh([\d,]+.\d{2}).+M\x2DPESA balance is Ksh([\d,]+.\d{2}).+Transaction cost Ksh(?:\s|\S)([\d,]+.\d{2})/, {
reference: 1,
amount: 2,
transactionType: 3,
account: 4,
date: 5,
time: 6,
mShwariBalance: 7,
balance: 8,
transactionCost: 9
})
}, {
type: TransactionType.MPesaDeposit,
keyPhrase: 'You have received',
regex: /*#__PURE__*/_wrapRegExp(/([A-Z0-9]+)(?: Confirmed\.)(?:.+) (received)? Ksh([\d,]+.\d{2}) from (.+) on (\d{1,2}\/\d{1,2}\/\d{2}) at (\d{1,2}:\d{2} [AP]M).+M\x2DPESA balance is Ksh([\d,]+.\d{2}).+/, {
reference: 1,
transactionType: 2,
amount: 3,
sender: 4,
date: 5,
time: 6,
balance: 7
})
}];
var parseDateTimeString = function parseDateTimeString(date, time) {
var _date$split$map = date.split('/').map(function (s) {
return +s;
}),
day = _date$split$map[0],
month = _date$split$map[1],
year = _date$split$map[2];
var finalDate = new Date(year + 2000, month, day);
var timeArray = time.split(" ");
var hoursAndMinutes = timeArray[0].split(":");
var hours = parseInt(hoursAndMinutes[0]);
var minutes = parseInt(hoursAndMinutes[1]);
var period = timeArray[1];
if (period === "PM" && hours !== 12) {
hours += 12;
}
if (period === "AM" && hours === 12) {
hours = 0;
}
finalDate.setHours(hours);
finalDate.setMinutes(minutes);
return finalDate.valueOf();
};
var parseAmount = function parseAmount(numberString) {
var amount = parseFloat(numberString.replace(/,/g, ''));
return amount;
};
var _excluded = ["date", "time", "balance", "amount"];
function getTransactionType(message) {
for (var index = 0; index < transactionTypeWithPattern.length; index++) {
var transactionWithRegex = transactionTypeWithPattern[index];
var found = message.indexOf(transactionWithRegex.keyPhrase);
if (found > -1) {
return transactionWithRegex;
}
}
return null;
}
function parseMessage(message) {
var transactionType = getTransactionType(message);
if (!transactionType) return {
type: FailedParsing.NoTransactionType
};
var matched = transactionType.regex.exec(message);
if (!matched) return {
type: FailedParsing.NoMatch
};
var _result = matched.groups;
if (Object.keys(_result).length === 0) {
return {
type: FailedParsing.NoResult
};
}
var date = _result.date,
time = _result.time,
_b = _result.balance,
_a = _result.amount,
rest = _objectWithoutPropertiesLoose(_result, _excluded);
var finalDate = parseDateTimeString(date, time);
var balance = parseAmount(_b);
var amount = parseAmount(_a);
var parsedResult = _extends({}, rest, {
balance: balance,
amount: amount,
dateTime: finalDate.valueOf(),
type: transactionType.type
});
return parsedResult;
}
export { FailedParsing, TransactionType, getTransactionType, parseMessage, transactionTypeWithPattern };
//# sourceMappingURL=sms-transaction-parser.esm.js.map