class TimeOverlap::Calculator

Attributes

data[R]
duration[R]
end_time[R]
from[R]
min_overlap[R]
my_time_zone[R]
start_time[R]
time_zone[R]
to[R]

Public Class Methods

new(from:, to:, time_zone:, my_time_zone:, min_overlap:, expert: true, show_base: true) click to toggle source
# File lib/time_overlap/calculator.rb, line 4
def initialize(from:, to:, time_zone:, my_time_zone:, min_overlap:, expert: true, show_base: true)
  @current_year = Time.current.year
  @current_month = Time.current.month
  @current_day = Time.current.day

  @from = from
  @to = to
  @time_zone = time_zone
  @my_time_zone = my_time_zone
  @min_overlap = min_overlap
  @start_time = set_time(from)
  @end_time = set_time(to)
  @duration = (end_time - start_time).to_i / 60 / 60

  @expert = expert
  @show_base = show_base

  @data = {}
end
show(*args) click to toggle source
# File lib/time_overlap/calculator.rb, line 24
def self.show(*args)
  self.new(*args).execute
end

Public Instance Methods

execute() click to toggle source
# File lib/time_overlap/calculator.rb, line 28
def execute
  @data = build_data

  if @data[:overlap_1][:start] == @data[:overlap_2][:start] &&
    @data[:overlap_1][:end] == @data[:overlap_2][:end]
      @data.delete(:overlap_2)
  end

  throw_errors!

  unless @expert
    @data.delete(:overlap_1)
    @data.delete(:overlap_2)
  end

  present_result
end

Private Instance Methods

build_data() click to toggle source
# File lib/time_overlap/calculator.rb, line 60
def build_data
  offset = duration - min_overlap

  start_time_in_my_time_zone = start_time.in_time_zone(my_time_zone)
  end_time_in_my_time_zone = end_time.in_time_zone(my_time_zone)

  overlap_1_start_time = (start_time - offset * 60 * 60).in_time_zone(my_time_zone)
  overlap_1_end_time = (end_time - offset * 60 * 60).in_time_zone(my_time_zone)

  overlap_2_start_time = (end_time - min_overlap * 60 * 60).in_time_zone(my_time_zone)
  overlap_2_end_time = (overlap_2_start_time + duration * 60 * 60).in_time_zone(my_time_zone)

  {
    original: {
      start: start_time,
      end: end_time
    },
    full_overlap: {
      start: start_time_in_my_time_zone,
      end: end_time_in_my_time_zone
    },
    overlap_1: {
      start: overlap_1_start_time,
      end: overlap_1_end_time,
    },
    overlap_2: {
      start: overlap_2_start_time,
      end: overlap_2_end_time
    },
    duration: duration,
    min_overlap: min_overlap,
    time_zone: time_zone,
    my_time_zone: my_time_zone
  }
end
present_result() click to toggle source
# File lib/time_overlap/calculator.rb, line 96
def present_result
  presenter_instance.generate_output
end
presenter_instance() click to toggle source
# File lib/time_overlap/calculator.rb, line 100
def presenter_instance
  @presenter_instance ||= Presenter.new(@data)
end
set_time(hour) click to toggle source
# File lib/time_overlap/calculator.rb, line 104
def set_time(hour)
  offset = Time.zone_offset(time_zone)

  if offset.nil?
    zone = ActiveSupport::TimeZone.new(time_zone)
    if zone.nil?
      raise "Invalid Timezone: #{time_zone}"
    end

    offset = zone.now.utc_offset
  end

  raise "Problem has occured during offset calculation for #{time_zone}" if offset.nil?

  Time.new(
    @current_year,
    @current_month,
    @current_day,
    hour,
    0,
    0,
    offset
  )
end
throw_errors!() click to toggle source
# File lib/time_overlap/calculator.rb, line 129
def throw_errors!
  raise "Min overlap must be lower that duration" if @min_overlap > @duration
  raise "Wrong Overlap 1" unless (data[:overlap_1][:end] - data[:overlap_1][:start]).to_i / 60 / 60 == duration

  if data[:overlap_2] && (data[:overlap_2][:end] - data[:overlap_2][:start]).to_i / 60 / 60 != duration
    raise "Wrong Overlap 2"
  end
end