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 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