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