plutus 0.11.0 → 0.16

Sign up to get free protection for your applications and to get access to all the features.
Files changed (64) hide show
  1. checksums.yaml +5 -5
  2. data/README.markdown +66 -40
  3. data/app/assets/javascripts/plutus/application.js +5 -4
  4. data/app/assets/javascripts/plutus/reports.js +5 -0
  5. data/app/assets/stylesheets/bootstrap-theme.min.css +5 -0
  6. data/app/assets/stylesheets/bootstrap.min.css +5 -0
  7. data/app/assets/stylesheets/plutus/application.css +11 -5
  8. data/app/controllers/plutus/accounts_controller.rb +1 -16
  9. data/app/controllers/plutus/application_controller.rb +4 -0
  10. data/app/controllers/plutus/entries_controller.rb +7 -17
  11. data/app/controllers/plutus/reports_controller.rb +40 -0
  12. data/app/models/plutus/account.rb +92 -7
  13. data/app/models/plutus/amount.rb +2 -11
  14. data/app/models/plutus/amounts_extension.rb +31 -6
  15. data/app/models/plutus/asset.rb +21 -18
  16. data/app/models/plutus/entry.rb +15 -3
  17. data/app/models/plutus/equity.rb +22 -19
  18. data/app/models/plutus/expense.rb +21 -18
  19. data/app/models/plutus/liability.rb +27 -19
  20. data/app/models/plutus/revenue.rb +22 -19
  21. data/app/models/plutus/tenancy.rb +5 -1
  22. data/app/views/layouts/plutus/_messages.html.erb +9 -0
  23. data/app/views/layouts/plutus/_navigation.html.erb +19 -0
  24. data/app/views/layouts/plutus/_navigation_links.html.erb +5 -0
  25. data/app/views/layouts/plutus/application.html.erb +19 -0
  26. data/app/views/plutus/accounts/index.html.erb +9 -12
  27. data/app/views/plutus/entries/index.html.erb +22 -11
  28. data/app/views/plutus/reports/_account.html.erb +28 -0
  29. data/app/views/plutus/reports/balance_sheet.html.erb +21 -0
  30. data/app/views/plutus/reports/income_statement.html.erb +24 -0
  31. data/config/routes.rb +6 -3
  32. data/{lib/generators/plutus/templates/migration.rb → db/migrate/20160422010135_create_plutus_tables.rb} +6 -10
  33. data/lib/generators/plutus/add_date_upgrade_generator.rb +11 -0
  34. data/lib/generators/plutus/base_generator.rb +19 -0
  35. data/lib/generators/plutus/plutus_generator.rb +8 -22
  36. data/lib/generators/plutus/templates/add_date_migration.rb +12 -0
  37. data/lib/generators/plutus/templates/tenant_migration.rb +1 -1
  38. data/lib/generators/plutus/templates/update_migration.rb +2 -2
  39. data/lib/generators/plutus/tenancy_generator.rb +2 -17
  40. data/lib/generators/plutus/upgrade_plutus_generator.rb +6 -22
  41. data/lib/plutus.rb +2 -5
  42. data/lib/plutus/engine.rb +5 -0
  43. data/lib/plutus/version.rb +1 -1
  44. data/spec/controllers/accounts_controller_spec.rb +11 -20
  45. data/spec/controllers/entries_controller_spec.rb +11 -20
  46. data/spec/controllers/reports_controller_spec.rb +24 -0
  47. data/spec/factories/account_factory.rb +6 -6
  48. data/spec/factories/amount_factory.rb +3 -3
  49. data/spec/factories/entry_factory.rb +1 -1
  50. data/spec/factories/tenant_factory.rb +12 -0
  51. data/spec/models/account_spec.rb +71 -8
  52. data/spec/models/amount_spec.rb +6 -1
  53. data/spec/models/entry_spec.rb +35 -63
  54. data/spec/models/tenancy_spec.rb +26 -8
  55. data/spec/routing/accounts_routing_spec.rb +6 -25
  56. data/spec/routing/entries_routing_spec.rb +6 -25
  57. data/spec/spec_helper.rb +4 -2
  58. data/spec/support/account_shared_examples.rb +14 -10
  59. data/spec/support/amount_shared_examples.rb +4 -4
  60. data/spec/support/shoulda_matchers.rb +8 -0
  61. metadata +100 -28
  62. data/app/views/plutus/accounts/show.html.erb +0 -59
  63. data/app/views/plutus/entries/show.html.erb +0 -46
  64. data/spec/schema.rb +0 -31
@@ -5,7 +5,11 @@ module Plutus
5
5
  included do
6
6
  validates :name, presence: true, uniqueness: { scope: :tenant_id }
7
7
 
8
- belongs_to :tenant, class_name: Plutus.tenant_class
8
+ if ActiveRecord::VERSION::MAJOR > 4
9
+ belongs_to :tenant, class_name: Plutus.tenant_class, optional: true
10
+ else
11
+ belongs_to :tenant, class_name: Plutus.tenant_class
12
+ end
9
13
  end
10
14
  end
11
15
  end
@@ -0,0 +1,9 @@
1
+ <%# Rails flash messages styled for Bootstrap 3.0 %>
2
+ <% flash.each do |name, msg| %>
3
+ <% if msg.is_a?(String) %>
4
+ <div class="alert alert-<%= name.to_s == 'notice' ? 'success' : 'danger' %>">
5
+ <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
6
+ <%= content_tag :div, msg, :id => "flash_#{name}" %>
7
+ </div>
8
+ <% end %>
9
+ <% end %>
@@ -0,0 +1,19 @@
1
+ <%# navigation styled for Bootstrap 3.0 %>
2
+ <nav class="navbar navbar-default navbar-fixed-top">
3
+ <div class="container">
4
+ <div class="navbar-header">
5
+ <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
6
+ <span class="sr-only">Toggle navigation</span>
7
+ <span class="icon-bar"></span>
8
+ <span class="icon-bar"></span>
9
+ <span class="icon-bar"></span>
10
+ </button>
11
+ <a class="navbar-brand" href="/">&nbsp;Plutus</a>
12
+ </div>
13
+ <div class="collapse navbar-collapse">
14
+ <ul class="nav navbar-nav">
15
+ <%= render 'layouts/plutus/navigation_links' %>
16
+ </ul>
17
+ </div>
18
+ </div>
19
+ </nav>
@@ -0,0 +1,5 @@
1
+ <%# add navigation links to this file %>
2
+ <li><%= link_to "Balance Sheet", reports_balance_sheet_path%></li>
3
+ <li><%= link_to "Income Statement", reports_income_statement_path%></li>
4
+ <li><%= link_to "General Ledger", accounts_path%></li>
5
+ <li><%= link_to "Journal", entries_path%></li>
@@ -0,0 +1,19 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
5
+ <title>Plutus</title>
6
+ <%= stylesheet_link_tag "plutus/application", media: "all" %>
7
+ <%= javascript_include_tag "plutus/application" %>
8
+ <%= csrf_meta_tags %>
9
+ </head>
10
+ <body>
11
+ <header>
12
+ <%= render 'layouts/plutus/navigation' %>
13
+ </header>
14
+ <main role="main">
15
+ <%= render 'layouts/plutus/messages' %>
16
+ <%= yield %>
17
+ </main>
18
+ </body>
19
+ </html>
@@ -1,9 +1,11 @@
1
- <div class="plutus_container">
2
- <h1>Listing Accounts</h1>
1
+ <div class="container">
2
+ <center>
3
+ <h1>General Ledger</h1>
4
+ <br>
5
+ </center>
3
6
 
4
- <table>
7
+ <table class="table table-striped table-hover">
5
8
  <tr>
6
- <th class="nobg">ID</th>
7
9
  <th>Name</th>
8
10
  <th>Type</th>
9
11
  <th>Credit Balance</th>
@@ -13,17 +15,12 @@
13
15
 
14
16
  <% @accounts.each do |account| %>
15
17
  <tr class="<%= cycle("even", "odd") -%>">
16
- <td><%=link_to(account.id, account_path(account.id)) %></td>
17
18
  <td><%=h account.name %></td>
18
19
  <td><%=h account.type.sub('Plutus::','') %></td>
19
- <td><%=h account.credits_balance %></td>
20
- <td><%=h account.debits_balance %></td>
21
- <td><%=h account.balance %></td>
20
+ <td><%=h account.credits_balance.round(2) %></td>
21
+ <td><%=h account.debits_balance.round(2) %></td>
22
+ <td><%=h account.balance.round(2) %></td>
22
23
  </tr>
23
24
  <% end %>
24
25
  </table>
25
-
26
- <br />
27
-
28
- <h3>Go to <%= link_to 'Entries', entries_path %></h3>
29
26
  </div>
@@ -1,10 +1,19 @@
1
- <div class="plutus_container">
2
- <h1>Entries</h1>
1
+ <div class="container">
2
+ <center>
3
+ <h1>Journal</h1>
4
+ <br>
5
+ <%= form_tag({:action => 'index'}, {:method => :get, :class => 'form-inline'}) do%>
6
+ <div class="form-group">
7
+ Per page: <%= select_tag :limit, options_for_select([25, 100, 200, 300], selected: params[:limit]), class: 'form-control' %>
8
+ Order: <%= select_tag :order, options_for_select(['descending', 'ascending'], selected: params[:order]), class: 'form-control' %>
9
+ </div>
10
+ <button type="submit" class="btn btn-default">Refresh</button>
11
+ <% end %>
12
+ </center>
3
13
 
4
- <table cellspacing="0">
14
+ <table class="table table-striped table-hover">
5
15
  <thead>
6
16
  <tr>
7
- <th class="nobg">ID</th>
8
17
  <th>Description</th>
9
18
  <th>Debits</th>
10
19
  <th>Credits</th>
@@ -14,7 +23,6 @@
14
23
  <tbody>
15
24
  <% @entries.each do |entry| %>
16
25
  <tr class="<%= cycle("even", "odd") -%>">
17
- <td><%=link_to(entry.id, entry_path(entry)) %></td>
18
26
  <td><%=h entry.description %></td>
19
27
  <td></td>
20
28
  <td></td>
@@ -22,27 +30,30 @@
22
30
  </tr>
23
31
  <% entry.debit_amounts.each do |debit_amount| %>
24
32
  <tr class="<%= cycle("odd", "odd") -%>">
25
- <td></td>
26
33
  <td>&nbsp;&nbsp;&nbsp;&nbsp;<%=h "#{debit_amount.account.name}" %></td>
27
- <td><%=h debit_amount.amount %></td>
34
+ <td><%=h debit_amount.amount.round(2) %></td>
28
35
  <td></td>
29
36
  <td></td>
30
37
  </tr>
31
38
  <% end %>
32
39
  <% entry.credit_amounts.each do |credit_amount| %>
33
40
  <tr class="<%= cycle("odd", "odd") -%>">
34
- <td></td>
35
41
  <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<%=h "#{credit_amount.account.name}" %></td>
36
42
  <td></td>
37
- <td><%=h credit_amount.amount %></td>
43
+ <td><%=h credit_amount.amount.round(2) %></td>
38
44
  <td></td>
39
45
  </tr>
40
46
  <% end %>
47
+ <tr class="<%= cycle("odd", "odd") -%>">
48
+ <td></td>
49
+ <td></td>
50
+ <td></td>
51
+ <td></td>
52
+ </tr>
41
53
  <% end %>
42
54
  </tbody>
43
55
  </table>
44
56
 
45
- <br />
57
+ <%= paginate @entries %>
46
58
 
47
- <h3>Go to <%= link_to 'Accounts', accounts_path %></h3>
48
59
  </div>
@@ -0,0 +1,28 @@
1
+ <table class="table table-striped table-hover">
2
+ <caption class="text-left"><b><%=name%></b></caption>
3
+ <thead>
4
+ <tr>
5
+ <th></th>
6
+ <th></th>
7
+ </tr>
8
+ </thead>
9
+ <% if accounts.count > 0%>
10
+ <tbody>
11
+ <% running_total = 0 %>
12
+ <% accounts.each do |account| %>
13
+ <% balance = account.balance(:from_date => @from_date, :to_date => @to_date) %>
14
+ <tr class="<%= cycle("even", "odd") -%>">
15
+ <td><%=h account.name %></td>
16
+ <td><%=h balance.round(2) %></td>
17
+ <% running_total += balance %>
18
+ </tr>
19
+ <% end %>
20
+ <tr class="<%= cycle("even", "odd") -%>">
21
+ <strong>
22
+ <td>Total <%= name %></td>
23
+ <td><%= running_total.round(2) %></td>
24
+ </strong>
25
+ </tr>
26
+ </tbody>
27
+ <% end %>
28
+ </table>
@@ -0,0 +1,21 @@
1
+ <div class="container">
2
+ <center>
3
+ <h1>Balance Sheet</h1>
4
+
5
+ <%= form_tag({:action => 'balance_sheet'}, {:method => :get, :class => 'form-inline'}) do%>
6
+ <div class="form-group">
7
+ <%= label_tag :date, nil, class: 'sr-only'%>
8
+ <%= text_field_tag :date, @to_date, :class => 'datepicker form-control' %>
9
+ </div>
10
+ <button type="submit" class="btn btn-default">Get Report</button>
11
+ <% end %>
12
+ </center>
13
+
14
+ <br>
15
+
16
+ <%= render 'account', :name => "Assets", :accounts => @assets %>
17
+ <%= render 'account', :name => "Liabilities", :accounts => @liabilities %>
18
+ <%= render 'account', :name => "Equity", :accounts => @equity %>
19
+
20
+
21
+ </div>
@@ -0,0 +1,24 @@
1
+ <div class="container">
2
+ <center>
3
+ <h1>Income Statement</h1>
4
+
5
+ <%= form_tag({:action => 'income_statement'}, {:method => :get, :class => 'form-inline'}) do%>
6
+ <div class="form-group">
7
+ <%= label_tag :from_date, nil, class: 'sr-only'%>
8
+ <%= text_field_tag :from_date, @from_date, :class => 'datepicker form-control', :placeholder => "Date" %>
9
+ </div>
10
+ <div class="form-group">
11
+ <%= label_tag :to_date, nil, class: 'sr-only'%>
12
+ <%= text_field_tag :to_date, @to_date, :class => 'datepicker form-control', :placeholder => "Date" %>
13
+ </div>
14
+ <button type="submit" class="btn btn-default">Get Report</button>
15
+ <% end %>
16
+ </center>
17
+
18
+ <br>
19
+
20
+ <%= render 'account', :name => "Revenues", :accounts => @revenues %>
21
+ <%= render 'account', :name => "Expenses", :accounts => @expenses %>
22
+
23
+
24
+ </div>
@@ -1,6 +1,9 @@
1
1
  Plutus::Engine.routes.draw do
2
- root :to => "accounts#index"
2
+ root :to => 'reports#balance_sheet'
3
3
 
4
- resources :accounts
5
- resources :entries
4
+ get 'reports/balance_sheet' => 'reports#balance_sheet'
5
+ get 'reports/income_statement' => 'reports#income_statement'
6
+
7
+ resources :accounts, only: [:index]
8
+ resources :entries, only: [:index]
6
9
  end
@@ -1,9 +1,9 @@
1
- class CreatePlutusTables < ActiveRecord::Migration
2
- def self.up
1
+ class CreatePlutusTables < ActiveRecord::Migration[4.2]
2
+ def change
3
3
  create_table :plutus_accounts do |t|
4
4
  t.string :name
5
5
  t.string :type
6
- t.boolean :contra
6
+ t.boolean :contra, default: false
7
7
 
8
8
  t.timestamps
9
9
  end
@@ -11,11 +11,13 @@ class CreatePlutusTables < ActiveRecord::Migration
11
11
 
12
12
  create_table :plutus_entries do |t|
13
13
  t.string :description
14
+ t.date :date
14
15
  t.integer :commercial_document_id
15
16
  t.string :commercial_document_type
16
17
 
17
18
  t.timestamps
18
19
  end
20
+ add_index :plutus_entries, :date
19
21
  add_index :plutus_entries, [:commercial_document_id, :commercial_document_type], :name => "index_entries_on_commercial_doc"
20
22
 
21
23
  create_table :plutus_amounts do |t|
@@ -23,15 +25,9 @@ class CreatePlutusTables < ActiveRecord::Migration
23
25
  t.references :account
24
26
  t.references :entry
25
27
  t.decimal :amount, :precision => 20, :scale => 10
26
- end
28
+ end
27
29
  add_index :plutus_amounts, :type
28
30
  add_index :plutus_amounts, [:account_id, :entry_id]
29
31
  add_index :plutus_amounts, [:entry_id, :account_id]
30
32
  end
31
-
32
- def self.down
33
- drop_table :plutus_accounts
34
- drop_table :plutus_entries
35
- drop_table :plutus_amounts
36
- end
37
33
  end
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+ require_relative 'base_generator'
4
+
5
+ module Plutus
6
+ class AddDateUpgradeGenerator < BaseGenerator
7
+ def create_migration_file
8
+ migration_template 'add_date_migration.rb', 'db/migrate/add_date_to_plutus_entries.rb'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Plutus
2
+ class BaseGenerator < Rails::Generators::Base
3
+ include Rails::Generators::Migration
4
+
5
+ def self.source_root
6
+ @source_root ||= File.join(File.dirname(__FILE__), 'templates')
7
+ end
8
+
9
+ # Implement the required interface for Rails::Generators::Migration.
10
+ # See http://apidock.com/rails/ActiveRecord/Generators/Base/next_migration_number/class
11
+ def self.next_migration_number(dirname)
12
+ if ActiveRecord::Base.timestamped_migrations
13
+ Time.now.utc.strftime("%Y%m%d%H%M%S")
14
+ else
15
+ "%.3d" % (current_migration_number(dirname) + 1)
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,26 +1,12 @@
1
1
  # lib/generators/plutus/plutus_generator.rb
2
2
  require 'rails/generators'
3
3
  require 'rails/generators/migration'
4
-
5
- class PlutusGenerator < Rails::Generators::Base
6
- include Rails::Generators::Migration
7
-
8
- def self.source_root
9
- @source_root ||= File.join(File.dirname(__FILE__), 'templates')
10
- end
11
-
12
- # Implement the required interface for Rails::Generators::Migration.
13
- # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
14
- def self.next_migration_number(dirname)
15
- if ActiveRecord::Base.timestamped_migrations
16
- Time.now.utc.strftime("%Y%m%d%H%M%S")
17
- else
18
- "%.3d" % (current_migration_number(dirname) + 1)
19
- end
20
- end
21
-
22
- def create_migration_file
23
- migration_template 'migration.rb', 'db/migrate/create_plutus_tables.rb'
24
- end
25
-
4
+ require_relative 'base_generator'
5
+
6
+ module Plutus
7
+ class PlutusGenerator < BaseGenerator
8
+ def create_migration_file
9
+ migration_template 'migration.rb', 'db/migrate/create_plutus_tables.rb'
10
+ end
11
+ end
26
12
  end
@@ -0,0 +1,12 @@
1
+ class AddDateToPlutusEntries < ActiveRecord::Migration[4.2]
2
+ def change
3
+ add_column :plutus_entries, :date, :date
4
+ add_index :plutus_entries, :date
5
+
6
+ execute <<-SQL
7
+ UPDATE plutus_entries
8
+ SET date = created_at
9
+ WHERE date is null
10
+ SQL
11
+ end
12
+ end
@@ -1,4 +1,4 @@
1
- class TenantPlutusTables < ActiveRecord::Migration
1
+ class TenantPlutusTables < ActiveRecord::Migration[4.2]
2
2
  def change
3
3
  # add a tenant column to plutus accounts table.
4
4
  add_column :plutus_accounts, :tenant_id, :integer, index: true
@@ -5,10 +5,10 @@ class UpdatePlutusTables < ActiveRecord::Migration
5
5
  remove_index :plutus_amounts, [:account_id, :transaction_id]
6
6
  remove_index :plutus_amounts, [:transaction_id, :account_id]
7
7
  remove_index :plutus_transactions, column: [:commercial_document_id, :commercial_document_type], :name => "index_transactions_on_commercial_doc"
8
-
8
+
9
9
  rename_table :plutus_transactions, :plutus_entries
10
10
  rename_column :plutus_amounts, :transaction_id, :entry_id
11
-
11
+
12
12
  # adding the indexes back
13
13
  add_index :plutus_amounts, [:account_id, :entry_id]
14
14
  add_index :plutus_amounts, [:entry_id, :account_id]
@@ -1,25 +1,10 @@
1
1
  # lib/generators/plutus/plutus_generator.rb
2
2
  require 'rails/generators'
3
3
  require 'rails/generators/migration'
4
+ require_relative 'base_generator'
4
5
 
5
6
  module Plutus
6
- class TenancyGenerator < Rails::Generators::Base
7
- include Rails::Generators::Migration
8
-
9
- def self.source_root
10
- @source_root ||= File.join(File.dirname(__FILE__), 'templates')
11
- end
12
-
13
- # Implement the required interface for Rails::Generators::Migration.
14
- # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
15
- def self.next_migration_number(dirname)
16
- if ActiveRecord::Base.timestamped_migrations
17
- Time.now.utc.strftime("%Y%m%d%H%M%S")
18
- else
19
- "%.3d" % (current_migration_number(dirname) + 1)
20
- end
21
- end
22
-
7
+ class TenancyGenerator < BaseGenerator
23
8
  def create_migration_file
24
9
  migration_template 'tenant_migration.rb', 'db/migrate/tenant_plutus_tables.rb'
25
10
  end
@@ -1,28 +1,12 @@
1
1
  # lib/generators/plutus/plutus_generator.rb
2
2
  require 'rails/generators'
3
3
  require 'rails/generators/migration'
4
+ require_relative 'base_generator'
4
5
 
5
6
  module Plutus
6
- class UpgradePlutusGenerator < Rails::Generators::Base
7
- include Rails::Generators::Migration
8
-
9
- def self.source_root
10
- @source_root ||= File.join(File.dirname(__FILE__), 'templates')
11
- end
12
-
13
- # Implement the required interface for Rails::Generators::Migration.
14
- # taken from http://github.com/rails/rails/blob/master/activerecord/lib/generators/active_record.rb
15
- def self.next_migration_number(dirname)
16
- if ActiveRecord::Base.timestamped_migrations
17
- Time.now.utc.strftime("%Y%m%d%H%M%S")
18
- else
19
- "%.3d" % (current_migration_number(dirname) + 1)
20
- end
21
- end
22
-
23
- def create_migration_file
24
- migration_template 'update_migration.rb', 'db/migrate/update_plutus_tables.rb'
25
- end
26
-
27
- end
7
+ class UpgradePlutusGenerator < BaseGenerator
8
+ def create_migration_file
9
+ migration_template 'update_migration.rb', 'db/migrate/update_plutus_tables.rb'
10
+ end
11
+ end
28
12
  end