accountability 0.1.1 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +86 -9
  3. data/app/assets/stylesheets/accountability/application.scss +0 -0
  4. data/app/controllers/accountability/accounts_controller.rb +2 -4
  5. data/app/controllers/accountability/billing_configurations_controller.rb +80 -0
  6. data/app/controllers/accountability/order_groups_controller.rb +2 -4
  7. data/app/controllers/accountability/payments_controller.rb +25 -0
  8. data/app/controllers/accountability/products_controller.rb +7 -5
  9. data/app/controllers/accountability/statements_controller.rb +19 -0
  10. data/app/controllers/accountability_controller.rb +47 -0
  11. data/app/helpers/accountability/{application_helper.rb → accountability_helper.rb} +1 -1
  12. data/app/helpers/accountability/billing_configurations_helper.rb +47 -0
  13. data/app/helpers/accountability/products_helper.rb +21 -0
  14. data/app/models/accountability/account.rb +31 -1
  15. data/app/models/accountability/application_record.rb +24 -0
  16. data/app/models/accountability/billing_configuration.rb +41 -0
  17. data/app/models/accountability/coupon.rb +2 -0
  18. data/app/models/accountability/credit.rb +53 -29
  19. data/app/models/accountability/debit.rb +10 -0
  20. data/app/models/accountability/inventory.rb +61 -0
  21. data/app/models/accountability/offerable.rb +28 -1
  22. data/app/models/accountability/offerable/scope.rb +48 -0
  23. data/app/models/accountability/order_item.rb +3 -7
  24. data/app/models/accountability/payment.rb +22 -3
  25. data/app/models/accountability/product.rb +45 -5
  26. data/app/models/accountability/statement.rb +46 -0
  27. data/app/models/accountability/{account/transactions.rb → transactions.rb} +14 -2
  28. data/app/models/concerns/accountability/active_merchant_interface.rb +15 -0
  29. data/app/models/concerns/accountability/active_merchant_interface/stripe_interface.rb +134 -0
  30. data/app/pdfs/statement_pdf.rb +91 -0
  31. data/app/views/accountability/accounts/show.html.haml +21 -9
  32. data/app/views/accountability/products/index.html.haml +17 -34
  33. data/app/views/accountability/products/new.html.haml +73 -0
  34. data/app/views/accountability/shared/_session_info.html.haml +24 -0
  35. data/config/locales/en.yml +19 -0
  36. data/db/migrate/20190814000455_create_accountability_tables.rb +43 -1
  37. data/lib/accountability.rb +2 -1
  38. data/lib/accountability/configuration.rb +22 -2
  39. data/lib/accountability/engine.rb +6 -1
  40. data/lib/accountability/extensions/acts_as_billable.rb +11 -0
  41. data/lib/accountability/rails/routes.rb +72 -0
  42. data/lib/accountability/types.rb +9 -0
  43. data/lib/accountability/types/billing_configuration_types.rb +57 -0
  44. data/lib/accountability/version.rb +1 -1
  45. data/lib/generators/accountability/install_generator.rb +47 -0
  46. data/lib/generators/accountability/templates/migration.rb.tt +155 -0
  47. data/lib/generators/accountability/templates/price_overrides_migration.rb.tt +13 -0
  48. metadata +73 -12
  49. data/app/assets/stylesheets/accountability/application.css +0 -15
  50. data/app/controllers/accountability/application_controller.rb +0 -45
  51. data/app/views/accountability/products/new.html.erb +0 -40
  52. data/lib/accountability/cartographer.rb +0 -28
@@ -0,0 +1,155 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :accountability_accounts do |t|
4
+ t.belongs_to :billable, null: true, polymorphic: true
5
+ t.integer :statement_schedule, default: 0, null: false # end_of_month bi_weekly
6
+ t.datetime :last_balanced_at, default: nil, null: true
7
+
8
+ t.timestamps
9
+ end
10
+
11
+ create_table :accountability_statements do |t|
12
+ t.belongs_to :account, null: false, index: { name: :index_account_on_statement }
13
+ t.datetime :end_date, default: nil, null: false
14
+
15
+ t.timestamps
16
+ end
17
+
18
+ create_table :accountability_debits do |t|
19
+ t.belongs_to :account, null: false, index: { name: :index_account_on_debit }
20
+ t.belongs_to :payment, null: true, index: { name: :index_payment_on_debit }
21
+ t.decimal :amount, default: 0.00, precision: 8, scale: 2, null: false
22
+
23
+ t.timestamps
24
+ end
25
+
26
+ create_table :accountability_credits do |t|
27
+ t.belongs_to :account, null: false, index: { name: :index_account_on_credit }
28
+ t.belongs_to :order_item, null: false, index: { name: :index_order_item_on_credit }
29
+ t.belongs_to :statement, null: false, index: { name: :index_statement_on_credit }
30
+ t.decimal :amount, default: 0.00, precision: 8, scale: 2, null: false
31
+ t.decimal :taxes, default: 0.00, precision: 8, scale: 2, null: false
32
+
33
+ t.timestamps
34
+ end
35
+
36
+ create_table :accountability_payments do |t|
37
+ t.belongs_to :account, null: false, index: { name: :index_account_on_payment }
38
+ t.belongs_to :billing_configuration, null: false, index: { name: :index_billing_configuration_on_payment }
39
+
40
+ t.decimal :amount, default: 0.00, precision: 8, scale: 2, null: false
41
+ t.integer :status, default: 0, null: false # Pending, Processing, Complete, Failed
42
+
43
+ t.timestamps
44
+ end
45
+
46
+ create_table :accountability_order_groups do |t|
47
+ t.belongs_to :account, null: true, index: { name: :index_account_on_order_group }
48
+
49
+ t.integer :status, default: 0, null: false # Pending, Complete, Abandoned
50
+ t.text :notes, default: nil, null: true, limit: 10_000
51
+
52
+ t.timestamps
53
+ end
54
+
55
+ create_table :accountability_order_items do |t|
56
+ t.belongs_to :order_group, null: false, index: { name: :index_order_group_on_order_iem }
57
+ t.belongs_to :product, null: false, index: { name: :index_product_on_order_iem }
58
+
59
+ t.text :source_scope, default: nil, null: true, limit: 1_000
60
+ t.datetime :termination_date, default: nil, null: true
61
+
62
+ t.timestamps
63
+ end
64
+
65
+ create_table :accountability_deductions do |t|
66
+ t.belongs_to :credit, null: false, index: { name: :index_credit_on_deduction }
67
+ t.belongs_to :discount, null: false, index: { name: :index_discount_on_deduction }
68
+
69
+ t.decimal :amount, default: 0.00, precision: 8, scale: 2, null: false
70
+
71
+ t.timestamps
72
+ end
73
+
74
+ create_table :accountability_discounts do |t|
75
+ t.belongs_to :order_item, null: false, index: { name: :index_order_item_on_discount }
76
+ t.belongs_to :coupon, null: false, index: { name: :index_coupon_on_discount }
77
+
78
+ t.timestamps
79
+ end
80
+
81
+ create_table :accountability_products do |t|
82
+ t.boolean :public, default: true, null: false
83
+ t.boolean :tax_exempt, default: false, null: false
84
+ t.decimal :price, default: 0.00, precision: 8, scale: 2, null: false
85
+ t.integer :quantity, default: 1, null: false
86
+ t.string :name, default: nil, null: false
87
+ t.string :sku, default: nil, null: true
88
+ t.text :description, default: nil, null: true, limit: 10_000
89
+ t.integer :schedule, default: 0, null: false # OneTime, Weekly, Monthly, Annually
90
+ t.string :offerable_category, default: nil, null: false
91
+ t.text :source_scope, default: nil, null: true, limit: 1_000
92
+ t.text :billing_configuration, default: nil, null: true, limit: 1_000
93
+
94
+ t.datetime :activation_date, default: nil, null: true
95
+ t.datetime :expiration_date, default: nil, null: true
96
+ t.datetime :termination_date, default: nil, null: true
97
+
98
+ t.timestamps
99
+ end
100
+
101
+ create_table :accountability_coupons do |t|
102
+ t.decimal :amount, default: 0.00, precision: 8, scale: 2, null: false
103
+ t.boolean :public, default: true, null: false
104
+ t.integer :limit, default: nil, null: true
105
+ t.string :name, default: nil, null: false
106
+ t.string :code, default: nil, null: true
107
+
108
+ t.integer :usage_cap, default: 1, null: false
109
+
110
+ t.datetime :activation_date, default: nil, null: true
111
+ t.datetime :expiration_date, default: nil, null: true
112
+ t.datetime :termination_date, default: nil, null: true
113
+
114
+ t.timestamps
115
+ end
116
+
117
+ # rubocop:disable Rails/CreateTableWithTimestamps
118
+ create_table :accountability_coupons_products, id: false do |t|
119
+ t.belongs_to :product, index: { name: :index_product_on_product_coupon }
120
+ t.belongs_to :coupon, index: { name: :index_coupon_on_product_coupon }
121
+ end
122
+ # rubocop:enable Rails/CreateTableWithTimestamps
123
+
124
+ # rubocop:disable Rails/CreateTableWithTimestamps
125
+ create_table :accountability_identities do |t|
126
+ t.belongs_to :identifiable, polymorphic: true, index: { name: :index_identifiable_on_identity }
127
+ end
128
+ # rubocop:enable Rails/CreateTableWithTimestamps
129
+
130
+ create_table :accountability_billing_configurations do |t|
131
+ t.belongs_to :account, null: false, index: { name: :index_account_on_billing_configuration }
132
+ t.boolean :primary, default: false, null: false
133
+ t.text :billing_address, default: nil, null: true # JSON serialized value object
134
+ t.text :active_merchant_data, default: nil, null: true # JSON serialized data for ActiveMerchant
135
+ t.integer :provider, default: 0, null: false # [unselected, stripe]
136
+ t.string :token, default: nil, null: true # A token used to retrieve & charge the payment method from the provider
137
+ t.string :configuration_name, default: nil, null: true # A name for the payment method
138
+ t.string :contact_email, default: nil, null: true
139
+ t.string :contact_first_name, default: nil, null: true
140
+ t.string :contact_last_name, default: nil, null: true
141
+
142
+ t.timestamps
143
+ end
144
+
145
+ create_table :accountability_price_overrides do |t|
146
+ t.belongs_to :product, index: { name: :index_product_on_price_override }
147
+ t.belongs_to :offerable_source, null: false, polymorphic: true, index: { name: :index_offerable_source_on_price_override }
148
+
149
+ t.decimal :price, default: 0.00, precision: 8, scale: 2, null: false # The inventory item's new price
150
+ t.text :description, default: nil, null: true, limit: 10_000 # Optional field for describing adjustment rationale
151
+
152
+ t.timestamps
153
+ end
154
+ end
155
+ end
@@ -0,0 +1,13 @@
1
+ class <%= migration_class_name %> < ActiveRecord::Migration<%= migration_version %>
2
+ def change
3
+ create_table :accountability_price_overrides do |t|
4
+ t.belongs_to :product, index: { name: :index_product_on_price_override }
5
+ t.belongs_to :offerable_source, null: false, polymorphic: true, index: { name: :index_offerable_source_on_price_override }
6
+
7
+ t.decimal :price, default: 0.00, precision: 8, scale: 2, null: false # The inventory item's new price
8
+ t.text :description, default: nil, null: true, limit: 10_000 # Optional field for describing adjustment rationale
9
+
10
+ t.timestamps
11
+ end
12
+ end
13
+ end
metadata CHANGED
@@ -1,29 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: accountability
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Joshua Stowers
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-09-13 00:00:00.000000000 Z
11
+ date: 2020-03-23 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: active_accountability_merchant
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: prawn
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: prawn-table
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
13
55
  - !ruby/object:Gem::Dependency
14
56
  name: rails
15
57
  requirement: !ruby/object:Gem::Requirement
16
58
  requirements:
17
- - - "~>"
59
+ - - ">="
18
60
  - !ruby/object:Gem::Version
19
- version: 6.0.0.rc2
61
+ version: '0'
20
62
  type: :runtime
21
63
  prerelease: false
22
64
  version_requirements: !ruby/object:Gem::Requirement
23
65
  requirements:
24
- - - "~>"
66
+ - - ">="
25
67
  - !ruby/object:Gem::Version
26
- version: 6.0.0.rc2
68
+ version: '0'
27
69
  - !ruby/object:Gem::Dependency
28
70
  name: sqlite3
29
71
  requirement: !ruby/object:Gem::Requirement
@@ -49,44 +91,63 @@ files:
49
91
  - MIT-LICENSE
50
92
  - README.md
51
93
  - app/assets/config/accountability_manifest.js
52
- - app/assets/stylesheets/accountability/application.css
94
+ - app/assets/stylesheets/accountability/application.scss
53
95
  - app/controllers/accountability/accounts_controller.rb
54
- - app/controllers/accountability/application_controller.rb
96
+ - app/controllers/accountability/billing_configurations_controller.rb
55
97
  - app/controllers/accountability/order_groups_controller.rb
98
+ - app/controllers/accountability/payments_controller.rb
56
99
  - app/controllers/accountability/products_controller.rb
57
- - app/helpers/accountability/application_helper.rb
100
+ - app/controllers/accountability/statements_controller.rb
101
+ - app/controllers/accountability_controller.rb
102
+ - app/helpers/accountability/accountability_helper.rb
103
+ - app/helpers/accountability/billing_configurations_helper.rb
104
+ - app/helpers/accountability/products_helper.rb
58
105
  - app/models/accountability/account.rb
59
- - app/models/accountability/account/transactions.rb
60
106
  - app/models/accountability/application_record.rb
107
+ - app/models/accountability/billing_configuration.rb
61
108
  - app/models/accountability/coupon.rb
62
109
  - app/models/accountability/credit.rb
63
110
  - app/models/accountability/debit.rb
64
111
  - app/models/accountability/deduction.rb
65
112
  - app/models/accountability/discount.rb
113
+ - app/models/accountability/inventory.rb
66
114
  - app/models/accountability/offerable.rb
115
+ - app/models/accountability/offerable/scope.rb
67
116
  - app/models/accountability/order_group.rb
68
117
  - app/models/accountability/order_item.rb
69
118
  - app/models/accountability/payment.rb
70
119
  - app/models/accountability/product.rb
120
+ - app/models/accountability/statement.rb
121
+ - app/models/accountability/transactions.rb
122
+ - app/models/concerns/accountability/active_merchant_interface.rb
123
+ - app/models/concerns/accountability/active_merchant_interface/stripe_interface.rb
124
+ - app/pdfs/statement_pdf.rb
71
125
  - app/views/accountability/accounts/index.html.haml
72
126
  - app/views/accountability/accounts/show.html.haml
73
127
  - app/views/accountability/order_groups/new.html.haml
74
128
  - app/views/accountability/order_groups/show.html.haml
75
129
  - app/views/accountability/products/edit.html.erb
76
130
  - app/views/accountability/products/index.html.haml
77
- - app/views/accountability/products/new.html.erb
131
+ - app/views/accountability/products/new.html.haml
78
132
  - app/views/accountability/products/show.html.erb
133
+ - app/views/accountability/shared/_session_info.html.haml
79
134
  - app/views/layouts/acts_as_billable/application.html.erb
135
+ - config/locales/en.yml
80
136
  - config/routes.rb
81
137
  - db/migrate/20190814000455_create_accountability_tables.rb
82
138
  - lib/accountability.rb
83
- - lib/accountability/cartographer.rb
84
139
  - lib/accountability/configuration.rb
85
140
  - lib/accountability/engine.rb
86
141
  - lib/accountability/extensions.rb
87
142
  - lib/accountability/extensions/acts_as_billable.rb
88
143
  - lib/accountability/extensions/acts_as_offerable.rb
144
+ - lib/accountability/rails/routes.rb
145
+ - lib/accountability/types.rb
146
+ - lib/accountability/types/billing_configuration_types.rb
89
147
  - lib/accountability/version.rb
148
+ - lib/generators/accountability/install_generator.rb
149
+ - lib/generators/accountability/templates/migration.rb.tt
150
+ - lib/generators/accountability/templates/price_overrides_migration.rb.tt
90
151
  homepage: https://elevatesystems.com
91
152
  licenses:
92
153
  - MIT
@@ -1,15 +0,0 @@
1
- /*
2
- * This is a manifest file that'll be compiled into application.css, which will include all the files
3
- * listed below.
4
- *
5
- * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets,
6
- * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path.
7
- *
8
- * You're free to add application-wide styles to this file and they'll appear at the bottom of the
9
- * compiled file so the styles you add here take precedence over styles defined in any other CSS/SCSS
10
- * files in this directory. Styles in this file should be added after the last require_* statement.
11
- * It is generally better to create a new file per style scope.
12
- *
13
- * require_tree accountability
14
- *= require_self
15
- */
@@ -1,45 +0,0 @@
1
- module Accountability
2
- class ApplicationController < ::ApplicationController
3
- protect_from_forgery with: :exception
4
-
5
- private
6
-
7
- def track_order
8
- # Check if session is billable (billable_identifier proc returns )
9
- billable_record = instance_exec(&Configuration.billable_identifier)
10
-
11
- if billable_record.present?
12
- track_user_session(billable_record)
13
- else
14
- track_guest_session
15
- end
16
- end
17
-
18
- def track_user_session(billable_record)
19
- raise 'Record not billable' unless billable_record.acts_as.billable?
20
-
21
- current_account = billable_record.accounts.first_or_create!
22
- session[:current_account_id] = current_account.id
23
-
24
- if current_order_group&.unassigned?
25
- current_order_group.assign_account! current_account
26
- else
27
- current_order_group = current_account.order_groups.pending.first_or_create!
28
- session[:current_order_group_id] = current_order_group.id
29
- end
30
- end
31
-
32
- def track_guest_session
33
- # Check if the order already belongs to someone
34
- return if current_order_group&.unassigned?
35
-
36
- current_order_group = OrderGroup.create!
37
- session[:current_order_group_id] = current_order_group.id
38
- end
39
-
40
- def current_order_group
41
- order_group_id = session[:current_order_group_id]
42
- OrderGroup.find_by(id: order_group_id)
43
- end
44
- end
45
- end
@@ -1,40 +0,0 @@
1
- <h1>Product#new</h1>
2
-
3
- <% @product.errors.full_messages.each do |message| %>
4
- <div class="alert alert-danger">
5
- <%= message %>
6
- </div>
7
- <% end %>
8
-
9
- <%= form_with model: [:accountability, @product], local: true do |f| %>
10
- <div class="card my-3">
11
- <div class="card-header">
12
- <b>Info</b>
13
- </div>
14
- <div class="card-body">
15
- <div class="form-row">
16
- <div class="form-group col-md-8">
17
- <%= f.label :name %>
18
- <%= f.text_field :name, class: 'form-control' %>
19
- </div>
20
- <div class="form-group col-md-4">
21
- <%= f.label :sku %>
22
- <%= f.text_field :sku, class: 'form-control' %>
23
- </div>
24
- <div class="form-group col-md-4">
25
- <%= f.label :price %>
26
- <%= f.number_field :price, step: 2, class: 'form-control' %>
27
- </div>
28
- <div class="form-group col-md-12">
29
- <%= f.label :description %>
30
- <%= f.text_area :description, class: 'form-control' %>
31
- </div>
32
- <div class="form-group col-md-4">
33
- <%= f.label :source_class, 'Category' %>
34
- <%= f.select :source_class, Accountability::Offerable.collection.stringify_keys.keys.map(&:titleize), {}, {class: 'form-control' } %>
35
- </div>
36
- </div>
37
- </div>
38
- </div>
39
- <%= f.submit 'Submit', class: 'btn btn-success' %>
40
- <% end %>
@@ -1,28 +0,0 @@
1
- # TODO: Rewrite cartographer logic to be less flaky (see Devise)
2
-
3
- module ActionDispatch::Routing
4
- class Mapper
5
- def accountability_views_for(*tenants)
6
- options = tenants.extract_options!
7
-
8
- options[:path_prefix] ||= options[:path] if options[:path_prefix].nil?
9
-
10
- cartographer = proc do
11
- namespace :accountability, path: options[:path_prefix], as: :accountability do
12
- resources :accounts, only: %i[index show]
13
- resources :products
14
- resources :order_groups, path: 'orders' do
15
- member do
16
- post :add_item
17
- end
18
- end
19
- root to: 'products#index'
20
- end
21
- end
22
-
23
- cartographer.call
24
-
25
- Accountability::Engine.routes.draw(&cartographer)
26
- end
27
- end
28
- end