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