57 lines
1.5 KiB
Ruby
57 lines
1.5 KiB
Ruby
class ScrapeTogglJob < ApplicationJob
|
|
queue_as :default
|
|
|
|
def perform(*args)
|
|
courses = Course.all
|
|
|
|
courses.each do |course|
|
|
self.scrape_course(course)
|
|
end
|
|
end
|
|
|
|
# @param [Course] course
|
|
def scrape_course(course)
|
|
toggl_project_id = course.toggl_project
|
|
lectures = course.lectures.order(:start_time).includes(:attendance)
|
|
|
|
return if lectures.empty?
|
|
|
|
entries_data = Toggl::entries_for_project(
|
|
toggl_project_id,
|
|
|
|
# TODO: Work out better limits
|
|
start_time: Time.new('2023-01-01'),
|
|
end_time: Time.new('2024-01-01')
|
|
)
|
|
|
|
return if entries_data.empty?
|
|
|
|
lectures.each do |lecture|
|
|
return if lecture.attendance.present?
|
|
|
|
entries_data.each do |entry|
|
|
concurrent_time_entry = entry['time_entries'].find do |inner_entry|
|
|
(Time.new(inner_entry['start']) - lecture.start_time).abs < 10.minutes
|
|
end
|
|
|
|
if concurrent_time_entry.present?
|
|
Attendance.create!(
|
|
lecture:,
|
|
associated_toggl_entry: concurrent_time_entry['id'],
|
|
kind: :concurrent,
|
|
toggl_data: entry
|
|
)
|
|
elsif entry['description'] == lecture.title
|
|
# If the title matches but it wasn't concurrent, then it was a catchup
|
|
Attendance.create!(
|
|
lecture:,
|
|
associated_toggl_entry: entry['time_entries'][0]['id'],
|
|
kind: :catchup,
|
|
toggl_data: entry
|
|
)
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|