Skip to content

Instantly share code, notes, and snippets.

@LukasPol
Last active March 3, 2022 21:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save LukasPol/b1387500a8cd5817db01f7c267111492 to your computer and use it in GitHub Desktop.
Save LukasPol/b1387500a8cd5817db01f7c267111492 to your computer and use it in GitHub Desktop.
require 'csv'
file = CSV.read('arq.csv', headers: true, col_sep: ';')
stocks = file['Produto'].uniq.sort
receives = {
'dividendo': [],
'jcp': []
}
stocks.each do |stock|
proventos = [
{ id: :dividendo, value: 'Dividendo' },
{ id: :jcp, value: 'Juros Sobre Capital Próprio' }
]
proventos.each do |provento|
price = 0
if receives[provento[:id]].find {|s| s.first[0..4] == stock[0..4]}
next
end
rows = file.select { |r| r['Produto'][0..4] == stock[0..4] && r['Movimentação'] == provento[:value] }
unless rows.empty?
rows.each do |row|
value = row['Valor da Operação'].delete(' R$')
value.gsub!(',', '.')
price += value.to_f
end
receives[provento[:id]] << [stock, price]
end
end
end
p receives
CSV.open('myProventos.csv', 'w', col_sep: ';') do |csv|
csv << ['Ação', 'Valor', 'Provento']
receives.each do |r|
receives[r.first].each do |prov|
csv << [prov.first, prov.last, r.first]
end
end
end
# Script para gerar um novo CSV já 'pronto' para para declarar suas ações no IR.
# 1. Entra no site da B3
# 2. Baixe o extrato na aba negociações com filtro desejado
# 3. Converta o excel em csv com separador `;`, dá para fazer pelo libreoffice ou excel
# 4. na linha 10 colocar o nome do arquivo correto
# 5. Execute o script
require 'csv'
file = CSV.read('arq.csv', headers: true, col_sep: ';')
stocks = file['Código de Negociação'].uniq.sort
info_stocks = []
stocks.each do |stock|
price = 0
quantity = 0
profit = 0
rows = file.select { |r| r['Código de Negociação'] == stock }
rows.each do |row|
value = row['Valor'].delete(' R$')
value.gsub!(',', '.')
if row['Tipo de Movimentação'] == 'Compra'
price += value.to_f
quantity += row['Quantidade'].to_i
else
price -= value.to_f
quantity -= row['Quantidade'].to_i
end
end
if quantity.positive?
average_price = (price / quantity).to_f.round(2)
else
average_price = 0
profit = price.round(2) * -1
end
info_stocks << [stock, average_price, quantity, profit]
end
p info_stocks
CSV.open('myStocks.csv', 'w', col_sep: ';') do |csv|
csv << ['Ação', 'Preço médio', 'Quantidade', 'Lucro']
info_stocks.each do |stock|
csv << stock
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment