erp_products 3.0.0

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.
Files changed (38) hide show
  1. data/GPL-3-LICENSE +674 -0
  2. data/README.rdoc +2 -0
  3. data/Rakefile +30 -0
  4. data/app/assets/javascripts/erp_products/application.js +9 -0
  5. data/app/assets/stylesheets/erp_products/application.css +7 -0
  6. data/app/controllers/erp_products/erp_app/desktop/product_manager/base_controller.rb +233 -0
  7. data/app/helpers/erp_products/application_helper.rb +4 -0
  8. data/app/models/prod_availability_status_type.rb +5 -0
  9. data/app/models/prod_instance_reln.rb +14 -0
  10. data/app/models/prod_instance_reln_type.rb +4 -0
  11. data/app/models/prod_instance_role_type.rb +4 -0
  12. data/app/models/prod_type_reln.rb +15 -0
  13. data/app/models/prod_type_reln_type.rb +4 -0
  14. data/app/models/prod_type_role_type.rb +4 -0
  15. data/app/models/product_instance.rb +21 -0
  16. data/app/models/product_offer.rb +11 -0
  17. data/app/models/product_package.rb +7 -0
  18. data/app/models/product_type.rb +37 -0
  19. data/app/models/simple_product_offer.rb +4 -0
  20. data/app/views/layouts/erp_products/application.html.erb +14 -0
  21. data/config/routes.rb +4 -0
  22. data/db/data_migrations/20110324010232_product_role_types.rb +23 -0
  23. data/db/data_migrations/20110527160807_add_default_prod_avail_types.rb +26 -0
  24. data/db/data_migrations/20110728201730_create_desktop_app_product_manager.rb +25 -0
  25. data/db/migrate/20080805000040_base_products.rb +232 -0
  26. data/db/migrate/20080805000041_base_products_indexes.rb +58 -0
  27. data/lib/erp_products/engine.rb +16 -0
  28. data/lib/erp_products/extensions/active_record/acts_as_product_instance.rb +50 -0
  29. data/lib/erp_products/extensions/active_record/acts_as_product_offer.rb +52 -0
  30. data/lib/erp_products/extensions/active_record/acts_as_product_type.rb +59 -0
  31. data/lib/erp_products/extensions.rb +3 -0
  32. data/lib/erp_products/version.rb +3 -0
  33. data/lib/erp_products.rb +5 -0
  34. data/lib/tasks/erp_products_tasks.rake +4 -0
  35. data/public/javascripts/erp_app/desktop/applications/product_manager/module.js +799 -0
  36. data/public/javascripts/erp_app/desktop/applications/product_manager/product_list_panel.js +141 -0
  37. data/public/stylesheets/erp_app/desktop/applications/product_manager/style.css +71 -0
  38. metadata +119 -0
@@ -0,0 +1,232 @@
1
+ class BaseProducts < ActiveRecord::Migration
2
+ def self.up
3
+
4
+ unless table_exists?(:product_types)
5
+ create_table :product_types do |t|
6
+ #these columns are required to support the behavior of the plugin 'better_nested_set'
7
+ #ALL products have the ability to act as packages in a nested set-type structure
8
+ #
9
+ #The package behavior is treated differently from other product_relationship behavior
10
+ #which is implemented using a standard relationship structure.
11
+ #
12
+ #This is to allow quick construction of highly nested product types.
13
+ t.column :parent_id, :integer
14
+ t.column :lft, :integer
15
+ t.column :rgt, :integer
16
+
17
+ #custom columns go here
18
+ t.column :description, :string
19
+ t.column :product_type_record_id, :integer
20
+ t.column :product_type_record_type, :string
21
+ t.column :external_identifier, :string
22
+ t.column :external_id_source, :string
23
+ t.column :default_image_url, :string
24
+ t.column :list_view_image_id, :integer
25
+ t.timestamps
26
+ end
27
+ end
28
+
29
+ unless table_exists?(:product_instances)
30
+ create_table :product_instances do |t|
31
+ #these columns are required to support the behavior of the plugin 'better_nested_set'
32
+ #ALL products have the ability to act as packages in a nested set-type structure
33
+ #
34
+ #The package behavior is treated differently from other product_relationship behavior
35
+ #which is implemented using a standard relationship structure.
36
+ #
37
+ #This is to allow quick construction of highly nested product types.
38
+ t.column :parent_id, :integer
39
+ t.column :lft, :integer
40
+ t.column :rgt, :integer
41
+
42
+ #custom columns go here
43
+ t.column :description, :string
44
+ t.column :product_instance_record_id, :integer
45
+ t.column :product_instance_record_type, :string
46
+ t.column :external_identifier, :string
47
+ t.column :external_id_source, :string
48
+ t.column :product_type_id, :integer
49
+ t.column :type, :string
50
+
51
+ t.references :prod_availability_status_type
52
+
53
+ t.timestamps
54
+ end
55
+ end
56
+
57
+ unless table_exists?(:product_offers)
58
+ create_table :product_offers do |t|
59
+ t.column :description, :string
60
+ t.column :product_offer_record_id, :integer
61
+ t.column :product_offer_record_type, :string
62
+ t.column :external_identifier, :string
63
+ t.column :external_id_source, :string
64
+ t.timestamps
65
+ end
66
+ end
67
+
68
+ unless table_exists?(:simple_product_offers)
69
+ create_table :simple_product_offers do |t|
70
+ t.column :description, :string
71
+ t.column :product_id, :integer
72
+ t.column :base_price, :float
73
+ t.column :uom, :integer
74
+ t.timestamps
75
+ end
76
+ end
77
+
78
+ unless table_exists?(:prod_instance_reln_types)
79
+ create_table :prod_instance_reln_types do |t|
80
+ t.column :parent_id, :integer
81
+ t.column :lft, :integer
82
+ t.column :rgt, :integer
83
+
84
+ #custom columns go here
85
+ t.column :description, :string
86
+ t.column :comments, :string
87
+ t.column :internal_identifier, :string
88
+ t.column :external_identifier, :string
89
+ t.column :external_id_source, :string
90
+ t.timestamps
91
+ end
92
+ end
93
+
94
+ unless table_exists?(:prod_instance_role_types)
95
+ create_table :prod_instance_role_types do |t|
96
+ t.column :parent_id, :integer
97
+ t.column :lft, :integer
98
+ t.column :rgt, :integer
99
+ #custom columns go here
100
+ t.column :description, :string
101
+ t.column :comments, :string
102
+ t.column :internal_identifier, :string
103
+ t.column :external_identifier, :string
104
+ t.column :external_id_source, :string
105
+ t.timestamps
106
+ end
107
+ end
108
+
109
+ unless table_exists?(:prod_instance_relns)
110
+ create_table :prod_instance_relns do |t|
111
+ t.column :prod_instance_reln_type_id, :integer
112
+ t.column :description, :string
113
+ t.column :prod_instance_id_from, :integer
114
+ t.column :prod_instance_id_to, :integer
115
+ t.column :role_type_id_from, :integer
116
+ t.column :role_type_id_to, :integer
117
+ t.column :status_type_id, :integer
118
+ t.column :from_date, :date
119
+ t.column :thru_date, :date
120
+ t.timestamps
121
+ end
122
+ end
123
+
124
+ unless table_exists?(:prod_type_reln_types)
125
+ create_table :prod_type_reln_types do |t|
126
+ t.column :parent_id, :integer
127
+ t.column :lft, :integer
128
+ t.column :rgt, :integer
129
+ #custom columns go here
130
+ t.column :description, :string
131
+ t.column :comments, :string
132
+ t.column :internal_identifier, :string
133
+ t.column :external_identifier, :string
134
+ t.column :external_id_source, :string
135
+ t.timestamps
136
+ end
137
+ end
138
+
139
+ unless table_exists?(:prod_type_role_types)
140
+ create_table :prod_type_role_types do |t|
141
+ t.column :parent_id, :integer
142
+ t.column :lft, :integer
143
+ t.column :rgt, :integer
144
+ #custom columns go here
145
+ t.column :description, :string
146
+ t.column :comments, :string
147
+ t.column :internal_identifier, :string
148
+ t.column :external_identifier, :string
149
+ t.column :external_id_source, :string
150
+ t.timestamps
151
+ end
152
+ end
153
+
154
+ unless table_exists?(:prod_type_relns)
155
+ create_table :prod_type_relns do |t|
156
+ t.column :prod_type_reln_type_id, :integer
157
+ t.column :description, :string
158
+ t.column :prod_type_id_from, :integer
159
+ t.column :prod_type_id_to, :integer
160
+ t.column :role_type_id_from, :integer
161
+ t.column :role_type_id_to, :integer
162
+ t.column :status_type_id, :integer
163
+ t.column :from_date, :date
164
+ t.column :thru_date, :date
165
+ t.timestamps
166
+ end
167
+ end
168
+
169
+ unless table_exists?(:product_instance_status_types)
170
+ create_table :product_instance_status_types do |t|
171
+ #better nested set colummns
172
+ t.column :parent_id, :integer
173
+ t.column :lft, :integer
174
+ t.column :rgt, :integer
175
+
176
+ t.column :description, :string
177
+ t.column :internal_identifier, :string
178
+ t.column :external_identifier, :string
179
+ t.column :external_id_source, :string
180
+
181
+ t.timestamps
182
+ end
183
+ end
184
+
185
+ unless table_exists?(:prod_availability_status_types)
186
+ create_table :prod_availability_status_types do |t|
187
+ #better nested set colummns
188
+ t.column :parent_id, :integer
189
+ t.column :lft, :integer
190
+ t.column :rgt, :integer
191
+
192
+ t.column :description, :string
193
+ t.column :internal_identifier, :string
194
+ t.column :external_identifier, :string
195
+ t.column :external_id_source, :string
196
+
197
+ t.timestamps
198
+ end
199
+ end
200
+
201
+ unless table_exists?(:prod_availability_status_types)
202
+ create_table :prod_availability_status_types do |t|
203
+ #better nested set colummns
204
+ t.column :parent_id, :integer
205
+ t.column :lft, :integer
206
+ t.column :rgt, :integer
207
+
208
+ t.column :description, :string
209
+ t.column :internal_identifier, :string
210
+ t.column :external_identifier, :string
211
+ t.column :external_id_source, :string
212
+
213
+ t.timestamps
214
+ end
215
+ end
216
+
217
+
218
+ end
219
+
220
+ def self.down
221
+ [
222
+ :prod_type_relns, :prod_type_role_types, :prod_type_reln_types,
223
+ :prod_instance_relns, :prod_instance_role_types, :prod_instance_reln_types,
224
+ :simple_product_offers, :product_offers, :product_instances,
225
+ :product_types,:prod_availability_status_types
226
+ ].each do |tbl|
227
+ if table_exists?(tbl)
228
+ drop_table tbl
229
+ end
230
+ end
231
+ end
232
+ end
@@ -0,0 +1,58 @@
1
+ class BaseProductsIndexes < ActiveRecord::Migration
2
+ def self.up
3
+ add_index :product_types, :parent_id
4
+ add_index :product_types, [:product_type_record_id, :product_type_record_type],
5
+ :name => "bpi_1"
6
+
7
+ add_index :product_instances, :parent_id
8
+ add_index :product_instances, [:product_instance_record_id, :product_instance_record_type],
9
+ :name => "bpi_2"
10
+ add_index :product_instances, :product_type_id
11
+
12
+ add_index :product_offers, [:product_offer_record_id, :product_offer_record_type],
13
+ :name => "bpi_3"
14
+
15
+ add_index :simple_product_offers, :product_id
16
+
17
+ add_index :prod_instance_reln_types, :parent_id
18
+
19
+ add_index :prod_instance_role_types, :parent_id
20
+
21
+ add_index :prod_instance_relns, :prod_instance_reln_type_id
22
+ add_index :prod_instance_relns, :status_type_id
23
+
24
+ add_index :prod_type_reln_types, :parent_id
25
+
26
+ add_index :prod_type_role_types, :parent_id
27
+
28
+ add_index :prod_type_relns, :prod_type_reln_type_id
29
+ add_index :prod_type_relns, :status_type_id
30
+ end
31
+
32
+ def self.down
33
+ remove_index :product_types, :parent_id
34
+ remove_index :product_types, :name => "bpi_1"
35
+
36
+ remove_index :product_instances, :parent_id
37
+ remove_index :product_instances, :name => "bpi_2"
38
+ remove_index :product_instances, :product_type_id
39
+
40
+ remove_index :product_offers, :name => "bpi_3"
41
+
42
+ remove_index :simple_product_offers, :product_id
43
+
44
+ remove_index :prod_instance_reln_types, :parent_id
45
+
46
+ remove_index :prod_instance_role_types, :parent_id
47
+
48
+ remove_index :prod_instance_relns, :prod_instance_reln_type_id
49
+ remove_index :prod_instance_relns, :status_type_id
50
+
51
+ remove_index :prod_type_reln_types, :parent_id
52
+
53
+ remove_index :prod_type_role_types, :parent_id
54
+
55
+ remove_index :prod_type_relns, :prod_type_reln_type_id
56
+ remove_index :prod_type_relns, :status_type_id
57
+ end
58
+ end
@@ -0,0 +1,16 @@
1
+ module ErpProducts
2
+ class Engine < Rails::Engine
3
+ isolate_namespace ErpProducts
4
+
5
+ initializer "erp_products.merge_public" do |app|
6
+ app.middleware.insert_before Rack::Lock, ::ActionDispatch::Static, "#{root}/public"
7
+ end
8
+
9
+ ActiveSupport.on_load(:active_record) do
10
+ include ErpProducts::Extensions::ActiveRecord::ActsAsProductInstance
11
+ include ErpProducts::Extensions::ActiveRecord::ActsAsProductOffer
12
+ include ErpProducts::Extensions::ActiveRecord::ActsAsProductType
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,50 @@
1
+ module ErpProducts
2
+ module Extensions
3
+ module ActiveRecord
4
+ module ActsAsProductInstance
5
+ def self.included(base)
6
+ base.extend(ClassMethods)
7
+ end
8
+
9
+ module ClassMethods
10
+ def acts_as_product_instance
11
+ extend ActsAsProductInstance::SingletonMethods
12
+ include ActsAsProductInstance::InstanceMethods
13
+
14
+ after_initialize :initialize_product_instance
15
+ after_create :save_product_instance
16
+ after_update :save_product_instance
17
+ after_destroy :destroy_product_instance
18
+
19
+ has_one :product_instance, :as => :product_instance_record
20
+
21
+ [:product_type,:product_type=,:description,:description=].each do |m| delegate m, :to => :product_instance end
22
+
23
+ end
24
+ end
25
+
26
+ module SingletonMethods
27
+ end
28
+
29
+ module InstanceMethods
30
+ def save_product_instance
31
+ self.product_instance.save
32
+ end
33
+
34
+ def initialize_product_instance
35
+ if self.new_record? && self.product_instance.nil?
36
+ product_instance = ProductInstance.new
37
+ self.product_instance = product_instance
38
+ product_instance.product_instance_record = self
39
+ end
40
+ end
41
+
42
+ def destroy_product_instance
43
+ self.product_instance.destroy if (self.product_instance && !self.product_instance.frozen?)
44
+ end
45
+
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,52 @@
1
+ module ErpProducts
2
+ module Extensions
3
+ module ActiveRecord
4
+ module ActsAsProductOffer
5
+
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def acts_as_product_offer
12
+ extend ActsAsProductOffer::SingletonMethods
13
+ include ActsAsProductOffer::InstanceMethods
14
+
15
+ after_initialize :initialize_product_offer
16
+ after_create :save_product_offer
17
+ after_update :save_product_offer
18
+ after_destroy :destroy_product_offer
19
+
20
+ has_one :product_offer, :as => :product_offer_record
21
+
22
+ [:description, :description=].each do |m| delegate m, :to => :product_offer end
23
+ end
24
+ end
25
+
26
+ module SingletonMethods
27
+ end
28
+
29
+ module InstanceMethods
30
+ def initialize_product_offer
31
+ if self.new_record? && self.product_offer.nil?
32
+ product_offer = ProductOffer.new
33
+ self.product_offer = product_offer
34
+ product_offer.save
35
+ self.save
36
+ end
37
+ end
38
+
39
+ def save_product_offer
40
+ self.product_offer.description = self.description
41
+ self.product_offer.save
42
+ end
43
+
44
+ def destroy_product_offer
45
+ self.product_offer.destroy if (self.product_offer && !self.product_offer.frozen?)
46
+ end
47
+
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,59 @@
1
+ module ErpProducts
2
+ module Extensions
3
+ module ActiveRecord
4
+ module ActsAsProductType
5
+
6
+ def self.included(base)
7
+ base.extend(ClassMethods)
8
+ end
9
+
10
+ module ClassMethods
11
+ def acts_as_product_type()
12
+ extend ActsAsProductType::SingletonMethods
13
+ include ActsAsProductType::InstanceMethods
14
+
15
+ after_initialize :initialize_product_type
16
+ after_create :save_product_type
17
+ after_update :save_product_type
18
+ after_destroy :destroy_product_type
19
+
20
+ has_one :product_type, :as => :product_type_record
21
+
22
+ [:children, :description, :description=].each do |m| delegate m, :to => :product_type end
23
+
24
+ def self.find_roots
25
+ ProductType.find_roots
26
+ end
27
+
28
+ def self.find_children(parent_id = nil)
29
+ ProductType.find_children(parent_id)
30
+ end
31
+ end
32
+ end
33
+
34
+ module SingletonMethods
35
+ end
36
+
37
+ module InstanceMethods
38
+ def initialize_product_type
39
+ if self.new_record? && self.product_type.nil?
40
+ product_type = ProductType.new
41
+ self.product_type = product_type
42
+ product_type.save
43
+ self.save
44
+ end
45
+ end
46
+
47
+ def save_product_type
48
+ self.product_type.save
49
+ end
50
+
51
+ def destroy_product_type
52
+ self.product_type.destroy if (self.product_type && !self.product_type.frozen?)
53
+ end
54
+ end
55
+
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,3 @@
1
+ require 'erp_products/extensions/active_record/acts_as_product_instance'
2
+ require 'erp_products/extensions/active_record/acts_as_product_offer'
3
+ require 'erp_products/extensions/active_record/acts_as_product_type'
@@ -0,0 +1,3 @@
1
+ module ErpProducts
2
+ VERSION = "3.0.0"
3
+ end
@@ -0,0 +1,5 @@
1
+ require "erp_products/extensions"
2
+ require "erp_products/engine"
3
+
4
+ module ErpProducts
5
+ end
@@ -0,0 +1,4 @@
1
+ # desc "Explaining what the task does"
2
+ # task :erp_products do
3
+ # # Task goes here
4
+ # end