From a9edb90fbe07ceac5ab8b628bca494e8866726b9 Mon Sep 17 00:00:00 2001 From: Gustavo Maximiliano Cortez Date: Wed, 12 Jul 2017 19:45:15 -0300 Subject: [PATCH] Refactor code. Fix tx list (for pending and confirming tx) --- src/js/controllers/bitpayCard.js | 52 +------- src/js/services/bitpayCardService.js | 177 +++++++++++++++++++++------ src/sass/views/bitpayCard.scss | 2 + www/views/includes/cardActivity.html | 8 +- 4 files changed, 154 insertions(+), 85 deletions(-) diff --git a/src/js/controllers/bitpayCard.js b/src/js/controllers/bitpayCard.js index 27efc7d0a..c200bbc3a 100644 --- a/src/js/controllers/bitpayCard.js +++ b/src/js/controllers/bitpayCard.js @@ -3,7 +3,6 @@ angular.module('copayApp.controllers').controller('bitpayCardController', function($scope, $timeout, $log, $state, lodash, bitpayCardService, moment, popupService, gettextCatalog, $ionicHistory, bitpayService, externalLinkService, timeService) { var self = this; - var runningBalance; $scope.dateRange = { value: 'last30Days' }; @@ -73,16 +72,9 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi setGetStarted(history, function() { var txs = lodash.clone(history.txs); - runningBalance = parseFloat(history.endingBalance); for (var i = 0; i < txs.length; i++) { - txs[i] = _getMerchantInfo(txs[i]); txs[i].icon = _getIconName(txs[i]); txs[i].desc = _processDescription(txs[i]); - txs[i].price = _price(txs[i]); - txs[i].runningBalance = runningBalance; - txs[i].pending = txs[i].status.toLowerCase() == 'pending'; - - _runningBalance(txs[i]); if (txs[i].merchant.city && txs[i].merchant.state) { txs[i].merchant.location = txs[i].merchant.city + ', ' + txs[i].merchant.state; @@ -90,25 +82,10 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi txs[i].merchant.location = txs[i].merchant.city || txs[i].merchant.state || ''; } } - self.bitpayCardTransactionHistoryCompleted = lodash.filter(txs, function(tx) { - return !tx.pending && tx.type.indexOf('93') == -1; - }); - self.bitpayCardTransactionHistoryConfirming = lodash.filter(txs, function(tx) { - return tx.pending && tx.type.indexOf('93') == -1; - }); - self.bitpayCardTransactionHistoryPreAuth = lodash.filter(txs, function(tx) { - return tx.pending && tx.type.indexOf('93') > -1; - }); - lodash.forEach(self.bitpayCardTransactionHistoryConfirming, function(tx) { - if (lodash.includes(tx, 'paidPartial')) - self.underpaidInvoiceInList = true; - }); - - lodash.forEach(self.bitpayCardTransactionHistoryConfirming, function(tx) { - if (lodash.includes(tx, 'paid') || lodash.includes(tx, 'invalid')) - self.delayedInvoiceInList = true; - }); + self.bitpayCardTransactionHistoryConfirming = bitpayCardService.filterTransactions('confirming', txs); + self.bitpayCardTransactionHistoryCompleted = bitpayCardService.filterTransactions('completed', txs); + self.bitpayCardTransactionHistoryPreAuth = bitpayCardService.filterTransactions('preAuth', txs); self.balance = history.currentCardBalance; self.updatedOn = null; @@ -133,16 +110,6 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi }); }; - var _getMerchantInfo = function(tx) { - var bpTranCodes = bitpayCardService.bpTranCodes; - lodash.keys(bpTranCodes).forEach(function(code) { - if (tx.type.indexOf(code) === 0) { - lodash.assign(tx, bpTranCodes[code]); - } - }); - return tx; - }; - var _getIconName = function(tx) { var icon = tx.mcc || tx.category || null; if (!icon || bitpayCardService.iconMap[icon] == undefined) return 'default'; @@ -156,19 +123,10 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi return tx.description; }; - var _price = function(tx) { - var price = tx.fee ? parseFloat(tx.amount) + parseFloat(tx.fee) : parseFloat(tx.amount); - return price; - }; - - var _runningBalance = function(tx) { - runningBalance -= parseFloat(tx.amount); - }; - $scope.createdWithinPastDay = function(tx) { var result = false; - if (tx.timestamp) { - result = timeService.withinPastDay(tx.timestamp); + if (tx.date) { + result = timeService.withinPastDay(tx.date); } return result; }; diff --git a/src/js/services/bitpayCardService.js b/src/js/services/bitpayCardService.js index 114074a28..643ddb97c 100644 --- a/src/js/services/bitpayCardService.js +++ b/src/js/services/bitpayCardService.js @@ -9,36 +9,129 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log, return error; }; - var _processTransactions = function(invoices, history) { - invoices = invoices ||  []; - for (var i = 0; i < invoices.length; i++) { - var matched = false; - for (var j = 0; j < history.length; j++) { - if (history[j].description[0] && history[j].description[0].indexOf(invoices[i].id) > -1) { - matched = true; - } + var _buildDate = function(date, time) { + date = date.match(/(\d{2})\/(\d{2})\/(\d{4})/); + time = time.match(/(\d{2})(\d{2})(\d{2})/); + var newDate = new Date(date[1] + '/' + date[2] + '/' + date[3]); + newDate.setHours(time[1], time[2], time[3]); + return newDate; + }; + + var _lowercaseMerchant = function(merchant) { + if (merchant.name && merchant.name.toLowerCase) { + merchant.name = merchant.name.toLowerCase(); + } + if (merchant.city && merchant.city.toLowerCase) { + merchant.city = merchant.city.toLowerCase(); + } + + return merchant; + }; + + var _getMerchantInfo = function(tx) { + var bpTranCodes = root.bpTranCodes; + lodash.keys(bpTranCodes).forEach(function(code) { + if (tx.type.indexOf(code) === 0) { + lodash.assign(tx, bpTranCodes[code]); } - var isInvoiceLessThanOneDayOld = moment() < moment(new Date(invoices[i].invoiceTime)).add(1, 'day'); - if (!matched && isInvoiceLessThanOneDayOld) { - var isInvoiceUnderpaid = invoices[i].exceptionStatus === 'paidPartial'; + }); + return tx; + }; - if (['paid', 'confirmed', 'complete'].indexOf(invoices[i].status) >= 0 || - (invoices[i].status === 'invalid' || isInvoiceUnderpaid)) { + var _fromTransaction = function(txn, runningBalance) { + var dateTime = _buildDate(txn.date, txn.time); + var merchant = _lowercaseMerchant(txn.merchant); + return _getMerchantInfo({ + date: txn.timestamp || dateTime, + category: txn.mcc, + merchant: merchant, + description: txn.description[0], + price: parseFloat(txn.amount) + parseFloat(txn.fee), + type: txn.type, + runningBalance: runningBalance + }); + }; - history.unshift({ - timestamp: new Date(invoices[i].invoiceTime), - description: invoices[i].itemDesc, - amount: invoices[i].price, - type: '00611 = Client Funded Deposit', - pending: true, - status: invoices[i].status, - transactionId: invoices[i].transactions && invoices[i].transactions[0] ? invoices[i].transactions[0].txid : '', - exceptionStatus: invoices[i].exceptionStatus - }); + var _processTransactions = function(invoices, history) { + + var balance = history.endingBalance || history.currentCardBalance; + var runningBalance = parseFloat(balance); + var activityList = []; + + if(history && history.transactionList){ + for (var j = 0; j < history.transactionList.length; j++) { + runningBalance -= parseFloat(history.transactionList[j].amount); + activityList.push(_fromTransaction(history.transactionList[j], runningBalance)); + } + } + + if (activityList.length > 0) { + + invoices = invoices ||  []; + for (var i = 0; i < invoices.length; i++) { + var matched = false; + for (var j = 0; j < history.transactionList.length; j++) { + var description = history.transactionList[j].description; + for (var k = 0; k < description.length; k++) { + if (description[k] && description[k].indexOf(invoices[i].id) > -1) { + matched = true; + } + } + } + + var isInvoiceLessThanOneDayOld = moment() < moment(new Date(invoices[i].invoiceTime)).add(1, 'day'); + + if (!matched && isInvoiceLessThanOneDayOld) { + var isInvoiceUnderpaid = invoices[i].exceptionStatus === 'paidPartial'; + + if (['paid', 'confirmed', 'complete'].indexOf(invoices[i].status) >= 0 || + (invoices[i].status === 'invalid' || isInvoiceUnderpaid)) { + + activityList.unshift(_getMerchantInfo({ + date: new Date(invoices[i].invoiceTime), + category: '', + merchant: '', + description: invoices[i].itemDesc, + price: invoices[i].price, + type: '00611 = Client Funded Deposit', + runningBalance: null, + pending: true, + transactionId: invoices[i].transactions && invoices[i].transactions[0] ? invoices[i].transactions[0].txid : '' + })); + } } } } - return history; + return activityList; + }; + + root.filterTransactions = function(type, txns) { + var list, + getPreAuth = lodash.filter(txns, function(txn) { + return txn.type.indexOf('93') > -1; + }), + getPending = lodash.filter(txns, function(txn) { + return txn.pending; + }), + getCompleted = lodash.filter(txns, function(txn) { + return !txn.pending && txn.type.indexOf('93') == -1; + }); + + switch (type) { + case "preAuth": + list = lodash.filter(getPreAuth); + break; + case "confirming": + list = lodash.filter(getPending); + break; + case "completed": + list = lodash.filter(getCompleted); + break; + default: + // code... + break; + } + return list; }; root.sync = function(apiContext, cb) { @@ -91,12 +184,11 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log, // opts: range root.getHistory = function(cardId, opts, cb) { - var invoices, transactions; + var invoices, history; opts = opts || {}; var json = { - method: 'getInvoiceHistory', - params: JSON.stringify(opts) + method: 'getInvoiceHistory' }; appIdentityService.getIdentity(bitpayService.getEnvironment().network, function(err, appIdentity) { @@ -123,17 +215,17 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log, method: 'getTransactionHistory', params: JSON.stringify(opts) }; - // Get transactions list + // Get transactions History list bitpayService.post('/api/v2/' + card.token, json, function(data) { - $log.info('BitPay Get Transactions: SUCCESS'); - transactions = data.data.data || {}; - transactions['txs'] = _processTransactions(invoices, transactions.transactionList); + $log.info('BitPay Get History: SUCCESS'); + history = data.data.data || {}; + history['txs'] = _processTransactions(invoices, history); - root.setLastKnownBalance(cardId, transactions.currentCardBalance, function() {}); + root.setLastKnownBalance(cardId, history.currentCardBalance, function() {}); - return cb(data.data.error, transactions); + return cb(data.data.error, history); }, function(data) { - return cb(_setError('BitPay Card Error: Get Transactions', data)); + return cb(_setError('BitPay Card Error: Get History', data)); }); }, function(data) { return cb(_setError('BitPay Card Error: Get Invoices', data)); @@ -338,7 +430,22 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log, category: 'bp002', description: '' }, - '9991': { // General assignment of a fee for WC card + 'load': { + merchant: { + name: 'BitPay', + city: 'Atlanta', + state: 'GA' + }, + category: 'bp001', + description: 'Top-Up' + }, + 'unload | pos': { + description: 'Purchase' + }, + 'unload | epos': { + description: 'Online Purchase' + }, + 'transactionfee': { merchant: { name: 'Transaction Fee', }, diff --git a/src/sass/views/bitpayCard.scss b/src/sass/views/bitpayCard.scss index c05bd8497..ef5e6ad2b 100644 --- a/src/sass/views/bitpayCard.scss +++ b/src/sass/views/bitpayCard.scss @@ -154,11 +154,13 @@ } .tx-message { margin-right: 1rem; + text-transform: capitalize; } .tx-location { margin-right: 1rem; font-size: 12.5px; color: $v-light-gray; + text-transform: capitalize; } .tx-amount { font-size: 16px; diff --git a/www/views/includes/cardActivity.html b/www/views/includes/cardActivity.html index 68e90fdb9..406cf311c 100644 --- a/www/views/includes/cardActivity.html +++ b/www/views/includes/cardActivity.html @@ -8,7 +8,9 @@
{{tx.merchant.name || 'Unknown Merchant'}}
-
{{tx.merchant.location}}
+
+ {{tx.merchant.location}} +
View Confirmation Status
@@ -19,8 +21,8 @@ {{tx.price | currency:bitpayCard.currencySymbol:2 }}
- - + +