app/models/c80_estate/area.rb in c80_estate-0.1.0.35 vs app/models/c80_estate/area.rb in c80_estate-0.1.0.36
- old
+ new
@@ -30,10 +30,13 @@
validates :property, :presence => true
validates :atype, :presence => true
validate :has_astatus?
after_create :create_initial_sevent
+ after_update :calc_square_value
+ after_update :calc_price_value
+ after_update :calc_power_price_value
after_update :check_and_remove_item_props, :if => :atype_id_changed?
after_update :check_and_generate_sevent
def self.all_areas
self.all
@@ -317,65 +320,10 @@
if last_updater.present?
last_updater.email
end
end
- # выдать цену за м.кв. в месяц
- # TODO_MY:: добавить модели Area столбец price_value и before_update метод, который высчитывал бы значение
- def price_value
-
- res = 0.0
- mark_use_usual_price = false
-
- # если указана "цена за площадь",
- # то цену за м кв. в месяц высчитываем
- pa = item_props.where(:prop_name_id => 14)
- if pa.count > 0
- pa_val = pa.first.value.to_f
-
- if pa_val == 0
- # если руками было проставлено 0 - т.е. свойство как бы было удалено, выключено
- mark_use_usual_price = true
- else
- if square_value != 0
- # результат получаем только тогда, когда указана площадь и когда указана цена за площадь
- res = pa_val / square_value
- else
- # если не указана площадь - то берём обычную цену
- mark_use_usual_price = true
- end
- end
- else
- mark_use_usual_price = true
- end
-
- if mark_use_usual_price
- p = item_props.where(:prop_name_id => 1)
- if p.count > 0
- res = p.first.value.to_f
- end
- end
-
- res
- end
-
- # TODO_MY:: добавить модели Area столбец square_value и before_update метод, который высчитывал бы значение
- def square_value
- res = 0.0
- p = item_props.where(:prop_name_id => 9)
- if p.count > 0
- res = p.first.value.to_f
- end
- Rails.logger.debug "<Area.square_value> res = #{res}"
- res
- end
-
- # TODO_MY:: добавить модели Area столбец power_price_value и before_update метод, который высчитывал бы значение
- def power_price_value
- price_value * 1.0 * square_value
- end
-
def main_image_url
url = "no_thumb_#{atype.id}.jpg"
if aphotos.count > 0
url = aphotos.first.image.thumb512
@@ -394,10 +342,35 @@
end
end
res
end
+ # метод добавлен для того, чтобы можно было из консоли дёрнуть его и обновить поле с ценой
+ # сначала считаем площадь, затем цену (иначе, цена не посчитается)
+ def recalc_price
+ calc_price_value
+ end
+
+ # метод добавлен для того, чтобы можно было из консоли дёрнуть его и обновить поле с площадью
+ # сначала считаем площадь, затем цену (иначе, цена не посчитается)
+ def recalc_square
+ calc_square_value
+ end
+
+ # метод добавлен для того, чтобы можно было из консоли дёрнуть его и обновить поле с ценой за площадь
+ def recalc_power_price_value
+ calc_power_price_value
+ end
+
+ # перерассчитать все рассчитываемые переменные
+ # сначала считаем площадь, затем цену (иначе, цена не посчитается)
+ def recalc_all
+ recalc_square
+ recalc_price
+ recalc_power_price_value
+ end
+
ransacker :item_prop_price_val,
formatter: proc { |price_range| # 10,156
results = C80Estate::Area.where_price_range(price_range).map(&:id)
results = results.present? ? results : nil
}, splat_params: true do |parent|
@@ -490,14 +463,14 @@
last_known_sevent = self.sevents.last.astatus.tag
end
# если статус этого события отличен
# от нового статуса - генерим события
- Rails.logger.debug "<Area.check_and_generate_sevent> last_known_sevent = #{last_known_sevent}, self.astatuses.first.tag = #{self.astatuses.first.tag}"
+ Rails.logger.debug "[TRACE] <Area.check_and_generate_sevent> last_known_sevent = #{last_known_sevent}, self.astatuses.first.tag = #{self.astatuses.first.tag}"
if last_known_sevent != self.astatuses.first.tag
- Rails.logger.debug "<Area.check_and_generate_sevent> [STATUS_CHANGED] self.last_updater_id = #{self.last_updater_id}"
+ Rails.logger.debug "[TRACE] <Area.check_and_generate_sevent> [STATUS_CHANGED] self.last_updater_id = #{self.last_updater_id}"
sparams = {
area_id: self.id,
atype_id: self.atype_id,
property_id: self.property_id,
astatus_id: self.astatus_id,
@@ -559,10 +532,12 @@
raise "Неизвестный формат файла: #{file.original_filename}"
end
end
def clean_unrelated_item_props
+ Rails.logger.debug "[TRACE] <Area.clean_unrelated_item_props>"
+
# item_props = [ {area,prop_name} ]
# item_props.delete_all
# на этом этапе в запись уже помещены данные о новых свойствах
# тут необходимо пройтись по свойствам, выбрать те, которые не присущи новому типу,
@@ -589,31 +564,95 @@
# если айдишника PropName очередного ItemProp нет в списке PropNames присущих Типу,
# удаляем это ItemProp
item_props.each do |item_prop|
# Rails.logger.debug "<clean_unrelated_item_props> item_prop.prop_name.id = #{item_prop.prop_name.id}"
unless atype_prop_names_ids.include?(item_prop.prop_name.id.to_i)
- Rails.logger.debug "<clean_unrelated_item_props> Удаляем '#{item_prop.prop_name.title}' из площади типа '#{atype.title}'."
+ Rails.logger.debug "[TRACE] <Area.clean_unrelated_item_props> Удаляем '#{item_prop.prop_name.title}' из площади типа '#{atype.title}'."
item_prop.destroy
end
end
end
def clean_duplicated_item_props
# удаляем дубликаты
- Rails.logger.debug "<clean_dublicated_item_props>"
+ Rails.logger.debug "[TRACE] <Area.clean_dublicated_item_props>"
+
item_props.each do |item_prop|
duplicates = item_props
.where(area_id: item_prop.area_id)
.where(prop_name_id: item_prop.prop_name_id)
.where.not(id: item_prop.id)
- Rails.logger.debug "<clean_dublicated_item_props> #{item_prop.prop_name.title}: dublicates.count = #{duplicates.count}"
+ Rails.logger.debug "[TRACE] <Area.clean_dublicated_item_props> #{item_prop.prop_name.title}: dublicates.count = #{duplicates.count}"
if duplicates.count > 0
- Rails.logger.debug "<clean_dublicated_item_props> delete '#{item_prop.prop_name.title}', val: #{item_prop.value}"
+ Rails.logger.debug "[TRACE] <Area.clean_dublicated_item_props> delete '#{item_prop.prop_name.title}', val: #{item_prop.value}"
duplicates.delete_all
end
end
+ end
+
+ # рассчитать цену за м.кв. в месяц
+ # updated_at Не изменится
+ def calc_price_value
+ # Rails.logger.debug '[TRACE] <Area.calc_price_value> begin...'
+
+ res = 0.0
+ mark_use_usual_price = false
+
+ # если указана "цена за площадь",
+ # то цену за м кв. в месяц высчитываем
+ pa = self.item_props.where(:prop_name_id => 14)
+ if pa.count > 0
+ pa_val = pa.first.value.to_f
+
+ if pa_val == 0
+ # если руками было проставлено 0 - т.е. свойство как бы было удалено, выключено
+ mark_use_usual_price = true
+ else
+ if self.square_value.present? && self.square_value != 0
+ # результат получаем только тогда, когда указана площадь и когда указана цена за площадь
+ res = pa_val / self.square_value
+ Rails.logger.debug '[TRACE] <Area.calc_price_value> Рассчитываем цену за метр из цены за площадь.'
+ else
+ # если не указана площадь - то берём обычную цену
+ mark_use_usual_price = true
+ end
+ end
+ else
+ mark_use_usual_price = true
+ end
+
+ if mark_use_usual_price
+ p = self.item_props.where(:prop_name_id => 1)
+ if p.count > 0
+ res = p.first.value.to_f
+ end
+ end
+
+ Rails.logger.debug "[TRACE] <Area.calc_price_value> end. result = #{res}."
+ # self.price_value = res
+ self.update_column(:price_value, res)
+ end
+
+ # добавляем модели Area столбец square_value и before_update метод, который высчитывает значение
+ # updated_at Не изменится
+ def calc_square_value
+ res = 0.0
+ p = item_props.where(:prop_name_id => 9)
+ if p.count > 0
+ res = p.first.value.to_f
+ end
+ Rails.logger.debug "[TRACE] <Area.square_value> res = #{res}"
+ # res
+ self.update_column(:square_value, res)
+ end
+
+ # добавляем модели Area столбец square_value и before_update метод, который высчитывает значение
+ # updated_at Не изменится
+ def calc_power_price_value
+ v = self.price_value * self.square_value
+ self.update_column(:power_price_value, v)
end
end
end
\ No newline at end of file