event_sourced_accounting 0.1.1 → 0.1.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.markdown +4 -3
- data/app/models/esa/contexts/date_context.rb +1 -1
- data/app/models/esa/flag.rb +16 -0
- data/app/models/esa/ruleset.rb +30 -38
- data/app/models/esa/transaction.rb +26 -0
- data/lib/esa/blocking_processor.rb +78 -57
- data/lib/esa/filters/date_time_filter.rb +28 -32
- data/lib/esa/filters/timestamp_filter.rb +16 -0
- data/lib/esa/version.rb +1 -1
- data/lib/esa.rb +1 -0
- data/lib/generators/{esa/esa_generator.rb → event_sourced_accounting/event_sourced_accounting_generator.rb} +1 -1
- data/lib/generators/{esa → event_sourced_accounting}/templates/migration.rb +27 -2
- metadata +20 -5
- /data/lib/generators/{esa → event_sourced_accounting}/USAGE +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e28546ed4b08b5d9b469930f571e4569117beb0d
|
4
|
+
data.tar.gz: eb9c05d4dae1d65d80b7bcc5fae05f7562219232
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae325b397c7c0c356b5d98da5880de818a348a7565c485b4f671a1d7560bf8538b0c712eab2e0b70e27773d782965c8e559c3ab14ae9814aec721cdf1263717e
|
7
|
+
data.tar.gz: debb565a7e5e6d23c81904cbf5d789ff2a874e87f0a206920262fbab7b60bce600989824cbfc194396d6f69f44400b4628f6127042fa9a98b3bf2aff1c90c5e4
|
data/README.markdown
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
[![Gem Version](https://badge.fury.io/rb/event_sourced_accounting.svg)](http://badge.fury.io/rb/event_sourced_accounting)
|
2
2
|
[![Dependency Status](https://gemnasium.com/lnagel/event-sourced-accounting.svg)](https://gemnasium.com/lnagel/event-sourced-accounting)
|
3
3
|
[![Build Status](https://api.travis-ci.org/lnagel/event-sourced-accounting.svg)](https://travis-ci.org/lnagel/event-sourced-accounting)
|
4
|
-
[![Code Climate](https://
|
4
|
+
[![Code Climate](https://img.shields.io/codeclimate/github/lnagel/event-sourced-accounting.svg)](https://codeclimate.com/github/lnagel/event-sourced-accounting)
|
5
|
+
[![Code Climate](https://img.shields.io/codeclimate/coverage/github/lnagel/event-sourced-accounting.svg)](https://codeclimate.com/github/lnagel/event-sourced-accounting)
|
5
6
|
|
6
7
|
Event-Sourced Accounting
|
7
8
|
=================
|
@@ -21,9 +22,9 @@ The documentation and test coverage is expected to be completed within April-May
|
|
21
22
|
Installation
|
22
23
|
============
|
23
24
|
|
24
|
-
- Add `gem "
|
25
|
+
- Add `gem "event_sourced_accounting"` to your Gemfile
|
25
26
|
|
26
|
-
- generate migration files with `rails g
|
27
|
+
- generate migration files with `rails g event_sourced_accounting`
|
27
28
|
|
28
29
|
- run migrations `rake db:migrate`
|
29
30
|
|
@@ -59,7 +59,7 @@ module ESA
|
|
59
59
|
@filters = []
|
60
60
|
|
61
61
|
if self.start_date.present? and self.end_date.present?
|
62
|
-
@filters << lambda { |relation| relation.
|
62
|
+
@filters << lambda { |relation| relation.with_date_range(self.start_date..self.end_date) }
|
63
63
|
elsif self.start_date.present?
|
64
64
|
@filters << lambda { |relation| relation.with_date_gte(self.start_date) }
|
65
65
|
elsif self.end_date.present?
|
data/app/models/esa/flag.rb
CHANGED
@@ -50,6 +50,22 @@ module ESA
|
|
50
50
|
self.transition == -1
|
51
51
|
end
|
52
52
|
|
53
|
+
def matches_spec?(spec)
|
54
|
+
self.nature == spec[:nature].to_s and
|
55
|
+
self.state == spec[:state]
|
56
|
+
end
|
57
|
+
|
58
|
+
def transactions_match_specs?(specs)
|
59
|
+
if self.transactions.count == specs.count
|
60
|
+
self.transactions.map do |tx|
|
61
|
+
tx_spec = specs.find{|a| a[:description] == tx.description} || {}
|
62
|
+
tx.matches_spec?(tx_spec)
|
63
|
+
end.all?
|
64
|
+
else
|
65
|
+
false
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
53
69
|
private
|
54
70
|
|
55
71
|
def validate_transition
|
data/app/models/esa/ruleset.rb
CHANGED
@@ -76,15 +76,11 @@ module ESA
|
|
76
76
|
accountable.esa_flags.transitioning.most_recent(nature)
|
77
77
|
end.compact
|
78
78
|
|
79
|
-
most_recent_flags.select(&:is_set?)
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
tx_attrs_amounts = (tx_attrs[:credits] + tx_attrs[:debits]).map{|a| [a[:account], a[:amount]]}
|
85
|
-
tx_amounts = tx.amounts.map{|a| [a.account, a.amount]}
|
86
|
-
(tx_attrs_amounts - tx_amounts).empty?
|
87
|
-
end.all?
|
79
|
+
set_flags = most_recent_flags.select(&:is_set?)
|
80
|
+
|
81
|
+
set_flags.reject do |flag|
|
82
|
+
specs = flag_transactions_as_attributes(flag)
|
83
|
+
flag.transactions_match_specs?(specs)
|
88
84
|
end
|
89
85
|
end
|
90
86
|
|
@@ -96,65 +92,61 @@ module ESA
|
|
96
92
|
|
97
93
|
def flag_transactions_when_unset(flag)
|
98
94
|
self.flag_transactions_when_set(flag).each do |tx|
|
99
|
-
description = tx[:description]
|
100
|
-
debits = tx[:credits] # swap
|
101
|
-
credits = tx[:debits] # swap
|
102
|
-
tx[:description] = description
|
103
|
-
tx[:debits] = debits
|
104
|
-
tx[:credits] = credits
|
95
|
+
tx[:description] = "#{tx[:description]} / reversed"
|
96
|
+
tx[:debits], tx[:credits] = tx[:credits], tx[:debits] # swap
|
105
97
|
end
|
106
98
|
end
|
107
99
|
|
108
100
|
def flag_transactions_when_adjusted(flag)
|
109
101
|
flag.transactions.map do |tx|
|
110
102
|
if tx.valid?
|
103
|
+
spec = tx.spec
|
111
104
|
[
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
:debits => tx.amounts.debits.map{|a| {:account => a.account, :amount => a.amount}},
|
117
|
-
},
|
118
|
-
{
|
105
|
+
# original transaction, which must be kept
|
106
|
+
spec,
|
107
|
+
# adjustment transaction, which must be added
|
108
|
+
spec.merge({
|
119
109
|
:time => flag.adjustment_time,
|
120
|
-
:description => tx.description
|
121
|
-
:debits =>
|
122
|
-
:credits =>
|
123
|
-
}
|
110
|
+
:description => "#{tx.description} / adjusted",
|
111
|
+
:debits => spec[:credits], # swap
|
112
|
+
:credits => spec[:debits], # swap
|
113
|
+
})
|
124
114
|
]
|
125
115
|
end
|
126
116
|
end.compact.flatten
|
127
117
|
end
|
128
118
|
|
129
|
-
def
|
119
|
+
def flag_transactions(flag)
|
130
120
|
if flag.adjusted?
|
131
|
-
|
132
|
-
elsif flag.
|
133
|
-
|
121
|
+
flag_transactions_when_adjusted(flag)
|
122
|
+
elsif flag.is_set? and (flag.became_set? or (flag.event.present? and flag.event.nature.adjustment?))
|
123
|
+
flag_transactions_when_set(flag)
|
134
124
|
elsif flag.became_unset?
|
135
|
-
|
125
|
+
flag_transactions_when_unset(flag)
|
136
126
|
else
|
137
|
-
|
127
|
+
[]
|
138
128
|
end
|
129
|
+
end
|
139
130
|
|
140
|
-
|
131
|
+
def flag_transactions_as_attributes(flag)
|
132
|
+
flag_transactions(flag).map do |tx|
|
141
133
|
tx[:time] ||= flag.time
|
142
134
|
tx[:accountable] ||= flag.accountable
|
143
135
|
tx[:flag] ||= flag
|
144
136
|
|
145
137
|
amounts = (tx[:debits] + tx[:credits]).map{|a| a[:amount]}
|
146
|
-
|
147
138
|
if amounts.map{|a| a <= BigDecimal(0)}.all?
|
148
|
-
|
149
|
-
credits = tx[:debits].map{|a| a[:amount] = BigDecimal(0) - a[:amount]; a } # swap
|
150
|
-
tx[:debits] = debits
|
151
|
-
tx[:credits] = credits
|
139
|
+
tx[:debits], tx[:credits] = inverted(tx[:credits]), inverted(tx[:debits]) # invert & swap
|
152
140
|
end
|
153
141
|
|
154
142
|
tx
|
155
143
|
end
|
156
144
|
end
|
157
145
|
|
146
|
+
def inverted(amounts)
|
147
|
+
amounts.map{|a| a.dup.merge({amount: BigDecimal(0) - a[:amount]}) }
|
148
|
+
end
|
149
|
+
|
158
150
|
def find_account(type, name)
|
159
151
|
if self.chart.present? and Account.valid_type?(type)
|
160
152
|
self.chart.accounts.
|
@@ -43,6 +43,32 @@ module ESA
|
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
+
def spec
|
47
|
+
{
|
48
|
+
:time => self.time,
|
49
|
+
:description => self.description,
|
50
|
+
:credits => self.amounts.credits.map{|a| {:account => a.account, :amount => a.amount}},
|
51
|
+
:debits => self.amounts.debits.map{|a| {:account => a.account, :amount => a.amount}},
|
52
|
+
}
|
53
|
+
end
|
54
|
+
|
55
|
+
def matches_spec?(spec)
|
56
|
+
self.description == spec[:description] and self.amounts_match_spec?(spec)
|
57
|
+
end
|
58
|
+
|
59
|
+
def amounts_match_spec?(spec)
|
60
|
+
to_check = [
|
61
|
+
[self.amounts.credits.all, spec[:credits]],
|
62
|
+
[self.amounts.debits.all, spec[:debits]]
|
63
|
+
]
|
64
|
+
|
65
|
+
to_check.map do |amounts,amount_spec|
|
66
|
+
a = amounts.map{|a| [a.account, a.amount]}
|
67
|
+
s = amount_spec.map{|a| [a[:account], a[:amount]]}
|
68
|
+
(a - s).empty? and (s - a).empty?
|
69
|
+
end.all?
|
70
|
+
end
|
71
|
+
|
46
72
|
private
|
47
73
|
|
48
74
|
def default_values
|
@@ -10,11 +10,7 @@ module ESA
|
|
10
10
|
events_created = create_events(accountable)
|
11
11
|
|
12
12
|
if events_created
|
13
|
-
unprocessed_events
|
14
|
-
where(processed: false).
|
15
|
-
order('time ASC, created_at ASC')
|
16
|
-
|
17
|
-
unprocessed_events.each do |event|
|
13
|
+
unprocessed_events(accountable).each do |event|
|
18
14
|
event.processed = process_event(event)
|
19
15
|
event.save if event.changed?
|
20
16
|
|
@@ -26,6 +22,12 @@ module ESA
|
|
26
22
|
end
|
27
23
|
end
|
28
24
|
|
25
|
+
def self.unprocessed_events(accountable)
|
26
|
+
accountable.esa_events.
|
27
|
+
where(processed: false).
|
28
|
+
order(:time, :created_at, :id)
|
29
|
+
end
|
30
|
+
|
29
31
|
def self.create_events(accountable)
|
30
32
|
produce_events(accountable).map(&:save).all?
|
31
33
|
end
|
@@ -46,20 +48,9 @@ module ESA
|
|
46
48
|
flags_created = create_flags(event)
|
47
49
|
|
48
50
|
if flags_created
|
49
|
-
unprocessed_flags
|
50
|
-
|
51
|
-
if event.nature.adjustment?
|
52
|
-
unprocessed_flags += event.accountable.esa_flags.
|
53
|
-
where(adjusted: true, processed: false).
|
54
|
-
order('time ASC, created_at ASC')
|
55
|
-
end
|
56
|
-
|
57
|
-
unprocessed_flags += event.flags.
|
58
|
-
where(processed: false).
|
59
|
-
order('time ASC, created_at ASC')
|
60
|
-
|
61
|
-
unprocessed_flags.map do |flag|
|
51
|
+
unprocessed_flags(event).map do |flag|
|
62
52
|
flag.processed = process_flag(flag)
|
53
|
+
|
63
54
|
if flag.changed?
|
64
55
|
flag.save and flag.processed
|
65
56
|
else
|
@@ -71,6 +62,22 @@ module ESA
|
|
71
62
|
end
|
72
63
|
end
|
73
64
|
|
65
|
+
def self.unprocessed_flags(event)
|
66
|
+
flags = []
|
67
|
+
|
68
|
+
if event.nature.adjustment?
|
69
|
+
flags += event.accountable.esa_flags.
|
70
|
+
where(adjusted: true, processed: false).
|
71
|
+
order(:time, :created_at, :id)
|
72
|
+
end
|
73
|
+
|
74
|
+
flags += event.flags.
|
75
|
+
where(processed: false).
|
76
|
+
order(:time, :created_at, :id)
|
77
|
+
|
78
|
+
flags
|
79
|
+
end
|
80
|
+
|
74
81
|
def self.create_flags(event)
|
75
82
|
if not event.processed and not event.processed_was
|
76
83
|
produce_flags(event).map(&:save).all?
|
@@ -80,42 +87,55 @@ module ESA
|
|
80
87
|
end
|
81
88
|
|
82
89
|
def self.produce_flags(event)
|
83
|
-
|
90
|
+
if event.nature.adjustment?
|
91
|
+
produce_flags_for_adjustment(event)
|
92
|
+
else
|
93
|
+
produce_flags_for_regular(event)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def self.produce_flags_for_adjustment(event)
|
84
98
|
if event.ruleset.present?
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
99
|
+
adjusted_flags = event.ruleset.flags_needing_adjustment(event.accountable)
|
100
|
+
adjusted_flags.map do |flag|
|
101
|
+
flag.processed = false
|
102
|
+
flag.adjusted = true
|
103
|
+
flag.adjustment_time = event.time
|
104
|
+
|
105
|
+
attrs = {
|
106
|
+
:accountable => event.accountable,
|
107
|
+
:nature => flag.nature,
|
108
|
+
:state => flag.state,
|
109
|
+
:event => event,
|
110
|
+
}
|
111
|
+
|
112
|
+
adjustment = event.accountable.esa_flags.new(attrs)
|
113
|
+
event.flags << adjustment
|
114
|
+
|
115
|
+
[flag, adjustment]
|
116
|
+
end.flatten
|
117
|
+
else
|
118
|
+
[]
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
def self.produce_flags_for_regular(event)
|
123
|
+
if event.ruleset.present?
|
124
|
+
existing_flags = event.flags.all
|
125
|
+
required_flags = event.ruleset.event_flags_as_attributes(event)
|
126
|
+
|
127
|
+
required_flags.map do |attrs|
|
128
|
+
flag = existing_flags.find{|flag| flag.matches_spec?(attrs)}
|
129
|
+
|
130
|
+
if flag.nil?
|
131
|
+
flag = event.accountable.esa_flags.new(attrs)
|
132
|
+
event.flags << flag
|
115
133
|
end
|
134
|
+
|
135
|
+
flag
|
116
136
|
end
|
117
137
|
else
|
118
|
-
|
138
|
+
[]
|
119
139
|
end
|
120
140
|
end
|
121
141
|
|
@@ -137,21 +157,22 @@ module ESA
|
|
137
157
|
end
|
138
158
|
|
139
159
|
def self.produce_transactions(flag)
|
140
|
-
transactions = flag.transactions.all
|
141
160
|
if flag.ruleset.present? and flag.transition.present? and flag.transition.in? [-1, 0, 1]
|
161
|
+
existing_transactions = flag.transactions.all
|
142
162
|
required_transactions = flag.ruleset.flag_transactions_as_attributes(flag)
|
163
|
+
|
143
164
|
required_transactions.map do |attrs|
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
else
|
165
|
+
transaction = existing_transactions.find{|tx| tx.matches_spec?(attrs)}
|
166
|
+
|
167
|
+
if transaction.nil?
|
148
168
|
transaction = flag.accountable.esa_transactions.new(attrs)
|
149
169
|
flag.transactions << transaction
|
150
|
-
transaction
|
151
170
|
end
|
171
|
+
|
172
|
+
transaction
|
152
173
|
end
|
153
174
|
else
|
154
|
-
|
175
|
+
[]
|
155
176
|
end
|
156
177
|
end
|
157
178
|
end
|
@@ -1,52 +1,48 @@
|
|
1
1
|
module ESA
|
2
2
|
module Filters
|
3
3
|
module DateTimeFilter
|
4
|
-
module
|
4
|
+
module DateScopes
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
7
|
included do
|
8
|
-
scope :
|
9
|
-
scope :
|
10
|
-
|
11
|
-
scope :
|
12
|
-
scope :
|
13
|
-
scope :with_date_lte, lambda { |date| with_time_lte(date.end_of_day) }
|
14
|
-
scope :with_date_gte, lambda { |date| with_time_gte(date.midnight) }
|
15
|
-
|
16
|
-
scope :with_time_lt, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].lt( time)) }
|
17
|
-
scope :with_time_gt, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].gt( time)) }
|
18
|
-
scope :with_time_lte, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].lteq(time)) }
|
19
|
-
scope :with_time_gte, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].gteq(time)) }
|
20
|
-
|
21
|
-
scope :created_before, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:created_at].lt(time)) }
|
8
|
+
scope :with_date_range, lambda { |range| with_time_range(range.begin.midnight..range.end.end_of_day) }
|
9
|
+
scope :with_date_lt, lambda { |date| with_time_lt(date.midnight) }
|
10
|
+
scope :with_date_gt, lambda { |date| with_time_gt(date.end_of_day) }
|
11
|
+
scope :with_date_lte, lambda { |date| with_time_lte(date.end_of_day) }
|
12
|
+
scope :with_date_gte, lambda { |date| with_time_gte(date.midnight) }
|
22
13
|
end
|
23
14
|
end
|
24
15
|
|
25
|
-
module
|
16
|
+
module TransactionTime
|
26
17
|
extend ActiveSupport::Concern
|
18
|
+
include DateScopes
|
27
19
|
|
28
20
|
included do
|
29
|
-
scope :
|
30
|
-
scope :
|
31
|
-
|
32
|
-
scope :
|
33
|
-
scope :
|
34
|
-
|
35
|
-
|
21
|
+
scope :with_time_range, lambda { |range| joins(:transaction).where(esa_transactions: {time: range}) }
|
22
|
+
scope :with_time_lt, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].lt(time)) }
|
23
|
+
scope :with_time_gt, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].gt(time)) }
|
24
|
+
scope :with_time_lte, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].lteq(time)) }
|
25
|
+
scope :with_time_gte, lambda { |time| joins(:transaction).where(ESA::Transaction.arel_table[:time].gteq(time)) }
|
26
|
+
end
|
27
|
+
end
|
36
28
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
scope :with_time_gte, lambda { |time| where(arel_table[:time].gteq(time)) }
|
29
|
+
module ObjectTime
|
30
|
+
extend ActiveSupport::Concern
|
31
|
+
include DateScopes
|
41
32
|
|
42
|
-
|
33
|
+
included do
|
34
|
+
scope :with_time_range, lambda { |range| where(time: range) }
|
35
|
+
scope :with_time_lt, lambda { |time| where(arel_table[:time].lt(time)) }
|
36
|
+
scope :with_time_gt, lambda { |time| where(arel_table[:time].gt(time)) }
|
37
|
+
scope :with_time_lte, lambda { |time| where(arel_table[:time].lteq(time)) }
|
38
|
+
scope :with_time_gte, lambda { |time| where(arel_table[:time].gteq(time)) }
|
43
39
|
end
|
44
40
|
end
|
45
41
|
end
|
46
42
|
end
|
47
43
|
end
|
48
44
|
|
49
|
-
ESA::Amount.send :include, ESA::Filters::DateTimeFilter::
|
50
|
-
ESA::Event.send :include, ESA::Filters::DateTimeFilter::
|
51
|
-
ESA::Flag.send :include, ESA::Filters::DateTimeFilter::
|
52
|
-
ESA::Transaction.send :include, ESA::Filters::DateTimeFilter::
|
45
|
+
ESA::Amount.send :include, ESA::Filters::DateTimeFilter::TransactionTime
|
46
|
+
ESA::Event.send :include, ESA::Filters::DateTimeFilter::ObjectTime
|
47
|
+
ESA::Flag.send :include, ESA::Filters::DateTimeFilter::ObjectTime
|
48
|
+
ESA::Transaction.send :include, ESA::Filters::DateTimeFilter::ObjectTime
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ESA
|
2
|
+
module Filters
|
3
|
+
module TimestampFilter
|
4
|
+
extend ActiveSupport::Concern
|
5
|
+
|
6
|
+
included do
|
7
|
+
scope :created_before, lambda { |time| where(arel_table[:created_at].lt(time)) }
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
ESA::Amount.send :include, ESA::Filters::TimestampFilter
|
14
|
+
ESA::Event.send :include, ESA::Filters::TimestampFilter
|
15
|
+
ESA::Flag.send :include, ESA::Filters::TimestampFilter
|
16
|
+
ESA::Transaction.send :include, ESA::Filters::TimestampFilter
|
data/lib/esa/version.rb
CHANGED
data/lib/esa.rb
CHANGED
@@ -5,7 +5,7 @@ class CreateEsaTables < ActiveRecord::Migration
|
|
5
5
|
|
6
6
|
t.timestamps
|
7
7
|
end
|
8
|
-
add_index :esa_charts,
|
8
|
+
add_index :esa_charts, :name, :unique => true
|
9
9
|
|
10
10
|
create_table :esa_accounts do |t|
|
11
11
|
t.string :code
|
@@ -17,7 +17,8 @@ class CreateEsaTables < ActiveRecord::Migration
|
|
17
17
|
|
18
18
|
t.timestamps
|
19
19
|
end
|
20
|
-
add_index :esa_accounts, [:
|
20
|
+
add_index :esa_accounts, [:chart_id, :name], :unique => true
|
21
|
+
add_index :esa_accounts, [:chart_id, :name, :type]
|
21
22
|
add_index :esa_accounts, :normal_balance
|
22
23
|
|
23
24
|
create_table :esa_events, :force => true do |t|
|
@@ -127,9 +128,33 @@ class CreateEsaTables < ActiveRecord::Migration
|
|
127
128
|
add_index :esa_contexts, :start_date
|
128
129
|
add_index :esa_contexts, :end_date
|
129
130
|
add_index :esa_contexts, :freshness
|
131
|
+
|
132
|
+
add_foreign_key :esa_accounts, :esa_charts, column: 'chart_id'
|
133
|
+
add_foreign_key :esa_events, :esa_rulesets, column: 'ruleset_id'
|
134
|
+
add_foreign_key :esa_flags, :esa_events, column: 'event_id'
|
135
|
+
add_foreign_key :esa_flags, :esa_rulesets, column: 'ruleset_id'
|
136
|
+
add_foreign_key :esa_transactions, :esa_flags, column: 'flag_id'
|
137
|
+
add_foreign_key :esa_rulesets, :esa_charts, column: 'chart_id'
|
138
|
+
add_foreign_key :esa_amounts, :esa_accounts, column: 'account_id'
|
139
|
+
add_foreign_key :esa_amounts, :esa_transactions, column: 'transaction_id'
|
140
|
+
add_foreign_key :esa_contexts, :esa_charts, column: 'chart_id'
|
141
|
+
add_foreign_key :esa_contexts, :esa_contexts, column: 'parent_id'
|
142
|
+
add_foreign_key :esa_contexts, :esa_accounts, column: 'account_id'
|
130
143
|
end
|
131
144
|
|
132
145
|
def self.down
|
146
|
+
remove_foreign_key :esa_accounts, name: "esa_accounts_chart_id_fk"
|
147
|
+
remove_foreign_key :esa_amounts, name: "esa_amounts_account_id_fk"
|
148
|
+
remove_foreign_key :esa_amounts, name: "esa_amounts_transaction_id_fk"
|
149
|
+
remove_foreign_key :esa_contexts, name: "esa_contexts_account_id_fk"
|
150
|
+
remove_foreign_key :esa_contexts, name: "esa_contexts_chart_id_fk"
|
151
|
+
remove_foreign_key :esa_contexts, name: "esa_contexts_parent_id_fk"
|
152
|
+
remove_foreign_key :esa_events, name: "esa_events_ruleset_id_fk"
|
153
|
+
remove_foreign_key :esa_flags, name: "esa_flags_event_id_fk"
|
154
|
+
remove_foreign_key :esa_flags, name: "esa_flags_ruleset_id_fk"
|
155
|
+
remove_foreign_key :esa_rulesets, name: "esa_rulesets_chart_id_fk"
|
156
|
+
remove_foreign_key :esa_transactions, name: "esa_transactions_flag_id_fk"
|
157
|
+
|
133
158
|
drop_table :esa_charts
|
134
159
|
drop_table :esa_accounts
|
135
160
|
drop_table :esa_events
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: event_sourced_accounting
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lenno Nagel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.0.4
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: foreigner
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: sqlite3
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -226,13 +240,14 @@ files:
|
|
226
240
|
- lib/esa/blocking_processor.rb
|
227
241
|
- lib/esa/filters/chart_filter.rb
|
228
242
|
- lib/esa/filters/accountable_type_filter.rb
|
243
|
+
- lib/esa/filters/timestamp_filter.rb
|
229
244
|
- lib/esa/filters/context_filter.rb
|
230
245
|
- lib/esa/filters/date_time_filter.rb
|
231
246
|
- lib/esa/filters/accountable_filter.rb
|
232
247
|
- lib/esa/filters/account_filter.rb
|
233
|
-
- lib/generators/
|
234
|
-
- lib/generators/
|
235
|
-
- lib/generators/
|
248
|
+
- lib/generators/event_sourced_accounting/event_sourced_accounting_generator.rb
|
249
|
+
- lib/generators/event_sourced_accounting/templates/migration.rb
|
250
|
+
- lib/generators/event_sourced_accounting/USAGE
|
236
251
|
- lib/esa.rb
|
237
252
|
- LICENSE
|
238
253
|
- Rakefile
|
File without changes
|