class Timesheet::TogglRecord

get issue id

issue-related params

get project split by several issues

if one issue, then all good
if several:
  delete time entries from timesheet
  delete time entries from kibana
  add new time entries to timesheet

@time_part

Attributes

config[RW]
record[RW]

Public Class Methods

new(hash, config) click to toggle source
# File lib/timesheet/toggl/parser.rb, line 16
def initialize(hash, config)
  @descriptions = parse_description hash[:description]
  @record = hash
  @config = config
end

Public Instance Methods

client_id() click to toggle source
# File lib/timesheet/toggl/parser.rb, line 112
def client_id
  if client = Client.find_by(name: record[:client])
    client_id = client.id
  else
    Rails.logger.error "No client match to toggl client #{record[:client]}"
  end
  client_id
end
derive_params() click to toggle source
# File lib/timesheet/toggl/parser.rb, line 58
def derive_params
  params = record.reduce({}) do |r, (k, v)|
    next(r) unless params_map[k]
    r.merge(params_map[k] => v)
  end
  params[:data_source_id] = config[:source_id]
  params[:spent_on] = record[:start]
  params[:user_id] = user_id
  return unless params[:user_id]
  params[:hours] /= 3_600_000.0 # turn milliseconds into hours
  if iid = issue_id(params)
    params.merge!(issue_related_params(iid))
  end
  params[:client_id] ||= client_id
  params
end
descriptions_params() click to toggle source
# File lib/timesheet/toggl/parser.rb, line 43
def descriptions_params
  return unless params = derive_params
  time_proc = proc { |x| x.scan(/@\s?(\d+)/).flatten.first.to_i }
  times = @descriptions.map(&time_proc).reject(&:zero?)
  one_part = (times.size / @descriptions.size.to_f) * params[:hours] / times.sum
  @descriptions.map do |x|
    time = time_proc.call(x)
    hours = time.zero? ?
      (params[:hours] / @descriptions.size) :
      (one_part * time)
    iid = issue_id(comment: x)
    params.merge(comment: x, hours: hours).merge(issue_related_params(iid))
  end
end
issue_id(params) click to toggle source
# File lib/timesheet/toggl/parser.rb, line 86
def issue_id(params)
  return unless config[:redmine_time_entry_class]
  params[:comment].match(/#\s?(\d+)/).try(:[], 1)
end
params_map() click to toggle source
# File lib/timesheet/toggl/parser.rb, line 75
def params_map
  {
    id: :external_id,
    project: :project,
    description: :comment,
    dur: :hours,
    start: :start_time,
    end: :finish_time
  }
end
parse_description(description) click to toggle source
# File lib/timesheet/toggl/parser.rb, line 22
def parse_description(description)
  result = description.scan(/(#\s?\d+[^#]+)/).flatten
  result.size < 2 ? [description] : result
end
push() click to toggle source
# File lib/timesheet/toggl/parser.rb, line 27
def push
  return unless params = descriptions_params
  if params.size > 1
    TimeEntry
      .where(external_id: record[:id], data_source_id: config[:source_id])
      .each { |x| x.delete_from_kibana; x.delete }
    params.each { |x| return unless x[:user_id]; TimeEntry.create x }
  else
    params = params.first
    return unless params[:user_id]
    te = TimeEntry.find_or_create_by(
      external_id: record[:id], data_source_id: config[:source_id])
    te.update params
  end
end
user_id() click to toggle source
# File lib/timesheet/toggl/parser.rb, line 121
def user_id
  data_source_user = DataSourceUser.find_by(
    data_source_id: config[:source_id], external_user_id: record[:uid])
  error = "No user match to toggl user #{record[:user]} (id #{record[:uid]})"
  (Rails.logger.error(error); return) unless data_source_user
  data_source_user.user_id
end