diff --git a/app/assets/stylesheets/custom/student_enrollment.scss b/app/assets/stylesheets/custom/student_enrollment.scss index 96620d71..58af7243 100644 --- a/app/assets/stylesheets/custom/student_enrollment.scss +++ b/app/assets/stylesheets/custom/student_enrollment.scss @@ -32,6 +32,11 @@ border-color: rgb(1, 104, 1); } +.background-held{ + background-color: #b188b8; + border-color: purple; +} + .show-box summary { margin-top: 0; margin-bottom: 10px; diff --git a/app/controllers/class_enrollment_requests_controller.rb b/app/controllers/class_enrollment_requests_controller.rb index a5343ab1..0ab0e192 100644 --- a/app/controllers/class_enrollment_requests_controller.rb +++ b/app/controllers/class_enrollment_requests_controller.rb @@ -236,7 +236,8 @@ def set_status(status, message) yield record if block_given? flash[:info] = I18n.t(message, count: 1) else - flash[:error] = I18n.t(message, count: 0) + flash[:info] = (I18n.t(message, count: 0)) + flash[:error] = record.errors.full_messages end end end diff --git a/app/controllers/research_lines_controller.rb b/app/controllers/research_lines_controller.rb index 379c7096..07295c7c 100644 --- a/app/controllers/research_lines_controller.rb +++ b/app/controllers/research_lines_controller.rb @@ -26,6 +26,7 @@ class ResearchLinesController < ApplicationController config.columns = [:name, :research_area, :professor_research_lines, :available] config.columns[:research_area].form_ui = :record_select config.list.columns = [:name, :research_area, :available] + config.show.columns = [:name, :research_area, :professors, :courses, :available] config.actions.exclude :deleted_records end diff --git a/app/models/class_enrollment.rb b/app/models/class_enrollment.rb index 57d5172b..26a1e329 100644 --- a/app/models/class_enrollment.rb +++ b/app/models/class_enrollment.rb @@ -39,6 +39,7 @@ class ClassEnrollment < ApplicationRecord validate :check_multiple_class_enrollment_allowed validate :professor_changed_only_valid_fields, if: -> { can?(:post_grades, self) && cannot?(:update_all_fields, self) } + validate :check_enrollment_hold after_save :notify_student_and_advisor after_save :class_enrollment_request_cascade @@ -129,6 +130,12 @@ def should_send_email_to_professor? ) end + def check_enrollment_hold + if self.course_class && EnrollmentHold.hold_in_date(enrollment, self.course_class.start_date, self.course_class.end_date) + errors.add(:enrollment, :enrollment_is_held) + end + end + private def grade_for_situation if course_has_grade diff --git a/app/models/class_enrollment_request.rb b/app/models/class_enrollment_request.rb index 6d5daacf..b647ed2f 100644 --- a/app/models/class_enrollment_request.rb +++ b/app/models/class_enrollment_request.rb @@ -61,6 +61,7 @@ class ClassEnrollmentRequest < ApplicationRecord if: -> { !student_saving && !marked_for_destruction? } validate :that_course_class_does_not_exist_in_a_class_enrollment, if: -> { !marked_for_destruction? } + validate :check_enrollment_hold before_validation :create_or_destroy_class_enrollment, on: %i[create update] after_save :destroy_or_create_class_enrollment @@ -126,6 +127,12 @@ def remove_not_effected? self.status != ClassEnrollmentRequest::EFFECTED end + def check_enrollment_hold + if self.course_class && EnrollmentHold.hold_in_date(enrollment, self.course_class.start_date, self.course_class.end_date) + errors.add(:enrollment, :enrollment_is_held) + end + end + protected def that_class_enrollment_matches_course_and_enrollment ce = self.class_enrollment diff --git a/app/models/course_class.rb b/app/models/course_class.rb index a0746029..d0403069 100644 --- a/app/models/course_class.rb +++ b/app/models/course_class.rb @@ -50,6 +50,16 @@ def label_with_course "#{self.course.name}#{name_l} - #{year}/#{semester}" end + def start_date + ys = YearSemester.new(year: year, semester: semester) + ys.semester_begin + end + + def end_date + ys = YearSemester.new(year: year, semester: semester) + ys.semester_end + end + def class_enrollments_count self.class_enrollments.count end diff --git a/app/models/enrollment_hold.rb b/app/models/enrollment_hold.rb index ba6719c1..5a5ec056 100644 --- a/app/models/enrollment_hold.rb +++ b/app/models/enrollment_hold.rb @@ -17,6 +17,8 @@ class EnrollmentHold < ApplicationRecord validate :validate_dates + validate :verify_class_enrollments + after_commit :create_phase_completions def to_label @@ -61,4 +63,24 @@ def end_date def create_phase_completions enrollment.create_phase_completions end + + def verify_class_enrollments + class_enrollments = ClassEnrollment.where(enrollment: self.enrollment) + class_enrollments.each do |class_enrollment| + course_class = class_enrollment.course_class + unless course_class.end_date < self.start_date || course_class.start_date > self.end_date + errors.add(:base, :class_enrollments_exist) + end + end + end + + def self.hold_in_date(enrollment, course_start, course_end) + enrollment_holds = EnrollmentHold.where(enrollment: enrollment) + unless enrollment_holds.empty? + enrollment_holds.each do |hold| + return true unless course_end < hold.start_date || course_start > hold.end_date + end + end + false + end end diff --git a/app/views/student_enrollment/_show_enroll.html.erb b/app/views/student_enrollment/_show_enroll.html.erb index f420cae7..8e620b8d 100644 --- a/app/views/student_enrollment/_show_enroll.html.erb +++ b/app/views/student_enrollment/_show_enroll.html.erb @@ -1,19 +1,28 @@ -
"> -

- <% if semester.main_enroll_open? %> - <%= t "student_enrollment.show_enroll.title_main", semester: semester.to_label %> +<% is_held = EnrollmentHold.hold_in_date(@enrollment, semester.period_start, semester.period_end)%> +<% unless is_held%> +
"> +<% else %> +
+<% end %> +

+ <% if semester.main_enroll_open? %> + <%= t "student_enrollment.show_enroll.title_main", semester: semester.to_label %> + <% else %> + <%= t "student_enrollment.show_enroll.title_adjust", semester: semester.to_label %> + <% end %> +

+ <% unless is_held%> + <% linkpath = student_enroll_path(id: @enrollment.id, year: semester.year, semester: semester.semester) %> + <% if enrollment_request.persisted? %> + <% unread = enrollment_request.student_unread_messages %> + <%= link_to t("student_enrollment.show_enroll.enroll_link_edit_#{ClassEnrollmentRequest::STATUSES_MAP[enrollment_request.status]}"), linkpath %> + <% if unread > 0 %> + <%= t("student_enrollment.show_enroll.unread", count: unread) %> + <% end %> + <% else %> + <%= link_to t("student_enrollment.show_enroll.enroll_link_new"), linkpath %> + <% end %> <% else %> - <%= t "student_enrollment.show_enroll.title_adjust", semester: semester.to_label %> +

<%= t "student_enrollment.show_enroll.enrollment_is_held" %>

<% end %> -

- <% linkpath = student_enroll_path(id: @enrollment.id, year: semester.year, semester: semester.semester) %> - <% if enrollment_request.persisted? %> - <% unread = enrollment_request.student_unread_messages %> - <%= link_to t("student_enrollment.show_enroll.enroll_link_edit_#{ClassEnrollmentRequest::STATUSES_MAP[enrollment_request.status]}"), linkpath %> - <% if unread > 0 %> - <%= t("student_enrollment.show_enroll.unread", count: unread) %> - <% end %> - <% else %> - <%= link_to t("student_enrollment.show_enroll.enroll_link_new"), linkpath %> - <% end %> -
+ diff --git a/config/locales/class_enrollment.pt-BR.yml b/config/locales/class_enrollment.pt-BR.yml index d42a7ecd..f768c099 100644 --- a/config/locales/class_enrollment.pt-BR.yml +++ b/config/locales/class_enrollment.pt-BR.yml @@ -30,6 +30,7 @@ pt-BR: student: "Aluno" enrollment_level: "Nível" enrollment_status: "Tipo de Matrícula" + enrollment_hold: "Matrícula Trancada" admission_date: "Data de Admissão" scholarship_durations_active: "Possui bolsa?" advisor: "Orientador" @@ -51,6 +52,7 @@ pt-BR: grade_gt_100: "deve ser menor ou igual a 10.0" grade_lt_0: "deve ser maior ou igual a 0.0" changes_to_disallowed_fields: "houve modificação de campos não válidos" + enrollment_is_held: "está trancada no período da turma" models: class_enrollment: diff --git a/config/locales/class_enrollment_request.pt-BR.yml b/config/locales/class_enrollment_request.pt-BR.yml index 92f04e4e..9a517129 100644 --- a/config/locales/class_enrollment_request.pt-BR.yml +++ b/config/locales/class_enrollment_request.pt-BR.yml @@ -33,6 +33,7 @@ pt-BR: remove: "Remoção" class_enrollment_requests: course_class: Turma + enrollment: Matrícula errors: models: @@ -43,6 +44,8 @@ pt-BR: course_class: previously_approved: "já foi cursada anteriormente com aprovação" taken: "duplicada" + enrollment: + enrollment_is_held: "está trancada no período" models: class_enrollment_request: diff --git a/config/locales/enrollment_hold.pt-BR.yml b/config/locales/enrollment_hold.pt-BR.yml index 08e5e4d2..0fc7afa5 100644 --- a/config/locales/enrollment_hold.pt-BR.yml +++ b/config/locales/enrollment_hold.pt-BR.yml @@ -19,6 +19,7 @@ pt-BR: enrollment_hold: before_admission_date: "anterior a Data de Admissão" after_dismissal_date: "posterior a Data de Desligamento" + class_enrollments_exist: "existem inscrições no período trancado" models: enrollment_hold: diff --git a/config/locales/research_line.pt-BR.yml b/config/locales/research_line.pt-BR.yml index 66295421..1442b6a0 100644 --- a/config/locales/research_line.pt-BR.yml +++ b/config/locales/research_line.pt-BR.yml @@ -5,7 +5,7 @@ pt-BR: activerecord: attributes: research_line: - code: "Código" + courses: "Disciplinas" name: "Nome" research_area: "Área de Pesquisa" professor_research_lines: "Professores" diff --git a/config/locales/student_enrollment.pt-BR.yml b/config/locales/student_enrollment.pt-BR.yml index dc93478a..186d1763 100644 --- a/config/locales/student_enrollment.pt-BR.yml +++ b/config/locales/student_enrollment.pt-BR.yml @@ -10,6 +10,7 @@ pt-BR: show_enroll: title_main: Inscrições em disciplinas do semestre %{semester} estão abertas! title_adjust: Período de ajustes do semestre %{semester} está aberto! + enrollment_is_held: Sua matrícula está trancada. Entre em contato com a secretaria caso queira destrancar para esta inscrição. enroll_link_new: Clique aqui para fazer um pedido de inscrição. enroll_link_edit_valid: Seu pedido de inscrição foi marcado como válido. Clique aqui para editar enroll_link_edit_requested: Clique aqui para editar seu pedido de inscrição. diff --git a/spec/factories/factory_enrollment.rb b/spec/factories/factory_enrollment.rb index 9bacc077..8d089949 100644 --- a/spec/factories/factory_enrollment.rb +++ b/spec/factories/factory_enrollment.rb @@ -13,6 +13,6 @@ sequence :enrollment_number do |number| "M#{number}" end - admission_date { 5.days.ago.to_date } + admission_date { 10.days.ago.to_date } end end diff --git a/spec/features/enrollments_spec.rb b/spec/features/enrollments_spec.rb index 8a79cddb..0927cf8b 100644 --- a/spec/features/enrollments_spec.rb +++ b/spec/features/enrollments_spec.rb @@ -145,9 +145,15 @@ it "should update research_line columns when research_area is chosen" do within("#as_#{plural_name}-create--form") do - expect(page.all("select#record_research_line_ option").map(&:text)).to eq ["Selecione uma opção", "Machine Learning", "Versionamento"] + expect(page).to have_select( + "record_research_line_", + options: ["Selecione uma opção", "Machine Learning", "Versionamento"] + ) find(:select, "record_research_area_").find(:option, text: @research_area1.name).select_option - expect(page.all("select#record_research_line_ option").map(&:text)).to eq ["Selecione uma opção", "Machine Learning"] + expect(page).to have_select( + "record_research_line_", + options: ["Selecione uma opção", "Machine Learning"] + ) end end end diff --git a/spec/features/scholarship_durations_spec.rb b/spec/features/scholarship_durations_spec.rb index 287f799b..673cd294 100644 --- a/spec/features/scholarship_durations_spec.rb +++ b/spec/features/scholarship_durations_spec.rb @@ -235,7 +235,7 @@ start_month = I18n.l(2.months.ago, format: "%B") find(:select, "suspended_start_month").find(:option, text: start_month).select_option - end_year = 0.years.ago.year + end_year = 1.year.from_now.year find(:select, "suspended_end_year").find(:option, text: end_year.to_s).select_option end_month = I18n.l(2.months.from_now, format: "%B") diff --git a/spec/features/student_enrollment_spec.rb b/spec/features/student_enrollment_spec.rb index 85e946f8..436a01d6 100644 --- a/spec/features/student_enrollment_spec.rb +++ b/spec/features/student_enrollment_spec.rb @@ -73,14 +73,14 @@ @destroy_all << @enrollment3 = FactoryBot.create(:enrollment, enrollment_number: "D01", student: @student1, level: @level1, enrollment_status: @enrollment_status1) @destroy_all << @enrollment4 = FactoryBot.create(:enrollment, enrollment_number: "D02", student: @student1, level: @level1, enrollment_status: @enrollment_status1) - @destroy_all << @course_class1 = FactoryBot.create(:course_class, name: "Algebra", course: @course1, professor: @professor1, year: 2022, semester: 1) - @destroy_all << @course_class2 = FactoryBot.create(:course_class, name: "Algebra", course: @course1, professor: @professor1, year: 2022, semester: 2) - @destroy_all << @course_class3 = FactoryBot.create(:course_class, name: "Algebra", course: @course2, professor: @professor1, year: 2021, semester: 1) - @destroy_all << @course_class4 = FactoryBot.create(:course_class, name: "Versionamento", course: @course3, professor: @professor2, year: 2022, semester: 2) - @destroy_all << @course_class5 = FactoryBot.create(:course_class, name: "Defesa", course: @course4, professor: @professor3, year: 2022, semester: 2) - @destroy_all << @course_class6 = FactoryBot.create(:course_class, name: "Mineração de Repositórios", course: @course5, professor: @professor2, year: 2022, semester: 2) - @destroy_all << @course_class7 = FactoryBot.create(:course_class, name: "Pesquisa", course: @course6, professor: @professor3, year: 2022, semester: 2) - @destroy_all << @course_class8 = FactoryBot.create(:course_class, name: "Programação", course: @course7, professor: @professor1, year: 2022, semester: 2) + @destroy_all << @course_class1 = FactoryBot.create(:course_class, name: "Algebra", course: @course1, professor: @professor1, year: 3.years.ago.year, semester: 1) + @destroy_all << @course_class2 = FactoryBot.create(:course_class, name: "Algebra", course: @course1, professor: @professor1, year: 3.years.ago.year, semester: 2) + @destroy_all << @course_class3 = FactoryBot.create(:course_class, name: "Algebra", course: @course2, professor: @professor1, year: 4.years.ago.year, semester: 1) + @destroy_all << @course_class4 = FactoryBot.create(:course_class, name: "Versionamento", course: @course3, professor: @professor2, year: 3.years.ago.year, semester: 2) + @destroy_all << @course_class5 = FactoryBot.create(:course_class, name: "Defesa", course: @course4, professor: @professor3, year: 3.years.ago.year, semester: 2) + @destroy_all << @course_class6 = FactoryBot.create(:course_class, name: "Mineração de Repositórios", course: @course5, professor: @professor2, year: 3.years.ago.year, semester: 2) + @destroy_all << @course_class7 = FactoryBot.create(:course_class, name: "Pesquisa", course: @course6, professor: @professor3, year: 3.years.ago.year, semester: 2) + @destroy_all << @course_class8 = FactoryBot.create(:course_class, name: "Programação", course: @course7, professor: @professor1, year: 3.years.ago.year, semester: 2) @destroy_all << FactoryBot.create(:allocation, course_class: @course_class2, day: "Segunda", start_time: 11, end_time: 13) @destroy_all << FactoryBot.create(:allocation, course_class: @course_class2, day: "Segunda", start_time: 14, end_time: 16) diff --git a/spec/models/class_enrollment_request_spec.rb b/spec/models/class_enrollment_request_spec.rb index d11cf238..41c7ccc4 100644 --- a/spec/models/class_enrollment_request_spec.rb +++ b/spec/models/class_enrollment_request_spec.rb @@ -155,6 +155,18 @@ def prepare_course_class(allocations, to_destroy, attributes = {}) :must_represent_the_same_enrollment_and_class).on :class_enrollment end end + context "should have error enrollment_is_held when" do + it "enrollment has an enrollment hold conflicting the date of course_class" do + @destroy_later << e = FactoryBot.create(:enrollment, admission_date: 3.years.ago.at_beginning_of_month.to_date) + @destroy_later << cc = FactoryBot.create(:course_class, year: 1.year.ago.year, semester: 1) + @destroy_later << FactoryBot.create(:enrollment_hold, enrollment: e, + year: 2.years.ago.year, number_of_semesters: 4) + @destroy_later << cer = FactoryBot.create(:enrollment_request, enrollment: e) + class_enrollment_request.enrollment_request = cer + class_enrollment_request.course_class = cc + expect(class_enrollment_request).to have_error(:enrollment_is_held).on :enrollment + end + end end end describe "Methods" do diff --git a/spec/models/class_enrollment_spec.rb b/spec/models/class_enrollment_spec.rb index 5e887775..eb80041f 100644 --- a/spec/models/class_enrollment_spec.rb +++ b/spec/models/class_enrollment_spec.rb @@ -174,6 +174,17 @@ expect(class_enrollment).to have_error(:disapproved_by_absence_for_situation_aproved).on :disapproved_by_absence end end + context "should have error enrollment_is_held when" do + it "enrollment has an enrollment hold conflicting the date of course_class" do + @destroy_later << e = FactoryBot.create(:enrollment, admission_date: 3.years.ago.at_beginning_of_month.to_date) + @destroy_later << cc = FactoryBot.create(:course_class, year: 1.year.ago.year, semester: 1) + @destroy_later << FactoryBot.create(:enrollment_hold, enrollment: e, + year: 2.years.ago.year, number_of_semesters: 4) + class_enrollment.enrollment = e + class_enrollment.course_class = cc + expect(class_enrollment).to have_error(:enrollment_is_held).on :enrollment + end + end end end describe "Methods" do diff --git a/spec/models/enrollment_hold_spec.rb b/spec/models/enrollment_hold_spec.rb index a322f41d..64f97978 100644 --- a/spec/models/enrollment_hold_spec.rb +++ b/spec/models/enrollment_hold_spec.rb @@ -60,6 +60,17 @@ enrollment_hold.number_of_semesters = 20 expect(enrollment_hold).to have_error(:after_dismissal_date).on :base end + + it "exist class enrollment in enrollment hold period" do + @destroy_later << e = FactoryBot.create(:enrollment) + @destroy_later << cc = FactoryBot.create(:course_class, year: e.admission_date.year + 2) + @destroy_later << FactoryBot.create(:class_enrollment, enrollment: e, course_class: cc) + enrollment_hold.enrollment = e + enrollment_hold.year = e.admission_date.year + 1 + enrollment_hold.semester = 2 + enrollment_hold.number_of_semesters = 6 + expect(enrollment_hold).to have_error(:class_enrollments_exist).on :base + end end end end diff --git a/spec/support/download_helpers.rb b/spec/support/download_helpers.rb index cc95cf5f..8b736b90 100644 --- a/spec/support/download_helpers.rb +++ b/spec/support/download_helpers.rb @@ -2,7 +2,7 @@ # frozen_string_literal: true module DownloadHelpers - TIMEOUT = 1 + TIMEOUT = 5 PATH = Rails.root.join("tmp/test_downloads") extend self @@ -31,7 +31,7 @@ def downloaded? end def downloading? - downloads.grep(/\.part$/).any? + downloads.any? { |f| f.end_with?(".part", ".crdownload") } end def clear_downloads