app/models/c80_estate/pstat.rb in c80_estate-0.1.0.3 vs app/models/c80_estate/pstat.rb in c80_estate-0.1.0.4
- old
+ new
@@ -8,47 +8,123 @@
# nil, если это запись с общими данными, а не astatus related запись
# (добавлена только для того, чтобы можно было :dependend => :destroy)
belongs_to :parent, :class_name => 'C80Estate::Pstat'
has_many :pstats, :foreign_key => 'parent_id', :dependent => :destroy
+ scope :ordered_by_created_at, -> { order(created_at: :asc) }
+
# рассчитаем коэф-ты занятости
before_create :calc_busy_coefs
# сгенерим atype related записи
after_create :generate_atype_pstats
def self.busy_coef(prop_id: nil, atype_id: nil, start_date: nil, end_date: nil)
# start_date: строка вида 2015-12-12
-
+ # Rails.logger.debug "<Pstat.busy_coef> prop_id = #{prop_id}, atype_id = #{atype_id}"
result = {}
+ # обозначим диапазон фильтрации
+ first_created_at = Time.at(self.first.created_at)
+ time_now = Time.now
+
# если ничего не подано - просто выберем все занятые площади и поделим на все известные площади
- if prop_id.nil? && atype_id.nil? && start_date.nil? && end_date.nil?
+ if prop_id.nil? && atype_id.nil?
- all_areas_count = Area.all.count
- free_areas_count = Area.free_areas.count
- busy_areas_count = Area.busy_areas.count
+ # prepare
+ tcut = _calc_time_cut(first_created_at, time_now, start_date, end_date)
+
ddd = '-'
if self.count > 0
- ddd = Time.at(self.first.created_at).strftime('%Y/%m/%d')
+ ddd = tcut[:used_start_date_str] #Time.at(self.first.created_at).strftime('%Y/%m/%d')
end
- result[:busy_coef] = sprintf "%.2f%", busy_areas_count*1.0/all_areas_count*100.0
- result[:comment] = "<abbr title='Период рассчёта занятости: с момента самого первого известного события до текущего дня'>C #{ddd} по #{Time.now.year}/#{sprintf "%02d", Time.now.month}/#{sprintf "%02d", Time.now.day}</abbr>"
- result[:abbr] = 'Показана занятость для всех площадей всех объектов недвижимости за весь период'
- result[:title] = 'Статистика - Все объекты недвижимости'
+ pstats = self.where("created_at BETWEEN ? AND ?", tcut[:used_start_date], tcut[:used_end_date])
+ .where(:atype_id => nil)
+
+ # если в этот промежуток небыло событий - значит промежуток целиком попал в какое-то событие
+ # найдем его
+ # заодно поднимем вспомогательный флаг, который обработаем во view
+ mark_whole = false
+ if pstats.count == 0
+ pstats = [self.where(:atype_id => nil).where("created_at < ?", tcut[:used_start_date]).last]
+ mark_whole = true
+ # sevents.each do |se|
+ # Rails.logger.debug "\t\t\t #{used_start_date - se.created_at}"
+ # end
+ end
+
+ # Занятость
+
+ tt = _calc_free_busy_areas(pstats)
+
+ free_areas_atnow = tt[:sum_free_areas] #*1.0/all_props.count #pstats.last.free_areas
+ busy_areas_atnow = tt[:sum_busy_areas] #*1.0/all_props.count #pstats.last.busy_areas
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
+
+ # защищаемся от деления на ноль
+ if free_areas_atnow + busy_areas_atnow == 0
+ bcoef = 0.0
+ else
+ bcoef = busy_areas_atnow*1.0 / (free_areas_atnow + busy_areas_atnow) * 100.0
+ end
+
+ # all_areas_count = Area.all.count
+ # free_areas_count = Area.free_areas.count
+ # busy_areas_count = Area.busy_areas.count
+
+ result[:busy_coef] = sprintf "%.2f%", bcoef
+ result[:comment] = "<abbr title='Период рассчёта занятости'>C #{ddd} по #{ tcut[:used_end_date_str] }</abbr>"
+ result[:abbr] = 'Показана занятость для ВСЕХ площадей ВСЕХ объектов недвижимости за указанный период'
result[:props] = [
- {tag: 'all_areas_count', val: "Площадей всего: #{all_areas_count}"},
- {tag: 'free_areas_count', val: "Площадей свободно: #{free_areas_count}"},
- {tag: 'busy_areas_count', val: "Площадей занято: #{busy_areas_count}"}
+ {tag: 'all_areas_count', val: "Площадей всего: #{free_areas_atnow + busy_areas_atnow}"},
+ {tag: 'free_areas_count', val: "Площадей свободно: #{free_areas_atnow}"},
+ {tag: 'busy_areas_count', val: "Площадей занято: #{busy_areas_atnow}"}
]
+ result[:raw_props] = {}
+ result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
+ result[:raw_props][:free_areas_count] = free_areas_atnow
+ result[:raw_props][:busy_areas_atnow] = busy_areas_atnow
+ result[:graph_dynamic] = graph_data
- Rails.logger.debug "<Pstat.busy_coef> busy_areas_count = #{ busy_areas_count }"
- Rails.logger.debug "<Pstat.busy_coef> all_areas_count = #{ all_areas_count }"
- Rails.logger.debug "<Pstat.busy_coef> result[:busy_coef] = #{ result[:busy_coef] }"
+ # Rails.logger.debug "<Pstat.busy_coef> busy_areas_count = #{ busy_areas_count }"
+ # Rails.logger.debug "<Pstat.busy_coef> all_areas_count = #{ all_areas_count }"
+ # Rails.logger.debug "<Pstat.busy_coef> result[:busy_coef] = #{ result[:busy_coef] }"
+ # Занятость в метрах
+
+ free_areas_atnow_sq = pstats.where(:atype_id => nil).last.free_areas_sq
+ busy_areas_atnow_sq = pstats.where(:atype_id => nil).last.busy_areas_sq
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.where(:atype_id => nil).ordered_by_created_at)
+
+ # защищаемся от деления на ноль
+ if busy_areas_atnow_sq + free_areas_atnow_sq == 0
+ bcoef_sq = 0.0
+ else
+ bcoef_sq = busy_areas_atnow_sq*1.0/(busy_areas_atnow_sq + free_areas_atnow_sq)*100.0
+ end
+
+ result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
+ result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{tcut[:used_start_date_str]} по #{tcut[:used_end_date_str]}</abbr>"
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
+ result[:props_sq] = [
+ {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
+ {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
+ {tag: 'busy_areas_count_sq', val: "Занятых: #{busy_areas_atnow_sq}"}
+ ]
+ result[:raw_props_sq] = {}
+ result[:raw_props_sq][:all_areas_count_sq] = free_areas_atnow_sq + busy_areas_atnow_sq
+ result[:raw_props_sq][:free_areas_count_sq] = free_areas_atnow_sq
+ result[:raw_props_sq][:busy_areas_atnow_sq] = busy_areas_atnow_sq
+ result[:graph_dynamic_sq] = graph_data_sq
+
+ # common
+
+ result[:title] = 'Статистика - Все объекты недвижимости'
+ # Rails.logger.debug "result ============= #{result}"
+
# если фильтруем по property
elsif prop_id.present?
# фиксируем property
property = Property.find(prop_id)
@@ -113,37 +189,83 @@
# sevents.each do |se|
# Rails.logger.debug "\t\t\t #{used_start_date - se.created_at}"
# end
end
+ # Занятость -----
+
# если сортируем по типу, то берём последнюю запись,
# иначе - берём последнюю запись с общими данными
if atype_id.nil?
free_areas_atnow = pstats.where(:atype_id => nil).last.free_areas
busy_areas_atnow = pstats.where(:atype_id => nil).last.busy_areas
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.where(:atype_id => nil).ordered_by_created_at)
else
free_areas_atnow = pstats.last.free_areas
busy_areas_atnow = pstats.last.busy_areas
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
end
- Rails.logger.debug("\t\t atype_id = #{atype_id}")
- Rails.logger.debug("\t\t free_areas_atnow = #{free_areas_atnow}")
- Rails.logger.debug("\t\t busy_areas_atnow = #{busy_areas_atnow}")
+ # Rails.logger.debug("\t\t atype_id = #{atype_id}")
+ # Rails.logger.debug("\t\t free_areas_atnow = #{free_areas_atnow}")
+ # Rails.logger.debug("\t\t busy_areas_atnow = #{busy_areas_atnow}")
# защищаемся от деления на ноль
if free_areas_atnow + busy_areas_atnow == 0
bcoef = 0.0
else
bcoef = busy_areas_atnow*1.0 / (free_areas_atnow + busy_areas_atnow) * 100.0
end
result[:busy_coef] = sprintf "%.2f%", bcoef
result[:comment] = "<abbr title='Период рассчёта занятости'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
- result[:abbr] = 'Занятость объекта за указанный период'
+ result[:abbr] = 'Занятость объекта за указанный период: число b/N, где b - кол-во свободных, N - всего площадей'
+
+ result[:raw_props] = {}
+ result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
+ result[:raw_props][:free_areas_count] = free_areas_atnow
+ result[:raw_props][:busy_areas_atnow] = busy_areas_atnow
+
+ # Занятость в метрах ------
+
+ if atype_id.nil?
+ free_areas_atnow_sq = pstats.where(:atype_id => nil).last.free_areas_sq
+ busy_areas_atnow_sq = pstats.where(:atype_id => nil).last.busy_areas_sq
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.where(:atype_id => nil).ordered_by_created_at)
+ else
+ free_areas_atnow_sq = pstats.last.free_areas_sq
+ busy_areas_atnow_sq = pstats.last.busy_areas_sq
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.ordered_by_created_at)
+ end
+
+ # защищаемся от деления на ноль
+ if busy_areas_atnow_sq + free_areas_atnow_sq == 0
+ bcoef_sq = 0.0
+ else
+ bcoef_sq = busy_areas_atnow_sq*1.0/(busy_areas_atnow_sq + free_areas_atnow_sq)*100.0
+ end
+
+ result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
+ result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
+ result[:props_sq] = [
+ {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
+ {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
+ {tag: 'busy_areas_count_sq', val: "Занятых: #{busy_areas_atnow_sq}"}
+ ]
+
+ result[:raw_props_sq] = {}
+ result[:raw_props_sq][:all_areas_count_sq] = free_areas_atnow_sq + busy_areas_atnow_sq
+ result[:raw_props_sq][:free_areas_count_sq] = free_areas_atnow_sq
+ result[:raw_props_sq][:busy_areas_atnow_sq] = busy_areas_atnow_sq
+
+ # common
+
result[:title] = "Статистика - Объект - #{property.title}"
- result[:graph] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
- result[:graph_dynamic] = _parse_for_js_dynamic_graph(pstats)
+ # result[:graph] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
+ result[:graph_dynamic] = graph_data
+ result[:graph_dynamic_sq] = graph_data_sq
# if atype_id.present?
# result[:title] += " (#{Atype.find(atype_id).title})"
# end
@@ -165,10 +287,146 @@
else
result[:props] = [
{tag: 'title', val: "#{property.title} не имеет площадей"}
]
end
+
+ elsif atype_id.present?
+
+ # обозначим диапазон фильтрации
+ first_created_at = Time.at(self.first.created_at)
+ time_now = Time.now
+
+ # если подана нижняя граница диапазона и она позже, чем время создания самой первой площади объекта,
+ # выравниваем период рассчета коэф-та по этой нижней границе диапазона
+ if start_date.present?
+ start_date_tt = Time.parse(start_date)
+ if start_date_tt > first_created_at
+ used_start_date = start_date_tt
+ # Rails.logger.debug("start_date: используем аргумент: #{start_date_tt}")
+ else
+ used_start_date = first_created_at
+ # Rails.logger.debug("start_date: используем время рождения Площади: #{area_created_at}")
+ end
+ else
+ used_start_date = first_created_at
+ # Rails.logger.debug("start_date: используем время рождения Площади: #{area_created_at}")
+ end
+ used_start_date_str = used_start_date.strftime('%Y/%m/%d')
+
+ if end_date.present?
+ end_date_tt = Time.parse(end_date)
+ if end_date < time_now
+ used_end_date = end_date_tt
+ # Rails.logger.debug("end_date: используем аргумент: #{end_date_tt}")
+ else
+ used_end_date = time_now
+ # Rails.logger.debug("end_date: используем текущее время")
+ end
+ else
+ used_end_date = time_now
+ # Rails.logger.debug("end_date: используем текущее время")
+ end
+ used_end_date_str = used_end_date.strftime('%Y/%m/%d')
+
+ # Rails.logger.debug("start_date = #{start_date}; end_date = #{end_date}; used_start_date = #{used_start_date}; used_end_date = #{used_end_date}")
+ # sevents = self.where(:area_id => area_id).where(:created_at => used_start_date..used_end_date)
+ pstats = self.where(:atype_id => atype_id)
+ .where("created_at BETWEEN ? AND ?", used_start_date, used_end_date)
+
+
+ # если в этот промежуток небыло событий - значит промежуток целиком попал в какое-то событие
+ # найдем его
+ # заодно поднимем вспомогательный флаг, который обработаем во view
+ mark_whole = false
+ if pstats.count == 0
+ pstats = [self.where(:atype_id => atype_id).where("created_at < ?", used_start_date).last]
+ mark_whole = true
+ # sevents.each do |se|
+ # Rails.logger.debug "\t\t\t #{used_start_date - se.created_at}"
+ # end
+ end
+
+ # Занятость
+
+ tt = _calc_free_busy_areas(pstats)
+
+ free_areas_atnow = tt[:sum_free_areas] #*1.0/all_props.count #pstats.last.free_areas
+ busy_areas_atnow = tt[:sum_busy_areas] #*1.0/all_props.count #pstats.last.busy_areas
+ graph_data = _parse_for_js_dynamic_graph_canvasjs(pstats.ordered_by_created_at)
+
+ # Rails.logger.debug("\t\t atype_id = #{atype_id}")
+ # Rails.logger.debug("\t\t free_areas_atnow = #{free_areas_atnow}")
+ # Rails.logger.debug("\t\t busy_areas_atnow = #{busy_areas_atnow}")
+
+ # защищаемся от деления на ноль
+ if free_areas_atnow + busy_areas_atnow == 0
+ bcoef = 0.0
+ else
+ bcoef = busy_areas_atnow*1.0 / (free_areas_atnow + busy_areas_atnow) * 100.0
+ end
+
+ result[:busy_coef] = sprintf "%.2f%", bcoef
+ result[:comment] = "<abbr title='Период рассчёта занятости'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
+ result[:abbr] = 'Занятость объекта за указанный период: число b/N, где b - кол-во свободных, N - всего площадей'
+
+ result[:raw_props] = {}
+ result[:raw_props][:all_areas_count] = free_areas_atnow + busy_areas_atnow
+ result[:raw_props][:free_areas_count] = free_areas_atnow
+ result[:raw_props][:busy_areas_atnow] = busy_areas_atnow
+
+ # Занятость в метрах
+
+ free_areas_atnow_sq = pstats.last.free_areas_sq
+ busy_areas_atnow_sq = pstats.last.busy_areas_sq
+ graph_data_sq = _parse_for_js_dynamic_graph3_canvasjs(pstats.ordered_by_created_at)
+
+ # защищаемся от деления на ноль
+ if busy_areas_atnow_sq + free_areas_atnow_sq == 0
+ bcoef_sq = 0.0
+ else
+ bcoef_sq = busy_areas_atnow_sq*1.0/(busy_areas_atnow_sq + free_areas_atnow_sq)*100.0
+ end
+
+ result[:busy_coef_sq] = sprintf "%.2f%", bcoef_sq
+ result[:comment_sq] = "<abbr title='Период рассчёта занятости в МЕТРАХ КВ'>C #{used_start_date_str} по #{used_end_date_str}</abbr>"
+ result[:abbr_sq] = 'Занятость объекта в МЕТРАХ за указанный период: число b/N, где b - кол-во свободных МЕТРОВ, N - всего МЕТРОВ КВ'
+ result[:props_sq] = [
+ {tag: 'all_areas_count_sq', val: "Кв.м. всего: #{busy_areas_atnow_sq + free_areas_atnow_sq}"},
+ {tag: 'free_areas_count_sq', val: "Свободных: #{free_areas_atnow_sq}"},
+ {tag: 'busy_areas_count_sq', val: "Занятых: #{busy_areas_atnow_sq}"}
+ ]
+
+ result[:raw_props_sq] = {}
+ result[:raw_props_sq][:all_areas_count_sq] = free_areas_atnow_sq + busy_areas_atnow_sq
+ result[:raw_props_sq][:free_areas_count_sq] = free_areas_atnow_sq
+ result[:raw_props_sq][:busy_areas_atnow_sq] = busy_areas_atnow_sq
+
+ # common
+
+ result[:title] = "Статистика - Объекты - Фильтр по типу площади '#{ Atype.find(atype_id).title }'"
+ # result[:graph] = _parse_for_js_radial_graph(free_areas_atnow,busy_areas_atnow)
+ result[:graph_dynamic] = graph_data
+ result[:graph_dynamic_sq] = graph_data_sq
+
+ # if atype_id.present?
+ # result[:title] += " (#{Atype.find(atype_id).title})"
+ # end
+
+ dc_str = self.first.created_at.in_time_zone('Moscow').strftime('%Y/%m/%d')
+ dc_abbr = 'За дату создания объекта недвижимости при рассчетах берётся дата создания первой площади объекта'
+
+ result[:props] = [
+ {tag: 'title', val: "Фильтр по типу площади: #{ Atype.find(atype_id).title }"},
+ # {tag: 'born_date', val: "<abbr title='#{dc_abbr}'>Дата создания: #{dc_str}"},
+ {tag: 'all_areas_count', val: "<abbr title='В конце указанного периода'>Площадей всего</abbr>: #{ free_areas_atnow + busy_areas_atnow }"},
+ {tag: 'free_areas_count', val: "<abbr title='В конце указанного периода'>Свободных площадей</abbr>: #{ free_areas_atnow }"},
+ {tag: 'busy_areas_count', val: "<abbr title='В конце указанного периода'>Занятых площадей</abbr>: #{ busy_areas_atnow }"}
+ ]
+
+ # Rails.logger.debug "result ============= #{result}"
+
end
result
end
@@ -198,25 +456,25 @@
# здесь считаем коэф-ты только для `записей с общими данными`
if self.atype.nil?
self.free_areas = self.property.areas.free_areas.count
self.busy_areas = self.property.areas.busy_areas.count
- self.coef_busy = self.busy_areas / (self.free_areas + self.busy_areas) * 100
+ self.coef_busy = self.busy_areas*1.0 / (self.free_areas + self.busy_areas) * 100.0
self.free_areas_sq = self.property.areas.free_areas_sq
self.busy_areas_sq = self.property.areas.busy_areas_sq
- self.coef_busy_sq = self.busy_areas_sq / (self.free_areas_sq + self.busy_areas_sq) * 100
+ self.coef_busy_sq = self.busy_areas_sq*1.0 / (self.free_areas_sq + self.busy_areas_sq) * 100.0
- # здесь считаем коэф-ты для 'atype related записей'
+ # здесь считаем коэф-ты для 'atype related записей'
else
self.free_areas = self.property.areas.where(:atype_id => self.atype.id).free_areas.count
self.busy_areas = self.property.areas.where(:atype_id => self.atype.id).busy_areas.count
- self.coef_busy = (self.free_areas + self.busy_areas == 0) ? 0:self.busy_areas / (self.free_areas + self.busy_areas) * 100
+ self.coef_busy = (self.free_areas + self.busy_areas == 0) ? 0 : self.busy_areas*1.0 / (self.free_areas + self.busy_areas) * 100.0
self.free_areas_sq = self.property.areas.where(:atype_id => self.atype.id).free_areas_sq
self.busy_areas_sq = self.property.areas.where(:atype_id => self.atype.id).busy_areas_sq
- 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
+ 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
end
end
end
# Когда создаётся `запись с общими данными` в таблице 'pstats', автоматически
@@ -258,32 +516,163 @@
# ['', ''],
# ['Свободно', 11],
# ['Занято', 2]
# ]
- res = [['','']]
+ res = [['', '']]
res << ['Свободно', free_areas_atnow]
res << ['Занято', busy_areas_atnow]
Rails.logger.debug "<_parse_for_js_radial_graph> res: #{res}"
res
end
- def self._parse_for_js_dynamic_graph(pstats)
+ def self._parse_for_js_dynamic_graph_chartjs(pstats)
+
+ # res = {
+ # labels: ['2016/12/22',...]
+ # points: [12,13,...]
+ # }
+
+ res = {
+ labels: [],
+ points: []
+ }
+ pstats.each do |pstat|
+ label = pstat.created_at.strftime('%Y/%m/%d')
+ point = pstat.coef_busy
+ res[:labels] << label
+ res[:points] << point
+ Rails.logger.debug "<_parse_for_js_dynamic_graph_chartjs> label = #{label}, point = #{point}"
+ end
+ res
+
+ end
+
+ def self._parse_for_js_dynamic_graph_google_charts(pstats)
# res = [
# ['Year', 'Sales', 'Expenses'],
# ['2013', 1000, 400],
# ['2014', 1170, 460],
# ['2015', 660, 1120],
# ['2016/12/12', 1030, 540]
# ]
res = []
pstats.each do |pstat|
- res << [ pstat.created_at.strftime('%Y/%m/%d'), pstat.coef_busy ]
+ res << [pstat.created_at.strftime('%Y/%m/%d'), pstat.coef_busy]
end
res
+ end
+
+ def self._parse_for_js_dynamic_graph_canvasjs(pstats)
+ # res: [
+ # {
+ # year
+ # month
+ # day
+ # val
+ # }
+ # ]
+
+ res = []
+
+ pstats.each do |pstat|
+
+ res << {
+ year: pstat.created_at.strftime('%Y'),
+ month: pstat.created_at.strftime('%m').to_i-1,
+ day: pstat.created_at.strftime('%d'),
+ val: pstat.coef_busy
+ }
+
+ end
+
+ Rails.logger.debug "<Pstat.parse_for_js_graph> res = #{res}"
+ res
+ end
+
+ def self._parse_for_js_dynamic_graph3_canvasjs(pstats)
+ # res: [
+ # {
+ # year
+ # month
+ # day
+ # val
+ # }
+ # ]
+
+ res = []
+
+ pstats.each do |pstat|
+
+ res << {
+ year: pstat.created_at.strftime('%Y'),
+ month: pstat.created_at.strftime('%m').to_i-1,
+ day: pstat.created_at.strftime('%d'),
+ val: pstat.coef_busy_sq
+ }
+ end
+ res
+ end
+
+ def self._calc_time_cut(first_created_at, time_now, start_date, end_date)
+
+ # если подана нижняя граница диапазона и она позже, чем время создания самой первой площади объекта,
+ # выравниваем период рассчета коэф-та по этой нижней границе диапазона
+ if start_date.present?
+ start_date_tt = Time.parse(start_date)
+ if start_date_tt > first_created_at
+ used_start_date = start_date_tt
+ # Rails.logger.debug("1: start_date: используем аргумент: #{start_date_tt} (first_created_at = #{first_created_at})")
+ else
+ used_start_date = first_created_at
+ # Rails.logger.debug("2: start_date: используем first_created_at: #{first_created_at}")
+ end
+ else
+ used_start_date = first_created_at
+ # Rails.logger.debug("3: start_date: используем first_created_at: #{first_created_at} (start_date = #{start_date})")
+ end
+ used_start_date_str = used_start_date.strftime('%Y/%m/%d')
+
+ if end_date.present?
+ end_date_tt = Time.parse(end_date)
+ if end_date < time_now
+ used_end_date = end_date_tt
+ # Rails.logger.debug("end_date: используем аргумент: #{end_date_tt}")
+ else
+ used_end_date = time_now
+ # Rails.logger.debug("end_date: используем текущее время")
+ end
+ else
+ used_end_date = time_now
+ # Rails.logger.debug("end_date: используем текущее время")
+ end
+ used_end_date_str = used_end_date.strftime('%Y/%m/%d')
+
+ {
+ used_start_date: used_start_date,
+ used_start_date_str: used_start_date_str,
+ used_end_date: used_end_date,
+ used_end_date_str: used_end_date_str
+ }
+
+ end
+
+ def self._calc_free_busy_areas(pstats)
+ sum_free_areas = 0
+ sum_busy_areas = 0
+ all_props = Property.all
+ all_props.each do |prop|
+ ppstats = pstats.where(:property_id => prop.id).ordered_by_created_at.last
+ sum_free_areas += ppstats.free_areas
+ sum_busy_areas += ppstats.busy_areas
+ end
+ {
+ sum_free_areas:sum_free_areas,
+ sum_busy_areas:sum_busy_areas
+ }
end
end
end
\ No newline at end of file