c80_shared 0.1.68 → 0.1.69

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3667af28c965c19676a043379c8a15b8520b3ce1e9e83aa4ef6cbbbfb70f0249
4
- data.tar.gz: 0a277eb1c4478fe49c9128e3a7b83e256859905adc07b2d9a6fff7f0b20712c2
3
+ metadata.gz: a51c1503139e06e27c0a6734a20c44bff15f5ba150c776ff4ad5be6739206004
4
+ data.tar.gz: 39343ca14d3ccb8817c2be53812529b7e00041e89f19d435bf2df6cd002139b8
5
5
  SHA512:
6
- metadata.gz: cdc3c04bf31a5f23c181f78ec8127b502f602e326515415833c2351b6379d57f17a37df9f7ac83929951434712c2dd8be49f2a0710dda2a49fc81802438776d4
7
- data.tar.gz: 9b9fad0a5d7a9a6518f0577397652e8430616e8c3e4f80e4828efd7d51aee560fa25afb05e89a6619caa294ef4701ae81286e4ee76fc3693eaf3c5dc3002e293
6
+ metadata.gz: 8a9eaf0707a2282394a2511fb25676b3c06708e0c0b4ae27039c7e7ae03ef486ade82b403647c42a7e5d22bf2a165f294cd650d5a403bbd867e99203f49cd858
7
+ data.tar.gz: 42287fcb2ab7e5d759951199508cd8ab564cecb1697dd19a482ae02d3c7aa4ddc04f056f80bc14b0e48c2606a439428c2400a0c8af8f7e6150ac9b482996d257
@@ -24,6 +24,7 @@ module Lease
24
24
  human_price
25
25
  human_price_vat_incl
26
26
  comments
27
+ extra
27
28
  ].freeze
28
29
  end
29
30
 
@@ -113,6 +114,29 @@ module Lease
113
114
  { comments: bid.comments }
114
115
  end
115
116
 
117
+ def extra(bid)
118
+ extra = %i[
119
+ extra_captain
120
+ extra_towels
121
+ extra_hostess
122
+ extra_cleaning
123
+ extra_chef
124
+ extra_fees
125
+ extra_apa
126
+ ].map do |attr|
127
+ [attr, bid.send(attr)]
128
+ end.to_h.select do |_, value|
129
+ !value.nil?
130
+ end.map do |a,v|
131
+ if a == :extra_apa
132
+ [a, '%s %' % v ]
133
+ else
134
+ [a, num_to_cur(v,bid.currency, @opts[:locale])]
135
+ end
136
+ end.to_h
137
+
138
+ { extra: extra }
139
+ end
116
140
  end
117
141
  end
118
142
  end
@@ -0,0 +1,120 @@
1
+ module Lease
2
+
3
+ class FindSuitsService
4
+
5
+ attr_reader :errors, # результат: ошибки
6
+ :log, # результат: лог работы сервиса
7
+ :emails, # результат: почта владельцев лодок
8
+ :aboats_ids # результат: айдишники лодок с хозяевами. Эти айдишники вписаны в таблицу suits
9
+
10
+ def initialize
11
+ _reset_ivars
12
+ end
13
+
14
+ def perform(inquiry, personal_boat_id = nil)
15
+ _reset_ivars
16
+ @inquiry = inquiry
17
+
18
+ locs1 = BoatLocation.near([inquiry.latitude, inquiry.longitude], 300, units: :km, order: false) # сначала ищем все лодки в Ш-радиусе (300км)
19
+ locs2 = locs1.select { |loc| loc.radius >= loc.distance } # потом выбираем только те лодки, которые охватывают эту точку заявки
20
+
21
+ boats_ids = locs2.map(&:boat_id).uniq
22
+ boats = Boat.where(id: boats_ids).where(boat_type_id: inquiry.boat_type_ids).where(for_rent: 1).where.not(state: ::Boat::STATE_REJECTED)
23
+ boats_ids = boats.map(&:id)
24
+
25
+ _log 'inquiry_id = ', inquiry.id
26
+ _log 'locs sql = ', locs1.to_sql
27
+ _log 'boats sql = ', boats.to_sql
28
+ _log 'result 1: boats_ids = ', boats_ids
29
+
30
+ find_users boats_ids, personal_boat_id # 3) фильтруем найденные лодки - выбираем только те, которые имеют хозяев
31
+ end
32
+
33
+ private
34
+
35
+ def find_users(boat_ids, personal_boat_id)
36
+ if boat_ids.count.zero?
37
+ errors << 'BOATS NOT FOUND: inquiry = %s' % @inquiry.attributes
38
+ _log 'BOATS NOT FOUND: inquiry =', @inquiry.attributes
39
+ return false
40
+ end
41
+
42
+ # находим те лодки, у которых есть явные хозяева
43
+ sql = '
44
+ SELECT
45
+ users.id,
46
+ boat_users.boat_id,
47
+ users.email,
48
+ users.is_notify
49
+ FROM users
50
+ INNER JOIN boat_users ON boat_users.user_id = users.id
51
+ WHERE boat_users.boat_id IN (%s)' % (boat_ids * ',')
52
+ result = ActiveRecord::Base.connection.execute(sql) # for example: [[2977, 4675, "diego.s@gmx.com", 1], [2978, 4676, "dohomota@yandex.ru", 1]]
53
+
54
+ # (22,55,509),(22,63,531),... - собираем значения для вставки в другой sql-запрос (создающий Suits)
55
+ # values = result.map { |record| '(%s)' % ([@inquiry.id, record[0], record[1]] * ',') } # 0-user_id, 1-boat_id
56
+ values = result.map do |record|
57
+ @aboats_ids << record[1]
58
+ '(%s)' % ([@inquiry.id, record[0], record[1]] * ',') # 0-user_id, 1-boat_id
59
+ end
60
+
61
+ _log 'boats with owners sql = ', sql
62
+ _log '(inq,user,boat) result = ', values
63
+
64
+ unless values.present?
65
+ errors << 'SUITS NOT FOUND: inquiry = %s, boat_ids = [%s]' % [@inquiry.attributes, boat_ids * ',']
66
+ _log 'SUITS NOT FOUND: inquiry = ', @inquiry.attributes
67
+ _log 'SUITS NOT FOUND: boat_ids = ', boat_ids * ','
68
+ return false
69
+ end
70
+
71
+ # пишем в таблицу Suits подходящие под Заявку варианты
72
+ sql2 = 'INSERT IGNORE INTO %s(inquiry_id, user_id, boat_id) VALUES%s' % [::Lease::Suit.table_name, values * ',']
73
+ ActiveRecord::Base.connection.execute(sql2)
74
+
75
+ @emails = if personal_boat_id.present?
76
+ # уведомляем только 1 хозяина лодки, на которую была оставлена персональная заявка
77
+ [result.select { |record| record[1] == personal_boat_id }.flatten[2]] # 2-users.email # for example: ['diego.s@gmx.com']
78
+ else
79
+ # уведомляем всех агентов, подходящих под заявку
80
+ result.map do |record|
81
+ record[3].zero? ? nil : record[2] # 3-is_notify, 2-email
82
+ end.compact.uniq
83
+ end
84
+
85
+ _log 'insert ignore into suits sql =', sql2
86
+ _log 'collect user emails = ', @emails
87
+
88
+ uc_values = if personal_boat_id.present?
89
+ # кружок рисуем только владельцу Целевой лодки, на которую была оставлена заявка
90
+ user_id = result.select { |record| record[1] == personal_boat_id }.flatten[0] # 0-user_id
91
+ ['(%s,%s)' % [user_id, @inquiry.id]]
92
+ else
93
+ # кружок рисуем всем подходящим под заявку агентам
94
+ result.map { |record| '(%s)' % ([record[0], @inquiry.id] * ',') } # 0-user_id
95
+ end
96
+
97
+ # запишем счётчики (те, кому надо, увидят кружки в интерфейсе)
98
+ sql3 = 'INSERT IGNORE INTO %s(user_id, inquiry_id) VALUES%s' % [::Lease::UsersInquiriesCounters.table_name, uc_values * ',']
99
+ ActiveRecord::Base.connection.execute sql3
100
+
101
+ _log 'insert counters = ', sql3
102
+
103
+ puts @log * "\n"
104
+ true
105
+ end
106
+
107
+ def _reset_ivars
108
+ @errors = []
109
+ @emails = []
110
+ @log = []
111
+ @aboats_ids = []
112
+ end
113
+
114
+ def _log(key, value)
115
+ @log << key
116
+ @log << value
117
+ @log << "\n"
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,12 @@
1
+ en:
2
+ activerecord:
3
+ labels:
4
+ lease/bid:
5
+ header_extra: 'Extra services'
6
+ extra_captain: 'Captain'
7
+ extra_towels: 'Bed sheets/towels'
8
+ extra_hostess: 'Hostess'
9
+ extra_chef: 'Chef'
10
+ extra_fees: 'Port fees'
11
+ extra_cleaning: 'Cleaning'
12
+ extra_apa: 'APA'
@@ -0,0 +1,12 @@
1
+ ru:
2
+ activerecord:
3
+ labels:
4
+ lease/bid:
5
+ header_extra: 'Дополнительные услуги'
6
+ extra_captain: 'Капитан'
7
+ extra_towels: 'Постельное бельё/полотенца'
8
+ extra_hostess: 'Хостес'
9
+ extra_chef: 'Повар'
10
+ extra_fees: 'Портовые сборы'
11
+ extra_cleaning: 'Уборка'
12
+ extra_apa: 'APA'
@@ -1,3 +1,3 @@
1
1
  module C80Shared
2
- VERSION = "0.1.68"
2
+ VERSION = "0.1.69"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: c80_shared
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.68
4
+ version: 0.1.69
5
5
  platform: ruby
6
6
  authors:
7
7
  - C80609A
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-28 00:00:00.000000000 Z
11
+ date: 2019-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -100,6 +100,7 @@ files:
100
100
  - app/services/central_agent/save_boat_service.rb
101
101
  - app/services/dimension_service.rb
102
102
  - app/services/lease/create_broadcast_inquiry_service.rb
103
+ - app/services/lease/find_suits_service.rb
103
104
  - app/services/users/find_or_generate_email_token_service.rb
104
105
  - app/services/users/generate_email_token_service.rb
105
106
  - bin/console
@@ -125,6 +126,8 @@ files:
125
126
  - config/locales/dicts/motor/ru.yml
126
127
  - config/locales/dicts/rental_type/en.yml
127
128
  - config/locales/dicts/rental_type/ru.yml
129
+ - config/locales/lease/bid.en.yml
130
+ - config/locales/lease/bid.ru.yml
128
131
  - config/locales/rent_skip_type/en.yml
129
132
  - config/locales/rent_skip_type/ru.yml
130
133
  - lib/c80_shared.rb