subj_sub_models 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.idea/modules.xml +1 -1
  4. data/.idea/workspace.xml +5 -5
  5. data/Gemfile +1 -1
  6. data/README.md +3 -3
  7. data/bin/console +1 -1
  8. data/lib/subj_models/access_group.rb +22 -0
  9. data/lib/subj_models/action_banner.rb +37 -0
  10. data/lib/subj_models/attribute_value.rb +32 -0
  11. data/lib/subj_models/brand.rb +74 -0
  12. data/lib/subj_models/brand_line.rb +51 -0
  13. data/lib/subj_models/category.rb +36 -0
  14. data/lib/subj_models/city.rb +31 -0
  15. data/lib/subj_models/concerns/comprising_external_id.rb +37 -0
  16. data/lib/subj_models/concerns/shared_scopes.rb +15 -0
  17. data/lib/subj_models/content_block.rb +28 -0
  18. data/lib/subj_models/document_file.rb +38 -0
  19. data/lib/subj_models/event.rb +79 -0
  20. data/lib/subj_models/event_booking.rb +39 -0
  21. data/lib/subj_models/event_schedule.rb +37 -0
  22. data/lib/subj_models/event_type.rb +27 -0
  23. data/lib/subj_models/faq.rb +46 -0
  24. data/lib/subj_models/global_notification.rb +16 -0
  25. data/lib/subj_models/manager.rb +31 -0
  26. data/lib/subj_models/measure_unit.rb +28 -0
  27. data/lib/subj_models/nomenclature.rb +166 -0
  28. data/lib/subj_models/nomenclature_access_group.rb +19 -0
  29. data/lib/subj_models/nomenclature_attribute.rb +27 -0
  30. data/lib/subj_models/nomenclature_file.rb +44 -0
  31. data/lib/subj_models/nomenclature_photo.rb +36 -0
  32. data/lib/subj_models/nomenclature_price.rb +39 -0
  33. data/lib/subj_models/nomenclature_review.rb +38 -0
  34. data/lib/subj_models/nomenclature_variety.rb +29 -0
  35. data/lib/subj_models/office.rb +40 -0
  36. data/lib/subj_models/office_contact.rb +41 -0
  37. data/lib/subj_models/order.rb +91 -0
  38. data/lib/subj_models/order_delivery_courier.rb +31 -0
  39. data/lib/subj_models/order_delivery_nova_poshta_warhouse.rb +20 -0
  40. data/lib/subj_models/order_delivery_pickup.rb +28 -0
  41. data/lib/subj_models/order_delivery_privatbank.rb +29 -0
  42. data/lib/subj_models/order_delivery_subj_courier.rb +25 -0
  43. data/lib/subj_models/order_item.rb +60 -0
  44. data/lib/subj_models/quality.rb +25 -0
  45. data/lib/subj_models/services/types_support.rb +122 -0
  46. data/lib/subj_models/services/values_checker.rb +11 -0
  47. data/lib/subj_models/specialist_activity.rb +33 -0
  48. data/lib/subj_models/specialist_activity_document_type.rb +29 -0
  49. data/lib/subj_models/template.rb +18 -0
  50. data/lib/subj_models/user.rb +131 -0
  51. data/lib/subj_models/user_card.rb +29 -0
  52. data/lib/subj_models/user_card_delivery.rb +29 -0
  53. data/lib/subj_models/user_delivery_address.rb +34 -0
  54. data/lib/subj_models/user_specialization.rb +38 -0
  55. data/lib/subj_models/user_specialization_approval.rb +33 -0
  56. data/lib/subj_models/user_work_place.rb +29 -0
  57. data/lib/subj_models/version.rb +3 -0
  58. data/lib/subj_models/video.rb +29 -0
  59. data/lib/subj_models.rb +49 -0
  60. data/subj_models.gemspec +33 -0
  61. data/subj_models.iml +9 -0
  62. metadata +56 -2
@@ -0,0 +1,28 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+
3
+ module SubjModels
4
+
5
+ module ContentBlockModule
6
+
7
+ def self.included(including_class)
8
+
9
+ including_class.class_eval do
10
+
11
+ include SubjModels::ComprisingExternalId
12
+
13
+ belongs_to :document_file
14
+ has_one :brand
15
+
16
+ end
17
+
18
+ end
19
+
20
+ def to_s
21
+ brands = Brand.where('content_block1_id=? OR (content_block2_id=? OR content_block3_id=?)', id, id, id)
22
+ addition_text = brands.any? ? "#{brands.first.try(:name)}" : 'Без бренда'
23
+ "#{title} - " + addition_text
24
+ end
25
+
26
+ end
27
+
28
+ end
@@ -0,0 +1,38 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+
3
+ module SubjModels
4
+
5
+ module DocumentFileModule
6
+
7
+ def self.included(including_class)
8
+
9
+ including_class.class_eval do
10
+
11
+ include SubjModels::ComprisingExternalId
12
+
13
+ has_one :nomenclature_photo
14
+ has_one :nomenclature_file
15
+ has_one :brand_line
16
+ has_one :user
17
+ has_one :manager
18
+ has_one :user_specialization_approval
19
+
20
+ has_many :videos
21
+ has_many :brands
22
+
23
+ mount_uploader :file_data, PhotoUploader
24
+ mount_uploader :alternative_file_data, PhotoUploader
25
+
26
+ validates :file_data, presence: true
27
+
28
+ end
29
+
30
+ end
31
+
32
+ def to_s
33
+ id.to_s
34
+ end
35
+
36
+ end
37
+
38
+ end
@@ -0,0 +1,79 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+
3
+ module SubjModels
4
+
5
+ module EventModule
6
+
7
+ def self.included(including_class)
8
+
9
+ including_class.class_eval do
10
+
11
+ include SubjModels::ComprisingExternalId
12
+
13
+ belongs_to :manager
14
+ belongs_to :event_type
15
+ belongs_to :nomenclature
16
+ belongs_to :document_file
17
+ belongs_to :brand
18
+
19
+ has_one :event_schedule
20
+ has_one :nomenclature_price
21
+
22
+ has_many :order_items
23
+ has_many :event_bookings
24
+
25
+ has_and_belongs_to_many :user_specializations
26
+ has_and_belongs_to_many :nomenclatures
27
+
28
+ validates :document_file, :title, presence: true
29
+
30
+ scope :from_today, -> {
31
+ Event.joins(:event_schedule).where('event_schedules.event_date >= ?', DateTime.now.beginning_of_day )
32
+ .includes(:event_schedule).order( 'event_schedules.event_date ASC' ).uniq
33
+ }
34
+
35
+ scope :where_nomenclature_ids, -> (ids) do
36
+ joins(:nomenclatures).where(nomenclatures: {id: ids})
37
+ end
38
+
39
+ scope :office_ids, -> (ids) do
40
+ joins(event_schedule: [:office]).where(event_schedule: { office: {id: ids}})
41
+ end
42
+
43
+ scope :type_ids, -> (ids) do
44
+ joins(:event_type).where(event_type: {id: ids})
45
+ end
46
+
47
+ scope :brand_ids, -> (ids) do
48
+ joins(:brand).where(brand: { id: ids})
49
+ end
50
+
51
+ scope :only_free, -> do
52
+ joins(:event_schedule).where(event_schedule: { is_free: true } )
53
+ end
54
+
55
+ scope :specialities_ids, -> (ids) do
56
+ joins(:user_specializations).where(user_specializations: { id: ids})
57
+ end
58
+
59
+ scope :date_range, -> (date) do
60
+ joins(:event_schedule)
61
+ .where(event_schedule: { event_date: DateTime.parse(date['from']).beginning_of_day..DateTime.parse(date['to']).end_of_day } )
62
+ end
63
+
64
+ scope :today_events, -> {
65
+ includes(:event_schedule).where(event_schedule: { event_date: DateTime.now.beginning_of_day..DateTime.now.end_of_day } )
66
+ }
67
+ scope :is_public, -> { where(is_public: true) }
68
+
69
+ end
70
+
71
+ end
72
+
73
+ def to_s
74
+ title.to_s
75
+ end
76
+
77
+ end
78
+
79
+ end
@@ -0,0 +1,39 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+
3
+ module SubjModels
4
+
5
+ module EventBookingModule
6
+
7
+ def self.included(including_class)
8
+
9
+ including_class.class_eval do
10
+
11
+ include SubjModels::ComprisingExternalId
12
+
13
+ belongs_to :order
14
+ belongs_to :user
15
+ belongs_to :event
16
+
17
+ validates :user, uniqueness: { scope: :event }
18
+
19
+ scope :user_id , -> (user_id) {where(user_id: user_id)}
20
+ scope :event_id , -> (event_id) {where(event_id: event_id)}
21
+ scope :only_new, -> (condition) do
22
+ if condition
23
+ where(external_id: nil)
24
+ else
25
+ all
26
+ end
27
+ end
28
+
29
+ end
30
+
31
+ end
32
+
33
+ def to_s
34
+ id.to_s
35
+ end
36
+
37
+ end
38
+
39
+ end
@@ -0,0 +1,37 @@
1
+ require 'subj_models/services/values_checker'
2
+ require 'subj_models/services/types_support'
3
+ require 'subj_models/concerns/comprising_external_id'
4
+
5
+ module SubjModels
6
+
7
+ module EventScheduleModule
8
+
9
+ include SubjModels::TypesSupport::EventTypes
10
+ include SubjModels::ValuesChecker
11
+
12
+ def self.included(including_class)
13
+
14
+ including_class.class_eval do
15
+
16
+ include SubjModels::ComprisingExternalId
17
+
18
+ enum event_type: EVENT_TYPES
19
+
20
+ belongs_to :event
21
+ belongs_to :office
22
+
23
+ validates :event_date, presence: true
24
+
25
+ scope :event_id, -> (event_id) { parent_id_scope(event_id: event_id) }
26
+
27
+ end
28
+
29
+ end
30
+
31
+ def to_s
32
+ id.to_s # TODO
33
+ end
34
+
35
+ end
36
+
37
+ end
@@ -0,0 +1,27 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+
3
+ module SubjModels
4
+
5
+ module EventTypeModule
6
+
7
+ def self.included(including_class)
8
+
9
+ including_class.class_eval do
10
+
11
+ include SubjModels::ComprisingExternalId
12
+
13
+ has_many :events
14
+
15
+ validates :name, presence: true
16
+
17
+ end
18
+
19
+ end
20
+
21
+ def to_s
22
+ name
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,46 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+
3
+ module SubjModels
4
+
5
+ module FaqModule
6
+
7
+ include SubjModels::TypesSupport::FaqTypes
8
+ include SubjModels::ValuesChecker
9
+
10
+ def self.included(including_class)
11
+
12
+ including_class.class_eval do
13
+
14
+ include SubjModels::ComprisingExternalId
15
+
16
+ enum faq_type: FAQ_TYPES
17
+
18
+ after_save :notify_user
19
+
20
+ validates :question, presence: true, allow_blank: false,
21
+ uniqueness: { message: 'Простите, такой вопрос уже был задан' }
22
+ validates :faq_type, inclusion: { in: faq_types.keys },
23
+ on: :update
24
+
25
+ scope :with_answer, -> { where.not(answer: nil) }
26
+ scope :without_answer, -> { where(answer: nil) }
27
+ scope :on_site, -> { where(show_on_site: true) }
28
+ scope :type_is, -> (condition) { where(faq_type: condition) }
29
+
30
+ end
31
+
32
+ end
33
+
34
+ def to_s
35
+ question
36
+ end
37
+
38
+ private
39
+
40
+ def notify_user
41
+ FaqMailer.notify_user(self).deliver if send_to_user
42
+ end
43
+
44
+ end
45
+
46
+ end
@@ -0,0 +1,16 @@
1
+ module SubjModels
2
+
3
+ module GlobalNotificationModule
4
+
5
+ def self.included(including_class)
6
+
7
+ including_class.class_eval do
8
+
9
+
10
+ end
11
+
12
+ end
13
+
14
+ end
15
+
16
+ end
@@ -0,0 +1,31 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+ require 'subj_models/concerns/shared_scopes'
3
+
4
+ module SubjModels
5
+
6
+ module ManagerModule
7
+
8
+ def self.included(including_class)
9
+
10
+ including_class.class_eval do
11
+
12
+ include SubjModels::SharedScopes
13
+ include SubjModels::ComprisingExternalId
14
+
15
+ belongs_to :document_file
16
+ has_many :events
17
+
18
+ validates :email, uniqueness: { case_sensitive: false }
19
+ validates :first_name, :last_name, :email, :phone, :document_file, presence: true
20
+
21
+ end
22
+
23
+ end
24
+
25
+ def to_s
26
+ "#{first_name} #{last_name}"
27
+ end
28
+
29
+ end
30
+
31
+ end
@@ -0,0 +1,28 @@
1
+ require 'subj_models/concerns/comprising_external_id'
2
+
3
+ module SubjModels
4
+
5
+ module MeasureUnitModule
6
+
7
+ def self.included(including_class)
8
+
9
+ including_class.class_eval do
10
+
11
+ include SubjModels::ComprisingExternalId
12
+
13
+ belongs_to :attribute_value
14
+
15
+ has_many :nomenclature_prices
16
+
17
+ validates :name, presence: true
18
+
19
+ end
20
+
21
+ end
22
+
23
+ def to_s
24
+ name
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,166 @@
1
+ require 'json'
2
+ require 'subj_models/concerns/comprising_external_id'
3
+
4
+ module SubjModels
5
+
6
+ module NomenclatureModule
7
+
8
+ def self.included(including_class)
9
+
10
+ including_class.class_eval do
11
+
12
+ include SubjModels::ComprisingExternalId
13
+
14
+ belongs_to :brand_line
15
+ belongs_to :brand
16
+ belongs_to :user_specialization
17
+ belongs_to :category
18
+
19
+ has_many :nomenclature_varieties, dependent: :destroy
20
+ has_many :nomenclature_photos, dependent: :destroy
21
+ has_many :nomenclature_reviews, dependent: :destroy
22
+ has_many :nomenclature_files, dependent: :destroy
23
+ has_many :attribute_values, dependent: :destroy
24
+ has_many :nomenclature_prices, dependent: :destroy
25
+
26
+ belongs_to :analog_related_nomenclature, class_name: "Nomenclature"
27
+ has_many :analogs, foreign_key: "analog_related_nomenclature_id", class_name: "Nomenclature"
28
+ belongs_to :bought_together_related_nomenclature, class_name: "Nomenclature"
29
+ has_many :bought_together, foreign_key: "bought_together_related_nomenclature_id", class_name: "Nomenclature"
30
+
31
+ has_and_belongs_to_many :action_banners
32
+ has_and_belongs_to_many :access_groups, through: :nomenclature_access_groups
33
+ has_and_belongs_to_many :events
34
+
35
+ validates :name, presence: true
36
+
37
+ scope :with_category, -> { where.not(category_id: nil) }
38
+ scope :brand_line_ids, -> (brand_line_id) { where(brand_line_id: brand_line_id) }
39
+ scope :with_action, -> { joins(:action_banners).distinct }
40
+ scope :is_recommended, -> condition { where(is_recommended: condition) }
41
+ scope :in_index_list, -> condition { where(show_on_index: condition) }
42
+ scope :is_stock, -> (condition) do
43
+ nomenclature_prices_join.joins("LEFT OUTER JOIN qualities ON qualities.id = nomenclature_prices.quality_id").where("qualities.is_stock" => condition).uniq
44
+ end
45
+
46
+ scope :bought_together_external_id, -> (ids) do
47
+ joins(:bought_together_related_nomenclature).where(bought_together_related_nomenclature: {external_id: ids }).uniq
48
+ end
49
+
50
+ scope :is_available, -> (params) do
51
+ is_available = params.first
52
+ return all unless is_available == 'true'
53
+ user = User.find_by(id: params.second.to_i)
54
+ not_professional_ids = Nomenclature.is_professional(false).pluck(:id)
55
+ ids = user ? user.available_nomenclature_ids.concat(not_professional_ids) : []
56
+ where(id: ids)
57
+ end
58
+
59
+ scope :only_promotional, -> do
60
+ joins(:action_banners).uniq
61
+ end
62
+
63
+ scope :is_professional, -> (condition) {where(is_professional: condition) }
64
+
65
+ scope :price, -> (prices) do
66
+ prices = prices.map { |p| p.split(',') }
67
+ nomenclature_prices_join.
68
+ where(
69
+ prices.map do |range|
70
+ if range[0] && range[1]
71
+ '(nomenclature_prices.current_price >= ? AND nomenclature_prices.current_price < ?)'
72
+ elsif range[0]
73
+ '(nomenclature_prices.current_price >= ?)'
74
+ elsif range[1]
75
+ '(nomenclature_prices.current_price < ?)'
76
+ end
77
+ end.join(' OR '),
78
+ *prices.map(&:compact).flatten
79
+ )
80
+ end
81
+
82
+ scope :order_by_name, -> (ordering) do
83
+ ordering = ordering.second.try(:to_sym)
84
+ if [:asc, :desc].include? ordering
85
+ order(name: ordering)
86
+ end
87
+ end
88
+
89
+ scope :order_by_popularity, -> (ordering) do
90
+ ordering = ordering.second.try(:to_sym)
91
+ if [:asc, :desc].include? ordering
92
+ order(popularity: ordering)
93
+ end
94
+ end
95
+
96
+ scope :attribute_value_ids, -> (attribute_value_name_strings) do
97
+ query_result = nil
98
+ nomenclature_ids = ids
99
+ attribute_value_name_strings.each do |str|
100
+ attr_names = str.split('/')
101
+ query_result = Nomenclature.joins(:attribute_values).where("attribute_values.nomenclature_value" => attr_names).where(id: nomenclature_ids).uniq
102
+ nomenclature_ids = query_result.pluck(:id)
103
+ end
104
+
105
+ query_result
106
+ end
107
+
108
+ scope :nomenclature_prices_join, -> do
109
+ joins(:nomenclature_prices)
110
+ #joins('LEFT OUTER JOIN nomenclature_varieties ON nomenclature_varieties.id = (SELECT innerNomVar.id FROM nomenclature_varieties as innerNomVar WHERE innerNomVar.nomenclature_id = nomenclatures.id LIMIT 1)')
111
+ #.joins('LEFT OUTER JOIN nomenclature_prices on nomenclature_prices.id = (SELECT innerNomPrice.id FROM nomenclature_prices AS innerNomPrice WHERE innerNomPrice.nomenclature_variety_id = nomenclature_varieties.id LIMIT 1)')
112
+ end
113
+
114
+ scope :order_by_price, -> (ordering) do
115
+ ordering = ordering.second.try(:to_sym)
116
+ if [:asc, :desc].include? ordering
117
+ nomenclature_prices_join.
118
+ order("nomenclature_prices.current_price #{ordering}")
119
+ end
120
+ end
121
+
122
+ scope :category_id, -> (category_id) do
123
+ return all unless category_id.present?
124
+ where(category_id: category_id)
125
+ end
126
+
127
+ scope :nomenclature_ids, -> (ids) { where(id: ids) }
128
+
129
+ scope :brand_ids, -> (brand) do
130
+ return all unless brand.present?
131
+ where(brand: brand)
132
+ end
133
+
134
+ scope :with_brand, -> (brand) do
135
+ return none unless brand.present?
136
+ where(brand: brand)
137
+ end
138
+
139
+ scope :brand_line_ids, -> (ids) do
140
+ return all unless ids.present?
141
+ where(brand_line_id: ids)
142
+ end
143
+
144
+ end
145
+
146
+ end
147
+
148
+ def is_bought(user_id)
149
+ Order.joins(order_items: :nomenclature)
150
+ .where("nomenclatures.id IN (?)", self.id)
151
+ .where(user_id: user_id).any?
152
+ end
153
+
154
+ def to_s
155
+ name.to_s # TODO
156
+ end
157
+
158
+ def self.name_field_update(field)
159
+ if field.to_s == 'name' #TODO refactor this
160
+ field = 'name.raw'
161
+ end
162
+ end
163
+
164
+ end
165
+
166
+ end