class TogglBillable::Formatter::Details

Constants

SHORT_DATES
SKIP_GROUP_DATES

Public Instance Methods

billable_items(with_dates = true) click to toggle source

TODO: make this working also for different grouping than default

# File lib/toggl_billable/formatter/details.rb, line 8
def billable_items(with_dates = true)
  group = data.group_by { |d| d['client'] }

  group.each do |group_name, group_items|
    key = group_name || @no_client_key
    billable[key] = [] unless billable[key]
    subgroup = group_items.group_by { |d| d['project'] }

    subgroup.each do |subgroup_name, subgroup_items|
      subgroup_items.group_by { |d| d['description'] }.each do |item, data|
        if with_dates && !SKIP_GROUP_DATES.include?(subgroup_name)
          task = "#{dates(data, SHORT_DATES.include?(subgroup_name))}: "
        else
          task = ''
        end

        if item && subgroup_name
          task += "#{subgroup_name}: #{item}"
        elsif item
          task += "#{item}"
        elsif subgroup_name
          task += "#{subgroup_name}"
        end

        billable[key] << {
          task: task,
          amount: data.map {|i| i['dur']}.reduce(0, :+).to_hours,
          unit: :hours
        }
      end
    end
  end

  billable
end

Private Instance Methods

dates(items, short) click to toggle source
# File lib/toggl_billable/formatter/details.rb, line 46
def dates(items, short)
  start_date = Date.parse(items.sort_by { |i| i['start'] }.first['start'])
  end_date   = Date.parse(items.sort_by { |i| i['end'] }.reverse.first['end'])

  return start_date.strftime(TogglBillable::Config.format_month).to_s if short

  if start_date.strftime('%-d') == end_date.strftime('%-d')
    start_date.strftime(TogglBillable::Config.format_day)
  else
    start_date = start_date.strftime(TogglBillable::Config.format_daterange_start)
    end_date = end_date.strftime(TogglBillable::Config.format_daterange_end)

    "#{start_date}-#{end_date}"
  end
end