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.
- checksums.yaml +7 -0
- data/LICENSE +21 -0
- data/README.markdown +361 -0
- data/Rakefile +11 -0
- data/app/assets/javascripts/credere/application.js +16 -0
- data/app/assets/javascripts/credere/reports.js +5 -0
- data/app/assets/stylesheets/bootstrap-theme.min.css +5 -0
- data/app/assets/stylesheets/bootstrap.min.css +5 -0
- data/app/assets/stylesheets/credere/application.css +19 -0
- data/app/controllers/credere/accounts_controller.rb +30 -0
- data/app/controllers/credere/application_controller.rb +4 -0
- data/app/controllers/credere/entries_controller.rb +34 -0
- data/app/controllers/credere/reports_controller.rb +40 -0
- data/app/models/credere/account.rb +170 -0
- data/app/models/credere/amount.rb +22 -0
- data/app/models/credere/amounts_extension.rb +42 -0
- data/app/models/credere/asset.rb +56 -0
- data/app/models/credere/credit_amount.rb +10 -0
- data/app/models/credere/debit_amount.rb +10 -0
- data/app/models/credere/entry.rb +77 -0
- data/app/models/credere/equity.rb +56 -0
- data/app/models/credere/expense.rb +56 -0
- data/app/models/credere/liability.rb +56 -0
- data/app/models/credere/no_tenancy.rb +9 -0
- data/app/models/credere/revenue.rb +56 -0
- data/app/models/credere/tenancy.rb +15 -0
- data/app/views/credere/accounts/index.html.erb +26 -0
- data/app/views/credere/entries/index.html.erb +59 -0
- data/app/views/credere/reports/_account.html.erb +28 -0
- data/app/views/credere/reports/balance_sheet.html.erb +21 -0
- data/app/views/credere/reports/income_statement.html.erb +24 -0
- data/app/views/layouts/credere/_messages.html.erb +9 -0
- data/app/views/layouts/credere/_navigation.html.erb +19 -0
- data/app/views/layouts/credere/_navigation_links.html.erb +5 -0
- data/app/views/layouts/credere/application.html.erb +19 -0
- data/config/backtrace_silencers.rb +7 -0
- data/config/database.yml +5 -0
- data/config/inflections.rb +10 -0
- data/config/mime_types.rb +5 -0
- data/config/routes.rb +9 -0
- data/config/secret_token.rb +7 -0
- data/config/session_store.rb +8 -0
- data/lib/credere/version.rb +3 -0
- data/lib/credere.rb +23 -0
- data/lib/generators/credere/USAGE +22 -0
- data/lib/generators/credere/add_date_upgrade_generator.rb +11 -0
- data/lib/generators/credere/base_generator.rb +19 -0
- data/lib/generators/credere/credere_generator.rb +12 -0
- data/lib/generators/credere/templates/add_date_migration.rb +6 -0
- data/lib/generators/credere/templates/migration.rb +39 -0
- data/lib/generators/credere/templates/tenant_migration.rb +6 -0
- data/lib/generators/credere/templates/update_migration.rb +17 -0
- data/lib/generators/credere/tenancy_generator.rb +12 -0
- data/lib/generators/credere/upgrade_credere_generator.rb +12 -0
- data/spec/controllers/accounts_controller_spec.rb +19 -0
- data/spec/controllers/entries_controller_spec.rb +19 -0
- data/spec/controllers/reports_controller_spec.rb +24 -0
- data/spec/factories/account_factory.rb +35 -0
- data/spec/factories/amount_factory.rb +19 -0
- data/spec/factories/entry_factory.rb +11 -0
- data/spec/lib/credere_spec.rb +0 -0
- data/spec/models/account_spec.rb +133 -0
- data/spec/models/amount_spec.rb +8 -0
- data/spec/models/asset_spec.rb +7 -0
- data/spec/models/credit_amount_spec.rb +7 -0
- data/spec/models/debit_amount_spec.rb +7 -0
- data/spec/models/entry_spec.rb +170 -0
- data/spec/models/equity_spec.rb +7 -0
- data/spec/models/expense_spec.rb +7 -0
- data/spec/models/liability_spec.rb +7 -0
- data/spec/models/revenue_spec.rb +7 -0
- data/spec/models/tenancy_spec.rb +45 -0
- data/spec/rcov.opts +2 -0
- data/spec/routing/accounts_routing_spec.rb +13 -0
- data/spec/routing/entries_routing_spec.rb +13 -0
- data/spec/spec.opts +4 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/support/account_shared_examples.rb +60 -0
- data/spec/support/active_support_helpers.rb +13 -0
- data/spec/support/amount_shared_examples.rb +21 -0
- data/spec/support/factory_girl_helpers.rb +8 -0
- 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!
|
data/config/database.yml
ADDED
@@ -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
|
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
|
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,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,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
|