class Admin::Poll::Shifts::FormComponent < ApplicationComponent attr_reader :shift, :booth, :officer def initialize(shift, booth:, officer:) @shift = shift @booth = booth @officer = officer end private def voting_polls booth.polls.current end def recount_polls booth.polls.current_or_recounting end def shift_vote_collection_dates return [] if voting_polls.blank? date_options(voting_start_date..voting_end_date, Poll::Shift.tasks[:vote_collection]) end def shift_recount_scrutiny_dates return [] if recount_polls.blank? dates = recount_polls.map(&:ends_at).map(&:to_date).sort.reduce([]) do |total, date| initial_date = [date, Date.current].max total << (initial_date..date + Poll::RECOUNT_DURATION).to_a end date_options(dates.flatten.uniq, Poll::Shift.tasks[:recount_scrutiny]) end def date_options(dates, task_id) valid_dates(dates, task_id).map { |date| [l(date, format: :long), l(date)] } end def valid_dates(dates, task_id) dates.reject { |date| officer_shifts(task_id).include?(date) } end def voting_start_date start_date = voting_polls.minimum(:starts_at).to_date [start_date, Date.current].max end def voting_end_date voting_polls.maximum(:ends_at).to_date end def officer_shifts(task_id) officer.shifts.where(task: task_id, booth: booth).map(&:date) end end