c80_estate 0.1.0.9 → 0.1.0.10

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/app/admin/c80_estate/admin_user.rb +4 -1
  3. data/app/admin/c80_estate/areas.rb +30 -20
  4. data/app/admin/c80_estate/astatuses.rb +1 -0
  5. data/app/admin/c80_estate/comments.rb +3 -1
  6. data/app/admin/c80_estate/dashboard.rb +14 -4
  7. data/app/admin/c80_estate/properties.rb +1 -1
  8. data/app/admin/c80_estate/pstats.rb +1 -0
  9. data/app/assets/javascript/c80_estate/backend/admin/areas.js +180 -19
  10. data/app/assets/javascript/c80_estate/backend/admin/pstats.js +155 -147
  11. data/app/assets/javascript/c80_estate/lib/bootstrap-slider.js +1641 -0
  12. data/app/assets/stylesheets/c80_estate/backend/admin_areas.scss +7 -3
  13. data/app/assets/stylesheets/c80_estate/backend/admin_pstats.scss +19 -11
  14. data/app/assets/stylesheets/c80_estate/backend/common.scss +5 -0
  15. data/app/controllers/c80_estate/ajax_areas_controller.rb +38 -0
  16. data/app/helpers/c80_estate/app_helper.rb +45 -36
  17. data/app/models/c80_estate/area.rb +94 -0
  18. data/app/models/c80_estate/item_prop.rb +4 -2
  19. data/app/models/c80_estate/owner.rb +8 -2
  20. data/app/models/c80_estate/pstat.rb +53 -35
  21. data/app/views/admin/dashboard/_prop_in_list.html.erb +1 -2
  22. data/app/views/c80_estate/ajax_areas/exel_import.html.erb +1 -0
  23. data/app/views/c80_estate/ajax_areas/exel_import.js.erb +6 -0
  24. data/app/views/c80_estate/shared/_form_upload_areas_excel.erb +37 -0
  25. data/app/views/c80_estate/shared/_table_properties_coef_busy.html.erb +12 -8
  26. data/app/views/c80_estate/shared/_table_properties_coef_busy_sq.html.erb +12 -8
  27. data/config/routes.rb +2 -0
  28. data/lib/c80_estate/version.rb +1 -1
  29. metadata +7 -3
  30. data/app/assets/javascript/c80_estate/lib/bootstrap-slider.min.js +0 -29
@@ -122,14 +122,14 @@ body.admin_areas {
122
122
  &.index {
123
123
 
124
124
  .min_text_input {
125
- margin-top: 15px;
125
+ margin: 10px 0;
126
126
  width: 45% !important;
127
+ padding-left: 15px;
127
128
  }
128
129
 
129
130
  .max_text_input {
130
- margin-top: 15px;
131
+ margin: 10px 0 0 10% !important;
131
132
  width: 45% !important;
132
- margin-left: 10%;
133
133
  }
134
134
 
135
135
  a.delete_link {
@@ -174,6 +174,10 @@ body.admin_areas {
174
174
 
175
175
  }
176
176
 
177
+ .blank_slate_container {
178
+ display: none !important;
179
+ }
180
+
177
181
  }
178
182
 
179
183
  &.show {
@@ -24,8 +24,9 @@ body.admin_pstats {
24
24
  height: 183px;
25
25
 
26
26
  &#coef {
27
- width: 25%;
27
+ width: 33%;
28
28
  text-align: center;
29
+ margin-bottom: 15px;
29
30
 
30
31
  p {
31
32
  width: 100%;
@@ -40,8 +41,7 @@ body.admin_pstats {
40
41
  }
41
42
 
42
43
  &#coef_sq {
43
- width: calc(25% - 30px);
44
- margin-left: 30px;
44
+ width: 33%;
45
45
  text-align: center;
46
46
 
47
47
  p {
@@ -57,8 +57,9 @@ body.admin_pstats {
57
57
  }
58
58
 
59
59
  &#text_stats, &#text_stats_sq {
60
- width: calc(25% - 30px);
60
+ width: calc(33% - 30px);
61
61
  margin-left: 30px;
62
+ margin-bottom: 15px;
62
63
 
63
64
  ul {
64
65
  padding: 0 5px;
@@ -70,16 +71,23 @@ body.admin_pstats {
70
71
 
71
72
  }
72
73
 
73
- &#graph {
74
- width: calc(100% - 200px - 200px - 30px - 30px);
75
- /*width: 100%;*/
76
- /*height: 200px;*/
77
- /*margin-top: 15px;*/
74
+ &#graph_radial {
75
+ width: calc(33% - 30px);
76
+ margin-left: 30px;
77
+ margin-bottom: 15px;
78
+ padding: 0;
78
79
 
80
+ -webkit-transition: opacity .2s ease-in;
81
+ -moz-transition: opacity .2s ease-in;
82
+ -ms-transition: opacity .2s ease-in;
83
+ -o-transition: opacity .2s ease-in;
84
+ transition: opacity .2s ease-in;
85
+ }
86
+
87
+ &#graph_radial_sq {
88
+ width: calc(33% - 30px);
79
89
  margin-left: 30px;
80
90
  padding: 0;
81
- display: none;
82
- opacity: 0;
83
91
 
84
92
  -webkit-transition: opacity .2s ease-in;
85
93
  -moz-transition: opacity .2s ease-in;
@@ -15,4 +15,9 @@
15
15
  > img {
16
16
  vertical-align: middle; /*!*/
17
17
  }
18
+ }
19
+
20
+ a.canvasjs-chart-credit {
21
+ display: none !important;
22
+ opacity: 0 !important;
18
23
  }
@@ -0,0 +1,38 @@
1
+ module C80Estate
2
+ class AjaxAreasController < ActionController::Base
3
+
4
+ def exel_import
5
+
6
+ is_ok = true
7
+ errs = {
8
+ "areas_exel" => [
9
+
10
+ ]
11
+ }
12
+
13
+ begin
14
+ @import_result = Area.import_excel(params[:file])
15
+ rescue => e
16
+ Rails.logger.debug "ERROR: #{e}"
17
+ errs["areas_exel"].push(e.to_s)
18
+ is_ok = false
19
+ end
20
+
21
+ # TODO:: Excel: реализовать вывод тех ошибок, которые возникли при импорте: например: таблица была импортирована за исключением таких-то полей
22
+
23
+ respond_to do |format|
24
+ if is_ok
25
+ format.js { render json: errs, status: :ok }
26
+ format.json
27
+ format.html
28
+ else
29
+ format.js { render json: errs, status: :unprocessable_entity }
30
+ format.json
31
+ format.html
32
+ end
33
+ end
34
+
35
+ end
36
+
37
+ end
38
+ end
@@ -5,50 +5,59 @@ module C80Estate
5
5
  # Rails.logger.debug "<render_table_prop_busy_coef> atype_id = #{atype_id}"
6
6
 
7
7
  props = Property.all
8
- list = []
9
-
10
- props.all.each do |prop|
11
- pp = Pstat.busy_coef(prop_id: prop.id, atype_id: atype_id)
12
- # Rails.logger.debug "<render_table_prop_busy_coef> pp = #{pp}"
13
- busy_coef = pp[:busy_coef]
14
- props = pp[:raw_props]
15
- list << {
16
- title: prop.title,
17
- busy_coef: busy_coef,
18
- props: props
19
- }
20
- # Rails.logger.debug "<render_table_prop_busy_coef> #{prop.title}"
21
- end
8
+ if props.count > 0
9
+ list = []
10
+
11
+ props.all.each do |prop|
12
+ pp = Pstat.busy_coef(prop_id: prop.id, atype_id: atype_id)
13
+ # Rails.logger.debug "<render_table_prop_busy_coef> pp = #{pp}"
14
+ busy_coef = pp[:busy_coef]
15
+ props = pp[:raw_props]
16
+ list << {
17
+ title: prop.title,
18
+ busy_coef: busy_coef,
19
+ props: props
20
+ }
21
+ # Rails.logger.debug "<render_table_prop_busy_coef> #{prop.title}"
22
+ end
22
23
 
23
- render :partial => 'c80_estate/shared/table_properties_coef_busy',
24
- :locals => {
25
- list: list
26
- }
24
+ render :partial => 'c80_estate/shared/table_properties_coef_busy',
25
+ :locals => {
26
+ list: list
27
+ }
28
+ end
27
29
  end
28
30
 
29
31
  def render_table_prop_busy_coef_sq(atype_id: nil)
30
- Rails.logger.debug "<render_table_prop_busy_coef_sq> atype_id = #{atype_id}"
32
+ # Rails.logger.debug "<render_table_prop_busy_coef_sq> atype_id = #{atype_id}"
31
33
 
32
34
  props = Property.all
33
- list = []
34
-
35
- props.all.each do |prop|
36
- pp = Pstat.busy_coef(prop_id: prop.id, atype_id: atype_id)
37
- # Rails.logger.debug "<render_table_prop_busy_coef> pp = #{pp}"
38
- busy_coef_sq = pp[:busy_coef_sq]
39
- props = pp[:raw_props_sq]
40
- list << {
41
- title: prop.title,
42
- busy_coef: busy_coef_sq,
43
- props: props
44
- }
45
- # Rails.logger.debug "<render_table_prop_busy_coef> #{prop.title}"
35
+
36
+ if props.count > 0
37
+ list = []
38
+
39
+ props.all.each do |prop|
40
+ pp = Pstat.busy_coef(prop_id: prop.id, atype_id: atype_id)
41
+ # Rails.logger.debug "<render_table_prop_busy_coef> pp = #{pp}"
42
+ busy_coef_sq = pp[:busy_coef_sq]
43
+ props = pp[:raw_props_sq]
44
+ list << {
45
+ title: prop.title,
46
+ busy_coef: busy_coef_sq,
47
+ props: props
48
+ }
49
+ # Rails.logger.debug "<render_table_prop_busy_coef> #{prop.title}"
50
+ end
51
+
52
+ render :partial => 'c80_estate/shared/table_properties_coef_busy_sq',
53
+ :locals => {
54
+ list: list
55
+ }
46
56
  end
57
+ end
47
58
 
48
- render :partial => 'c80_estate/shared/table_properties_coef_busy_sq',
49
- :locals => {
50
- list: list
51
- }
59
+ def render_upload_areas_excel_form
60
+ render :partial => 'c80_estate/shared/form_upload_areas_excel'
52
61
  end
53
62
 
54
63
  end
@@ -109,6 +109,69 @@ module C80Estate
109
109
  .where(c80_estate_item_props: {value: v})
110
110
  end
111
111
 
112
+ def self.import_excel(file)
113
+
114
+ Rails.logger.debug "------------------------------------------------------------- self.import [BEGIN] "
115
+
116
+ import_result = ''
117
+ spreadsheet = open_spreadsheet(file)
118
+ header = spreadsheet.row(1)
119
+
120
+ # Rails.logger.debug(header)
121
+ # ["title", "atype", "square", "price", "status"]
122
+
123
+ (2..spreadsheet.last_row).each do |i|
124
+
125
+ row = Hash[[header, spreadsheet.row(i)].transpose]
126
+
127
+ Rails.logger.debug("---------- #{row} -----------")
128
+ # {"title"=>"С2-1.18", "atype"=>"Торговое помещение", "square"=>"0", "price"=>800.0, "status"=>"Занята"}
129
+
130
+ # area_where = Area.where(:slug => row["ID"])
131
+ # if area_where.count > 0
132
+ #
133
+ # area = Area.where(:slug => row["ID"]).first
134
+ # puts "--- Обновляем данные для #{area.id}, #{area.slug}: "
135
+ # puts "--- Хотим вставить данные: " + row.to_hash.to_s
136
+ # area.price = row["Цена"]
137
+ # area.space = row["Площадь"]
138
+ # area.save
139
+ # puts "."
140
+ #
141
+ # else
142
+ # s = "В базе не найден павильон: #{row.to_hash}"
143
+ # import_result += s + "\n"
144
+ # puts s
145
+ #
146
+ # end
147
+ #
148
+ #
149
+
150
+ area = C80Estate::Area.create!({
151
+ title: row['title'],
152
+ property_id: row['property_id'].to_i,
153
+ atype_id: row['atype_id'].to_i,
154
+ owner_type: 'AdminUser',
155
+ owner_id: 2,
156
+ assigned_person_type: 'AdminUser',
157
+ assigned_person_id: 2
158
+ })
159
+
160
+ C80Estate::ItemProp.create!([
161
+ {value: row['price'].to_i, area_id: area.id, prop_name_id: 1},
162
+ {value: row['square'].to_f, area_id: area.id, prop_name_id: 9},
163
+ ])
164
+
165
+ area.astatuses << C80Estate::Astatus.find(row['astatus'].to_i)
166
+ area.save
167
+
168
+ end
169
+
170
+ puts "------------------------------------------------------------- self.import [END] "
171
+ import_result
172
+
173
+ end
174
+
112
175
  def atype_title
113
176
  res = "-"
114
177
  if atype.present?
@@ -165,6 +228,24 @@ module C80Estate
165
228
  res
166
229
  end
167
230
 
231
+ def price_value
232
+ res = '-'
233
+ p = item_props.where(:prop_name_id => 1)
234
+ if p.count > 0
235
+ res = p.first.value
236
+ end
237
+ res
238
+ end
239
+
240
+ def square_value
241
+ res = '-'
242
+ p = item_props.where(:prop_name_id => 9)
243
+ if p.count > 0
244
+ res = p.first.value
245
+ end
246
+ res
247
+ end
248
+
168
249
  ransacker :item_prop_price_val,
169
250
  formatter: proc { |price_range| # 10,156
170
251
  results = C80Estate::Area.where_price_range(price_range).map(&:id)
@@ -302,5 +383,18 @@ module C80Estate
302
383
 
303
384
  end
304
385
 
386
+ private
387
+
388
+ def self.open_spreadsheet(file)
389
+ case File.extname(file.original_filename)
390
+ when ".xls" then
391
+ Roo::Excel.new(file.path)
392
+ when ".xlsx" then
393
+ Roo::Excelx.new(file.path)
394
+ else
395
+ raise "Неизвестный формат файла: #{file.original_filename}"
396
+ end
397
+ end
398
+
305
399
  end
306
400
  end
@@ -8,8 +8,10 @@ module C80Estate
8
8
  before_save :before_save_format_value
9
9
 
10
10
  def self.all_uniq_values(prop_name_id)
11
- self.where(prop_name_id: prop_name_id)
12
- .map { |ip| ip.value }.uniq
11
+ r = self.where(prop_name_id: prop_name_id)
12
+ .map { |ip| ip.value.to_i }.uniq
13
+ # Rails.logger.debug("<ItemProp.all_uniq_values> #{prop_name_id}: #{r}")
14
+ r
13
15
  end
14
16
 
15
17
  private
@@ -74,7 +74,10 @@ module C80Estate
74
74
  def can_edit_area?(area)
75
75
  r1 = roles.where(role_type: 1)
76
76
  # mark_is_owner = area.owner.id == id
77
- mark_is_assigned = area.assigned_person.id == id
77
+ mark_is_assigned = false
78
+ if area.property.assigned_person.present?
79
+ mark_is_assigned = area.property.assigned_person.id == id
80
+ end
78
81
  r1.count > 0 || mark_is_assigned # || mark_is_owner
79
82
  # true
80
83
  end
@@ -83,7 +86,10 @@ module C80Estate
83
86
  def can_edit_property?(property)
84
87
  r1 = roles.where(role_type: 1)
85
88
  # mark_is_owner = property.owner.id == id
86
- mark_is_assigned = property.assigned_person.id == id
89
+ mark_is_assigned = false
90
+ if property.assigned_person.present?
91
+ mark_is_assigned = property.assigned_person.id == id
92
+ end
87
93
  r1.count > 0 || mark_is_assigned # || mark_is_owner
88
94
  # true
89
95
  end
@@ -23,6 +23,11 @@ module C80Estate
23
23
  # Rails.logger.debug "<Pstat.busy_coef> prop_id = #{prop_id}, atype_id = #{atype_id}"
24
24
  result = {}
25
25
 
26
+ # если нет событий - не считаем busy_coef
27
+ if self.all.count == 0
28
+ return result
29
+ end
30
+
26
31
  # обозначим диапазон фильтрации
27
32
  first_created_at = Time.at(self.first.created_at)
28
33
  time_now = Time.now
@@ -60,7 +65,6 @@ module C80Estate
60
65
 
61
66
  free_areas_atnow = tt[:sum_free_areas] #*1.0/all_props.count #pstats.last.free_areas
62
67
  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
68
 
65
69
  # защищаемся от деления на ноль
66
70
  if free_areas_atnow + busy_areas_atnow == 0
@@ -75,7 +79,7 @@ module C80Estate
75
79
 
76
80
  result[:busy_coef] = sprintf "%.2f%", bcoef
77
81
  result[:comment] = "<abbr title='Период рассчёта занятости'>C #{ddd} по #{ tcut[:used_end_date_str] }</abbr>"
78
- result[:abbr] = 'Показана занятость для ВСЕХ площадей ВСЕХ объектов недвижимости за указанный период'
82
+ result[:abbr] = 'Показана занятость для ВСЕХ площадей ВСЕХ объектов недвижимости в конце указанного периода'
79
83
  result[:props] = [
80
84
  {tag: 'all_areas_count', val: "Площадей всего: #{free_areas_atnow + busy_areas_atnow}"},
81
85
  {tag: 'free_areas_count', val: "Площадей свободно: #{free_areas_atnow}"},
@@ -85,7 +89,8 @@ module C80Estate
85
89
  result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
86
90
  result[:raw_props][:free_areas_count] = free_areas_atnow
87
91
  result[:raw_props][:busy_areas_atnow] = busy_areas_atnow
88
- result[:graph_dynamic] = graph_data
92
+ result[:graph_dynamic] = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
93
+ result[:graph_radial] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
89
94
 
90
95
  # Rails.logger.debug "<Pstat.busy_coef> busy_areas_count = #{ busy_areas_count }"
91
96
  # Rails.logger.debug "<Pstat.busy_coef> all_areas_count = #{ all_areas_count }"
@@ -95,7 +100,6 @@ module C80Estate
95
100
 
96
101
  free_areas_atnow_sq = pstats.where(:atype_id => nil).last.free_areas_sq
97
102
  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
103
 
100
104
  # защищаемся от деления на ноль
101
105
  if busy_areas_atnow_sq + free_areas_atnow_sq == 0
@@ -106,7 +110,7 @@ module C80Estate
106
110
 
107
111
  result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
108
112
  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 - всего МЕТРОВ КВ'
113
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ в конце указанного периода: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
110
114
  result[:props_sq] = [
111
115
  {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
112
116
  {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
@@ -116,7 +120,8 @@ module C80Estate
116
120
  result[:raw_props_sq][:all_areas_count_sq] = free_areas_atnow_sq + busy_areas_atnow_sq
117
121
  result[:raw_props_sq][:free_areas_count_sq] = free_areas_atnow_sq
118
122
  result[:raw_props_sq][:busy_areas_atnow_sq] = busy_areas_atnow_sq
119
- result[:graph_dynamic_sq] = graph_data_sq
123
+ result[:graph_dynamic_sq] = _parse_for_js_dynamic_graph3_canvasjs(pstats.where(:atype_id => nil).ordered_by_created_at)
124
+ result[:graph_radial_sq] = _parse_for_js_radial_graph_sq(free_areas_atnow_sq, busy_areas_atnow_sq)
120
125
 
121
126
  # common
122
127
 
@@ -218,7 +223,9 @@ module C80Estate
218
223
 
219
224
  result[:busy_coef] = sprintf "%.2f%", bcoef
220
225
  result[:comment] = "<abbr title='Период рассчёта занятости'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
221
- result[:abbr] = 'Занятость объекта за указанный период: число b/N, где b - кол-во свободных, N - всего площадей'
226
+ result[:abbr] = 'Занятость объекта в конце указанного периода: число b/N, где b - кол-во свободных, N - всего площадей'
227
+ result[:graph_radial] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
228
+ result[:graph_dynamic] = graph_data
222
229
 
223
230
  result[:raw_props] = {}
224
231
  result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
@@ -246,7 +253,10 @@ module C80Estate
246
253
 
247
254
  result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
248
255
  result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
249
- result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
256
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ в конце указанного периода: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
257
+ result[:graph_dynamic_sq] = graph_data_sq
258
+ result[:graph_radial_sq] = _parse_for_js_radial_graph_sq(free_areas_atnow_sq,busy_areas_atnow_sq)
259
+
250
260
  result[:props_sq] = [
251
261
  {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
252
262
  {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
@@ -262,8 +272,7 @@ module C80Estate
262
272
 
263
273
  result[:title] = "Статистика - Объект - #{property.title}"
264
274
  # 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
275
+
267
276
 
268
277
  # if atype_id.present?
269
278
  # result[:title] += " (#{Atype.find(atype_id).title})"
@@ -352,7 +361,6 @@ module C80Estate
352
361
 
353
362
  free_areas_atnow = tt[:sum_free_areas] #*1.0/all_props.count #pstats.last.free_areas
354
363
  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
364
 
357
365
  # Rails.logger.debug("\t\t atype_id = #{atype_id}")
358
366
  # Rails.logger.debug("\t\t free_areas_atnow = #{free_areas_atnow}")
@@ -367,7 +375,9 @@ module C80Estate
367
375
 
368
376
  result[:busy_coef] = sprintf "%.2f%", bcoef
369
377
  result[:comment] = "<abbr title='Период рассчёта занятости'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
370
- result[:abbr] = 'Занятость объекта за указанный период: число b/N, где b - кол-во свободных, N - всего площадей'
378
+ result[:abbr] = 'Занятость объекта в конце указанного периода: число b/N, где b - кол-во свободных, N - всего площадей'
379
+ result[:graph_dynamic] = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
380
+ result[:graph_radial] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
371
381
 
372
382
  result[:raw_props] = {}
373
383
  result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
@@ -389,7 +399,10 @@ module C80Estate
389
399
 
390
400
  result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
391
401
  result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
392
- result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
402
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ в конце указанного периода: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
403
+ result[:graph_dynamic_sq] = graph_data_sq
404
+ result[:graph_radial_sq] = _parse_for_js_radial_graph_sq(free_areas_atnow_sq,busy_areas_atnow_sq)
405
+
393
406
  result[:props_sq] = [
394
407
  {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
395
408
  {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
@@ -404,9 +417,6 @@ module C80Estate
404
417
  # common
405
418
 
406
419
  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
420
 
411
421
  # if atype_id.present?
412
422
  # result[:title] += " (#{Atype.find(atype_id).title})"
@@ -504,24 +514,30 @@ module C80Estate
504
514
  end
505
515
 
506
516
  def self._parse_for_js_radial_graph(free_areas_atnow, busy_areas_atnow)
507
- # res = [
508
- # ['Year', 'Sales', 'Expenses'],
509
- # ['2013', 1000, 400],
510
- # ['2014', 1170, 460],
511
- # ['2015', 660, 1120],
512
- # ['2016/12/12', 1030, 540]
513
- #
514
- # ]
515
- # [
516
- # ['', ''],
517
- # ['Свободно', 11],
518
- # ['Занято', 2]
519
- # ]
517
+ # data:
518
+ # [
519
+ # { y: 6, legendText:"", label: "Площадей свободно" },
520
+ # { y: 4, legendText:"", label: "Площадей занято" }
521
+ # ]
522
+
523
+ res = []
524
+ res << {label: 'Площадей свободно', y: free_areas_atnow, legendText: ''}
525
+ res << {label: 'Площадей занято', y: busy_areas_atnow, legendText: ''}
526
+ # Rails.logger.debug "<_parse_for_js_radial_graph> res: #{res}"
527
+ res
528
+
529
+ end
520
530
 
521
- res = [['', '']]
522
- res << ['Свободно', free_areas_atnow]
523
- res << ['Занято', busy_areas_atnow]
524
- Rails.logger.debug "<_parse_for_js_radial_graph> res: #{res}"
531
+ def self._parse_for_js_radial_graph_sq(free_areas_atnow_sq, busy_areas_atnow_sq)
532
+ # data:
533
+ # [
534
+ # { y: 6, legendText:"", label: "Метров свободно" },
535
+ # { y: 4, legendText:"", label: "Метров занято" }
536
+ # ]
537
+
538
+ res = []
539
+ res << {label: 'Метров свободно', y: free_areas_atnow_sq, legendText: ''}
540
+ res << {label: 'Метров занято', y: busy_areas_atnow_sq, legendText: ''}
525
541
  res
526
542
 
527
543
  end
@@ -665,8 +681,10 @@ module C80Estate
665
681
  all_props = Property.all
666
682
  all_props.each do |prop|
667
683
  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
684
+ if ppstats.present?
685
+ sum_free_areas += ppstats.free_areas
686
+ sum_busy_areas += ppstats.busy_areas
687
+ end
670
688
  end
671
689
  {
672
690
  sum_free_areas:sum_free_areas,