Newer
Older
dmpopidor / lib / data_cleanup / rules / section / fix_duplicate_number.rb
# frozen_string_literal: true
module DataCleanup
  module Rules
    # Fix duplicate number on Section
    module Section
      class FixDuplicateNumber < Rules::Base

        def description
          "Fix duplicate number on Section"
        end

        def call
          # A set of unique phase_ids that contain Sections with duplicate numbers
          phase_ids = ::Section.group(:number, :phase_id)
                               .count
                               .select { |k,v| v > 1 }
                               .collect { |values, count| values.last }
                               .uniq

          phase_ids.each do |phase_id|
            log("Re-setting number order for Sections in Phase##{phase_id}")
            phase = ::Phase.find(phase_id)
            sorted_sections = SectionSorter.new(*phase.sections).sort!
            ::Section.update_numbers!(*sorted_sections.map(&:id), parent: phase)
          end
        end

      end
    end
  end
end