event_sourced_accounting 0.1.1 → 0.1.3
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 +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
|
[](http://badge.fury.io/rb/event_sourced_accounting)
|
|
2
2
|
[](https://gemnasium.com/lnagel/event-sourced-accounting)
|
|
3
3
|
[](https://travis-ci.org/lnagel/event-sourced-accounting)
|
|
4
|
-
[](https://codeclimate.com/github/lnagel/event-sourced-accounting)
|
|
5
|
+
[](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
|