|
| 1 | +module Cms |
| 2 | + module EmailComponents |
| 3 | + class CourseList < BaseComponent |
| 4 | + attr_accessor :section_title, :courses, :remove_on_match |
| 5 | + |
| 6 | + def initialize(section_title:, courses:, remove_on_match:) |
| 7 | + @section_title = section_title |
| 8 | + @courses = courses |
| 9 | + @remove_on_match = remove_on_match |
| 10 | + @has_subsitutes = @courses.collect(&:substitute).any? |
| 11 | + end |
| 12 | + |
| 13 | + def activity_list(email_template, user) |
| 14 | + completed_activities = user.sorted_completed_cpd_achievements_by(programme: email_template.programme).collect(&:activity) |
| 15 | + matched = false |
| 16 | + display_courses = @courses.select { !_1.substitute }.each_with_object([]) do |course, list| |
| 17 | + if completed_activities.include?(course.activity) |
| 18 | + matched = true |
| 19 | + else |
| 20 | + list << course |
| 21 | + end |
| 22 | + end |
| 23 | + display_courses += @courses.select { _1.substitute } if matched |
| 24 | + display_courses |
| 25 | + end |
| 26 | + |
| 27 | + def matches(email_template, user) |
| 28 | + activites = user.sorted_completed_cpd_achievements_by(programme: email_template.programme).collect(&:activity) |
| 29 | + @courses.map { activites.include?(_1.activity) } |
| 30 | + end |
| 31 | + |
| 32 | + def render?(email_template, user) |
| 33 | + course_matches = matches(email_template, user) |
| 34 | + return !course_matches.any? if @remove_on_match |
| 35 | + return @has_subsitutes if course_matches.all? |
| 36 | + true |
| 37 | + end |
| 38 | + |
| 39 | + def render(email_template, user) |
| 40 | + Cms::EmailCourseListComponent.new(courses: activity_list(email_template, user), section_title:) |
| 41 | + end |
| 42 | + |
| 43 | + def render_text(email_template, user) |
| 44 | + CourseListText.new(activity_list(email_template, user), section_title:) |
| 45 | + end |
| 46 | + end |
| 47 | + |
| 48 | + class Course |
| 49 | + attr_accessor :activity_code, :display_name, :substitute, :activity |
| 50 | + |
| 51 | + def initialize(activity_code:, display_name:, substitute:) |
| 52 | + @activity_code = activity_code |
| 53 | + @display_name = display_name |
| 54 | + @substitute = substitute |
| 55 | + @activity = Activity.find_by(stem_activity_code: activity_code) |
| 56 | + end |
| 57 | + end |
| 58 | + |
| 59 | + class CourseListText |
| 60 | + include Rails.application.routes.url_helpers |
| 61 | + |
| 62 | + def initialize(course_list, section_title:) |
| 63 | + @course_list = course_list |
| 64 | + @section_title = section_title |
| 65 | + end |
| 66 | + |
| 67 | + def render_in(view_context) |
| 68 | + view_context.render inline: content |
| 69 | + end |
| 70 | + |
| 71 | + def content |
| 72 | + course_text = @course_list.map { display(_1) }.join("\n") + "\n" |
| 73 | + return "#{@section_title}\n\n#{course_text}" if @section_title |
| 74 | + |
| 75 | + course_text |
| 76 | + end |
| 77 | + |
| 78 | + def display(course) |
| 79 | + "#{course.display_name.presence || course.activity.title} (#{course_url(id: course.activity.stem_activity_code, name: course.activity.title.parameterize)})" |
| 80 | + end |
| 81 | + |
| 82 | + def format = :text |
| 83 | + end |
| 84 | + end |
| 85 | +end |
0 commit comments