ifin24-client 1.1.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.1.0
1
+ 1.3.0
data/bin/ifin24 CHANGED
@@ -12,6 +12,7 @@ require 'optparse'
12
12
  require 'ostruct'
13
13
 
14
14
  require 'ifin24'
15
+ include Ifin24
15
16
 
16
17
  class LoginError < StandardError
17
18
  end
@@ -30,15 +31,15 @@ class App
30
31
  def run
31
32
  parse_options!
32
33
 
33
- config = Ifin24::Configuration.instance
34
+ config = Configuration.instance
34
35
  login = @options.login || config[:login]
35
36
  password = @options.password || config[:password]
36
37
 
37
38
  begin
38
- client = Ifin24::Client.new(login, password)
39
+ client = Client.new(login, password)
39
40
  client.login or raise LoginError
40
41
 
41
- console = Ifin24::Console.new(client)
42
+ console = Console.new(client)
42
43
  console.main_menu
43
44
  rescue LoginError
44
45
  puts "Zły login lub hasło."
data/lib/ifin24/client.rb CHANGED
@@ -1,12 +1,13 @@
1
1
  require 'mechanize'
2
2
 
3
3
  class Ifin24::Client
4
+ include Ifin24::Models
4
5
 
5
- LOGIN_FORM_URL = 'https://www.ifin24.pl/logowanie'
6
- ENTRY_FORM_URL = 'https://www.ifin24.pl/zarzadzanie-finansami/transakcje/dodaj-wydatek'
6
+ LOGIN_FORM_URL = 'https://www.ifin24.pl/logowanie'.freeze
7
+ ENTRY_FORM_URL = 'https://www.ifin24.pl/zarzadzanie-finansami/transakcje/dodaj-wydatek'.freeze
7
8
 
8
- LIST_URL = 'https://www.ifin24.pl/zarzadzanie-finansami/transakcje/lista'
9
- LIMITS_URL = 'https://www.ifin24.pl/zarzadzanie-finansami/kontrola-wydatkow'
9
+ LIST_URL = 'https://www.ifin24.pl/zarzadzanie-finansami/transakcje/lista'.freeze
10
+ LIMITS_URL = 'https://www.ifin24.pl/zarzadzanie-finansami/kontrola-wydatkow'.freeze
10
11
 
11
12
  def initialize(login, password)
12
13
  @login, @password = login, password
@@ -54,7 +55,7 @@ class Ifin24::Client
54
55
  entry_elements = entry_row_element.search('td')
55
56
  next if entry_elements.size != 5
56
57
 
57
- entry = Ifin24::Models::Entry.new
58
+ entry = Entry.new
58
59
 
59
60
  title_column = entry_elements[2]
60
61
  entry.title = title_column.children[0].text.strip
@@ -64,7 +65,7 @@ class Ifin24::Client
64
65
  entry.date = date_column.text.strip
65
66
 
66
67
  category_column = entry_elements[3]
67
- sub_category = Ifin24::Models::Category.new(:name => category_column.children[0].text.strip)
68
+ sub_category = Category.new(:name => category_column.children[0].text.strip)
68
69
  entry.sub_category = sub_category
69
70
 
70
71
  entry.tags = category_column.search('span').text.strip
@@ -77,14 +78,20 @@ class Ifin24::Client
77
78
  return entries, total_pages
78
79
  end
79
80
 
80
- def fetch_limits
81
- page = agent.get(LIMITS_URL)
81
+ def fetch_limits(date = nil)
82
+ limits_url = "#{LIMITS_URL}"
83
+ if date
84
+ date = date.is_a?(Date) ? date.strftime("%Y-%m") : date
85
+ limits_url << "?data=#{date}"
86
+ end
87
+
88
+ page = agent.get(limits_url)
82
89
 
83
90
  limits = []
84
91
 
85
92
  table = page.search('table#expenses-tracking-limits tbody')
86
93
  table.search('tr').each do |tr|
87
- limit = Ifin24::Models::Limit.new
94
+ limit = Limit.new
88
95
  columns = tr.search('td')
89
96
 
90
97
  name_column = columns[0]
@@ -132,14 +139,14 @@ class Ifin24::Client
132
139
  next if category_without_children
133
140
 
134
141
  category_name = category_elem.children[0].text.strip
135
- category = Ifin24::Models::Category.new(:name => category_name)
142
+ category = Category.new(:name => category_name)
136
143
  children_element = category_elem.children[1].children.search('li')
137
144
 
138
145
  children_element.each do |child_elem|
139
146
  child_id = child_elem.attributes['rel'].value
140
147
  child_name = child_elem.text.strip
141
148
 
142
- child = Ifin24::Models::Category.new(:id => child_id, :name => child_name)
149
+ child = Category.new(:id => child_id, :name => child_name)
143
150
  category.children << child
144
151
  end
145
152
 
@@ -159,7 +166,7 @@ class Ifin24::Client
159
166
  next if id == '0' # skip the prompt
160
167
  name = account_elem.text.strip
161
168
 
162
- accounts << Ifin24::Models::Account.new(:id => id, :name => name)
169
+ accounts << Account.new(:id => id, :name => name)
163
170
  end
164
171
 
165
172
  return accounts
@@ -1,34 +1,24 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Ifin24::Commands::AddExpense < Ifin24::Commands::Base
4
+ include Ifin24::Models
4
5
 
5
6
  def execute
6
7
  entry = get_entry
7
8
 
8
- catch :all_ok do
9
- loop do
10
- choose do |menu|
11
- menu.index = :letter
12
- menu.index_suffix = ") "
13
-
14
- menu.choice("Nazwa: #{entry.title}") { get_title_for(entry) }
15
- menu.choice("Data: #{entry.date}") { get_date_for(entry) }
16
- menu.choice("Konto: #{entry.account.name}") { get_account_for(entry) }
17
- menu.choice("Kategoria: #{entry.category_full_name}") { get_category_for(entry) }
18
- menu.choice("Kwota: #{entry.amount}") { get_amount_for(entry) }
19
- menu.choice("Tagi: #{entry.tags}") { get_tags_for(entry) }
20
- menu.choice("Opis: #{entry.note}") { get_note_for(entry) }
21
-
22
- menu.choice("Powrót do głównego menu") do
23
- throw :all_ok
24
- end
25
-
26
- menu.choice("Wyślij") do
27
- puts "Wysyłanie danych..."
28
- @client.send_entry(entry)
29
- throw :all_ok
30
- end
31
- end
9
+ console_menu('Powrót do głównego menu') do |menu|
10
+ menu.choice("Nazwa: #{entry.title}") { get_title_for(entry) }
11
+ menu.choice("Data: #{entry.date}") { get_date_for(entry) }
12
+ menu.choice("Konto: #{entry.account.name}") { get_account_for(entry) }
13
+ menu.choice("Kategoria: #{entry.category_full_name}") { get_category_for(entry) }
14
+ menu.choice("Kwota: #{entry.amount}") { get_amount_for(entry) }
15
+ menu.choice("Tagi: #{entry.tags}") { get_tags_for(entry) }
16
+ menu.choice("Opis: #{entry.note}") { get_note_for(entry) }
17
+
18
+ menu.choice("Wyślij") do
19
+ puts "Wysyłanie danych..."
20
+ @client.send_entry(entry)
21
+ throw :exit
32
22
  end
33
23
  end
34
24
  end
@@ -36,7 +26,7 @@ class Ifin24::Commands::AddExpense < Ifin24::Commands::Base
36
26
  private
37
27
 
38
28
  def get_entry
39
- entry = Ifin24::Models::Entry.new
29
+ entry = Entry.new
40
30
 
41
31
  get_title_for(entry)
42
32
  get_date_for(entry)
@@ -54,9 +44,24 @@ class Ifin24::Commands::AddExpense < Ifin24::Commands::Base
54
44
  end
55
45
 
56
46
  def get_date_for(entry)
57
- curr_date = Date.today
58
- entry.date = ask('Data: ') do |q|
59
- q.default = curr_date
47
+ choose do |menu|
48
+ menu.prompt = 'Data: '
49
+
50
+ today = Date.today
51
+ menu.choice(today) do
52
+ entry.date = today
53
+ end
54
+
55
+ yesterday = today - 1
56
+ menu.choice(yesterday) do
57
+ entry.date = yesterday
58
+ end
59
+
60
+ menu.choice('Inna data') do
61
+ entry.date = ask('Data: ') do |q|
62
+ q.default = Date.today
63
+ end
64
+ end
60
65
  end
61
66
  end
62
67
 
@@ -1,4 +1,5 @@
1
1
  class Ifin24::Commands::Base
2
+ include Ifin24::Helpers::Menu
2
3
  include Ifin24::Helpers::Printer
3
4
 
4
5
  def initialize(client)
@@ -7,28 +7,19 @@ class Ifin24::Commands::ListEntries < Ifin24::Commands::Base
7
7
  list, pages = @client.fetch_entries(current_page)
8
8
  print_entries(list)
9
9
 
10
- catch :exit do
11
- loop do
12
- choose do |menu|
13
- menu.index = :letter
14
- menu.index_suffix = ") "
10
+ console_menu('Powrót do głównego menu') do |menu|
11
+ menu.choice("Poprzednia strona") do
12
+ current_page -= 1 if current_page > 1
15
13
 
16
- menu.choice("Poprzednia strona") do
17
- current_page -= 1 if current_page > 1
18
-
19
- list, pages = @client.fetch_entries(current_page)
20
- print_entries(list)
21
- end
22
-
23
- menu.choice("Następna strona") do
24
- current_page += 1 if current_page < pages
14
+ list, pages = @client.fetch_entries(current_page)
15
+ print_entries(list)
16
+ end
25
17
 
26
- list, pages = @client.fetch_entries(current_page)
27
- print_entries(list)
28
- end
18
+ menu.choice("Następna strona") do
19
+ current_page += 1 if current_page < pages
29
20
 
30
- menu.choice("Powrót do głównego menu") { throw :exit }
31
- end
21
+ list, pages = @client.fetch_entries(current_page)
22
+ print_entries(list)
32
23
  end
33
24
  end
34
25
  end
@@ -1,21 +1,52 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Ifin24::Commands::ListLimits < Ifin24::Commands::Base
4
- LIMIT_BAR_SIZE = 50
4
+ LIMIT_BAR_SIZE = 64
5
5
 
6
6
  def execute
7
- limits = @client.fetch_limits
7
+ curr_date = Date.today
8
+ limits = @client.fetch_limits(curr_date)
9
+ print_report(limits)
10
+
11
+ console_menu('Powrót do głównego menu') do |menu|
12
+ menu.choice("Poprzedni miesiąc") do
13
+ curr_date = curr_date << 1
14
+
15
+ limits = @client.fetch_limits(curr_date)
16
+ print_report(limits)
17
+ end
18
+
19
+ menu.choice("Następny miesiąc") do
20
+ curr_date = curr_date >> 1
21
+
22
+ limits = @client.fetch_limits(curr_date)
23
+ print_report(limits)
24
+ end
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def print_report(limits)
31
+ widest_name_size = limits.inject(0) { |max, limit| limit.name.size >= max ? limit.name.size : max }
32
+
8
33
  limits.each do |limit|
9
- widest_name_size = limits.map { |l| l.name }.inject(0) { |max, name| name.size >= max ? name.size : max }
10
34
  name = limit.name.ljust(widest_name_size)
11
35
  limit_bar = make_limit_bar(limit.amount, limit.max)
12
- amount = "#{limit.amount}zł z #{limit.max}zł"
36
+ amount_summary = "#{limit.amount}zł z #{limit.max}zł"
13
37
 
14
- puts "#{name} #{limit_bar} #{amount}"
38
+ puts "#{name} #{limit_bar} #{amount_summary}"
15
39
  end
16
- end
17
40
 
18
- private
41
+ total_amount = limits.inject(0) { |sum, limit| sum += limit.amount }
42
+ total_max = limits.inject(0) { |sum, limit| sum += limit.max }
43
+
44
+ total_name = 'Podsumowanie:'.ljust(widest_name_size)
45
+ total_limit_bar = make_limit_bar(total_amount, total_max)
46
+ total_amount_summary = "#{total_amount}zł z #{total_max}zł"
47
+
48
+ puts "\n#{total_name} #{total_limit_bar} #{total_amount_summary}"
49
+ end
19
50
 
20
51
  def make_limit_bar(amount, max)
21
52
  limit_exceeded = amount >= max
@@ -1,44 +1,38 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  class Ifin24::Console
4
+ include Ifin24
5
+ include Helpers::Menu
4
6
 
5
7
  def initialize(client)
6
8
  @client = client
7
9
  end
8
10
 
9
11
  def main_menu
10
- catch :exit do
11
- loop do
12
- choose do |menu|
13
- menu.header = "Menu główne"
14
- menu.index = :letter
15
- menu.index_suffix = ") "
16
-
17
- menu.choice("Dodaj wydatek") { add_expense }
18
- menu.choice("Lista kont") { list_accounts }
19
- menu.choice("Lista ostatnich transakcji") { list_entries }
20
- menu.choice("Kontrola wydatków") { list_limits }
21
-
22
- menu.choice("Koniec") { throw :exit }
23
- end
24
- end
12
+ console_menu('Koniec') do |menu|
13
+ menu.header = "Menu główne"
14
+
15
+ menu.choice("Dodaj wydatek") { add_expense }
16
+ menu.choice("Lista kont") { list_accounts }
17
+ menu.choice("Lista ostatnich transakcji") { list_entries }
18
+ menu.choice("Kontrola wydatków") { list_limits }
25
19
  end
26
20
  end
27
21
 
28
22
  def add_expense
29
- execute_command(Ifin24::Commands::AddExpense)
23
+ execute_command(Commands::AddExpense)
30
24
  end
31
25
 
32
26
  def list_accounts
33
- execute_command(Ifin24::Commands::ListAccounts)
27
+ execute_command(Commands::ListAccounts)
34
28
  end
35
29
 
36
30
  def list_entries
37
- execute_command(Ifin24::Commands::ListEntries)
31
+ execute_command(Commands::ListEntries)
38
32
  end
39
33
 
40
34
  def list_limits
41
- execute_command(Ifin24::Commands::ListLimits)
35
+ execute_command(Commands::ListLimits)
42
36
  end
43
37
 
44
38
  private
@@ -1,5 +1,6 @@
1
1
  module Ifin24::Helpers
2
2
 
3
+ autoload :Menu, 'ifin24/helpers/menu'
3
4
  autoload :Printer, 'ifin24/helpers/printer'
4
5
 
5
6
  end
@@ -0,0 +1,20 @@
1
+ module Ifin24::Helpers
2
+ module Menu
3
+
4
+ def console_menu(exit_prompt)
5
+ catch :exit do
6
+ loop do
7
+ choose do |menu|
8
+ menu.index = :letter
9
+ menu.index_suffix = ") "
10
+
11
+ yield menu
12
+
13
+ menu.choice(exit_prompt) { throw :exit }
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -1,11 +1,9 @@
1
1
  class Ifin24::Models::Base
2
2
 
3
3
  def initialize(attributes = {})
4
-
5
4
  attributes.each do |key, value|
6
5
  send(:"#{key}=", value)
7
6
  end
8
-
9
7
  end
10
8
 
11
9
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ifin24-client
3
3
  version: !ruby/object:Gem::Version
4
- hash: 19
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 1
8
- - 1
8
+ - 3
9
9
  - 0
10
- version: 1.1.0
10
+ version: 1.3.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - "\xC5\x81ukasz Bandzarewicz"
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-08-30 00:00:00 +02:00
18
+ date: 2010-10-22 00:00:00 +02:00
19
19
  default_executable: ifin24
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -120,6 +120,7 @@ files:
120
120
  - lib/ifin24/configuration.rb
121
121
  - lib/ifin24/console.rb
122
122
  - lib/ifin24/helpers.rb
123
+ - lib/ifin24/helpers/menu.rb
123
124
  - lib/ifin24/helpers/printer.rb
124
125
  - lib/ifin24/models.rb
125
126
  - lib/ifin24/models/account.rb