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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a83ae6907d7a2585115b51cbd1aaea238f15a3e
4
- data.tar.gz: a3cfe1ed43083547c9416b652e99ffbc14de6ff3
3
+ metadata.gz: e28546ed4b08b5d9b469930f571e4569117beb0d
4
+ data.tar.gz: eb9c05d4dae1d65d80b7bcc5fae05f7562219232
5
5
  SHA512:
6
- metadata.gz: 46bf5e9fe3c43bbf55125adef82617d589654abcfadb139fa85fc3f700f78756f1f2af5f1cb7d92cc15608e65e1b35444e6301615cfbd88d1f289b53f47213bd
7
- data.tar.gz: 2ff9df539e8295630998372e49e468b90f9642f15d4fe12d95d767d4295da853b9eaa1149387054f3cd70063706672fdffd21ac8189cba0167766b65fadb6981
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://codeclimate.com/github/lnagel/event-sourced-accounting.png)](https://codeclimate.com/github/lnagel/event-sourced-accounting)
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 "event-sourced-accounting"` to your Gemfile
25
+ - Add `gem "event_sourced_accounting"` to your Gemfile
25
26
 
26
- - generate migration files with `rails g esa`
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.between_dates(self.start_date, self.end_date) }
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?
@@ -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
@@ -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?).reject do |flag|
80
- attributes = flag_transactions_as_attributes(flag)
81
-
82
- flag.transactions.map do |tx|
83
- tx_attrs = attributes.find{|a| a[:description] == tx.description}
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] + " / reversed"
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
- :time => flag.time,
114
- :description => tx.description,
115
- :credits => tx.amounts.credits.map{|a| {:account => a.account, :amount => a.amount}},
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 + " / adjusted",
121
- :debits => tx.amounts.credits.map{|a| {:account => a.account, :amount => a.amount}}, # swap
122
- :credits => tx.amounts.debits.map{|a| {:account => a.account, :amount => a.amount}}, # swap
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 flag_transactions_as_attributes(flag)
119
+ def flag_transactions(flag)
130
120
  if flag.adjusted?
131
- transactions = self.flag_transactions_when_adjusted(flag)
132
- elsif flag.became_set? or (flag.is_set? and flag.event.present? and flag.event.nature.adjustment?)
133
- transactions = self.flag_transactions_when_set(flag)
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
- transactions = self.flag_transactions_when_unset(flag)
125
+ flag_transactions_when_unset(flag)
136
126
  else
137
- transactions = []
127
+ []
138
128
  end
129
+ end
139
130
 
140
- transactions.map do |tx|
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
- debits = tx[:credits].map{|a| a[:amount] = BigDecimal(0) - a[:amount]; a } # swap
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 = accountable.esa_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
- flags = event.flags.all
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
- if event.nature.adjustment?
86
- adjusted_flags = event.ruleset.flags_needing_adjustment(event.accountable)
87
- adjusted_flags.map do |flag|
88
- flag.processed = false
89
- flag.adjusted = true
90
- flag.adjustment_time = event.time
91
-
92
- attrs = {
93
- :accountable => event.accountable,
94
- :nature => flag.nature,
95
- :state => flag.state,
96
- :event => event,
97
- }
98
-
99
- adjustment = event.accountable.esa_flags.new(attrs)
100
- event.flags << adjustment
101
-
102
- [flag, adjustment]
103
- end.flatten
104
- else
105
- required_flags = event.ruleset.event_flags_as_attributes(event)
106
- required_flags.map do |attrs|
107
- existing = flags.find{|f| f.nature == attrs[:nature].to_s and f.state == attrs[:state]}
108
- if existing.present?
109
- existing
110
- else
111
- flag = event.accountable.esa_flags.new(attrs)
112
- event.flags << flag
113
- flag
114
- end
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
- flags
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
- existing = transactions.find{|f| f.description == attrs[:description]}
145
- if existing.present?
146
- existing
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
- transactions
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 TransactionDate
4
+ module DateScopes
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- scope :between_dates, lambda { |date1,date2| joins(:transaction).where(esa_transactions: {time: date1.midnight..date2.end_of_day}) }
9
- scope :with_date, lambda { |date| joins(:transaction).where(esa_transactions: {time: date.midnight..date.end_of_day}) }
10
-
11
- scope :with_date_lt, lambda { |date| with_time_lt(date.midnight) }
12
- scope :with_date_gt, lambda { |date| with_time_gt(date.end_of_day) }
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 ObjectDate
16
+ module TransactionTime
26
17
  extend ActiveSupport::Concern
18
+ include DateScopes
27
19
 
28
20
  included do
29
- scope :between_dates, lambda { |date1,date2| where(time: date1.midnight..date2.end_of_day) }
30
- scope :with_date, lambda { |date| where(time: date.midnight..date.end_of_day) }
31
-
32
- scope :with_date_lt, lambda { |date| with_time_lt(date.midnight) }
33
- scope :with_date_gt, lambda { |date| with_time_gt(date.end_of_day) }
34
- scope :with_date_lte, lambda { |date| with_time_lte(date.end_of_day) }
35
- scope :with_date_gte, lambda { |date| with_time_gte(date.midnight) }
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
- scope :with_time_lt, lambda { |time| where(arel_table[:time].lt( time)) }
38
- scope :with_time_gt, lambda { |time| where(arel_table[:time].gt( time)) }
39
- scope :with_time_lte, lambda { |time| where(arel_table[:time].lteq(time)) }
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
- scope :created_before, lambda { |time| where(arel_table[:created_at].lt(time)) }
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::TransactionDate
50
- ESA::Event.send :include, ESA::Filters::DateTimeFilter::ObjectDate
51
- ESA::Flag.send :include, ESA::Filters::DateTimeFilter::ObjectDate
52
- ESA::Transaction.send :include, ESA::Filters::DateTimeFilter::ObjectDate
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
@@ -1,3 +1,3 @@
1
1
  module ESA
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.3"
3
3
  end
data/lib/esa.rb CHANGED
@@ -50,6 +50,7 @@ require 'esa/filters/accountable_type_filter'
50
50
  require 'esa/filters/chart_filter'
51
51
  require 'esa/filters/context_filter'
52
52
  require 'esa/filters/date_time_filter'
53
+ require 'esa/filters/timestamp_filter'
53
54
 
54
55
  require 'esa/config'
55
56
 
@@ -2,7 +2,7 @@
2
2
  require 'rails/generators'
3
3
  require 'rails/generators/migration'
4
4
 
5
- class ESAGenerator < Rails::Generators::Base
5
+ class EventSourcedAccountingGenerator < Rails::Generators::Base
6
6
  include Rails::Generators::Migration
7
7
 
8
8
  def self.source_root
@@ -5,7 +5,7 @@ class CreateEsaTables < ActiveRecord::Migration
5
5
 
6
6
  t.timestamps
7
7
  end
8
- add_index :esa_charts, [:name]
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, [:name, :type, :chart_id]
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.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-07 00:00:00.000000000 Z
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/esa/esa_generator.rb
234
- - lib/generators/esa/templates/migration.rb
235
- - lib/generators/esa/USAGE
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