Refactor code. Fix tx list (for pending and confirming tx)

This commit is contained in:
Gustavo Maximiliano Cortez 2017-07-12 19:45:15 -03:00
parent 35b9ba049e
commit a9edb90fbe
No known key found for this signature in database
GPG Key ID: 15EDAD8D9F2EB1AF
4 changed files with 154 additions and 85 deletions

View File

@ -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;
};

View File

@ -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',
},

View File

@ -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;

View File

@ -8,7 +8,9 @@
<div class="tx-title">
<div class="ellipsis">
<div class="tx-message ellipsis">{{tx.merchant.name || 'Unknown Merchant'}}</div>
<div class="tx-location ellipsis" ng-show="tx.merchant.city && tx.merchant.state">{{tx.merchant.location}}</div>
<div class="tx-location ellipsis" ng-show="tx.merchant.city && tx.merchant.state">
{{tx.merchant.location}}
</div>
<div ng-show="tx.pending && tx.transactionId" class="size-12 tx-amount--pending">
<div ng-click="bitpayCard.viewOnBlockchain(tx.transactionId)">View Confirmation Status</div>
</div>
@ -19,8 +21,8 @@
{{tx.price | currency:bitpayCard.currencySymbol:2 }}
</span>
<div>
<time class="tx-time" ng-if="createdWithinPastDay(tx)">{{tx.timestamp | amTimeAgo}}</time>
<time class="tx-time" ng-if="!createdWithinPastDay(tx)">{{tx.timestamp | amDateFormat:'MMM D, YYYY'}}</time>
<time class="tx-time" ng-if="createdWithinPastDay(tx)">{{tx.date | amTimeAgo}}</time>
<time class="tx-time" ng-if="!createdWithinPastDay(tx)">{{tx.date | amDateFormat:'MMM D, YYYY'}}</time>
</div>
</span>
</div>