subj_sub_models 0.0.0 → 0.0.1

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