diff --git a/app/models/semester_process.rb b/app/models/semester_process.rb index 005829560d491a24bc2fdf40839cd3119a054194..44f72a45e9d6036c8e570780828c1e1070e03891 100644 --- a/app/models/semester_process.rb +++ b/app/models/semester_process.rb @@ -6,6 +6,8 @@ class SemesterProcess < ApplicationRecord inverse_of: 'semester_process_reminder_mail_posted', optional: true has_many :semester_process_volunteers, dependent: :destroy + accepts_nested_attributes_for :semester_process_volunteers, allow_destroy: true + has_many :volunteers, through: :semester_process_volunteers has_many :semester_feedbacks, through: :semester_process_volunteers has_many :hours, through: :semester_process_volunteers @@ -24,4 +26,26 @@ class SemesterProcess < ApplicationRecord # will only return an array, not a AD-result delegate :missions, to: :semester_process_volunteers + + # creates semester date range from string '[year],[semester_number]' e.g. '2018,2' + def semester=(semester) + if semester.is_a?(String) + super(Semester.new(*semester.split(',').map(&:to_i)).current) + else + super(semester) + end + end + + def build_semester_volunteers(volunteers, selected = nil) + volunteers = volunteers.where(id: selected) if selected + semester_process_volunteers << volunteers.to_a.map do |volunteer| + spv = SemesterProcessVolunteer.new(volunteer: volunteer, selected: true) + spv.build_missions(semester) + spv + end + end + + def build_volunteers_hours_feedbacks_and_mails + semester_process_volunteers.map(&:build_hours_feedbacks_and_mails) + end end diff --git a/app/models/semester_process_volunteer.rb b/app/models/semester_process_volunteer.rb index 523d982ea86ee1bf473469761baeacc73051c7eb..72bb1477654eae5abdb2eaef86a6020f06acd85a 100644 --- a/app/models/semester_process_volunteer.rb +++ b/app/models/semester_process_volunteer.rb @@ -1,6 +1,11 @@ class SemesterProcessVolunteer < ApplicationRecord + attr_accessor :selected + belongs_to :volunteer belongs_to :semester_process + delegate :semester, to: :semester_process + delegate :creator, to: :semester_process + belongs_to :responsible, -> { with_deleted }, class_name: 'User', inverse_of: 'semester_processes', optional: true belongs_to :reviewed_by, -> { with_deleted }, class_name: 'User', @@ -23,6 +28,23 @@ class SemesterProcessVolunteer < ApplicationRecord # will only return an array, not a AD-result def missions - assignments + group_assignments + semester_process_volunteer_missions.map(&:mission) + end + + def build_missions(semester) + new_missions = volunteer.assignments.active_between(semester.begin, semester.end) + + volunteer.group_assignments.active_between(semester.begin, semester.end) + + semester_process_volunteer_missions << new_missions.map do |mission| + SemesterProcessVolunteerMission.new(mission: mission) + end + end + + def build_hours_feedbacks_and_mails + missions.each do |mission| + hours << mission.hours.date_between_inclusion(:meeting_date, semester.begin, semester.end) + semester_feedbacks << SemesterFeedback.new(mission: mission, volunteer: mission.volunteer) + end + semester_process_mails << SemesterProcessMail.new(kind: :mail, sent_by: creator) end end diff --git a/test/models/semester_process_volunteer_test.rb b/test/models/semester_process_volunteer_test.rb index 9243f63fcb2e650562367b36056fdd251d99490d..c3f94234806ace73d94e5e7d614dd901dd33cfc6 100644 --- a/test/models/semester_process_volunteer_test.rb +++ b/test/models/semester_process_volunteer_test.rb @@ -28,4 +28,60 @@ class SemesterProcessVolunteerTest < ActiveSupport::TestCase assert_not @subject.reload.reminders.include? mail assert @subject.reload.reminders.include? reminder end + + test '#build_missions' do + travel_to time_z(2018, 7, 15) + semester = Semester.new + semester_process = SemesterProcess.new(semester: semester.previous, creator: create(:user)) + + @assignment.update(period_start: nil, period_end: nil) + @group_assignment.update(period_start: nil, period_end: nil) + + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 0, subject.semester_process_volunteer_missions.size + + @assignment.update(period_start: time_z(2015, 7, 15)) + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 1, subject.semester_process_volunteer_missions.size + + @group_assignment.update(period_start: time_z(2018, 7, 1)) + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 1, subject.semester_process_volunteer_missions.size + + @group_assignment.update(period_start: time_z(2018, 7, 1).advance(weeks: -2)) + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + assert_equal 1, subject.semester_process_volunteer_missions.size + end + + test '#build_hours_feedbacks_and_mails' do + travel_to time_z(2018, 7, 15) + semester = Semester.new + semester_process = SemesterProcess.new(semester: semester.previous, creator: create(:user)) + + @assignment.update(period_start: time_z(2018, 1, 15), period_end: nil) + @group_assignment.update(period_start: time_z(2018, 1, 15), period_end: nil) + hour_assignment = create :hour, hourable: @assignment, meeting_date: time_z(2018, 3, 15), + volunteer: @volunteer + + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + subject.build_hours_feedbacks_and_mails + assert subject.hours.include? hour_assignment + assert_equal @assignment, subject.semester_feedbacks.find { |fb| fb.assignment_id == @assignment.id }.mission + + hour_group_assignment = create :hour, hourable: @group_assignment.group_offer, + meeting_date: time_z(2018, 3, 15), volunteer: @volunteer + + subject = SemesterProcessVolunteer.new(semester_process: semester_process, volunteer: @volunteer) + subject.build_missions(semester.previous) + subject.build_hours_feedbacks_and_mails + assert subject.hours.include? hour_assignment + assert subject.hours.include? hour_group_assignment + assert_equal @assignment, subject.semester_feedbacks.find { |fb| fb.assignment_id == @assignment.id }.mission + assert_equal @group_assignment, subject.semester_feedbacks.find { |fb| fb.group_assignment_id == @group_assignment.id }.mission + end end