mirror of https://github.com/BTCPrivate/copay.git
Refactor code. Fix tx list (for pending and confirming tx)
This commit is contained in:
parent
35b9ba049e
commit
a9edb90fbe
|
@ -3,7 +3,6 @@
|
||||||
angular.module('copayApp.controllers').controller('bitpayCardController', function($scope, $timeout, $log, $state, lodash, bitpayCardService, moment, popupService, gettextCatalog, $ionicHistory, bitpayService, externalLinkService, timeService) {
|
angular.module('copayApp.controllers').controller('bitpayCardController', function($scope, $timeout, $log, $state, lodash, bitpayCardService, moment, popupService, gettextCatalog, $ionicHistory, bitpayService, externalLinkService, timeService) {
|
||||||
|
|
||||||
var self = this;
|
var self = this;
|
||||||
var runningBalance;
|
|
||||||
$scope.dateRange = {
|
$scope.dateRange = {
|
||||||
value: 'last30Days'
|
value: 'last30Days'
|
||||||
};
|
};
|
||||||
|
@ -73,16 +72,9 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
|
||||||
setGetStarted(history, function() {
|
setGetStarted(history, function() {
|
||||||
|
|
||||||
var txs = lodash.clone(history.txs);
|
var txs = lodash.clone(history.txs);
|
||||||
runningBalance = parseFloat(history.endingBalance);
|
|
||||||
for (var i = 0; i < txs.length; i++) {
|
for (var i = 0; i < txs.length; i++) {
|
||||||
txs[i] = _getMerchantInfo(txs[i]);
|
|
||||||
txs[i].icon = _getIconName(txs[i]);
|
txs[i].icon = _getIconName(txs[i]);
|
||||||
txs[i].desc = _processDescription(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) {
|
if (txs[i].merchant.city && txs[i].merchant.state) {
|
||||||
txs[i].merchant.location = 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 || '';
|
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) {
|
self.bitpayCardTransactionHistoryConfirming = bitpayCardService.filterTransactions('confirming', txs);
|
||||||
if (lodash.includes(tx, 'paidPartial'))
|
self.bitpayCardTransactionHistoryCompleted = bitpayCardService.filterTransactions('completed', txs);
|
||||||
self.underpaidInvoiceInList = true;
|
self.bitpayCardTransactionHistoryPreAuth = bitpayCardService.filterTransactions('preAuth', txs);
|
||||||
});
|
|
||||||
|
|
||||||
lodash.forEach(self.bitpayCardTransactionHistoryConfirming, function(tx) {
|
|
||||||
if (lodash.includes(tx, 'paid') || lodash.includes(tx, 'invalid'))
|
|
||||||
self.delayedInvoiceInList = true;
|
|
||||||
});
|
|
||||||
|
|
||||||
self.balance = history.currentCardBalance;
|
self.balance = history.currentCardBalance;
|
||||||
self.updatedOn = null;
|
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 _getIconName = function(tx) {
|
||||||
var icon = tx.mcc || tx.category || null;
|
var icon = tx.mcc || tx.category || null;
|
||||||
if (!icon || bitpayCardService.iconMap[icon] == undefined) return 'default';
|
if (!icon || bitpayCardService.iconMap[icon] == undefined) return 'default';
|
||||||
|
@ -156,19 +123,10 @@ angular.module('copayApp.controllers').controller('bitpayCardController', functi
|
||||||
return tx.description;
|
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) {
|
$scope.createdWithinPastDay = function(tx) {
|
||||||
var result = false;
|
var result = false;
|
||||||
if (tx.timestamp) {
|
if (tx.date) {
|
||||||
result = timeService.withinPastDay(tx.timestamp);
|
result = timeService.withinPastDay(tx.date);
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
};
|
};
|
||||||
|
|
|
@ -9,36 +9,129 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log,
|
||||||
return error;
|
return error;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
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]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return tx;
|
||||||
|
};
|
||||||
|
|
||||||
|
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
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
var _processTransactions = function(invoices, history) {
|
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 || [];
|
invoices = invoices || [];
|
||||||
for (var i = 0; i < invoices.length; i++) {
|
for (var i = 0; i < invoices.length; i++) {
|
||||||
var matched = false;
|
var matched = false;
|
||||||
for (var j = 0; j < history.length; j++) {
|
for (var j = 0; j < history.transactionList.length; j++) {
|
||||||
if (history[j].description[0] && history[j].description[0].indexOf(invoices[i].id) > -1) {
|
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;
|
matched = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var isInvoiceLessThanOneDayOld = moment() < moment(new Date(invoices[i].invoiceTime)).add(1, 'day');
|
var isInvoiceLessThanOneDayOld = moment() < moment(new Date(invoices[i].invoiceTime)).add(1, 'day');
|
||||||
|
|
||||||
if (!matched && isInvoiceLessThanOneDayOld) {
|
if (!matched && isInvoiceLessThanOneDayOld) {
|
||||||
var isInvoiceUnderpaid = invoices[i].exceptionStatus === 'paidPartial';
|
var isInvoiceUnderpaid = invoices[i].exceptionStatus === 'paidPartial';
|
||||||
|
|
||||||
if (['paid', 'confirmed', 'complete'].indexOf(invoices[i].status) >= 0 ||
|
if (['paid', 'confirmed', 'complete'].indexOf(invoices[i].status) >= 0 ||
|
||||||
(invoices[i].status === 'invalid' || isInvoiceUnderpaid)) {
|
(invoices[i].status === 'invalid' || isInvoiceUnderpaid)) {
|
||||||
|
|
||||||
history.unshift({
|
activityList.unshift(_getMerchantInfo({
|
||||||
timestamp: new Date(invoices[i].invoiceTime),
|
date: new Date(invoices[i].invoiceTime),
|
||||||
|
category: '',
|
||||||
|
merchant: '',
|
||||||
description: invoices[i].itemDesc,
|
description: invoices[i].itemDesc,
|
||||||
amount: invoices[i].price,
|
price: invoices[i].price,
|
||||||
type: '00611 = Client Funded Deposit',
|
type: '00611 = Client Funded Deposit',
|
||||||
|
runningBalance: null,
|
||||||
pending: true,
|
pending: true,
|
||||||
status: invoices[i].status,
|
transactionId: invoices[i].transactions && invoices[i].transactions[0] ? invoices[i].transactions[0].txid : ''
|
||||||
transactionId: invoices[i].transactions && invoices[i].transactions[0] ? invoices[i].transactions[0].txid : '',
|
}));
|
||||||
exceptionStatus: invoices[i].exceptionStatus
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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;
|
||||||
}
|
|
||||||
return history;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
root.sync = function(apiContext, cb) {
|
root.sync = function(apiContext, cb) {
|
||||||
|
@ -91,12 +184,11 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log,
|
||||||
|
|
||||||
// opts: range
|
// opts: range
|
||||||
root.getHistory = function(cardId, opts, cb) {
|
root.getHistory = function(cardId, opts, cb) {
|
||||||
var invoices, transactions;
|
var invoices, history;
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
var json = {
|
var json = {
|
||||||
method: 'getInvoiceHistory',
|
method: 'getInvoiceHistory'
|
||||||
params: JSON.stringify(opts)
|
|
||||||
};
|
};
|
||||||
|
|
||||||
appIdentityService.getIdentity(bitpayService.getEnvironment().network, function(err, appIdentity) {
|
appIdentityService.getIdentity(bitpayService.getEnvironment().network, function(err, appIdentity) {
|
||||||
|
@ -123,17 +215,17 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log,
|
||||||
method: 'getTransactionHistory',
|
method: 'getTransactionHistory',
|
||||||
params: JSON.stringify(opts)
|
params: JSON.stringify(opts)
|
||||||
};
|
};
|
||||||
// Get transactions list
|
// Get transactions History list
|
||||||
bitpayService.post('/api/v2/' + card.token, json, function(data) {
|
bitpayService.post('/api/v2/' + card.token, json, function(data) {
|
||||||
$log.info('BitPay Get Transactions: SUCCESS');
|
$log.info('BitPay Get History: SUCCESS');
|
||||||
transactions = data.data.data || {};
|
history = data.data.data || {};
|
||||||
transactions['txs'] = _processTransactions(invoices, transactions.transactionList);
|
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) {
|
}, function(data) {
|
||||||
return cb(_setError('BitPay Card Error: Get Transactions', data));
|
return cb(_setError('BitPay Card Error: Get History', data));
|
||||||
});
|
});
|
||||||
}, function(data) {
|
}, function(data) {
|
||||||
return cb(_setError('BitPay Card Error: Get Invoices', data));
|
return cb(_setError('BitPay Card Error: Get Invoices', data));
|
||||||
|
@ -338,7 +430,22 @@ angular.module('copayApp.services').factory('bitpayCardService', function($log,
|
||||||
category: 'bp002',
|
category: 'bp002',
|
||||||
description: ''
|
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: {
|
merchant: {
|
||||||
name: 'Transaction Fee',
|
name: 'Transaction Fee',
|
||||||
},
|
},
|
||||||
|
|
|
@ -154,11 +154,13 @@
|
||||||
}
|
}
|
||||||
.tx-message {
|
.tx-message {
|
||||||
margin-right: 1rem;
|
margin-right: 1rem;
|
||||||
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
.tx-location {
|
.tx-location {
|
||||||
margin-right: 1rem;
|
margin-right: 1rem;
|
||||||
font-size: 12.5px;
|
font-size: 12.5px;
|
||||||
color: $v-light-gray;
|
color: $v-light-gray;
|
||||||
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
.tx-amount {
|
.tx-amount {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
|
|
|
@ -8,7 +8,9 @@
|
||||||
<div class="tx-title">
|
<div class="tx-title">
|
||||||
<div class="ellipsis">
|
<div class="ellipsis">
|
||||||
<div class="tx-message ellipsis">{{tx.merchant.name || 'Unknown Merchant'}}</div>
|
<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-show="tx.pending && tx.transactionId" class="size-12 tx-amount--pending">
|
||||||
<div ng-click="bitpayCard.viewOnBlockchain(tx.transactionId)">View Confirmation Status</div>
|
<div ng-click="bitpayCard.viewOnBlockchain(tx.transactionId)">View Confirmation Status</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -19,8 +21,8 @@
|
||||||
{{tx.price | currency:bitpayCard.currencySymbol:2 }}
|
{{tx.price | currency:bitpayCard.currencySymbol:2 }}
|
||||||
</span>
|
</span>
|
||||||
<div>
|
<div>
|
||||||
<time class="tx-time" ng-if="createdWithinPastDay(tx)">{{tx.timestamp | amTimeAgo}}</time>
|
<time class="tx-time" ng-if="createdWithinPastDay(tx)">{{tx.date | 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 | amDateFormat:'MMM D, YYYY'}}</time>
|
||||||
</div>
|
</div>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Reference in New Issue