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.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/.idea/modules.xml +1 -1
- data/.idea/workspace.xml +5 -5
- data/Gemfile +1 -1
- data/README.md +3 -3
- data/bin/console +1 -1
- data/lib/subj_models/access_group.rb +22 -0
- data/lib/subj_models/action_banner.rb +37 -0
- data/lib/subj_models/attribute_value.rb +32 -0
- data/lib/subj_models/brand.rb +74 -0
- data/lib/subj_models/brand_line.rb +51 -0
- data/lib/subj_models/category.rb +36 -0
- data/lib/subj_models/city.rb +31 -0
- data/lib/subj_models/concerns/comprising_external_id.rb +37 -0
- data/lib/subj_models/concerns/shared_scopes.rb +15 -0
- data/lib/subj_models/content_block.rb +28 -0
- data/lib/subj_models/document_file.rb +38 -0
- data/lib/subj_models/event.rb +79 -0
- data/lib/subj_models/event_booking.rb +39 -0
- data/lib/subj_models/event_schedule.rb +37 -0
- data/lib/subj_models/event_type.rb +27 -0
- data/lib/subj_models/faq.rb +46 -0
- data/lib/subj_models/global_notification.rb +16 -0
- data/lib/subj_models/manager.rb +31 -0
- data/lib/subj_models/measure_unit.rb +28 -0
- data/lib/subj_models/nomenclature.rb +166 -0
- data/lib/subj_models/nomenclature_access_group.rb +19 -0
- data/lib/subj_models/nomenclature_attribute.rb +27 -0
- data/lib/subj_models/nomenclature_file.rb +44 -0
- data/lib/subj_models/nomenclature_photo.rb +36 -0
- data/lib/subj_models/nomenclature_price.rb +39 -0
- data/lib/subj_models/nomenclature_review.rb +38 -0
- data/lib/subj_models/nomenclature_variety.rb +29 -0
- data/lib/subj_models/office.rb +40 -0
- data/lib/subj_models/office_contact.rb +41 -0
- data/lib/subj_models/order.rb +91 -0
- data/lib/subj_models/order_delivery_courier.rb +31 -0
- data/lib/subj_models/order_delivery_nova_poshta_warhouse.rb +20 -0
- data/lib/subj_models/order_delivery_pickup.rb +28 -0
- data/lib/subj_models/order_delivery_privatbank.rb +29 -0
- data/lib/subj_models/order_delivery_subj_courier.rb +25 -0
- data/lib/subj_models/order_item.rb +60 -0
- data/lib/subj_models/quality.rb +25 -0
- data/lib/subj_models/services/types_support.rb +122 -0
- data/lib/subj_models/services/values_checker.rb +11 -0
- data/lib/subj_models/specialist_activity.rb +33 -0
- data/lib/subj_models/specialist_activity_document_type.rb +29 -0
- data/lib/subj_models/template.rb +18 -0
- data/lib/subj_models/user.rb +131 -0
- data/lib/subj_models/user_card.rb +29 -0
- data/lib/subj_models/user_card_delivery.rb +29 -0
- data/lib/subj_models/user_delivery_address.rb +34 -0
- data/lib/subj_models/user_specialization.rb +38 -0
- data/lib/subj_models/user_specialization_approval.rb +33 -0
- data/lib/subj_models/user_work_place.rb +29 -0
- data/lib/subj_models/version.rb +3 -0
- data/lib/subj_models/video.rb +29 -0
- data/lib/subj_models.rb +49 -0
- data/subj_models.gemspec +33 -0
- data/subj_models.iml +9 -0
- metadata +56 -2
@@ -0,0 +1,20 @@
|
|
1
|
+
module SubjModels
|
2
|
+
|
3
|
+
module OrderDeliveryNovaPoshtaWarhouseModule
|
4
|
+
|
5
|
+
def self.included(including_class)
|
6
|
+
|
7
|
+
including_class.class_eval do
|
8
|
+
include SubjModels::ComprisingExternalId
|
9
|
+
|
10
|
+
belongs_to :order
|
11
|
+
|
12
|
+
scope :order_id, -> (order_id) { parent_id_scope("order", order_id) }
|
13
|
+
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'subj_models/concerns/comprising_external_id'
|
2
|
+
|
3
|
+
module SubjModels
|
4
|
+
|
5
|
+
module OrderDeliveryPickupModule
|
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 :office
|
15
|
+
|
16
|
+
scope :order_id, -> (order_id) { parent_id_scope("order", order_id) }
|
17
|
+
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_s
|
23
|
+
id.to_s # TODO
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'subj_models/concerns/comprising_external_id'
|
2
|
+
|
3
|
+
module SubjModels
|
4
|
+
|
5
|
+
module OrderDeliveryPrivatbankModule
|
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
|
+
|
15
|
+
validates :privat_bank_address, presence: true
|
16
|
+
|
17
|
+
scope :order_id, -> (order_id) { parent_id_scope("order", order_id) }
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
id.to_s # TODO
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module SubjModels
|
2
|
+
|
3
|
+
module OrderDeliverySubjCourierModule
|
4
|
+
|
5
|
+
def self.included(including_class)
|
6
|
+
|
7
|
+
including_class.class_eval do
|
8
|
+
include SubjModels::ComprisingExternalId
|
9
|
+
|
10
|
+
belongs_to :order
|
11
|
+
belongs_to :city
|
12
|
+
|
13
|
+
scope :order_id, -> (order_id) { parent_id_scope("order", order_id) }
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
id.to_s # TODO
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'subj_models/concerns/comprising_external_id'
|
2
|
+
require 'subj_models/services/values_checker'
|
3
|
+
|
4
|
+
module SubjModels
|
5
|
+
|
6
|
+
module OrderItemModule
|
7
|
+
|
8
|
+
include SubjModels::TypesSupport::ItemTypes
|
9
|
+
include SubjModels::ValuesChecker
|
10
|
+
|
11
|
+
def self.included(including_class)
|
12
|
+
|
13
|
+
including_class.class_eval do
|
14
|
+
|
15
|
+
include SubjModels::ComprisingExternalId
|
16
|
+
|
17
|
+
# before_destroy :decrease_nomenclature_popularity
|
18
|
+
# after_create :increase_nomenclature_popularity
|
19
|
+
|
20
|
+
enum item_type: ITEM_TYPES
|
21
|
+
|
22
|
+
belongs_to :order
|
23
|
+
belongs_to :event
|
24
|
+
belongs_to :nomenclature_variety
|
25
|
+
belongs_to :nomenclature
|
26
|
+
belongs_to :quality
|
27
|
+
|
28
|
+
validates :item_type, presence: true, inclusion: { in: item_types.keys }
|
29
|
+
validates :item_price, :item_count, presence: true
|
30
|
+
|
31
|
+
scope :order_id, -> (order_id) { parent_id_scope("order", order_id) }
|
32
|
+
scope :without_autoadded, -> { where(autoaddedposition: [nil, false]) }
|
33
|
+
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
def to_s
|
39
|
+
id.to_s # TODO
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
|
44
|
+
# def increase_nomenclature_popularity
|
45
|
+
# if nomenclature
|
46
|
+
# current_popularity = (nomenclature.popularity && nomenclature.popularity > 0) ? nomenclature.popularity : 0
|
47
|
+
# nomenclature.update(popularity: current_popularity + item_count)
|
48
|
+
# end
|
49
|
+
# end
|
50
|
+
|
51
|
+
# def decrease_nomenclature_popularity
|
52
|
+
# if nomenclature
|
53
|
+
# current_popularity = (nomenclature.popularity && nomenclature.popularity > item_count) ? nomenclature.popularity : item_count
|
54
|
+
# nomenclature.update(popularity: current_popularity - item_count)
|
55
|
+
# end
|
56
|
+
# end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'subj_models/concerns/comprising_external_id'
|
2
|
+
|
3
|
+
module SubjModels
|
4
|
+
|
5
|
+
module QualityModule
|
6
|
+
|
7
|
+
def self.included(including_class)
|
8
|
+
|
9
|
+
including_class.class_eval do
|
10
|
+
|
11
|
+
include SubjModels::ComprisingExternalId
|
12
|
+
|
13
|
+
has_many :nomenclature_prices
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
name
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
@@ -0,0 +1,122 @@
|
|
1
|
+
module SubjModels
|
2
|
+
|
3
|
+
module TypesSupport
|
4
|
+
|
5
|
+
BASE64_FORMAT = /\A(?:[A-Za-z0-9+\/]{4})*(?:[A-Za-z0-9+\/]{2}==|[A-Za-z0-9+\/]{3}=)?\z/
|
6
|
+
|
7
|
+
module UserTypes
|
8
|
+
ADMIN = 1
|
9
|
+
LEGAL_PERSON = 2
|
10
|
+
NATURAL_PERSON = 3
|
11
|
+
DISTRIBUTOR = 4
|
12
|
+
|
13
|
+
USER_TYPES = {
|
14
|
+
'админ' => ADMIN,
|
15
|
+
'юридическое лицо' => LEGAL_PERSON,
|
16
|
+
'физическое лицо' => NATURAL_PERSON,
|
17
|
+
'поставщик' => DISTRIBUTOR
|
18
|
+
}
|
19
|
+
end
|
20
|
+
|
21
|
+
module EventTypes
|
22
|
+
WEBINAR = 1
|
23
|
+
OFFLINE = 2
|
24
|
+
|
25
|
+
EVENT_TYPES = { 'вебинар' => WEBINAR, 'оффлайн' => OFFLINE }
|
26
|
+
end
|
27
|
+
|
28
|
+
module FileTypes
|
29
|
+
PICTURE = 1
|
30
|
+
PDF = 2
|
31
|
+
VIDEO = 3
|
32
|
+
|
33
|
+
FILE_TYPES = { 'изображение' => PICTURE, 'PDF' => PDF, 'видео' => VIDEO }
|
34
|
+
end
|
35
|
+
|
36
|
+
module CardReceiveTypes
|
37
|
+
PICKUP = 1
|
38
|
+
WITH_ORDER = 2
|
39
|
+
POST_DELIVERY = 3
|
40
|
+
|
41
|
+
CARD_RECEIVE_TYPES = { 'Самовывоз' => PICKUP, 'С первым заказом' => WITH_ORDER, 'Со склада новой почты' => POST_DELIVERY }
|
42
|
+
end
|
43
|
+
|
44
|
+
module ContactTypes
|
45
|
+
ADDRESS = 1
|
46
|
+
PHONE = 2
|
47
|
+
EMAIL = 3
|
48
|
+
SKYPE = 4
|
49
|
+
|
50
|
+
CONTACT_TYPES = {
|
51
|
+
'адрес' => ADDRESS,
|
52
|
+
'телефон' => PHONE,
|
53
|
+
'email' => EMAIL,
|
54
|
+
'skype' => SKYPE
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
module OrderStatuses
|
59
|
+
RECEIVED = 1
|
60
|
+
PROCESSED = 2
|
61
|
+
EN_ROUTE_EXTERNAL_COURIER = 3
|
62
|
+
EN_ROUTE_INTERNAL_COURIER = 4
|
63
|
+
DELIVERED = 5
|
64
|
+
|
65
|
+
ORDER_STATUSES = {
|
66
|
+
'принят' => RECEIVED,
|
67
|
+
'в обработке' => PROCESSED,
|
68
|
+
'в пути(внешний курьер)' => EN_ROUTE_EXTERNAL_COURIER,
|
69
|
+
'внутренний курьер' => EN_ROUTE_INTERNAL_COURIER,
|
70
|
+
'получен' => DELIVERED
|
71
|
+
}
|
72
|
+
end
|
73
|
+
|
74
|
+
module DeliveryTypes
|
75
|
+
PRIVAT_BANK_PICK_POINT = 1
|
76
|
+
PICKUP = 2
|
77
|
+
NOVAYA_POCHTA_BY_COURIER = 3
|
78
|
+
NOVAYA_POCHTA_FROM_STORAGE = 4
|
79
|
+
SUBJ_COURIER = 5
|
80
|
+
|
81
|
+
DELIVERY_TYPES = {
|
82
|
+
'приват банк(почтомат)' => PRIVAT_BANK_PICK_POINT,
|
83
|
+
'самовывоз из центра' => PICKUP,
|
84
|
+
'курьер новой почты' => NOVAYA_POCHTA_BY_COURIER,
|
85
|
+
'склад новой почты' => NOVAYA_POCHTA_FROM_STORAGE,
|
86
|
+
'курьер SUBJ' => SUBJ_COURIER
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
module PaymentTypes
|
91
|
+
CARD = 1
|
92
|
+
CASH_ON_COURIER_DELIVERY = 2
|
93
|
+
BANK_TRANSFER = 3
|
94
|
+
CASH_IN_SUBJ_CENTER = 4
|
95
|
+
|
96
|
+
PAYMENT_TYPES = {
|
97
|
+
'картой' => CARD,
|
98
|
+
'курьеру' => CASH_ON_COURIER_DELIVERY,
|
99
|
+
'банковским переводом' => BANK_TRANSFER,
|
100
|
+
'наличными в центре Subj' => CASH_IN_SUBJ_CENTER
|
101
|
+
}
|
102
|
+
end
|
103
|
+
|
104
|
+
module ItemTypes
|
105
|
+
PRODUCT = 1
|
106
|
+
EVENT = 2
|
107
|
+
|
108
|
+
ITEM_TYPES = { 'товар' => PRODUCT, 'мероприятие' => EVENT }
|
109
|
+
end
|
110
|
+
|
111
|
+
module FaqTypes
|
112
|
+
FAQ = 1
|
113
|
+
FAQ_DELIVERY = 2
|
114
|
+
FAQ_PAYMENT = 3
|
115
|
+
|
116
|
+
FAQ_TYPES = { 'помощь' => FAQ, 'доставка' => FAQ_DELIVERY, 'оплата' => FAQ_PAYMENT }
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
end
|
122
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'subj_models/concerns/comprising_external_id'
|
2
|
+
|
3
|
+
module SubjModels
|
4
|
+
|
5
|
+
module SpecialistActivityModule
|
6
|
+
|
7
|
+
def self.included(including_class)
|
8
|
+
|
9
|
+
including_class.class_eval do
|
10
|
+
|
11
|
+
include SubjModels::ComprisingExternalId
|
12
|
+
|
13
|
+
has_many :specialist_activity_document_types, dependent: :destroy
|
14
|
+
has_many :user_specialization_approvals, dependent: :destroy
|
15
|
+
has_many :nomenclatures
|
16
|
+
|
17
|
+
belongs_to :document_file
|
18
|
+
|
19
|
+
validates :name, presence: true
|
20
|
+
|
21
|
+
scope :unavailable_for_current_user, -> ids { where.not(id: ids) }
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
def to_s
|
28
|
+
name
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'subj_models/concerns/comprising_external_id'
|
2
|
+
|
3
|
+
module SubjModels
|
4
|
+
|
5
|
+
module SpecialistActivityDocumentTypeModule
|
6
|
+
|
7
|
+
def self.included(including_class)
|
8
|
+
|
9
|
+
including_class.class_eval do
|
10
|
+
|
11
|
+
include SubjModels::ComprisingExternalId
|
12
|
+
|
13
|
+
belongs_to :user_specialization
|
14
|
+
|
15
|
+
validates :name, presence: true
|
16
|
+
|
17
|
+
scope :user_specialization_id, -> (user_specialization_id) { parent_id_scope("user_specialization", user_specialization_id) }
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_s
|
24
|
+
name
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'digest/sha1'
|
2
|
+
require 'subj_models/services/values_checker'
|
3
|
+
require 'subj_models/services/types_support'
|
4
|
+
require 'subj_models/concerns/shared_scopes'
|
5
|
+
require 'subj_models/concerns/comprising_external_id'
|
6
|
+
|
7
|
+
module SubjModels
|
8
|
+
|
9
|
+
module UserModule
|
10
|
+
|
11
|
+
include SubjModels::TypesSupport::UserTypes
|
12
|
+
include SubjModels::TypesSupport::CardReceiveTypes
|
13
|
+
include SubjModels::ValuesChecker
|
14
|
+
|
15
|
+
module ClassMethods
|
16
|
+
def get_by_email(email)
|
17
|
+
self.where(:email => email).first
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.included(including_class)
|
22
|
+
including_class.extend ClassMethods
|
23
|
+
including_class.class_eval do
|
24
|
+
|
25
|
+
include RademadeAdmin::UserModule
|
26
|
+
include SubjModels::ComprisingExternalId
|
27
|
+
include SubjModels::SharedScopes
|
28
|
+
|
29
|
+
enum user_type: USER_TYPES
|
30
|
+
enum card_receive_type: CARD_RECEIVE_TYPES
|
31
|
+
|
32
|
+
|
33
|
+
has_many :orders
|
34
|
+
has_many :user_specialization_approvals, dependent: :destroy
|
35
|
+
has_many :user_cards, dependent: :destroy
|
36
|
+
has_one :user_work_place, dependent: :destroy
|
37
|
+
has_one :user_card_delivery
|
38
|
+
has_many :user_delivery_addresses, dependent: :destroy
|
39
|
+
has_many :event_bookings, dependent: :destroy
|
40
|
+
|
41
|
+
has_and_belongs_to_many :user_specializations
|
42
|
+
has_and_belongs_to_many :brands
|
43
|
+
|
44
|
+
belongs_to :document_file
|
45
|
+
belongs_to :city
|
46
|
+
belongs_to :avatar, class_name: "DocumentFile"
|
47
|
+
|
48
|
+
validates :first_name, :last_name, presence: true,
|
49
|
+
on: :update,
|
50
|
+
unless: lambda { |user| user.legal_person? || user.skip_validations }
|
51
|
+
# Валидация отключена на время тестирования. После её надо разкоментировать сдесь и в контроллере.
|
52
|
+
# validates :email, uniqueness: { case_sensitive: false }, presence: true,
|
53
|
+
# on: :update,
|
54
|
+
# unless: :skip_validations
|
55
|
+
# validates :phone, uniqueness: { case_sensitive: false }, presence: true,
|
56
|
+
# on: :update,
|
57
|
+
# unless: :skip_validations
|
58
|
+
validates :user_type, inclusion: { in: user_types.keys },
|
59
|
+
on: :update,
|
60
|
+
unless: :skip_validations
|
61
|
+
|
62
|
+
attr_accessor :skip_validations
|
63
|
+
|
64
|
+
scope :external_id, -> external_id do
|
65
|
+
external_id ? where(external_id: external_id) : User.none
|
66
|
+
end
|
67
|
+
|
68
|
+
scope :internal_users, -> (condition) do
|
69
|
+
joins(:user_card_delivery).where.not(user_card_deliveries: {id: nil} ).where(external_id: nil).uniq
|
70
|
+
end
|
71
|
+
|
72
|
+
scope :updated_at_last_day, -> (date) do
|
73
|
+
where.not(external_id: nil)
|
74
|
+
.joins(:user_specialization_approvals)
|
75
|
+
.where("user_specialization_approvals.updated_at > ? OR users.updated_at > ?", date.to_datetime, date.to_datetime)
|
76
|
+
.uniq
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
82
|
+
|
83
|
+
def natural_person?
|
84
|
+
user_type == USER_TYPES.key(NATURAL_PERSON)
|
85
|
+
end
|
86
|
+
|
87
|
+
def legal_person?
|
88
|
+
user_type == USER_TYPES.key(LEGAL_PERSON)
|
89
|
+
end
|
90
|
+
|
91
|
+
def user_type_value
|
92
|
+
self[:user_type]
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.get_by_email(email)
|
96
|
+
self.where(:email => email).first
|
97
|
+
end
|
98
|
+
|
99
|
+
def password=(password)
|
100
|
+
self.encrypted_password = encrypt_password(password) unless password.blank?
|
101
|
+
end
|
102
|
+
|
103
|
+
def password
|
104
|
+
self.encrypted_password
|
105
|
+
end
|
106
|
+
|
107
|
+
def valid_password?(password)
|
108
|
+
self.encrypted_password == encrypt_password(password)
|
109
|
+
end
|
110
|
+
|
111
|
+
def to_s
|
112
|
+
email
|
113
|
+
end
|
114
|
+
|
115
|
+
def available_nomenclature_ids
|
116
|
+
Nomenclature.joins(access_groups: [user_specializations: :users]).where("users.id" => self.id).uniq.pluck(:id)
|
117
|
+
end
|
118
|
+
|
119
|
+
def available_categories_ids
|
120
|
+
Category.joins(:nomenclatures).where("nomenclatures.id IN (?) OR nomenclatures.is_professional=FALSE", available_nomenclature_ids).uniq.pluck(:id)
|
121
|
+
end
|
122
|
+
|
123
|
+
private
|
124
|
+
|
125
|
+
def encrypt_password(password)
|
126
|
+
Digest::SHA1.hexdigest(password)
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|