app/models/c80_estate/area.rb in c80_estate-0.1.0.30 vs app/models/c80_estate/area.rb in c80_estate-0.1.0.31
- old
+ new
@@ -29,10 +29,11 @@
validates :property, :presence => true
validates :atype, :presence => true
validate :has_astatus?
after_create :create_initial_sevent
+ after_update :check_and_remove_item_props, :if => :atype_id_changed?
after_update :check_and_generate_sevent
def self.all_areas
self.all
end
@@ -471,19 +472,83 @@
end
end
+ def check_and_remove_item_props
+ Rails.logger.debug '<check_and_remove_item_props> BEGIN'
+
+ clean_unrelated_item_props
+ clean_duplicated_item_props
+
+ Rails.logger.debug '<check_and_remove_item_props> END'
+ end
+
private
def self.open_spreadsheet(file)
case File.extname(file.original_filename)
when ".xls" then
Roo::Excel.new(file.path)
when ".xlsx" then
Roo::Excelx.new(file.path)
else
raise "Неизвестный формат файла: #{file.original_filename}"
+ end
+ end
+
+ def clean_unrelated_item_props
+ # item_props = [ {area,prop_name} ]
+ # item_props.delete_all
+
+ # на этом этапе в запись уже помещены данные о новых свойствах
+ # тут необходимо пройтись по свойствам, выбрать те, которые не присущи новому типу,
+ # и удалить их
+
+ # находим PropNames присущие Типу
+ atype_prop_names = Atype.get_propnames(atype.id)
+ # [ {"id"=>37, "title"=>"Артикул", "is_excluded_from_filtering"=>1, "uom_title"=>nil},... ]
+
+ # составляем массив айдишников
+ atype_prop_names_ids = []
+ atype_prop_names.each do |prop_name|
+ # Rails.logger.debug "<clean_unrelated_item_props> prop_name = #{prop_name}"
+ # begin
+ atype_prop_names_ids << prop_name['id'].to_i
+ # rescue => e
+ # Rails.logger.debug "<clean_unrelated_item_props> [ERROR]: #{e}"
+ # end
+
+ end
+ # Rails.logger.debug "<clean_unrelated_item_props> atype_prop_names_ids = #{atype_prop_names_ids}"
+
+ # теперь обходим Item Props
+ # если айдишника 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}'."
+ item_prop.destroy
+ end
+ end
+
+ end
+
+ def clean_duplicated_item_props
+ # удаляем дубликаты
+ Rails.logger.debug "<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}"
+
+ if duplicates.count > 0
+ Rails.logger.debug "<clean_dublicated_item_props> delete '#{item_prop.prop_name.title}', val: #{item_prop.value}"
+ duplicates.delete_all
+ end
end
end
end
end
\ No newline at end of file