UNPKG

sms-transaction-parser

Version:

Parse SMS for transactions to extract relevant information.

273 lines (266 loc) 9.11 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); 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; } exports.FailedParsing = FailedParsing; exports.TransactionType = TransactionType; exports.getTransactionType = getTransactionType; exports.parseMessage = parseMessage; exports.transactionTypeWithPattern = transactionTypeWithPattern; //# sourceMappingURL=sms-transaction-parser.cjs.development.js.map