-
Notifications
You must be signed in to change notification settings - Fork 2
/
statements_dashboard.rb
130 lines (112 loc) · 3.74 KB
/
statements_dashboard.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
require 'json'
require 'securerandom'
require_relative 'web_session'
module BancoDoBrasil
class StatementsDashboard
include WebSession
CODE_FOR_STATEMENT = {
'Conta-corrente' => {
'Conta Corrente' => 3469,
},
'Investimentos' => {
'Fundos de investimento' => 3910,
'CDB/RDB e BB Reaplic' => 3911,
'LCA' => 3912,
'LCI' => 3913,
'Compromissada BB Aplic' => 3914,
'Ações na instituição depositária - Quantidade' => 3915,
'Ações na instituição depositária - Dividendos' => 3916,
'Tesouro Direto' => 3917,
'Certificado de Operações Estruturadas' => 4197
},
'Poupança' => {
'Extrato' => 3909
},
'Ourocap' => {
'Extrato' => 3687
}
}.freeze
def initialize(branch, account, password)
@branch = branch
@account = account
@password = password
end
def fetch_all
%i(lci ourocap savings).map do |investment|
data = send(investment)
[investment, { 'data' => data }]
end
end
def lci
authenticate
click_for('Investimentos', 'LCI') and
page.has_content?('LCI - Letra de Crédito Imobiliário')
table_lines = all('.transacao-corpo tr')[1..-2]
data = table_lines.map do |line|
line.all('th, td').map(&:text)
end
attributes = data[0]
data[1..-1].map { |values| Hash[attributes.zip(values)] }
end
def ourocap
authenticate
click_for('Ourocap', 'Extrato') and
page.has_content?('Extrato de Capitalização Ourocap')
investments = all('.listaOurocap tr')[2..-1]
investments.each_with_index.map do |investment, index|
click_for('Ourocap', 'Extrato') if index > 0
investment.find('td:nth-child(1) [type="radio"]').click
find('#botaoContinua').click and
page.has_content?('Ultimos 12 (doze) meses')
find('#botaoContinua2').click and
page.has_content?('Dados do Título')
attributes = all('.tabelaDescricao .campo span')
.map(&:text).each_slice(2).to_a
table_lines = all('.tabelaExtrato tr')
data = table_lines.map do |line|
line.all('th, td').map(&:text)
end
statement = data[1..-1].map { |values| Hash[data[0].zip(values)] }
{
description: Hash[attributes],
statement: statement
}
end
end
def savings
authenticate
click_for('Poupança', 'Extrato') and
page.has_content?('Selecione a variação')
accounts = all('.elemento-variacao a')
accounts_data = accounts.each_with_index.map do |account, index|
if index > 0
account.click and
within('.poupanca-lancamentos-corpo') { page.has_content?('Saldo') }
end
table_lines = all('.poupanca-lancamentos-cabecalho, .poupanca-lancamentos-corpo > *')[0..-5]
data = table_lines.map do |line|
line.all(:xpath, 'div')[1..-1].map(&:text)
end
attributes = data[0]
[account.text, data[1..-1].map { |values| Hash[attributes.zip(values)] }]
end
Hash[accounts_data]
end
private
def click_for(category, investment_type)
find("[nome='#{category}']").click
find("[codigo='#{code_for(category, investment_type)}']").click
end
def parse_savings_table
table_lines = all('.poupanca-lancamentos-cabecalho, .poupanca-lancamentos-corpo > *')[0..-5]
data = table_lines.map do |line|
line.all(:xpath, 'div')[1..-1].map(&:text)
end
attributes = data[0]
data[1..-1].map { |values| Hash[attributes.zip(values)] }
end
def code_for(category, type)
CODE_FOR_STATEMENT[category][type]
end
end
end