credere 0.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.markdown +361 -0
  4. data/Rakefile +11 -0
  5. data/app/assets/javascripts/credere/application.js +16 -0
  6. data/app/assets/javascripts/credere/reports.js +5 -0
  7. data/app/assets/stylesheets/bootstrap-theme.min.css +5 -0
  8. data/app/assets/stylesheets/bootstrap.min.css +5 -0
  9. data/app/assets/stylesheets/credere/application.css +19 -0
  10. data/app/controllers/credere/accounts_controller.rb +30 -0
  11. data/app/controllers/credere/application_controller.rb +4 -0
  12. data/app/controllers/credere/entries_controller.rb +34 -0
  13. data/app/controllers/credere/reports_controller.rb +40 -0
  14. data/app/models/credere/account.rb +170 -0
  15. data/app/models/credere/amount.rb +22 -0
  16. data/app/models/credere/amounts_extension.rb +42 -0
  17. data/app/models/credere/asset.rb +56 -0
  18. data/app/models/credere/credit_amount.rb +10 -0
  19. data/app/models/credere/debit_amount.rb +10 -0
  20. data/app/models/credere/entry.rb +77 -0
  21. data/app/models/credere/equity.rb +56 -0
  22. data/app/models/credere/expense.rb +56 -0
  23. data/app/models/credere/liability.rb +56 -0
  24. data/app/models/credere/no_tenancy.rb +9 -0
  25. data/app/models/credere/revenue.rb +56 -0
  26. data/app/models/credere/tenancy.rb +15 -0
  27. data/app/views/credere/accounts/index.html.erb +26 -0
  28. data/app/views/credere/entries/index.html.erb +59 -0
  29. data/app/views/credere/reports/_account.html.erb +28 -0
  30. data/app/views/credere/reports/balance_sheet.html.erb +21 -0
  31. data/app/views/credere/reports/income_statement.html.erb +24 -0
  32. data/app/views/layouts/credere/_messages.html.erb +9 -0
  33. data/app/views/layouts/credere/_navigation.html.erb +19 -0
  34. data/app/views/layouts/credere/_navigation_links.html.erb +5 -0
  35. data/app/views/layouts/credere/application.html.erb +19 -0
  36. data/config/backtrace_silencers.rb +7 -0
  37. data/config/database.yml +5 -0
  38. data/config/inflections.rb +10 -0
  39. data/config/mime_types.rb +5 -0
  40. data/config/routes.rb +9 -0
  41. data/config/secret_token.rb +7 -0
  42. data/config/session_store.rb +8 -0
  43. data/lib/credere/version.rb +3 -0
  44. data/lib/credere.rb +23 -0
  45. data/lib/generators/credere/USAGE +22 -0
  46. data/lib/generators/credere/add_date_upgrade_generator.rb +11 -0
  47. data/lib/generators/credere/base_generator.rb +19 -0
  48. data/lib/generators/credere/credere_generator.rb +12 -0
  49. data/lib/generators/credere/templates/add_date_migration.rb +6 -0
  50. data/lib/generators/credere/templates/migration.rb +39 -0
  51. data/lib/generators/credere/templates/tenant_migration.rb +6 -0
  52. data/lib/generators/credere/templates/update_migration.rb +17 -0
  53. data/lib/generators/credere/tenancy_generator.rb +12 -0
  54. data/lib/generators/credere/upgrade_credere_generator.rb +12 -0
  55. data/spec/controllers/accounts_controller_spec.rb +19 -0
  56. data/spec/controllers/entries_controller_spec.rb +19 -0
  57. data/spec/controllers/reports_controller_spec.rb +24 -0
  58. data/spec/factories/account_factory.rb +35 -0
  59. data/spec/factories/amount_factory.rb +19 -0
  60. data/spec/factories/entry_factory.rb +11 -0
  61. data/spec/lib/credere_spec.rb +0 -0
  62. data/spec/models/account_spec.rb +133 -0
  63. data/spec/models/amount_spec.rb +8 -0
  64. data/spec/models/asset_spec.rb +7 -0
  65. data/spec/models/credit_amount_spec.rb +7 -0
  66. data/spec/models/debit_amount_spec.rb +7 -0
  67. data/spec/models/entry_spec.rb +170 -0
  68. data/spec/models/equity_spec.rb +7 -0
  69. data/spec/models/expense_spec.rb +7 -0
  70. data/spec/models/liability_spec.rb +7 -0
  71. data/spec/models/revenue_spec.rb +7 -0
  72. data/spec/models/tenancy_spec.rb +45 -0
  73. data/spec/rcov.opts +2 -0
  74. data/spec/routing/accounts_routing_spec.rb +13 -0
  75. data/spec/routing/entries_routing_spec.rb +13 -0
  76. data/spec/spec.opts +4 -0
  77. data/spec/spec_helper.rb +23 -0
  78. data/spec/support/account_shared_examples.rb +60 -0
  79. data/spec/support/active_support_helpers.rb +13 -0
  80. data/spec/support/amount_shared_examples.rb +21 -0
  81. data/spec/support/factory_girl_helpers.rb +8 -0
  82. metadata +197 -0
@@ -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 "credere/application", media: "all" %>
7
+ <%= javascript_include_tag "credere/application" %>
8
+ <%= csrf_meta_tags %>
9
+ </head>
10
+ <body>
11
+ <header>
12
+ <%= render 'layouts/credere/navigation' %>
13
+ </header>
14
+ <main role="main">
15
+ <%= render 'layouts/credere/messages' %>
16
+ <%= yield %>
17
+ </main>
18
+ </body>
19
+ </html>
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
4
+ # Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
5
+
6
+ # You can also remove all the silencers if you're trying to debug a problem that might stem from framework code.
7
+ # Rails.backtrace_cleaner.remove_silencers!
@@ -0,0 +1,5 @@
1
+ # config/database.yml in Rails
2
+ test:
3
+ adapter: sqlite3
4
+ database: ":memory:"
5
+ timeout: 500
@@ -0,0 +1,10 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new inflection rules using the following format
4
+ # (all these examples are active by default):
5
+ # ActiveSupport::Inflector.inflections do |inflect|
6
+ # inflect.plural /^(ox)$/i, '\1en'
7
+ # inflect.singular /^(ox)en/i, '\1'
8
+ # inflect.irregular 'person', 'people'
9
+ # inflect.uncountable %w( fish sheep )
10
+ # end
@@ -0,0 +1,5 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Add new mime types for use in respond_to blocks:
4
+ # Mime::Type.register "text/richtext", :rtf
5
+ # Mime::Type.register_alias "text/html", :iphone
data/config/routes.rb ADDED
@@ -0,0 +1,9 @@
1
+ Credere::Engine.routes.draw do
2
+ root :to => 'reports#balance_sheet'
3
+
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]
9
+ end
@@ -0,0 +1,7 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ # Your secret key for verifying the integrity of signed cookies.
4
+ # If you change this key, all old signed cookies will become invalid!
5
+ # Make sure the secret is at least 30 characters and all random,
6
+ # no regular words or you'll be exposed to dictionary attacks.
7
+ Credere::Application.config.secret_token = 'f6b9c48aaf200fda4bbcf1642319084d5e5cda2bd95ac0a43220aab19f4ee240f9cdab08b77c3284b3a6396b13b1fe8be12a227af04fc5f5a8b7a52b626c4fdd'
@@ -0,0 +1,8 @@
1
+ # Be sure to restart your server when you modify this file.
2
+
3
+ Credere::Application.config.session_store :cookie_store, :key => '_credere_session'
4
+
5
+ # Use the database for sessions instead of the cookie-based default,
6
+ # which shouldn't be used to store highly confidential information
7
+ # (create the session table with "rails generate session_migration")
8
+ # Testtest::Application.config.session_store :active_record_store
@@ -0,0 +1,3 @@
1
+ module Credere
2
+ VERSION = "0.10.1"
3
+ end
data/lib/credere.rb ADDED
@@ -0,0 +1,23 @@
1
+ # Credere
2
+ require "rails"
3
+
4
+ module Credere
5
+ class Engine < Rails::Engine
6
+ isolate_namespace Credere
7
+ end
8
+
9
+
10
+ # ------------------------------ tenancy ------------------------------
11
+ # configuration to enable or disable tenancy
12
+ mattr_accessor :enable_tenancy
13
+ enable_tenancy = false
14
+
15
+ mattr_accessor :tenant_class
16
+ tenant_class = nil
17
+
18
+
19
+ # provide hook to configure attributes
20
+ def self.config
21
+ yield(self)
22
+ end
23
+ end
@@ -0,0 +1,22 @@
1
+ Description:
2
+ Generator for Credere Plugin
3
+
4
+ Installation:
5
+ rails g credere
6
+
7
+ This will:
8
+ Create a migration in the application for the "Account",
9
+ "Entry" and "Amount" tables.
10
+
11
+ Once generated, simply run:
12
+ rake db:migrate
13
+
14
+ Upgrade < 0.8 -> 0.9+:
15
+ rails g credere:upgrade_credere
16
+
17
+ This will:
18
+ Create a migration in the application for renaming the
19
+ "Transaction" table, columns and indexes to "Entry" tables.
20
+
21
+ Once generated, simply run:
22
+ rake db:migrate
@@ -0,0 +1,11 @@
1
+ require 'rails/generators'
2
+ require 'rails/generators/migration'
3
+ require_relative 'base_generator'
4
+
5
+ module Credere
6
+ class AddDateUpgradeGenerator < BaseGenerator
7
+ def create_migration_file
8
+ migration_template 'add_date_migration.rb', 'db/migrate/add_date_to_credere_entries.rb'
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,19 @@
1
+ module Credere
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
@@ -0,0 +1,12 @@
1
+ # lib/generators/credere/credere_generator.rb
2
+ require 'rails/generators'
3
+ require 'rails/generators/migration'
4
+ require_relative 'base_generator'
5
+
6
+ module Credere
7
+ class CredereGenerator < BaseGenerator
8
+ def create_migration_file
9
+ migration_template 'migration.rb', 'db/migrate/create_credere_tables.rb'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,6 @@
1
+ class AddDateToCredereEntries < ActiveRecord::Migration[5.2]
2
+ def change
3
+ add_column :credere_entries, :date, :date
4
+ add_index :credere_entries, :date
5
+ end
6
+ end
@@ -0,0 +1,39 @@
1
+ class CreateCredereTables < ActiveRecord::Migration[5.2]
2
+ def self.up
3
+ create_table :credere_accounts do |t|
4
+ t.string :name
5
+ t.string :type
6
+ t.boolean :contra, default: false
7
+
8
+ t.timestamps
9
+ end
10
+ add_index :credere_accounts, [:name, :type]
11
+
12
+ create_table :credere_entries do |t|
13
+ t.string :description
14
+ t.date :date
15
+ t.integer :commercial_document_id
16
+ t.string :commercial_document_type
17
+
18
+ t.timestamps
19
+ end
20
+ add_index :credere_entries, :date
21
+ add_index :credere_entries, [:commercial_document_id, :commercial_document_type], :name => "index_entries_on_commercial_doc"
22
+
23
+ create_table :credere_amounts do |t|
24
+ t.string :type
25
+ t.references :account
26
+ t.references :entry
27
+ t.decimal :amount, :precision => 20, :scale => 10
28
+ end
29
+ add_index :credere_amounts, :type
30
+ add_index :credere_amounts, [:account_id, :entry_id]
31
+ add_index :credere_amounts, [:entry_id, :account_id]
32
+ end
33
+
34
+ def self.down
35
+ drop_table :credere_accounts
36
+ drop_table :credere_entries
37
+ drop_table :credere_amounts
38
+ end
39
+ end
@@ -0,0 +1,6 @@
1
+ class TenantPlutusTables < ActiveRecord::Migration[5.2]
2
+ def change
3
+ # add a tenant column to plutus accounts table.
4
+ add_column :credere_accounts, :tenant_id, :integer, index: true
5
+ end
6
+ end
@@ -0,0 +1,17 @@
1
+ class UpdatePlutusTables < ActiveRecord::Migration[5.2]
2
+ def change
3
+ # we have to remove these indexes because the temporary
4
+ # table index name is too long
5
+ remove_index :credere_amounts, [:account_id, :transaction_id]
6
+ remove_index :credere_amounts, [:transaction_id, :account_id]
7
+ remove_index :credere_transactions, column: [:commercial_document_id, :commercial_document_type], :name => "index_transactions_on_commercial_doc"
8
+
9
+ rename_table :credere_transactions, :credere_entries
10
+ rename_column :credere_amounts, :transaction_id, :entry_id
11
+
12
+ # adding the indexes back
13
+ add_index :credere_amounts, [:account_id, :entry_id]
14
+ add_index :credere_amounts, [:entry_id, :account_id]
15
+ add_index :credere_entries, [:commercial_document_id, :commercial_document_type], :name => "index_entries_on_commercial_doc"
16
+ end
17
+ end
@@ -0,0 +1,12 @@
1
+ # lib/generators/credere/credere_generator.rb
2
+ require 'rails/generators'
3
+ require 'rails/generators/migration'
4
+ require_relative 'base_generator'
5
+
6
+ module Credere
7
+ class TenancyGenerator < BaseGenerator
8
+ def create_migration_file
9
+ migration_template 'tenant_migration.rb', 'db/migrate/tenant_credere_tables.rb'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,12 @@
1
+ # lib/generators/credere/credere_generator.rb
2
+ require 'rails/generators'
3
+ require 'rails/generators/migration'
4
+ require_relative 'base_generator'
5
+
6
+ module Credere
7
+ class UpgradeCredereGenerator < BaseGenerator
8
+ def create_migration_file
9
+ migration_template 'update_migration.rb', 'db/migrate/update_credere_tables.rb'
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe AccountsController do
5
+ routes { Credere::Engine.routes }
6
+
7
+ def mock_account(stubs={})
8
+ @mock_account ||= FactoryGirl.create(:asset)
9
+ end
10
+
11
+ describe "GET index" do
12
+ it "assigns all accounts as @accounts" do
13
+ allow(Account).to receive(:all).and_return([mock_account])
14
+ get :index
15
+ expect(assigns[:accounts]).to eq([mock_account])
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,19 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe EntriesController do
5
+ routes { Credere::Engine.routes }
6
+
7
+ def mock_entry(stubs={})
8
+ @mock_entry ||= FactoryGirl.create(:entry_with_credit_and_debit)
9
+ end
10
+
11
+ describe "GET index" do
12
+ it "assigns all entries as @entries" do
13
+ allow(Entry).to receive_message_chain(:per, :order).and_return([mock_entry])
14
+ get :index
15
+ expect(assigns[:entries]).to eq([mock_entry])
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,24 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe ReportsController do
5
+ routes { Credere::Engine.routes }
6
+
7
+ def mock_entry(stubs={})
8
+ @mock_entry ||= FactoryGirl.create(:entry_with_credit_and_debit)
9
+ end
10
+
11
+ describe "GET balance_sheet" do
12
+ it "renders when one entry exists" do
13
+ allow(Entry).to receive_message_chain(:order).and_return([mock_entry])
14
+ get :balance_sheet
15
+ expect(response).to be_success
16
+ end
17
+ it "renders when no entries exist" do
18
+ allow(Entry).to receive_message_chain(:order).and_return([])
19
+ get :balance_sheet
20
+ expect(response).to be_success
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,35 @@
1
+ FactoryGirl.define do
2
+ factory :account, :class => Credere::Account do |account|
3
+ account.name
4
+ account.contra false
5
+ end
6
+
7
+ factory :asset, :class => Credere::Asset do |account|
8
+ account.name
9
+ account.contra false
10
+ end
11
+
12
+ factory :equity, :class => Credere::Equity do |account|
13
+ account.name
14
+ account.contra false
15
+ end
16
+
17
+ factory :expense, :class => Credere::Expense do |account|
18
+ account.name
19
+ account.contra false
20
+ end
21
+
22
+ factory :liability, :class => Credere::Liability do |account|
23
+ account.name
24
+ account.contra false
25
+ end
26
+
27
+ factory :revenue, :class => Credere::Revenue do |account|
28
+ account.name
29
+ account.contra false
30
+ end
31
+
32
+ sequence :name do |n|
33
+ "Factory Name #{n}"
34
+ end
35
+ end
@@ -0,0 +1,19 @@
1
+ FactoryGirl.define do
2
+ factory :amount, :class => Credere::Amount do |amount|
3
+ amount.amount BigDecimal.new('473')
4
+ amount.association :entry, :factory => :entry_with_credit_and_debit
5
+ amount.association :account, :factory => :asset
6
+ end
7
+
8
+ factory :credit_amount, :class => Credere::CreditAmount do |credit_amount|
9
+ credit_amount.amount BigDecimal.new('473')
10
+ credit_amount.association :entry, :factory => :entry_with_credit_and_debit
11
+ credit_amount.association :account, :factory => :revenue
12
+ end
13
+
14
+ factory :debit_amount, :class => Credere::DebitAmount do |debit_amount|
15
+ debit_amount.amount BigDecimal.new('473')
16
+ debit_amount.association :entry, :factory => :entry_with_credit_and_debit
17
+ debit_amount.association :account, :factory => :asset
18
+ end
19
+ end
@@ -0,0 +1,11 @@
1
+ FactoryGirl.define do
2
+ factory :entry, :class => Credere::Entry do |entry|
3
+ entry.description 'factory description'
4
+ factory :entry_with_credit_and_debit, :class => Credere::Entry do |entry_cd|
5
+ entry_cd.after_build do |t|
6
+ t.credit_amounts << FactoryGirl.build(:credit_amount, :entry => t)
7
+ t.debit_amounts << FactoryGirl.build(:debit_amount, :entry => t)
8
+ end
9
+ end
10
+ end
11
+ end
File without changes
@@ -0,0 +1,133 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe Account do
5
+ let(:account) { FactoryGirl.build(:account) }
6
+ subject { account }
7
+
8
+ it { is_expected.not_to be_valid } # must construct a child type instead
9
+
10
+ describe "when using a child type" do
11
+ let(:account) { FactoryGirl.create(:account, type: "Finance::Asset") }
12
+ it { is_expected.to be_valid }
13
+
14
+ it "should be unique per name" do
15
+ conflict = FactoryGirl.build(:account, name: account.name, type: account.type)
16
+ expect(conflict).not_to be_valid
17
+ expect(conflict.errors[:name]).to eq(["has already been taken"])
18
+ end
19
+ end
20
+
21
+ it "calling the instance method #balance should raise a NoMethodError" do
22
+ expect { subject.balance }.to raise_error NoMethodError, "undefined method 'balance'"
23
+ end
24
+
25
+ it "calling the class method ::balance should raise a NoMethodError" do
26
+ expect { subject.class.balance }.to raise_error NoMethodError, "undefined method 'balance'"
27
+ end
28
+
29
+ describe ".trial_balance" do
30
+ subject { Account.trial_balance }
31
+ it { is_expected.to be_kind_of BigDecimal }
32
+
33
+ context "when given no entries" do
34
+ it { is_expected.to eq(0) }
35
+ end
36
+
37
+ context "when given correct entries" do
38
+ before {
39
+ # credit accounts
40
+ liability = FactoryGirl.create(:liability)
41
+ equity = FactoryGirl.create(:equity)
42
+ revenue = FactoryGirl.create(:revenue)
43
+ contra_asset = FactoryGirl.create(:asset, :contra => true)
44
+ contra_expense = FactoryGirl.create(:expense, :contra => true)
45
+ # credit amounts
46
+ ca1 = FactoryGirl.build(:credit_amount, :account => liability, :amount => 100000)
47
+ ca2 = FactoryGirl.build(:credit_amount, :account => equity, :amount => 1000)
48
+ ca3 = FactoryGirl.build(:credit_amount, :account => revenue, :amount => 40404)
49
+ ca4 = FactoryGirl.build(:credit_amount, :account => contra_asset, :amount => 2)
50
+ ca5 = FactoryGirl.build(:credit_amount, :account => contra_expense, :amount => 333)
51
+
52
+ # debit accounts
53
+ asset = FactoryGirl.create(:asset)
54
+ expense = FactoryGirl.create(:expense)
55
+ contra_liability = FactoryGirl.create(:liability, :contra => true)
56
+ contra_equity = FactoryGirl.create(:equity, :contra => true)
57
+ contra_revenue = FactoryGirl.create(:revenue, :contra => true)
58
+ # debit amounts
59
+ da1 = FactoryGirl.build(:debit_amount, :account => asset, :amount => 100000)
60
+ da2 = FactoryGirl.build(:debit_amount, :account => expense, :amount => 1000)
61
+ da3 = FactoryGirl.build(:debit_amount, :account => contra_liability, :amount => 40404)
62
+ da4 = FactoryGirl.build(:debit_amount, :account => contra_equity, :amount => 2)
63
+ da5 = FactoryGirl.build(:debit_amount, :account => contra_revenue, :amount => 333)
64
+
65
+ FactoryGirl.create(:entry, :credit_amounts => [ca1], :debit_amounts => [da1])
66
+ FactoryGirl.create(:entry, :credit_amounts => [ca2], :debit_amounts => [da2])
67
+ FactoryGirl.create(:entry, :credit_amounts => [ca3], :debit_amounts => [da3])
68
+ FactoryGirl.create(:entry, :credit_amounts => [ca4], :debit_amounts => [da4])
69
+ FactoryGirl.create(:entry, :credit_amounts => [ca5], :debit_amounts => [da5])
70
+ }
71
+
72
+ it { is_expected.to eq(0) }
73
+ end
74
+ end
75
+
76
+ describe "#amounts" do
77
+ it "returns all credit and debit amounts" do
78
+ equity = FactoryGirl.create(:equity)
79
+ asset = FactoryGirl.create(:asset)
80
+ expense = FactoryGirl.create(:expense)
81
+
82
+ investment = Entry.new(
83
+ description: "Initial investment",
84
+ date: Date.today,
85
+ debits: [{ account_name: equity.name, amount: 1000 }],
86
+ credits: [{ account_name: asset.name, amount: 1000 }],
87
+ )
88
+ investment.save
89
+
90
+ purchase = Entry.new(
91
+ description: "First computer",
92
+ date: Date.today,
93
+ debits: [{ account_name: asset.name, amount: 900 }],
94
+ credits: [{ account_name: expense.name, amount: 900 }],
95
+ )
96
+ purchase.save
97
+
98
+ expect(equity.amounts.size).to eq 1
99
+ expect(asset.amounts.size).to eq 2
100
+ expect(expense.amounts.size).to eq 1
101
+ end
102
+ end
103
+
104
+ describe "#entries" do
105
+ it "returns all credit and debit entries" do
106
+ equity = FactoryGirl.create(:equity)
107
+ asset = FactoryGirl.create(:asset)
108
+ expense = FactoryGirl.create(:expense)
109
+
110
+ investment = Entry.new(
111
+ description: "Initial investment",
112
+ date: Date.today,
113
+ debits: [{ account_name: equity.name, amount: 1000 }],
114
+ credits: [{ account_name: asset.name, amount: 1000 }],
115
+ )
116
+ investment.save
117
+
118
+ purchase = Entry.new(
119
+ description: "First computer",
120
+ date: Date.today,
121
+ debits: [{ account_name: asset.name, amount: 900 }],
122
+ credits: [{ account_name: expense.name, amount: 900 }],
123
+ )
124
+ purchase.save
125
+
126
+ expect(equity.entries.size).to eq 1
127
+ expect(asset.entries.size).to eq 2
128
+ expect(expense.entries.size).to eq 1
129
+ end
130
+ end
131
+
132
+ end
133
+ end
@@ -0,0 +1,8 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe Amount do
5
+ subject { FactoryGirl.build(:amount) }
6
+ it { is_expected.not_to be_valid } # construct a child class instead
7
+ end
8
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe Asset do
5
+ it_behaves_like 'a Credere::Account subtype', kind: :asset, normal_balance: :debit
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe CreditAmount do
5
+ it_behaves_like 'a Credere::Amount subtype', kind: :credit_amount
6
+ end
7
+ end
@@ -0,0 +1,7 @@
1
+ require 'spec_helper'
2
+
3
+ module Credere
4
+ describe DebitAmount do
5
+ it_behaves_like 'a Credere::Amount subtype', kind: :debit_amount
6
+ end
7
+ end