borutus 0.1.0 → 0.2.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 86494802836afc08454711411a8110530a2822035adb650ac75c118303a35f97
4
- data.tar.gz: 1a008d994e3c7c923f0763e681f15116bbf4000d2596eccddbe1fb8fcad874e1
3
+ metadata.gz: 7ed73fe6e709a22d33f2a11f0360c57c0df95b940fe3b67ba97ea22171b941fc
4
+ data.tar.gz: 23ededc317f6e6373938e23bc4225bb96685fcb4bc240474147ed951f2b7d449
5
5
  SHA512:
6
- metadata.gz: d1c27e83114bea37af9e89a2b63915177af87eda9e6475eda2e71a670f5a78a78d0873c3bb9c53b98303b0bc0b3f9e2ec1f905862df8e3171493fb990ef1c505
7
- data.tar.gz: 66f28051b2fd2146d9b9c0bb9e9ed6b55156c1c47eccdfb377ec8e7809a4c4576f3f8a04759ad84ff2efcc10346f81fefacbc391a452fcddc7d77b251a176b0f
6
+ metadata.gz: 9eed73e765fbac8b03d41792381c8ced5c8c6e97dec7351ad52fed8c4f6d6aaeb8cf06744fff475590941d5f85050aebe8fa7afb40cfb4c67a3a4edd3ef2d879
7
+ data.tar.gz: 3935d58c029083d95125f2e2d5aed927b718c16c6d457d232f86434b2ac4c968c6d287df9e4c0c5781eb74b72c6b2e894b965b5c2d2a70b7d3fab6a91d4e1ad4
data/README.md CHANGED
@@ -11,6 +11,7 @@ Compatibility
11
11
  =============
12
12
 
13
13
  * Rails versions: ~> 5.0
14
+ * PostgreSQL: > 9.4
14
15
 
15
16
  Installation
16
17
  ============
@@ -325,7 +326,9 @@ mount Borutus::Engine => "/borutus", :as => "borutus"
325
326
  Testing
326
327
  =======
327
328
 
328
- [Rspec](http://rspec.info/) tests are provided. Run `bundle install` then `rake`.
329
+ Run `docker-compose up pg`, this will create a local postgresql database. Then create a DB name `borutus_fixture_test`, you can do this via `createdb --username=postgres --host=localhost --port=5432 --template=template0 borutus_fixture_test`
330
+
331
+ [Rspec](http://rspec.info/) tests are provided. Run `bundle install` then `bundle exec rspec spec`.
329
332
 
330
333
  Contributing and Contributors
331
334
  =============================
data/Rakefile CHANGED
@@ -1,11 +1,17 @@
1
1
  require 'bundler/setup'
2
2
 
3
+ APP_RAKEFILE = File.expand_path('./fixture_rails_root/Rakefile')
4
+ load 'rails/tasks/engine.rake'
5
+ load 'rails/tasks/statistics.rake'
6
+
7
+ require 'bundler/gem_tasks'
3
8
  require 'rspec/core/rake_task'
4
9
 
5
- desc "run specs"
10
+ desc 'run specs'
11
+
6
12
  RSpec::Core::RakeTask.new do |t|
7
- t.rspec_opts = ["-c", "-f d", "-r ./spec/spec_helper.rb"]
13
+ t.rspec_opts = ['-c', '-f d', '-r ./spec/spec_helper.rb']
8
14
  t.pattern = 'spec/**/*_spec.rb'
9
15
  end
10
16
 
11
- task :default => :spec
17
+ task default: :spec
@@ -35,7 +35,45 @@ module Borutus
35
35
  has_many :amounts
36
36
  has_many :credit_amounts, :extend => AmountsExtension, :class_name => 'Borutus::CreditAmount'
37
37
  has_many :debit_amounts, :extend => AmountsExtension, :class_name => 'Borutus::DebitAmount'
38
- has_many :entries, through: :amounts, source: :entry
38
+ has_many :entries, through: :amounts, source: :entry do
39
+ def with_running_balance
40
+ account = proxy_association.owner
41
+ credit_amounts = account.credit_amounts
42
+ debit_amounts = account.debit_amounts
43
+
44
+ credit_table = credit_amounts.joins(:entry).select(
45
+ :id,
46
+ :entry_id,
47
+ %{ SUM("borutus_amounts".amount) AS amount }
48
+ ).group(:entry_id, :id)
49
+
50
+ debit_table = debit_amounts.joins(:entry).select(
51
+ :id,
52
+ :entry_id,
53
+ %{ SUM("borutus_amounts".amount) AS amount }
54
+ ).group(:entry_id, :id)
55
+
56
+ select_statement = if account.normal_credit_balance
57
+ %{ COALESCE("credit_table"."amount", 0) - coalesce("debit_table"."amount", 0) }
58
+ else
59
+ %{ COALESCE("debit_table"."amount", 0) - coalesce("credit_table"."amount", 0) }
60
+ end
61
+
62
+ joins(%{
63
+ LEFT OUTER JOIN (#{credit_table.to_sql}) AS "credit_table" ON "credit_table".entry_id = "borutus_entries".id
64
+ LEFT OUTER JOIN (#{debit_table.to_sql}) AS "debit_table" ON "debit_table".entry_id = "borutus_entries".id
65
+ }).select(%{
66
+ "borutus_entries".*,
67
+ SUM(#{select_statement}) OVER(ORDER BY "borutus_entries"."created_at") AS balance
68
+ }).group(
69
+ :id,
70
+ %{
71
+ "debit_table".amount,
72
+ "credit_table".amount
73
+ }
74
+ ).order(created_at: :asc)
75
+ end
76
+ end
39
77
  has_many :credit_entries, :through => :credit_amounts, :source => :entry, :class_name => 'Borutus::Entry'
40
78
  has_many :debit_entries, :through => :debit_amounts, :source => :entry, :class_name => 'Borutus::Entry'
41
79
 
@@ -1,3 +1,3 @@
1
1
  module Borutus
2
- VERSION = "0.1.0"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -14,6 +14,70 @@ module Borutus
14
14
  end
15
15
  end
16
16
 
17
+ describe ".entries.with_running_balance" do
18
+ let(:mock_document) { FactoryGirl.create(:asset) }
19
+ let!(:accounts_receivable) do
20
+ FactoryGirl.create(:asset, name: "Accounts Receivable")
21
+ end
22
+ let!(:sales_revenue) do
23
+ FactoryGirl.create(:revenue, name: "Sales Revenue")
24
+ end
25
+ let!(:sales_tax_payable) do
26
+ FactoryGirl.create(:liability, name: "Sales Tax Payable")
27
+ end
28
+ let!(:entry_1) do
29
+ Borutus::Entry.new({
30
+ description: "Sold some widgets",
31
+ commercial_document: mock_document,
32
+ debits: [{account: accounts_receivable, amount: 50}],
33
+ credits: [
34
+ {account: sales_revenue, amount: 45},
35
+ {account: sales_tax_payable, amount: 5}
36
+ ]
37
+ })
38
+ end
39
+ let!(:entry_2) do
40
+ Borutus::Entry.new({
41
+ description: "Cancel Accounts receivable some widgets again",
42
+ commercial_document: mock_document,
43
+ debits: [
44
+ {account: accounts_receivable, amount: -30},
45
+ ],
46
+ credits: [
47
+ {account: sales_revenue, amount: -25},
48
+ {account: sales_tax_payable, amount: -5},
49
+ ]
50
+ })
51
+ end
52
+ let!(:entry_3) do
53
+ Borutus::Entry.new({
54
+ description: "Cancel Accounts receivable",
55
+ commercial_document: mock_document,
56
+ debits: [{account: sales_tax_payable, amount: 15}],
57
+ credits: [{account: accounts_receivable, amount: 15}],
58
+ })
59
+ end
60
+
61
+ it "returns entries for only the account with a balance column" do
62
+ entry_1.save
63
+ entry_2.save
64
+ entry_3.save
65
+
66
+ receivable_entries = accounts_receivable.entries.with_running_balance
67
+ expect(receivable_entries.to_a.count).to eq 3
68
+ expect(receivable_entries.first.balance).to eq 50 # inital 50
69
+ expect(receivable_entries.second.balance).to eq 20 # deduct 30 due to entry_2
70
+ expect(receivable_entries.last.balance).to eq 5 # deduct 5 due to entry_3
71
+
72
+ payable_entries = sales_tax_payable.entries.with_running_balance
73
+ .order(created_at: :asc)
74
+ expect(payable_entries.to_a.count).to eq 3
75
+ expect(payable_entries.first.balance).to eq 5
76
+ expect(payable_entries.second.balance).to eq 0 # deduct 5 due to entry_2
77
+ expect(payable_entries.last.balance).to eq -15 # deduct 15 due to entry_3
78
+ end
79
+ end
80
+
17
81
  describe "when using a child type" do
18
82
  let(:account) { FactoryGirl.create(:account, type: "Finance::Asset") }
19
83
  it { is_expected.to be_valid }
@@ -1,22 +1,34 @@
1
1
  require 'coveralls'
2
2
  Coveralls.wear!
3
3
 
4
+ require 'pry'
5
+
4
6
  ENV["RAILS_ENV"] ||= 'test'
5
- require File.expand_path(File.dirname(__FILE__) + "/../fixture_rails_root/config/environment")
6
7
 
8
+ require File.expand_path(File.dirname(__FILE__) + "/../fixture_rails_root/config/environment")
7
9
  require Rails.root.join('db/schema').to_s
10
+
8
11
  require 'rspec/rails'
9
12
 
10
13
  $: << File.expand_path(File.dirname(__FILE__) + '/../lib/')
14
+
11
15
  require 'borutus'
12
16
  require 'kaminari'
13
17
 
14
- Dir[File.expand_path(File.join(File.dirname(__FILE__),'support','**','*.rb'))].each {|f| require f}
18
+ Dir[
19
+ File.expand_path(
20
+ File.join(File.dirname(__FILE__), 'support', '**', '*.rb')
21
+ )
22
+ ].each do |f|
23
+ require f
24
+ end
15
25
 
16
26
  require 'factory_girl'
17
- borutus_definitions = File.expand_path(File.join(File.dirname(__FILE__), 'factories'))
18
- FactoryGirl.definition_file_paths << borutus_definitions
19
27
 
28
+ borutus_definitions = File.expand_path(
29
+ File.join(File.dirname(__FILE__), 'factories')
30
+ )
31
+ FactoryGirl.definition_file_paths << borutus_definitions
20
32
 
21
33
  RSpec.configure do |config|
22
34
  config.use_transactional_fixtures = true
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: borutus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ramon Tayag
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2018-07-24 00:00:00.000000000 Z
12
+ date: 2019-01-04 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -182,7 +182,6 @@ files:
182
182
  - spec/rcov.opts
183
183
  - spec/routing/accounts_routing_spec.rb
184
184
  - spec/routing/entries_routing_spec.rb
185
- - spec/spec.opts
186
185
  - spec/spec_helper.rb
187
186
  - spec/support/account_shared_examples.rb
188
187
  - spec/support/active_support_helpers.rb
@@ -234,7 +233,6 @@ test_files:
234
233
  - spec/rcov.opts
235
234
  - spec/routing/accounts_routing_spec.rb
236
235
  - spec/routing/entries_routing_spec.rb
237
- - spec/spec.opts
238
236
  - spec/spec_helper.rb
239
237
  - spec/support/account_shared_examples.rb
240
238
  - spec/support/active_support_helpers.rb
@@ -1,4 +0,0 @@
1
- --colour
2
- --format progress
3
- --loadby mtime
4
- --reverse