c80_shared 0.1.3 → 0.1.4

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b236e08513a15d9ca9dd41382641ee82d24158b0a0850c8c907ebb7528330a2f
4
- data.tar.gz: e80c6d7d2c3f12a153aac7c82abac231374f29ac616b11166803c52c6397c1c9
3
+ metadata.gz: beb69360e62a37e82a25e04c0f1c58b758f1b08ba9ba1e61f0c37afad5d7514d
4
+ data.tar.gz: b60b0b9fe9c872a0166d69599f11c0e0820e71e091d1daebeed7a77e8f66c042
5
5
  SHA512:
6
- metadata.gz: bbc0039d84644da11ff2aecd5cfbaf101e33b6bb1bb6e11c376d0290866bbe8d9ef21f8d737c59830539ec3fee54532f489fa2e8abbf75446dbf04d7ca2bdc15
7
- data.tar.gz: ee4753dda77eac6ed36e1cd30c16c8d50dcfab8885fc07b0895e162ea04a2425e6ce0c21555d23437306dda72020338cf718898108e05c15bdfdc10f035afe3b
6
+ metadata.gz: 20f3e67dd585908ff384bcddb985db8407f0b085a030afb19af6ba291659843ce213229d0880d97178db59cadaddb42c33b9d0f38796449e684926779145a9bf
7
+ data.tar.gz: a36075b8c1aad10b245e4cf3fd53ad435ae4c18cd0488afcabd3a592986f8bf6db9a51da5e44167a8ff11f9ac15f5d4609d3cdd4b0edc06b3d36369bbf106d0f
@@ -1,16 +1,20 @@
1
1
  module Custom
2
2
  module CurrencyHelper
3
- def currency_symbol
4
- collection_name_by_id(t('static.currencies', default: ''), cookies[:currency]) || ''
3
+ def currency_symbol(currency = nil)
4
+ currency ||= cookies[:currency]
5
+ collection_name_by_id(I18n.t('static.currencies', default: ''), currency) || ''
5
6
  end
6
7
 
7
8
  def currency_for_label(options = {})
8
9
  options[:prefix] ||= ', '
9
10
  "#{options[:prefix]}#{currency_symbol}"
10
11
  end
11
-
12
- def currency_attribute_name(name)
13
- Currency.attribute_name(cookies[:currency], name)
12
+
13
+ # @param name [Symbol, String] Например: `charter_1_day_high`
14
+ #
15
+ def currency_attribute_name name, currency = nil
16
+ currency ||= cookies[:currency]
17
+ Currency.attribute_name(currency, name)
14
18
  end
15
19
 
16
20
  # 12 USD -> $ 12.00, EUR -> €,...
@@ -0,0 +1,18 @@
1
+ module Custom
2
+ module DimensionHelper
3
+ def dimension_symbol(uom = nil)
4
+ uom ||= cookies[:dimension]
5
+ collection_name_by_id(I18n.t('static.dimensions', default: ''), uom) || ''
6
+ end
7
+
8
+ def dimension_for_label options = {}
9
+ options[:prefix] ||= ', '
10
+ "#{options[:prefix]}#{dimension_symbol}"
11
+ end
12
+
13
+ def dimension_attribute_name(name, uom = nil)
14
+ uom ||= cookies[:dimension]
15
+ Dimension.attribute_name(uom, name)
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,29 @@
1
+ module Custom
2
+ module PriceHelper
3
+
4
+ # @param [Boat] object
5
+ #
6
+ def price_discount(object, attr)
7
+ price = object.attributes[currency_attribute_name(attr)]
8
+ discount = object.attributes["#{attr}_discount"]
9
+ return '' if price.nil?
10
+
11
+ return price if discount.nil?
12
+
13
+ price - (price / 100 * discount)
14
+ end
15
+
16
+ # @param [Boat] object
17
+ #
18
+ def price_format(object, attr, options = {})
19
+ price = options[:discounted] ? price_discount(object, attr) : object.attributes[currency_attribute_name(attr, options[:currency])]
20
+ return '' if price.blank?
21
+
22
+ unit = currency_symbol options[:currency]
23
+ price = number_to_currency(price, unit: unit).to_s
24
+ price = price + options[:postfix] if options[:postfix]
25
+ price = options[:prefix] + price if options[:prefix]
26
+ price
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,331 @@
1
+ class BoatSerializer < AbstractSerializer
2
+
3
+ class << self
4
+ def available_attributes
5
+ %i[
6
+ charter_1_hour_low_usd
7
+ charter_1_hour_low_rub
8
+ charter_1_hour_low_eur
9
+ charter_1_day_low_usd
10
+ charter_1_day_low_rub
11
+ charter_1_day_low_eur
12
+ charter_1_week_low_usd
13
+ charter_1_week_low_rub
14
+ charter_1_week_low_eur
15
+ charter_1_month_low_usd
16
+ charter_1_month_low_rub
17
+ charter_1_month_low_eur
18
+ charter_1_hour_high_usd
19
+ charter_1_hour_high_rub
20
+ charter_1_hour_high_eur
21
+ charter_1_day_high_usd
22
+ charter_1_day_high_rub
23
+ charter_1_day_high_eur
24
+ charter_1_week_high_usd
25
+ charter_1_week_high_rub
26
+ charter_1_week_high_eur
27
+ charter_1_month_high_usd
28
+ charter_1_month_high_rub
29
+ charter_1_month_high_eur
30
+ sale_price_usd
31
+ sale_price_rub
32
+ sale_price_eur
33
+ id
34
+ picture_medium_url
35
+ name
36
+ builder
37
+ short_description
38
+ per_season
39
+ price
40
+ price_discount
41
+ guests_total
42
+ guest_cabins
43
+ crew_total
44
+ built_year
45
+ refit_year
46
+ boat_model
47
+ location_address
48
+ latitude
49
+ boat_type_id
50
+ boat_length_metrics
51
+ boat_length_metrics_meters
52
+ boat_length_metrics_ft
53
+ boat_beam_metrics
54
+ boat_beam_metrics_ft
55
+ boat_beam_metrics_meters
56
+ boat_draft_metrics
57
+ boat_draft_metrics_ft
58
+ boat_draft_metrics_meters
59
+ ].freeze
60
+ end
61
+
62
+ def default_opts
63
+ {
64
+ uom: 'ft',
65
+ currency: 'USD',
66
+ locale: 'en',
67
+ is_for_rent: true
68
+ }
69
+ end
70
+
71
+ def serialize(model, attributes: available_attributes, opts: {})
72
+ super(model, attributes: attributes, opts: default_opts.merge(opts))
73
+ end
74
+
75
+ def id(boat)
76
+ { id: boat.id }
77
+ end
78
+
79
+ # noinspection RubyResolve
80
+ def picture_medium_url(boat)
81
+ url = if boat.boat_photo.present?
82
+ boat.boat_photo.picture.url(:medium).gsub('\'', '&#39;')
83
+ else
84
+ ''
85
+ end
86
+
87
+ { picture_medium_url: url }
88
+ end
89
+
90
+ def name(boat)
91
+ { name: boat.name }
92
+ end
93
+
94
+ def builder(boat)
95
+ { builder: boat.builder }
96
+ end
97
+
98
+ def short_description(boat)
99
+ attr = 'short_description_%s' % @opts[:locale]
100
+ value = boat.send(attr.to_sym) || ''
101
+ { short_description: value }
102
+ end
103
+
104
+ # per day, per week; в день, в час, за месяц;
105
+ def per_season(boat)
106
+ season_key = ::Lib::Boats::RentPricePerSeason.spot_rentprice_id(boat, @opts[:currency], @opts[:rent_price_id]).gsub(/_low|_high/, '')
107
+ #=> charter_1_week_low, charter_1_day_high
108
+ translate = I18n.t("boat.rent_price.per_#{season_key}")
109
+ value = @opts[:is_for_rent] ? translate : ''
110
+
111
+ { per_season: value }
112
+ end
113
+
114
+ # ₽ 293,885
115
+ def price(boat)
116
+ value = if @opts[:is_for_rent]
117
+ ::Lib::Boats::RentPricePerSeason.price(boat, @opts[:currency], @opts[:rent_price_id])
118
+ else
119
+ ::Lib::Boats::SalePrice.price(boat, @opts[:currency])
120
+ end
121
+
122
+ { price: value }
123
+ end
124
+
125
+ # 12%
126
+ def price_discount(boat)
127
+ value = if @opts[:is_for_rent]
128
+ ::Lib::Boats::RentPricePerSeason.price_discount(boat, @opts[:currency])
129
+ else
130
+ ::Lib::Boats::SalePrice.price_discount(boat)
131
+ end
132
+ { price_discount: value }
133
+ end
134
+
135
+ def guests_total(boat)
136
+ { guests_total: boat.guests_total || '' }
137
+ end
138
+
139
+ def guest_cabins(boat)
140
+ { guest_cabins: boat.guest_cabins || '' }
141
+ end
142
+
143
+ def crew_total(boat)
144
+ { crew_total: boat.crew_total || '' }
145
+ end
146
+
147
+ def built_year(boat)
148
+ { built_year: boat.built_year || '' }
149
+ end
150
+
151
+ def refit_year(boat)
152
+ value = boat.refit_year || ''
153
+ { refit_year: value }
154
+ end
155
+
156
+ def boat_model(boat)
157
+ { boat_model: boat.boat_model }
158
+ end
159
+
160
+ def location_address(boat)
161
+ { location_address: boat.location_address }
162
+ end
163
+
164
+ def latitude(boat)
165
+ { latitude: boat.latitude }
166
+ end
167
+
168
+ def longitude(boat)
169
+ { longitude: boat.longitude }
170
+ end
171
+
172
+ def boat_type_id(boat)
173
+ { boat_type_id: boat.boat_type_id }
174
+ end
175
+
176
+ def boat_length_metrics(boat)
177
+ value = ::Lib::Boats::Dimensions.boatlength(boat, @opts[:uom])
178
+ { boat_length_metrics: value }
179
+ end
180
+
181
+ def boat_length_metrics_meters(boat)
182
+ { boat_length_metrics_meters: boat.boat_length_metrics_meters }
183
+ end
184
+
185
+ def boat_length_metrics_ft(boat)
186
+ { boat_length_metrics_ft: boat.boat_length_metrics_ft }
187
+ end
188
+
189
+ def boat_beam_metrics(boat)
190
+ value = ::Lib::Boats::Dimensions.boatbeam(boat, @opts[:uom])
191
+ { boat_beam_metrics: value }
192
+ end
193
+
194
+ def boat_beam_metrics_ft(boat)
195
+ { boat_beam_metrics_ft: boat.boat_beam_metrics_ft }
196
+ end
197
+
198
+ def boat_beam_metrics_meters(boat)
199
+ { boat_beam_metrics_meters: boat.boat_beam_metrics_meters }
200
+ end
201
+
202
+ def boat_draft_metrics(boat)
203
+ value = ::Lib::Boats::Dimensions.boatdraft(boat, @opts[:uom])
204
+ { boat_draft_metrics: value }
205
+ end
206
+
207
+ def boat_draft_metrics_ft(boat)
208
+ { boat_draft_metrics_ft: boat.boat_draft_metrics_ft }
209
+ end
210
+
211
+ def boat_draft_metrics_meters(boat)
212
+ { boat_draft_metrics_meters: boat.boat_draft_metrics_meters }
213
+ end
214
+
215
+
216
+ # --[low]-----------------------------------------------------------------------------------------------------------
217
+
218
+ def charter_1_hour_low_usd(boat)
219
+ { charter_1_hour_low_usd: boat.charter_1_hour_low_usd || '' }
220
+ end
221
+
222
+ def charter_1_hour_low_rub(boat)
223
+ { charter_1_hour_low_rub: boat.charter_1_hour_low_rub || '' }
224
+ end
225
+
226
+ def charter_1_hour_low_eur(boat)
227
+ { charter_1_hour_low_eur: boat.charter_1_hour_low_eur || '' }
228
+ end
229
+
230
+ def charter_1_day_low_usd(boat)
231
+ { charter_1_day_low_usd: boat.charter_1_day_low_usd || '' }
232
+ end
233
+
234
+ def charter_1_day_low_rub(boat)
235
+ { charter_1_day_low_rub: boat.charter_1_day_low_rub || '' }
236
+ end
237
+
238
+ def charter_1_day_low_eur(boat)
239
+ { charter_1_day_low_eur: boat.charter_1_day_low_eur || '' }
240
+ end
241
+
242
+ def charter_1_week_low_usd(boat)
243
+ { charter_1_week_low_usd: boat.charter_1_week_low_usd || '' }
244
+ end
245
+
246
+ def charter_1_week_low_rub(boat)
247
+ { charter_1_week_low_rub: boat.charter_1_week_low_rub || '' }
248
+ end
249
+
250
+ def charter_1_week_low_eur(boat)
251
+ { charter_1_week_low_eur: boat.charter_1_week_low_eur || '' }
252
+ end
253
+
254
+ def charter_1_month_low_usd(boat)
255
+ { charter_1_month_low_usd: boat.charter_1_month_low_usd || '' }
256
+ end
257
+
258
+ def charter_1_month_low_rub(boat)
259
+ { charter_1_month_low_rub: boat.charter_1_month_low_rub || '' }
260
+ end
261
+
262
+ def charter_1_month_low_eur(boat)
263
+ { charter_1_month_low_eur: boat.charter_1_month_low_eur || '' }
264
+ end
265
+
266
+ # --[high]-----------------------------------------------------------------------------------------------------------
267
+
268
+ def charter_1_hour_high_usd(boat)
269
+ { charter_1_hour_high_usd: boat.charter_1_hour_high_usd || '' }
270
+ end
271
+
272
+ def charter_1_hour_high_rub(boat)
273
+ { charter_1_hour_high_rub: boat.charter_1_hour_high_rub || '' }
274
+ end
275
+
276
+ def charter_1_hour_high_eur(boat)
277
+ { charter_1_hour_high_eur: boat.charter_1_hour_high_eur || '' }
278
+ end
279
+
280
+ def charter_1_day_high_usd(boat)
281
+ { charter_1_day_high_usd: boat.charter_1_day_high_usd || '' }
282
+ end
283
+
284
+ def charter_1_day_high_rub(boat)
285
+ { charter_1_day_high_rub: boat.charter_1_day_high_rub || '' }
286
+ end
287
+
288
+ def charter_1_day_high_eur(boat)
289
+ { charter_1_day_high_eur: boat.charter_1_day_high_eur || '' }
290
+ end
291
+
292
+ def charter_1_week_high_usd(boat)
293
+ { charter_1_week_high_usd: boat.charter_1_week_high_usd || '' }
294
+ end
295
+
296
+ def charter_1_week_high_rub(boat)
297
+ { charter_1_week_high_rub: boat.charter_1_week_high_rub || '' }
298
+ end
299
+
300
+ def charter_1_week_high_eur(boat)
301
+ { charter_1_week_high_eur: boat.charter_1_week_high_eur || '' }
302
+ end
303
+
304
+ def charter_1_month_high_usd(boat)
305
+ { charter_1_month_high_usd: boat.charter_1_month_high_usd || '' }
306
+ end
307
+
308
+ def charter_1_month_high_rub(boat)
309
+ { charter_1_month_high_rub: boat.charter_1_month_high_rub || '' }
310
+ end
311
+
312
+ def charter_1_month_high_eur(boat)
313
+ { charter_1_month_high_eur: boat.charter_1_month_high_eur || '' }
314
+ end
315
+
316
+ # --[sale]----------------------------------------------------------------------------------------------------------
317
+
318
+ def sale_price_usd(boat)
319
+ { sale_price_usd: boat.sale_price_usd || '' }
320
+ end
321
+
322
+ def sale_price_rub(boat)
323
+ { sale_price_rub: boat.sale_price_rub || '' }
324
+ end
325
+
326
+ def sale_price_eur(boat)
327
+ { sale_price_eur: boat.sale_price_eur || '' }
328
+ end
329
+
330
+ end
331
+ end
@@ -0,0 +1,26 @@
1
+ module Configs
2
+ module Boats
3
+ module CentralAgent
4
+ class BoatList
5
+ # список атрибутов Лодок, которые видны Агенту в списке Лодок
6
+ def self.attributes
7
+ %i[
8
+ id
9
+ picture_medium_url
10
+ name
11
+ builder
12
+ guests_total
13
+ guest_cabins
14
+ crew_total
15
+ boat_length_metrics
16
+ built_year
17
+ boat_model
18
+ location_address
19
+ price
20
+ per_season
21
+ ]
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,29 @@
1
+ module Configs
2
+ module Lease
3
+ module CentralAgent
4
+ class InquiryList
5
+ # список атрибутов Заявки, которые видны Агенту в списке заявок
6
+ def self.attributes
7
+ [
8
+ :id,
9
+ :token,
10
+ :is_skippered,
11
+ :is_my_price,
12
+ :my_price,
13
+ :my_price_currency,
14
+ :address,
15
+ :period,
16
+ :duration,
17
+ :guests,
18
+ :kids,
19
+ :watersports,
20
+ :need_transfer,
21
+ :comments,
22
+ :created_at,
23
+ :boat_types
24
+ ]
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ module Lib
2
+ module Boats
3
+ class Dimensions
4
+ extend ::Custom::DimensionHelper
5
+ extend ::Custom::SelectHelper
6
+
7
+ # @param [String] uom: ft, meters
8
+ # @return [String] '78.7 ft', '20 m'
9
+ #
10
+ def self.boatlength(boat, uom = nil)
11
+ attr = dimension_attribute_name(:boat_length_metrics, uom)
12
+ '%s %s' % [boat.attributes[attr], dimension_symbol(uom)]
13
+ end
14
+
15
+ def self.boatbeam(boat, uom = nil)
16
+ attr = dimension_attribute_name(:boat_beam_metrics, uom)
17
+ '%s %s' % [boat.attributes[attr], dimension_symbol(uom)]
18
+ end
19
+
20
+ def self.boatdraft(boat, uom = nil)
21
+ attr = dimension_attribute_name(:boat_draft_metrics, uom)
22
+ '%s %s' % [boat.attributes[attr], dimension_symbol(uom)]
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,51 @@
1
+ module Lib
2
+ module Boats
3
+ class RentPricePerSeason
4
+ extend ::Custom::CurrencyHelper
5
+ extend ::Custom::PriceHelper
6
+ extend ::ActionView::Helpers::NumberHelper
7
+
8
+ # Вернёт отформатированное минимальное число среди цен на аренду вместе с подписью.
9
+ # Если у лодки не заполнены цены - вернёт дефлотное значение.
10
+ # value возвращается, но не используется.
11
+ #
12
+ # @return [Hash] { value: String, perseason: String }
13
+ #
14
+ def self.min_rentprice(boat, currency)
15
+ ::Dictionaries::BoatCharterAttribute::ALL.map do |attr|
16
+ {
17
+ attr: attr.to_s,
18
+ value: boat.send(currency_attribute_name(attr, currency))
19
+ }
20
+ end.delete_if { |el| !el[:value].present? }.sort_by { |el| el[:value] }.first || { attr: 'charter_1_day_high', value: 0 }
21
+ end
22
+
23
+ # Определить столбец, из которого надо взять цену аренды.
24
+ # Может зависеть от контекста - от того, какой параметр выставлен в поисковой форме.
25
+ # Если с поисковой формы приходит nil или пустая строка - вернёт дефолтное значение.
26
+ # Если у лодки не заполнено искомое поле - вернёт дефолтное значение.
27
+ # Дефолтное значение - вычисляется с помощью min_rent_price
28
+ #
29
+ # @param [Symbol, String] rent_price_id Например: charter_1_day_low
30
+ # @return [String]
31
+ #
32
+ def self.spot_rentprice_id(boat, currency = 'USD', rent_price_id = nil)
33
+ default_id = min_rentprice(boat, currency)[:attr]
34
+ return default_id unless rent_price_id
35
+
36
+ return default_id unless boat.attributes[currency_attribute_name(rent_price_id, currency)].present?
37
+
38
+ rent_price_id.to_s
39
+ end
40
+
41
+ def self.price(boat, currency = 'USD', rent_price_id = nil)
42
+ attr = spot_rentprice_id(boat, currency, rent_price_id)
43
+ price_format(boat, attr, currency: currency)
44
+ end
45
+
46
+ def self.price_discount(boat, currency = 'USD')
47
+ boat.send('%s_discount' % min_rentprice(boat, currency)[:attr])
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,17 @@
1
+ module Lib
2
+ module Boats
3
+ class SalePrice
4
+ extend ::Custom::PriceHelper
5
+ extend ::Custom::CurrencyHelper
6
+ extend ::ActionView::Helpers::NumberHelper
7
+
8
+ def self.price(boat, currency)
9
+ price_format(boat, :sale_price, currency: currency)
10
+ end
11
+
12
+ def self.price_discount(boat)
13
+ boat.sale_price_discount
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,3 +1,3 @@
1
1
  module C80Shared
2
- VERSION = "0.1.3"
2
+ VERSION = "0.1.4"
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.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - C80609A
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-07 00:00:00.000000000 Z
11
+ date: 2018-11-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,10 +52,18 @@ files:
52
52
  - app/dicts/email_token_subj.rb
53
53
  - app/dicts/rent_skip_type.rb
54
54
  - app/helpers/custom/currency_helper.rb
55
+ - app/helpers/custom/dimension_helper.rb
56
+ - app/helpers/custom/price_helper.rb
55
57
  - app/helpers/custom/select_helper.rb
56
58
  - app/helpers/site/time_helper.rb
59
+ - app/serializers/boat_serializer.rb
60
+ - app/serializers/configs/boats/central_agent/boat_list.rb
61
+ - app/serializers/configs/lease/central_agent/inquiry_list.rb
57
62
  - app/serializers/lease/bid_serializer.rb
58
63
  - app/serializers/lease/inquiry_serializer.rb
64
+ - app/serializers/lib/boats/dimensions.rb
65
+ - app/serializers/lib/boats/rent_price_per_season.rb
66
+ - app/serializers/lib/boats/sale_price.rb
59
67
  - bin/console
60
68
  - bin/rails
61
69
  - bin/setup