c80_estate 0.1.0.3 → 0.1.0.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.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/app/admin/c80_estate/dashboard.rb +65 -0
  3. data/app/admin/c80_estate/properties.rb +9 -1
  4. data/app/admin/c80_estate/sevents.rb +18 -12
  5. data/app/assets/images/property_default_logo.png +0 -0
  6. data/app/assets/javascript/c80_estate/backend/admin/pstats.js +231 -40
  7. data/app/assets/javascript/c80_estate/backend/admin/sevents.js +127 -1
  8. data/app/assets/javascript/c80_estate/lib/Chart.bundle.js +14282 -0
  9. data/app/assets/javascript/c80_estate/lib/jquery.canvasjs.min.js +560 -0
  10. data/app/assets/stylesheets/c80_estate/backend/admin_pstats.scss +55 -5
  11. data/app/assets/stylesheets/c80_estate/backend/admin_sevents.scss +5 -0
  12. data/app/assets/stylesheets/c80_estate/backend/dashboard/atype_in_list.scss +29 -0
  13. data/app/assets/stylesheets/c80_estate/backend/dashboard/common.scss +43 -0
  14. data/app/assets/stylesheets/c80_estate/backend/dashboard/prop_in_list.scss +52 -0
  15. data/app/controllers/c80_estate/ajax_view_controller.rb +23 -0
  16. data/app/helpers/c80_estate/app_helper.rb +55 -0
  17. data/app/models/c80_estate/area.rb +40 -15
  18. data/app/models/c80_estate/plogo.rb +6 -0
  19. data/app/models/c80_estate/pphoto.rb +1 -0
  20. data/app/models/c80_estate/property.rb +14 -0
  21. data/app/models/c80_estate/pstat.rb +419 -30
  22. data/app/models/c80_estate/sevent.rb +65 -1
  23. data/app/uploaders/c80_estate/plogo_uploader.rb +25 -0
  24. data/app/views/admin/dashboard/_atype_in_list.html.erb +3 -0
  25. data/app/views/admin/dashboard/_prop_in_list.html.erb +10 -0
  26. data/app/views/c80_estate/ajax_view/table_properties_coef_busy.js.erb +3 -0
  27. data/app/views/c80_estate/ajax_view/table_properties_coef_busy_sq.js.erb +3 -0
  28. data/app/views/c80_estate/shared/_table_properties_coef_busy.html.erb +25 -0
  29. data/app/views/c80_estate/shared/_table_properties_coef_busy_sq.html.erb +25 -0
  30. data/config/routes.rb +4 -0
  31. data/db/migrate/20160630012728_create_c80_estate_plogos.rb +9 -0
  32. data/lib/c80_estate/version.rb +1 -1
  33. metadata +20 -2
@@ -10,6 +10,8 @@ module C80Estate
10
10
  belongs_to :parent, :class_name => 'C80Estate::Pstat'
11
11
  has_many :pstats, :foreign_key => 'parent_id', :dependent => :destroy
12
12
 
13
+ scope :ordered_by_created_at, -> { order(created_at: :asc) }
14
+
13
15
  # рассчитаем коэф-ты занятости
14
16
  before_create :calc_busy_coefs
15
17
 
@@ -18,34 +20,108 @@ module C80Estate
18
20
 
19
21
  def self.busy_coef(prop_id: nil, atype_id: nil, start_date: nil, end_date: nil)
20
22
  # start_date: строка вида 2015-12-12
21
-
23
+ # Rails.logger.debug "<Pstat.busy_coef> prop_id = #{prop_id}, atype_id = #{atype_id}"
22
24
  result = {}
23
25
 
26
+ # обозначим диапазон фильтрации
27
+ first_created_at = Time.at(self.first.created_at)
28
+ time_now = Time.now
29
+
24
30
  # если ничего не подано - просто выберем все занятые площади и поделим на все известные площади
25
- if prop_id.nil? && atype_id.nil? && start_date.nil? && end_date.nil?
31
+ if prop_id.nil? && atype_id.nil?
32
+
33
+ # prepare
26
34
 
27
- all_areas_count = Area.all.count
28
- free_areas_count = Area.free_areas.count
29
- busy_areas_count = Area.busy_areas.count
35
+ tcut = _calc_time_cut(first_created_at, time_now, start_date, end_date)
30
36
 
31
37
  ddd = '-'
32
38
  if self.count > 0
33
- ddd = Time.at(self.first.created_at).strftime('%Y/%m/%d')
39
+ ddd = tcut[:used_start_date_str] #Time.at(self.first.created_at).strftime('%Y/%m/%d')
34
40
  end
35
41
 
36
- result[:busy_coef] = sprintf "%.2f%", busy_areas_count*1.0/all_areas_count*100.0
37
- result[:comment] = "<abbr title='Период рассчёта занятости: с момента самого первого известного события до текущего дня'>C #{ddd} по #{Time.now.year}/#{sprintf "%02d", Time.now.month}/#{sprintf "%02d", Time.now.day}</abbr>"
38
- result[:abbr] = 'Показана занятость для всех площадей всех объектов недвижимости за весь период'
39
- result[:title] = 'Статистика - Все объекты недвижимости'
42
+ pstats = self.where("created_at BETWEEN ? AND ?", tcut[:used_start_date], tcut[:used_end_date])
43
+ .where(:atype_id => nil)
44
+
45
+ # если в этот промежуток небыло событий - значит промежуток целиком попал в какое-то событие
46
+ # найдем его
47
+ # заодно поднимем вспомогательный флаг, который обработаем во view
48
+ mark_whole = false
49
+ if pstats.count == 0
50
+ pstats = [self.where(:atype_id => nil).where("created_at < ?", tcut[:used_start_date]).last]
51
+ mark_whole = true
52
+ # sevents.each do |se|
53
+ # Rails.logger.debug "\t\t\t #{used_start_date - se.created_at}"
54
+ # end
55
+ end
56
+
57
+ # Занятость
58
+
59
+ tt = _calc_free_busy_areas(pstats)
60
+
61
+ free_areas_atnow = tt[:sum_free_areas] #*1.0/all_props.count #pstats.last.free_areas
62
+ busy_areas_atnow = tt[:sum_busy_areas] #*1.0/all_props.count #pstats.last.busy_areas
63
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
64
+
65
+ # защищаемся от деления на ноль
66
+ if free_areas_atnow + busy_areas_atnow == 0
67
+ bcoef = 0.0
68
+ else
69
+ bcoef = busy_areas_atnow*1.0 / (free_areas_atnow + busy_areas_atnow) * 100.0
70
+ end
71
+
72
+ # all_areas_count = Area.all.count
73
+ # free_areas_count = Area.free_areas.count
74
+ # busy_areas_count = Area.busy_areas.count
75
+
76
+ result[:busy_coef] = sprintf "%.2f%", bcoef
77
+ result[:comment] = "<abbr title='Период рассчёта занятости'>C #{ddd} по #{ tcut[:used_end_date_str] }</abbr>"
78
+ result[:abbr] = 'Показана занятость для ВСЕХ площадей ВСЕХ объектов недвижимости за указанный период'
40
79
  result[:props] = [
41
- {tag: 'all_areas_count', val: "Площадей всего: #{all_areas_count}"},
42
- {tag: 'free_areas_count', val: "Площадей свободно: #{free_areas_count}"},
43
- {tag: 'busy_areas_count', val: "Площадей занято: #{busy_areas_count}"}
80
+ {tag: 'all_areas_count', val: "Площадей всего: #{free_areas_atnow + busy_areas_atnow}"},
81
+ {tag: 'free_areas_count', val: "Площадей свободно: #{free_areas_atnow}"},
82
+ {tag: 'busy_areas_count', val: "Площадей занято: #{busy_areas_atnow}"}
83
+ ]
84
+ result[:raw_props] = {}
85
+ result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
86
+ result[:raw_props][:free_areas_count] = free_areas_atnow
87
+ result[:raw_props][:busy_areas_atnow] = busy_areas_atnow
88
+ result[:graph_dynamic] = graph_data
89
+
90
+ # Rails.logger.debug "<Pstat.busy_coef> busy_areas_count = #{ busy_areas_count }"
91
+ # Rails.logger.debug "<Pstat.busy_coef> all_areas_count = #{ all_areas_count }"
92
+ # Rails.logger.debug "<Pstat.busy_coef> result[:busy_coef] = #{ result[:busy_coef] }"
93
+
94
+ # Занятость в метрах
95
+
96
+ free_areas_atnow_sq = pstats.where(:atype_id => nil).last.free_areas_sq
97
+ busy_areas_atnow_sq = pstats.where(:atype_id => nil).last.busy_areas_sq
98
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.where(:atype_id => nil).ordered_by_created_at)
99
+
100
+ # защищаемся от деления на ноль
101
+ if busy_areas_atnow_sq + free_areas_atnow_sq == 0
102
+ bcoef_sq = 0.0
103
+ else
104
+ bcoef_sq = busy_areas_atnow_sq*1.0/(busy_areas_atnow_sq + free_areas_atnow_sq)*100.0
105
+ end
106
+
107
+ result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
108
+ result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{tcut[:used_start_date_str]} по #{tcut[:used_end_date_str]}</abbr>"
109
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
110
+ result[:props_sq] = [
111
+ {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
112
+ {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
113
+ {tag: 'busy_areas_count_sq', val: "Занятых: #{busy_areas_atnow_sq}"}
44
114
  ]
115
+ result[:raw_props_sq] = {}
116
+ result[:raw_props_sq][:all_areas_count_sq] = free_areas_atnow_sq + busy_areas_atnow_sq
117
+ result[:raw_props_sq][:free_areas_count_sq] = free_areas_atnow_sq
118
+ result[:raw_props_sq][:busy_areas_atnow_sq] = busy_areas_atnow_sq
119
+ result[:graph_dynamic_sq] = graph_data_sq
120
+
121
+ # common
45
122
 
46
- Rails.logger.debug "<Pstat.busy_coef> busy_areas_count = #{ busy_areas_count }"
47
- Rails.logger.debug "<Pstat.busy_coef> all_areas_count = #{ all_areas_count }"
48
- Rails.logger.debug "<Pstat.busy_coef> result[:busy_coef] = #{ result[:busy_coef] }"
123
+ result[:title] = 'Статистика - Все объекты недвижимости'
124
+ # Rails.logger.debug "result ============= #{result}"
49
125
 
50
126
  # если фильтруем по property
51
127
  elsif prop_id.present?
@@ -115,19 +191,23 @@ module C80Estate
115
191
  # end
116
192
  end
117
193
 
194
+ # Занятость -----
195
+
118
196
  # если сортируем по типу, то берём последнюю запись,
119
197
  # иначе - берём последнюю запись с общими данными
120
198
  if atype_id.nil?
121
199
  free_areas_atnow = pstats.where(:atype_id => nil).last.free_areas
122
200
  busy_areas_atnow = pstats.where(:atype_id => nil).last.busy_areas
201
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.where(:atype_id => nil).ordered_by_created_at)
123
202
  else
124
203
  free_areas_atnow = pstats.last.free_areas
125
204
  busy_areas_atnow = pstats.last.busy_areas
205
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
126
206
  end
127
207
 
128
- Rails.logger.debug("\t\t atype_id = #{atype_id}")
129
- Rails.logger.debug("\t\t free_areas_atnow = #{free_areas_atnow}")
130
- Rails.logger.debug("\t\t busy_areas_atnow = #{busy_areas_atnow}")
208
+ # Rails.logger.debug("\t\t atype_id = #{atype_id}")
209
+ # Rails.logger.debug("\t\t free_areas_atnow = #{free_areas_atnow}")
210
+ # Rails.logger.debug("\t\t busy_areas_atnow = #{busy_areas_atnow}")
131
211
 
132
212
  # защищаемся от деления на ноль
133
213
  if free_areas_atnow + busy_areas_atnow == 0
@@ -138,10 +218,52 @@ module C80Estate
138
218
 
139
219
  result[:busy_coef] = sprintf "%.2f%", bcoef
140
220
  result[:comment] = "<abbr title='Период рассчёта занятости'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
141
- result[:abbr] = 'Занятость объекта за указанный период'
221
+ result[:abbr] = 'Занятость объекта за указанный период: число b/N, где b - кол-во свободных, N - всего площадей'
222
+
223
+ result[:raw_props] = {}
224
+ result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
225
+ result[:raw_props][:free_areas_count] = free_areas_atnow
226
+ result[:raw_props][:busy_areas_atnow] = busy_areas_atnow
227
+
228
+ # Занятость в метрах ------
229
+
230
+ if atype_id.nil?
231
+ free_areas_atnow_sq = pstats.where(:atype_id => nil).last.free_areas_sq
232
+ busy_areas_atnow_sq = pstats.where(:atype_id => nil).last.busy_areas_sq
233
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.where(:atype_id => nil).ordered_by_created_at)
234
+ else
235
+ free_areas_atnow_sq = pstats.last.free_areas_sq
236
+ busy_areas_atnow_sq = pstats.last.busy_areas_sq
237
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.ordered_by_created_at)
238
+ end
239
+
240
+ # защищаемся от деления на ноль
241
+ if busy_areas_atnow_sq + free_areas_atnow_sq == 0
242
+ bcoef_sq = 0.0
243
+ else
244
+ bcoef_sq = busy_areas_atnow_sq*1.0/(busy_areas_atnow_sq + free_areas_atnow_sq)*100.0
245
+ end
246
+
247
+ result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
248
+ result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
249
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
250
+ result[:props_sq] = [
251
+ {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
252
+ {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
253
+ {tag: 'busy_areas_count_sq', val: "Занятых: #{busy_areas_atnow_sq}"}
254
+ ]
255
+
256
+ result[:raw_props_sq] = {}
257
+ result[:raw_props_sq][:all_areas_count_sq] = free_areas_atnow_sq + busy_areas_atnow_sq
258
+ result[:raw_props_sq][:free_areas_count_sq] = free_areas_atnow_sq
259
+ result[:raw_props_sq][:busy_areas_atnow_sq] = busy_areas_atnow_sq
260
+
261
+ # common
262
+
142
263
  result[:title] = "Статистика - Объект - #{property.title}"
143
- result[:graph] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
144
- result[:graph_dynamic] = _parse_for_js_dynamic_graph(pstats)
264
+ # result[:graph] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
265
+ result[:graph_dynamic] = graph_data
266
+ result[:graph_dynamic_sq] = graph_data_sq
145
267
 
146
268
  # if atype_id.present?
147
269
  # result[:title] += " (#{Atype.find(atype_id).title})"
@@ -167,6 +289,142 @@ module C80Estate
167
289
  {tag: 'title', val: "#{property.title} не имеет площадей"}
168
290
  ]
169
291
  end
292
+
293
+ elsif atype_id.present?
294
+
295
+ # обозначим диапазон фильтрации
296
+ first_created_at = Time.at(self.first.created_at)
297
+ time_now = Time.now
298
+
299
+ # если подана нижняя граница диапазона и она позже, чем время создания самой первой площади объекта,
300
+ # выравниваем период рассчета коэф-та по этой нижней границе диапазона
301
+ if start_date.present?
302
+ start_date_tt = Time.parse(start_date)
303
+ if start_date_tt > first_created_at
304
+ used_start_date = start_date_tt
305
+ # Rails.logger.debug("start_date: используем аргумент: #{start_date_tt}")
306
+ else
307
+ used_start_date = first_created_at
308
+ # Rails.logger.debug("start_date: используем время рождения Площади: #{area_created_at}")
309
+ end
310
+ else
311
+ used_start_date = first_created_at
312
+ # Rails.logger.debug("start_date: используем время рождения Площади: #{area_created_at}")
313
+ end
314
+ used_start_date_str = used_start_date.strftime('%Y/%m/%d')
315
+
316
+ if end_date.present?
317
+ end_date_tt = Time.parse(end_date)
318
+ if end_date < time_now
319
+ used_end_date = end_date_tt
320
+ # Rails.logger.debug("end_date: используем аргумент: #{end_date_tt}")
321
+ else
322
+ used_end_date = time_now
323
+ # Rails.logger.debug("end_date: используем текущее время")
324
+ end
325
+ else
326
+ used_end_date = time_now
327
+ # Rails.logger.debug("end_date: используем текущее время")
328
+ end
329
+ used_end_date_str = used_end_date.strftime('%Y/%m/%d')
330
+
331
+ # Rails.logger.debug("start_date = #{start_date}; end_date = #{end_date}; used_start_date = #{used_start_date}; used_end_date = #{used_end_date}")
332
+ # sevents = self.where(:area_id => area_id).where(:created_at => used_start_date..used_end_date)
333
+ pstats = self.where(:atype_id => atype_id)
334
+ .where("created_at BETWEEN ? AND ?", used_start_date, used_end_date)
335
+
336
+
337
+ # если в этот промежуток небыло событий - значит промежуток целиком попал в какое-то событие
338
+ # найдем его
339
+ # заодно поднимем вспомогательный флаг, который обработаем во view
340
+ mark_whole = false
341
+ if pstats.count == 0
342
+ pstats = [self.where(:atype_id => atype_id).where("created_at < ?", used_start_date).last]
343
+ mark_whole = true
344
+ # sevents.each do |se|
345
+ # Rails.logger.debug "\t\t\t #{used_start_date - se.created_at}"
346
+ # end
347
+ end
348
+
349
+ # Занятость
350
+
351
+ tt = _calc_free_busy_areas(pstats)
352
+
353
+ free_areas_atnow = tt[:sum_free_areas] #*1.0/all_props.count #pstats.last.free_areas
354
+ busy_areas_atnow = tt[:sum_busy_areas] #*1.0/all_props.count #pstats.last.busy_areas
355
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
356
+
357
+ # Rails.logger.debug("\t\t atype_id = #{atype_id}")
358
+ # Rails.logger.debug("\t\t free_areas_atnow = #{free_areas_atnow}")
359
+ # Rails.logger.debug("\t\t busy_areas_atnow = #{busy_areas_atnow}")
360
+
361
+ # защищаемся от деления на ноль
362
+ if free_areas_atnow + busy_areas_atnow == 0
363
+ bcoef = 0.0
364
+ else
365
+ bcoef = busy_areas_atnow*1.0 / (free_areas_atnow + busy_areas_atnow) * 100.0
366
+ end
367
+
368
+ result[:busy_coef] = sprintf "%.2f%", bcoef
369
+ result[:comment] = "<abbr title='Период рассчёта занятости'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
370
+ result[:abbr] = 'Занятость объекта за указанный период: число b/N, где b - кол-во свободных, N - всего площадей'
371
+
372
+ result[:raw_props] = {}
373
+ result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
374
+ result[:raw_props][:free_areas_count] = free_areas_atnow
375
+ result[:raw_props][:busy_areas_atnow] = busy_areas_atnow
376
+
377
+ # Занятость в метрах
378
+
379
+ free_areas_atnow_sq = pstats.last.free_areas_sq
380
+ busy_areas_atnow_sq = pstats.last.busy_areas_sq
381
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.ordered_by_created_at)
382
+
383
+ # защищаемся от деления на ноль
384
+ if busy_areas_atnow_sq + free_areas_atnow_sq == 0
385
+ bcoef_sq = 0.0
386
+ else
387
+ bcoef_sq = busy_areas_atnow_sq*1.0/(busy_areas_atnow_sq + free_areas_atnow_sq)*100.0
388
+ end
389
+
390
+ result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
391
+ result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
392
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
393
+ result[:props_sq] = [
394
+ {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
395
+ {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
396
+ {tag: 'busy_areas_count_sq', val: "Занятых: #{busy_areas_atnow_sq}"}
397
+ ]
398
+
399
+ result[:raw_props_sq] = {}
400
+ result[:raw_props_sq][:all_areas_count_sq] = free_areas_atnow_sq + busy_areas_atnow_sq
401
+ result[:raw_props_sq][:free_areas_count_sq] = free_areas_atnow_sq
402
+ result[:raw_props_sq][:busy_areas_atnow_sq] = busy_areas_atnow_sq
403
+
404
+ # common
405
+
406
+ result[:title] = "Статистика - Объекты - Фильтр по типу площади '#{ Atype.find(atype_id).title }'"
407
+ # result[:graph] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
408
+ result[:graph_dynamic] = graph_data
409
+ result[:graph_dynamic_sq] = graph_data_sq
410
+
411
+ # if atype_id.present?
412
+ # result[:title] += " (#{Atype.find(atype_id).title})"
413
+ # end
414
+
415
+ dc_str = self.first.created_at.in_time_zone('Moscow').strftime('%Y/%m/%d')
416
+ dc_abbr = 'За дату создания объекта недвижимости при рассчетах берётся дата создания первой площади объекта'
417
+
418
+ result[:props] = [
419
+ {tag: 'title', val: "Фильтр по типу площади: #{ Atype.find(atype_id).title }"},
420
+ # {tag: 'born_date', val: "<abbr title='#{dc_abbr}'>Дата создания: #{dc_str}"},
421
+ {tag: 'all_areas_count', val: "<abbr title='В конце указанного периода'>Площадей всего</abbr>: #{ free_areas_atnow + busy_areas_atnow }"},
422
+ {tag: 'free_areas_count', val: "<abbr title='В конце указанного периода'>Свободных площадей</abbr>: #{ free_areas_atnow }"},
423
+ {tag: 'busy_areas_count', val: "<abbr title='В конце указанного периода'>Занятых площадей</abbr>: #{ busy_areas_atnow }"}
424
+ ]
425
+
426
+ # Rails.logger.debug "result ============= #{result}"
427
+
170
428
  end
171
429
 
172
430
  result
@@ -200,21 +458,21 @@ module C80Estate
200
458
 
201
459
  self.free_areas = self.property.areas.free_areas.count
202
460
  self.busy_areas = self.property.areas.busy_areas.count
203
- self.coef_busy = self.busy_areas / (self.free_areas + self.busy_areas) * 100
461
+ self.coef_busy = self.busy_areas*1.0 / (self.free_areas + self.busy_areas) * 100.0
204
462
 
205
463
  self.free_areas_sq = self.property.areas.free_areas_sq
206
464
  self.busy_areas_sq = self.property.areas.busy_areas_sq
207
- self.coef_busy_sq = self.busy_areas_sq / (self.free_areas_sq + self.busy_areas_sq) * 100
465
+ self.coef_busy_sq = self.busy_areas_sq*1.0 / (self.free_areas_sq + self.busy_areas_sq) * 100.0
208
466
 
209
- # здесь считаем коэф-ты для 'atype related записей'
467
+ # здесь считаем коэф-ты для 'atype related записей'
210
468
  else
211
469
  self.free_areas = self.property.areas.where(:atype_id => self.atype.id).free_areas.count
212
470
  self.busy_areas = self.property.areas.where(:atype_id => self.atype.id).busy_areas.count
213
- self.coef_busy = (self.free_areas + self.busy_areas == 0) ? 0:self.busy_areas / (self.free_areas + self.busy_areas) * 100
471
+ self.coef_busy = (self.free_areas + self.busy_areas == 0) ? 0 : self.busy_areas*1.0 / (self.free_areas + self.busy_areas) * 100.0
214
472
 
215
473
  self.free_areas_sq = self.property.areas.where(:atype_id => self.atype.id).free_areas_sq
216
474
  self.busy_areas_sq = self.property.areas.where(:atype_id => self.atype.id).busy_areas_sq
217
- self.coef_busy_sq = (self.free_areas_sq + self.busy_areas_sq == 0) ? 0:self.busy_areas_sq / (self.free_areas_sq + self.busy_areas_sq) * 100
475
+ self.coef_busy_sq = (self.free_areas_sq + self.busy_areas_sq == 0) ? 0 : self.busy_areas_sq*1.0 / (self.free_areas_sq + self.busy_areas_sq) * 100.0
218
476
  end
219
477
  end
220
478
  end
@@ -260,7 +518,7 @@ module C80Estate
260
518
  # ['Занято', 2]
261
519
  # ]
262
520
 
263
- res = [['','']]
521
+ res = [['', '']]
264
522
  res << ['Свободно', free_areas_atnow]
265
523
  res << ['Занято', busy_areas_atnow]
266
524
  Rails.logger.debug "<_parse_for_js_radial_graph> res: #{res}"
@@ -268,7 +526,29 @@ module C80Estate
268
526
 
269
527
  end
270
528
 
271
- def self._parse_for_js_dynamic_graph(pstats)
529
+ def self._parse_for_js_dynamic_graph_chartjs(pstats)
530
+
531
+ # res = {
532
+ # labels: ['2016/12/22',...]
533
+ # points: [12,13,...]
534
+ # }
535
+
536
+ res = {
537
+ labels: [],
538
+ points: []
539
+ }
540
+ pstats.each do |pstat|
541
+ label = pstat.created_at.strftime('%Y/%m/%d')
542
+ point = pstat.coef_busy
543
+ res[:labels] << label
544
+ res[:points] << point
545
+ Rails.logger.debug "<_parse_for_js_dynamic_graph_chartjs> label = #{label}, point = #{point}"
546
+ end
547
+ res
548
+
549
+ end
550
+
551
+ def self._parse_for_js_dynamic_graph_google_charts(pstats)
272
552
  # res = [
273
553
  # ['Year', 'Sales', 'Expenses'],
274
554
  # ['2013', 1000, 400],
@@ -279,10 +559,119 @@ module C80Estate
279
559
 
280
560
  res = []
281
561
  pstats.each do |pstat|
282
- res << [ pstat.created_at.strftime('%Y/%m/%d'), pstat.coef_busy ]
562
+ res << [pstat.created_at.strftime('%Y/%m/%d'), pstat.coef_busy]
563
+ end
564
+ res
565
+
566
+ end
567
+
568
+ def self._parse_for_js_dynamic_graph_canvasjs(pstats)
569
+ # res: [
570
+ # {
571
+ # year
572
+ # month
573
+ # day
574
+ # val
575
+ # }
576
+ # ]
577
+
578
+ res = []
579
+
580
+ pstats.each do |pstat|
581
+
582
+ res << {
583
+ year: pstat.created_at.strftime('%Y'),
584
+ month: pstat.created_at.strftime('%m').to_i-1,
585
+ day: pstat.created_at.strftime('%d'),
586
+ val: pstat.coef_busy
587
+ }
588
+
589
+ end
590
+
591
+ Rails.logger.debug "<Pstat.parse_for_js_graph> res = #{res}"
592
+ res
593
+ end
594
+
595
+ def self._parse_for_js_dynamic_graph3_canvasjs(pstats)
596
+ # res: [
597
+ # {
598
+ # year
599
+ # month
600
+ # day
601
+ # val
602
+ # }
603
+ # ]
604
+
605
+ res = []
606
+
607
+ pstats.each do |pstat|
608
+
609
+ res << {
610
+ year: pstat.created_at.strftime('%Y'),
611
+ month: pstat.created_at.strftime('%m').to_i-1,
612
+ day: pstat.created_at.strftime('%d'),
613
+ val: pstat.coef_busy_sq
614
+ }
283
615
  end
284
616
  res
617
+ end
618
+
619
+ def self._calc_time_cut(first_created_at, time_now, start_date, end_date)
620
+
621
+ # если подана нижняя граница диапазона и она позже, чем время создания самой первой площади объекта,
622
+ # выравниваем период рассчета коэф-та по этой нижней границе диапазона
623
+ if start_date.present?
624
+ start_date_tt = Time.parse(start_date)
625
+ if start_date_tt > first_created_at
626
+ used_start_date = start_date_tt
627
+ # Rails.logger.debug("1: start_date: используем аргумент: #{start_date_tt} (first_created_at = #{first_created_at})")
628
+ else
629
+ used_start_date = first_created_at
630
+ # Rails.logger.debug("2: start_date: используем first_created_at: #{first_created_at}")
631
+ end
632
+ else
633
+ used_start_date = first_created_at
634
+ # Rails.logger.debug("3: start_date: используем first_created_at: #{first_created_at} (start_date = #{start_date})")
635
+ end
636
+ used_start_date_str = used_start_date.strftime('%Y/%m/%d')
285
637
 
638
+ if end_date.present?
639
+ end_date_tt = Time.parse(end_date)
640
+ if end_date < time_now
641
+ used_end_date = end_date_tt
642
+ # Rails.logger.debug("end_date: используем аргумент: #{end_date_tt}")
643
+ else
644
+ used_end_date = time_now
645
+ # Rails.logger.debug("end_date: используем текущее время")
646
+ end
647
+ else
648
+ used_end_date = time_now
649
+ # Rails.logger.debug("end_date: используем текущее время")
650
+ end
651
+ used_end_date_str = used_end_date.strftime('%Y/%m/%d')
652
+
653
+ {
654
+ used_start_date: used_start_date,
655
+ used_start_date_str: used_start_date_str,
656
+ used_end_date: used_end_date,
657
+ used_end_date_str: used_end_date_str
658
+ }
659
+
660
+ end
661
+
662
+ def self._calc_free_busy_areas(pstats)
663
+ sum_free_areas = 0
664
+ sum_busy_areas = 0
665
+ all_props = Property.all
666
+ all_props.each do |prop|
667
+ ppstats = pstats.where(:property_id => prop.id).ordered_by_created_at.last
668
+ sum_free_areas += ppstats.free_areas
669
+ sum_busy_areas += ppstats.busy_areas
670
+ end
671
+ {
672
+ sum_free_areas:sum_free_areas,
673
+ sum_busy_areas:sum_busy_areas
674
+ }
286
675
  end
287
676
 
288
677
  end