|
// Nubank transaction element |
|
// <div class="event-card transaction"> |
|
// <span class="category">eletrônicos</span> |
|
// <h4 class="merchant">Google Play</h4> |
|
// <div class="amount">R$ 6,66</div> |
|
// <span class="tags"> |
|
// <span class="tag">android</span> |
|
// <span class="tag">apps</span> |
|
// </span> |
|
// <span class="time">32 Janeiro</span> |
|
// </div> |
|
|
|
(function($) { |
|
'use strict'; |
|
|
|
var instance, |
|
MONTHS = [ null, 'Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', |
|
'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez' ]; |
|
|
|
function Nubank2CSV() { |
|
this.chargesElements = $('.transaction:visible'); |
|
} |
|
|
|
Nubank2CSV.prototype = { |
|
init: function() { |
|
this.checkPage(); |
|
this.charges = this.parseCharges(); |
|
this.downloadFile(); |
|
}, |
|
checkPage: function() { |
|
if (location.hash !== "#/transactions") { |
|
alert('vá para a págian de transações e tente novamente!'); |
|
throw 'Nubank2CSV: wrong page'; |
|
} |
|
}, |
|
parseCharges: function() { |
|
var callback = _.bind(function(el) { |
|
var charge = $(el); |
|
|
|
return { |
|
date: this.parseDate(charge), |
|
payee: this.parsePayee(charge), |
|
category: this.parseCategory(charge), |
|
memo: this.parseMemo(charge), |
|
outflow: this.parseOutflow(charge), |
|
inflow: this.parseInflow(charge) |
|
}; |
|
}, this); |
|
|
|
return this.chargesElements.get().map(callback); |
|
}, |
|
parseDate: function(charge) { |
|
var text = charge.find('.time').text(), |
|
values = text.trim().split(' '), |
|
|
|
// TODO: find a way to stop guessing the year |
|
year = (new Date()).getFullYear(), |
|
month = MONTHS.indexOf(values[1]), |
|
day = values[0]; |
|
|
|
return [day, month, year].join('/'); |
|
}, |
|
parsePayee: function(charge) { |
|
return charge.find('.description').text(); |
|
}, |
|
parseCategory: function(charge) { |
|
return charge.find('.title').text(); |
|
}, |
|
parseMemo: function(charge) { |
|
var tags = charge.find('.tag').map(function(i, tag) { |
|
return $(tag).text(); |
|
}).get(); |
|
|
|
return tags.join(' - '); |
|
}, |
|
parseOutflow: function(charge) { |
|
return this.parseValue(charge); |
|
}, |
|
parseInflow: function(charge) { |
|
return ''; |
|
}, |
|
parseValue: function(charge) { |
|
return charge.find('.amount').text() |
|
.replace(/R\$ /, '') |
|
.replace(',', '.'); |
|
}, |
|
toCSV: function() { |
|
var charges = this.charges.map(function(l) { |
|
return [ |
|
l.date, l.payee, l.category, l.memo, l.outflow, l.inflow |
|
].join(','); |
|
}); |
|
|
|
charges.unshift('Date,Payee,Category,Memo,Outflow,Inflow'); |
|
|
|
return charges.join('\n'); |
|
}, |
|
filename: function() { |
|
var filter = $('#timeChart .filter').text(); |
|
return ['Nubank2CSV ', filter, '.csv'].join(''); |
|
}, |
|
link: function() { |
|
return '<a href="data:attachment/csv;base64,' + btoa(this.toCSV()) + |
|
'" id="nubank2csv" target="_blank" download="' + this.filename() + '">Nubank2CSV</a>'; |
|
}, |
|
downloadFile: function() { |
|
$('body').append(this.link()); |
|
|
|
var link = $('#nubank2csv').get(0); |
|
|
|
// FIXME: phantomjs don't have the `#click` method |
|
if (typeof link.click === 'function') { |
|
// INFO: download only works through the native `click` API |
|
link.click(); |
|
} |
|
|
|
link.remove(); |
|
} |
|
}; |
|
|
|
window.Nubank2CSV = Nubank2CSV; |
|
|
|
var n = new Nubank2CSV(); |
|
n.init(); |
|
}(jQuery)); |