gems-uff/sapos

View on GitHub
app/helpers/enrollments_pdf_helper.rb

Summary

Maintainability
F
1 wk
Test Coverage
F
56%
# Copyright (c) Universidade Federal Fluminense (UFF).
# This file is part of SAPOS. Please, consult the license terms in the LICENSE file.

# frozen_string_literal: true

module EnrollmentsPdfHelper
  def i18n_eht(key, *args)
    key = "pdf_content.enrollment.header." + key.to_s
    I18n.t(key, *args)
  end

  def identity_issuing_place_to_label(student)
    if State.where("name LIKE ?", student.identity_issuing_place).present?
      return i18n_eht("identity_issuing_state")
    end
    i18n_eht("identity_issuing_country")
  end

  def enrollment_student_header(pdf, options = {})
    enrollment ||= options[:enrollment]
    pdf.bounding_box([0, pdf.cursor - 3], width: 560) do
      pdf.font("FreeMono", size: 8) do
        birthdate = if enrollment.student.birthdate.nil?
          rescue_blank_text(nil)
        else
          I18n.localize(enrollment.student.birthdate, format: :default)
        end

        data_table = [
          [
            "#{i18n_eht(:student_name)} <b>#{enrollment.student.name}</b>"
          ], [
            "#{i18n_eht(:enrollment_number)} <b>#{
              enrollment.enrollment_number
            }   </b>",
            "#{i18n_eht(:student_birthplace)} <b>#{
              rescue_blank_text(enrollment.student.nationality)
            }   </b>",
            "#{i18n_eht(:student_birthdate)} <b>#{birthdate}</b>"
          ], [
            "#{i18n_eht(:student_identity_number)} <b>#{
              rescue_blank_text(enrollment.student.identity_number)
            }  </b>",
            "#{i18n_eht(:identity_issuing_body)} <b>#{
              rescue_blank_text(enrollment.student.identity_issuing_body)
            }  </b>",
            "#{identity_issuing_place_to_label(enrollment.student)} <b>#{
              rescue_blank_text(enrollment.student.identity_issuing_place)
            }</b>"
          ], [
            "#{i18n_eht(:student_cpf)} <b>#{
              rescue_blank_text(enrollment.student.cpf)
            }</b>"
          ]
        ]

        pdf.indent(5) do
          text_table(pdf, data_table, 8)
        end

        pdf.move_down 5
        pdf.stroke_bounds
      end
    end
  end

  def common_header_part(pdf, options = {}, &block)
    data_table = yield
    pdf.indent(5) do
      text_table(pdf, data_table, 8)
    end

    pdf.move_down 5
    unless options[:hide_stroke]
      pdf.horizontal_line 0, 560
    end
  end

  def common_header_part1(pdf, enrollment, extra = [])
    common_header_part(pdf) do
      [
        [
          "#{i18n_eht(:course)} <b>#{rescue_blank_text(
            enrollment.level.name.nil? ? nil : (enrollment.level.full_name)
          )}</b>"
        ], [
          "#{i18n_eht(:field_of_study)} <b>#{rescue_blank_text(
            enrollment.research_area, method_call: :name
          )}</b>"
        ]
      ] + extra
    end
  end

  def common_header_part2(pdf, enrollment, hide_stroke)
    common_header_part(pdf, { hide_stroke: hide_stroke }) do
      [[
        "#{i18n_eht(:enrollment_admission_date)} <b>#{I18n.localize(
          enrollment.admission_date, format: :monthyear2
        )}</b>"
      ]]
    end
  end

  def grades_report_header(pdf, options = {})
    enrollment ||= options[:enrollment]
    pdf.bounding_box([0, pdf.cursor - 3], width: 560) do
      pdf.font("FreeMono", size: 8) do
        pdf.line_width 0.5
        common_header_part1(pdf, enrollment)
        common_header_part2(pdf, enrollment, false)
        common_header_part(pdf, { hide_stroke: true }) do
          [[
            "#{i18n_eht(:enrollment_dismissal_date)} <b>#{
              enrollment.dismissal ? " #{"#{I18n.localize(
                enrollment.dismissal.date, format: :monthyear2
              )}"}" : "--"}</b>   ",
            "#{i18n_eht(:enrollment_dismissal_reason)} <b>#{
              enrollment.dismissal ? " #{
                enrollment.dismissal.dismissal_reason.name
              }" : "--"
            }</b>"
          ]]
        end

        pdf.close_and_stroke
        pdf.line_width 1
        pdf.stroke_bounds
      end
    end
  end

  def enrollment_header(pdf, options = {})
    enrollment ||= options[:enrollment]
    pdf.bounding_box([0, pdf.cursor - 3], width: 560) do
      pdf.font("FreeMono", size: 8) do
        pdf.line_width 0.5

        common_header_part1(pdf, enrollment, [
          "#{i18n_eht(:program_level)} <b>#{CustomVariable.program_level} </b>"
        ])

        common_header_part(pdf) do
          [[
            "#{i18n_eht(:enrollment_admission_result)} <b>#{i18n_eht(
              :entrance_exam_approved
            )}</b>"
          ]]
        end

        common_header_part(pdf) do
          languages = enrollment.accomplishments.joins(:phase).where(
            phases: { is_language: true }
          )
          str = "#{i18n_eht(:language_tests)}:"
          unless languages.empty?
            data_table = []
            languages.each do |accomplishment|
              data_table.push([
                "#{str} <b>#{i18n_eht(:approved)} #{accomplishment.phase.name}</b>"
              ])
              str = "|" + " " * (str.size - 1)
            end
          else
            data_table = [[
              "#{str} <b>#{i18n_eht(:no_test)}</b>"
            ]]
          end
          data_table
        end

        common_header_part2(pdf, enrollment, true)

        pdf.close_and_stroke
        pdf.line_width 1
        pdf.stroke_bounds
      end
    end
  end

  def enrollments_table(pdf, options = {})
    enrollments ||= options[:enrollments]

    widths = [236, 108, 108, 108]

    header = [[
      "<b>#{I18n.t("activerecord.attributes.enrollment.student")}</b>",
      "<b>#{I18n.t("activerecord.attributes.enrollment.enrollment_number")}</b>",
      "<b>#{I18n.t("activerecord.attributes.enrollment.admission_date")}</b>",
      "<b>#{I18n.t("activerecord.attributes.enrollment.dismissal")}</b>"
    ]]

    enrollments.each { |e|
      e[2] = I18n.localize(e[2], format: :default) unless e[2].nil?
      e[3] = I18n.localize(e[3], format: :default) unless e[3].nil?
    }

    simple_pdf_table(pdf, widths, header, enrollments) do |table|
      table.column(0).align = :left
      table.column(0).padding = [2, 4]
    end
  end

  def transcript_table(pdf, options = {})
    class_enrollments ||= options[:class_enrollments]

    table_width = [66, 280, 57, 57, 50, 50]

    # Header
    pdf.bounding_box([0, pdf.cursor - 3], width: 560) do
      header = [[
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.title")}</b>"
      ]]

      pdf.table(
        header,
        column_widths: [560],
        row_colors: ["E5E5FF"],
        cell_style: {
          font: "FreeSans",
          size: 9,
          inline_format: true,
          border_width: 1,
          borders: [:left, :right],
          border_color: "000080",
          align: :left,
          padding: [2, 4]
        }
      )

      pdf.stroke_bounds
    end

    pdf.bounding_box([0, pdf.cursor], width: 560) do
      header = [[
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_code")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_name")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_grade")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_credits")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_workload")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_year_semester")}</b>"
      ]]

      pdf.table(
        header,
        column_widths: table_width,
        row_colors: ["E5E5FF"],
        cell_style: {
          font: "FreeSans",
          size: 9,
          inline_format: true,
          border_width: 1,
          borders: [:left, :right],
          border_color: "000080",
          align: :center,
          padding: [12, 2]
        }
      ) do |table|
        table.column(2).padding = [7, 2]
        table.column(3).padding = [2, 2]
        table.column(4).padding = [7, 2]
      end

      pdf.stroke_bounds
    end

    # Content
    unless class_enrollments.empty?
      new_page = true
      page_size = (pdf.cursor / 15.5).floor

      next_table_data = class_enrollments.map do |class_enrollment|
        [
          class_enrollment.course_class.course.code,
          class_enrollment.course_class.name_with_class_formated_to_reports,
          class_enrollment.grade_not_count_in_gpr.present? ?
            "*" : (
              class_enrollment.course_class.course.course_type.has_score ?
                number_to_grade(class_enrollment.grade) :
                I18n.t("pdf_content.enrollment.grade_list.course_approved")
            ),
          class_enrollment.course_class.course.credits,
          class_enrollment.course_class.course.workload_text,
          "#{class_enrollment.course_class.semester}/#{
            class_enrollment.course_class.year}"
        ]
      end

      while new_page do
        new_page = false
        table_data = next_table_data

        pdf.bounding_box([0, pdf.cursor], width: 560) do
          pdf.fill_color "000000"

          if table_data.size >= page_size
            new_page = true
            next_table_data = table_data.slice(page_size..-1)
            table_data = table_data.slice(0..page_size)
            page_size = 50
          end

          if table_data.size % 2 == 0
            table_data.push([" ", "", "", "", "", ""])
          end

          pdf.table(
            table_data,
            column_widths: table_width,
            row_colors: ["F2F2FF", "E5E5FF"],
            cell_style: {
              font: "FreeSans",
              size: 9,
              inline_format: true,
              border_width: 1,
              borders: [:left, :right],
              border_color: "000080",
              align: :center,
              padding: 2
            }
          ) do |table|
            table.column(1).align = :left
            table.column(1).font = "FreeSans"
            table.column(1).padding = [2, 4]
          end
          pdf.fill_color "000080"

          pdf.stroke_bounds
        end
        if new_page
          pdf.start_new_page
        end
      end
    end

    # Footer
    pdf.bounding_box([0, pdf.cursor], width: 560) do
      footer = [[
        "",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.total")}</b>",
        "",
        class_enrollments.joins({ course_class: :course }).sum(:credits).to_i,
        I18n.translate(
          "activerecord.attributes.course.workload_time",
          time: class_enrollments.joins({ course_class: :course })
            .sum(:workload).to_i
        ),
        ""
      ]]
      pdf.table(
        footer,
        column_widths: table_width,
        row_colors: ["E5E5FF"],
        cell_style: {
          font: "FreeSans",
          size: 9,
          inline_format: true,
          border_width: 1,
          borders: [:left, :right],
          border_color: "000080",
          align: :center,
          padding: 2
        }
      ) do |table|
        table.column(1).align = :right
        table.column(1).padding = [2, 4]
        table.column(3).text_color = "000000"
        table.column(4).text_color = "000000"
      end
      pdf.stroke_bounds
    end
  end

  def grades_report_table(pdf, options = {})
    enrollment ||= options[:enrollment]
    total_class_enrollments ||= options[:class_enrollments]

    table_width = [66, 215, 57, 57, 50, 50, 65]

    pdf.move_down 3
    # Header
    header = [
      [{
        colspan: 7,
        content: "<b>#{I18n.t("pdf_content.enrollment.grade_list.title")}</b>"
      }], [
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_code")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_name")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_grade")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_credits")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_workload")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.course_year_semester")}</b>",
        "<b>#{I18n.t("pdf_content.enrollment.grade_list.situation")}</b>"
      ]]

    pdf.table(
      header,
      column_widths: table_width,
      width: 560,
      row_colors: ["E5E5FF"],
      cell_style: {
        font: "FreeSans",
        size: 9,
        inline_format: true,
        border_width: 1,
        borders: [:left, :right, :top, :bottom],
        border_color: "000080",
        align: :center,
        padding: [12, 2]
      }
    ) do |table|
      table.column(0).row(0).align = :left
      table.column(0).row(0).padding = [2, 4]
      table.column(2).row(1).padding = [7, 2]
      table.column(3).row(1).padding = [2, 2]
      table.column(4).row(1).padding = [7, 2]
    end

    available_semesters = enrollment.available_semesters

    if available_semesters.any?
      table_data = []
      bold_rows = []
      total_credits = 0
      row_index = 0

      # Coleta e calculo de informacao
      available_semesters.each do |y, s|
        class_enrollments = enrollment.class_enrollments
          .where(
            "course_classes.year" => y,
            "course_classes.semester" => s)
          .joins(:course_class)
        ys = "#{s}/#{y}"

        semester_credits = 0
        semester_workload = 0

        class_enrollments.each do |class_enrollment|
          row_index += 1

          table_data << [
              class_enrollment.course_class.course.code,
              class_enrollment.course_class.name_with_class_formated_to_reports,
              class_enrollment.grade_not_count_in_gpr.present? ?
                "*" : (
                  class_enrollment.course_class.course.course_type.has_score ?
                    number_to_grade(class_enrollment.grade) : "--"
                ),
              class_enrollment.course_class.course.credits,
              class_enrollment.course_class.course.workload_text,
              ys,
              class_enrollment.situation
          ]

          semester_credits += class_enrollment.course_class.course.credits if
            class_enrollment.situation == ClassEnrollment::APPROVED
          semester_workload += class_enrollment.course_class.course.workload if
            class_enrollment.course_class.course.workload &&
            class_enrollment.situation == ClassEnrollment::APPROVED
        end
        bold_rows << row_index

        table_data << [
          "",
          "#{I18n.t("pdf_content.enrollment.grade_list.semester_summary")} ",
          number_to_grade(enrollment.gpr_by_semester(y, s), precision: 1),
          semester_credits,
          I18n.translate(
            "activerecord.attributes.course.workload_time",
            time: semester_workload
          ),
          "",
          ""
        ]
        row_index += 1

        total_credits += semester_credits
      end

      table_data.push([" ", "", "", "", "", "", ""]) if table_data.size % 2 == 0
      pdf.fill_color "000000"

      pdf.table(
        table_data,
        column_widths: table_width,
        row_colors: ["F2F2FF", "E5E5FF"],
        cell_style: {
          font: "FreeSans",
          size: 9,
          inline_format: true,
          border_width: 1,
          borders: [:left, :right],
          border_color: "000080",
          align: :center,
          padding: 2
        }
      ) do |table|
        table.row(0).borders = [:left, :right, :top]
        table.row(0).border_top_width = 1
        table.column(1).align = :left
        table.column(1).font = "FreeSans"
        table.column(1).padding = [2, 4]
        bold_rows.each do |i|
          table.column(1).row(i).align = :right
          table.row(i).font_style = :bold
        end
      end
      pdf.fill_color "000080"

    end

    # Footer
    footer = [[
      "",
      "#{I18n.t("pdf_content.enrollment.grade_list.total")} ",
      number_to_grade(enrollment.total_gpr, precision: 1),
      total_credits,
      I18n.translate(
        "activerecord.attributes.course.workload_time",
        time: total_class_enrollments.joins({ course_class: :course })
          .sum(:workload).to_i
      ),
      "",
      ""
    ]]
    pdf.table(
      footer,
      column_widths: table_width,
      row_colors: ["E5E5FF"],
      cell_style: {
        font: "FreeSans",
        size: 9,
        inline_format: true,
        border_width: 1,
        borders: [:left, :right, :bottom, :top],
        border_color: "000080",
        align: :center,
        padding: 2,
        font_style: :bold,
        text_color: "000000"
      }
    ) do |table|
      table.column(1).align = :right
      table.column(1).padding = [2, 4]
      table.column(3).text_color = "000000"
      table.column(4).text_color = "000000"
    end
    pdf.move_down 3
  end

  def thesis_table(curr_pdf, options = {})
    data_table_rows = nil
    data_table_rows_defense_committee = nil

    curr_pdf.group do |pdf|
      enrollment ||= options[:enrollment]

      thesis_title = enrollment.thesis_title
      thesis_defense_date = enrollment.thesis_defense_date
      thesis_desense_committee = enrollment.thesis_defense_committee_professors

      has_advisors = enrollment.professors.present?
      show_advisors = enrollment.dismissal.present? &&
        enrollment.dismissal.dismissal_reason.show_advisor_name
      show_advisors = true if options[:show_advisors]

      if thesis_desense_committee.any? || (has_advisors && show_advisors)
        data_table_rows = []
        data_table_rows_defense_committee = []

        if thesis_title.present? && thesis_desense_committee.any?
          data_table_rows += [[
            "#{I18n.t("pdf_content.enrollment.thesis.title")} <b>#{
              rescue_blank_text(thesis_title)
            }</b>"
          ]]

          thesis_defense_date = if thesis_defense_date.nil?
            rescue_blank_text(nil)
          else
            I18n.localize(thesis_defense_date, format: :default)
          end

          data_table_rows += [[
            "#{I18n.t("pdf_content.enrollment.thesis.date")} " +
            "<b>#{thesis_defense_date}   </b>"
          ]]

          if enrollment.dismissal.present?
            data_table_rows[-1][0] += "#{I18n.t(
              "pdf_content.enrollment.thesis.judgement"
            )} <b>#{rescue_blank_text(
              enrollment.dismissal.dismissal_reason,
              method_call: :thesis_judgement
            )}</b>"
          else
            data_table_rows[-1][0] += "#{I18n.t(
              "pdf_content.enrollment.thesis.judgement"
            )} <b>#{DismissalReason::INVALID}</b>"
          end
        end
        if has_advisors && show_advisors
          data_table_rows += [[
            "#{I18n.t("pdf_content.enrollment.thesis.advisors")} <b>#{
              rescue_blank_text(
                enrollment.professors.collect { |a| a.name }.join(", ")
              )
            }</b>"
          ]]
        end

        if thesis_desense_committee.present?
          data_table_rows_defense_committee += [[
            "#{I18n.t("pdf_content.enrollment.thesis.defense_committee")} "
          ]]
          thesis_desense_committee.each do |professor|
            data_table_rows_defense_committee += [[
              "<b>#{professor.name} / #{rescue_blank_text(
                professor.institution, method_call: :name
              )}</b>"
            ]]
          end
        end
      end
    end

    if data_table_rows.present?
      table = curr_pdf.make_table(
        data_table_rows,
        cell_style: {
          borders: [:left, :right, :bottom, :top],
          border_bottom_width: 0.5,
          border_top_width: 0.5,
          width: 560,
          padding_top: 5.5,
          padding_bottom: 7.5,
          inline_format: true,
          font: "FreeMono",
          size: 8,
          border_color: "000080"
        }
      )
      table.row(0).border_top_width = 1.0

      if data_table_rows_defense_committee.length == 0
        table.row(data_table_rows.length - 1).border_bottom_width = 1.0
      end

      table.draw
    end

    if data_table_rows_defense_committee.present?
      # title row
      table_committee = curr_pdf.make_table(
        data_table_rows_defense_committee[0, 1],
        cell_style: {
          borders: [:top, :left, :right],
          border_top_width: 0.5,
          width: 560,
          padding_top: 5.5,
          padding_bottom: 4.9,
          inline_format: true,
          font: "FreeMono",
          size: 8,
          border_color: "000080"
        }
      )
      table_committee.draw

      # middle rows (if any)
      if data_table_rows_defense_committee.length > 2
        table_committee = curr_pdf.make_table(
          data_table_rows_defense_committee[
            1, data_table_rows_defense_committee.length - 2
          ],
          cell_style: {
            borders: [:left, :right],
            width: 560,
            padding_top: 0.0,
            padding_bottom: 1.0,
            inline_format: true,
            font: "FreeMono",
            size: 8,
            border_color: "000080"
          }
        )
        table_committee.draw
      end

      # last row
      table_committee = curr_pdf.make_table(
        data_table_rows_defense_committee[
          data_table_rows_defense_committee.length - 1,
          data_table_rows_defense_committee.length
        ],
        cell_style: {
          borders: [:left, :right, :bottom],
          border_bottom_width: 1.0,
          width: 560,
          padding_top: 0.0,
          padding_bottom: 8.5,
          inline_format: true,
          font: "FreeMono",
          size: 8,
          border_color: "000080"
        }
      )
      table_committee.draw
    end
  end

  def justification_grade_not_count_in_gpr_table(curr_pdf, options = {})
    enrollment ||= options[:enrollment]

    class_enrollments_which_grade_not_count_in_gpr = enrollment
      .class_enrollments.where(class_enrollments: { grade_not_count_in_gpr: 1 })

    if class_enrollments_which_grade_not_count_in_gpr.length > 0
      data_table_rows_justification_grade_not_count_in_gpr = [[
        "<b>*</b> #{I18n.t(
          "pdf_content.enrollment.grades_report.courses_which_grade_not_count_in_gpr"
        )}"
      ]]

      class_enrollments_which_grade_not_count_in_gpr.each do |class_enrollment|
        if class_enrollment.justification_grade_not_count_in_gpr.to_s.strip.empty?
          justification = I18n.t("rescue_blank_text")
        else
          justification = class_enrollment.justification_grade_not_count_in_gpr
        end
        data_table_rows_justification_grade_not_count_in_gpr << [
          "<b>#{class_enrollment.course_class.course.code} / #{justification}</b>"
        ]
      end

      # title row
      table_justification_grade_not_count_in_gpr = curr_pdf.make_table(
        data_table_rows_justification_grade_not_count_in_gpr[0, 1],
        cell_style: {
          borders: [:top, :left, :right],
          border_top_width: 0.5,
          width: 560,
          padding_top: 5.5,
          padding_bottom: 4.9,
          inline_format: true,
          font: "FreeMono",
          size: 8,
          border_color: "000080"
        }
      )
      table_justification_grade_not_count_in_gpr.draw

      # middle rows (if any)
      if data_table_rows_justification_grade_not_count_in_gpr.length > 2
        table_justification_grade_not_count_in_gpr = curr_pdf.make_table(
          data_table_rows_justification_grade_not_count_in_gpr[
            1, data_table_rows_justification_grade_not_count_in_gpr.length - 2
          ],
          cell_style: {
            borders: [:left, :right],
            width: 560,
            padding_top: 0.0,
            padding_bottom: 1.0,
            inline_format: true,
            font: "FreeMono",
            size: 8,
            border_color: "000080"
          }
        )
        table_justification_grade_not_count_in_gpr.draw
      end

      # last row
      table_justification_grade_not_count_in_gpr = curr_pdf.make_table(
        data_table_rows_justification_grade_not_count_in_gpr[
          data_table_rows_justification_grade_not_count_in_gpr.length - 1,
          data_table_rows_justification_grade_not_count_in_gpr.length
        ],
        cell_style: {
          borders: [:left, :right, :bottom],
          border_bottom_width: 1.0,
          width: 560,
          padding_top: 0.0,
          padding_bottom: 8.5,
          inline_format: true,
          font: "FreeMono",
          size: 8,
          border_color: "000080"
        }
      )
      table_justification_grade_not_count_in_gpr.draw
    end
  end

  def accomplished_table(curr_pdf, options = {})
    curr_pdf.group do |pdf|
      accomplished_phases ||= options[:accomplished_phases]

      unless accomplished_phases.empty?
        title = [["<b>#{I18n.t(
          "pdf_content.enrollment.academic_transcript.accomplished_phases"
        )}</b>"]]
        data = accomplished_phases.map do |accomplishment|
          [
            "#{accomplishment.conclusion_date.nil? ? I18n.t(
              "pdf_content.enrollment.grades_report.accomplishment_conclusion_date_not_given"
            ) : I18n.localize(
              accomplishment.conclusion_date, format: :monthyear2
            )} #{accomplishment.phase.name}"
          ]
        end
        pdf_list_with_title(pdf, title, data)
      end
    end
  end

  def deferrals_table(curr_pdf, options = {})
    curr_pdf.group do |pdf|
      deferrals ||= options[:deferrals]

      unless deferrals.empty?
        title = [[
          "<b>#{I18n.t(
            "pdf_content.enrollment.academic_transcript.deferrals"
          )}</b>"
        ]]
        data = deferrals.map do |deferral|
          [
            "#{I18n.localize(
              deferral.approval_date, format: :monthyear2
            )} #{deferral.deferral_type.name}"
          ]
        end
        pdf_list_with_title(pdf, title, data)
      end
    end
  end

  def enrollment_scholarships_table(curr_pdf, options = {})
    curr_pdf.group do |pdf|
      enrollment ||= options[:enrollment]
      scholarship_durations = enrollment.scholarship_durations

      unless scholarship_durations.empty?
        title = [["<b>#{I18n.t(
          "pdf_content.enrollment.academic_transcript.scholarships"
        )}</b>"]]
        header = [[
          "<b>#{I18n.t("pdf_content.enrollment.scholarships.number")}</b>",
          "<b>#{I18n.t("pdf_content.enrollment.scholarships.sponsor")}</b>",
          "<b>#{I18n.t("pdf_content.enrollment.scholarships.start_date")}</b>",
          "<b>#{I18n.t("pdf_content.enrollment.scholarships.end_date")}</b>",
          "<b>#{I18n.t("pdf_content.enrollment.scholarships.cancel_date")}</b>"
        ]]

        i = 0
        data = []
        suspensions_ids = []
        scholarship_durations.each do |sd|
          start_date = sd.start_date.nil? ?
            "-" : I18n.localize(sd.start_date, format: :monthyear2)
          end_date = sd.end_date.nil? ?
            "-" : I18n.localize(sd.end_date, format: :monthyear2)
          cancel_date = sd.cancel_date.nil? ?
            "-" : I18n.localize(sd.cancel_date, format: :monthyear2)
          data << [
              rescue_blank_text(sd.scholarship, method_call: :scholarship_number),
              rescue_blank_text(sd.scholarship.sponsor, method_call: :name),
              start_date,
              end_date,
              cancel_date
          ]
          i += 1
          suspensions = sd.scholarship_suspensions
          unless suspensions.empty?
            suspensions.each do |s|
              data << [
                "Suspensão #{s.active ? "ativa" : "inativa"}",
                "",
                I18n.localize(s.start_date, format: :monthyear),
                I18n.localize(s.end_date, format: :monthyear),
                "-"
              ]
              suspensions_ids << i
              i += 1
            end
          end
        end
        widths = [200, 90, 90, 90, 90]
        pdf_table_with_title(
          pdf, widths, title, header, data, width: 560
        ) do |table|
          suspensions_ids.each do |i|
            table.cells[i, 0].font_style = :bold
            table.cells[i, 0].style align: :right
            table.cells[i, 0].style padding_right: 10
          end
        end
      end
    end
  end

  def enrollment_holds_table(curr_pdf, options = {})
    curr_pdf.group do |pdf|
      enrollment ||= options[:enrollment]
      enrollment_holds = enrollment.enrollment_holds

      unless enrollment_holds.empty?
        title = [["<b>#{I18n.t(
          "pdf_content.enrollment.academic_transcript.enrollment_holds"
        )}</b>"]]
        data = enrollment_holds.map do |eh|
          ["#{eh.date_label} #{eh.number_label}"]
        end
        pdf_list_with_title(pdf, title, data)
      end
    end
  end

  def search_table(pdf, options = {})
    search ||= options[:search]

    return if search.blank?
    values = []

    values.push([
      I18n.t("activerecord.attributes.enrollment.enrollment_number"),
      search[:enrollment_number]
    ]) if search[:enrollment_number].present?

    values.push([
      I18n.t("activerecord.attributes.enrollment.student"),
      Student.find(search[:student].to_i).name
    ]) if search[:student].present?

    values.push([
      I18n.t("activerecord.attributes.enrollment.level"),
      Level.find(search[:level].to_i).name
    ]) if search[:level].present?

    values.push([
      I18n.t("activerecord.attributes.enrollment.enrollment_status"),
      EnrollmentStatus.find(search[:enrollment_status].to_i).name
    ]) if search[:enrollment_status].present?

    admission_date_exists = (
      search[:admission_date][:month].present? &&
      search[:admission_date][:year].present?
    )
    if admission_date_exists
      admission_date = Date.new(
        search[:admission_date][:year].to_i,
        search[:admission_date][:month].to_i
      )
      values.push([
        "#{I18n.t("activerecord.attributes.enrollment.admission_date")}",
        I18n.localize(admission_date, format: :monthyear2)
      ])
    end

    values.push([
      I18n.t("activerecord.attributes.enrollment.active"),
      {
        "all" => "Todas",
        "active" => "Ativas",
        "not_active" => "Inativas"
      }[search[:active]]
    ]) if search[:active].present?

    values.push([
      I18n.t("activerecord.attributes.enrollment.scholarship_durations_active"),
      ["Não", "Sim"][search[:scholarship_durations_active].to_i]
    ]) unless search[:scholarship_durations_active].empty?

    values.push([
      I18n.t("activerecord.attributes.enrollment.professor"),
      search[:professor]
    ]) if search[:professor].present?


    if search[:accomplishments][:phase].present?
      phase_date = Date.new(
        search[:accomplishments][:year].to_i,
        search[:accomplishments][:month].to_i,
        search[:accomplishments][:day].to_i
      )
      phase_name = search[:accomplishments][:phase] == "all" ?
        "Todas" : Phase.find(search[:accomplishments][:phase].to_i).name
      values.push([
        "#{I18n.t("activerecord.attributes.enrollment.accomplishments")}",
        "#{phase_name} #{I18n.t(
          "activerecord.attributes.enrollment.accomplishment_date"
        )} #{I18n.localize(phase_date, format: :long)} "
      ])
    end

    if search[:delayed_phase][:phase].present?
      phase_date = Date.new(
        search[:delayed_phase][:year].to_i,
        search[:delayed_phase][:month].to_i,
        search[:delayed_phase][:day].to_i
      )

      phase_name = search[:delayed_phase][:phase] == "all" ?
        "Alguma" : Phase.find(search[:delayed_phase][:phase].to_i).name
      values.push([
        "#{I18n.t("activerecord.attributes.enrollment.delayed_phase")}",
        "#{phase_name} #{I18n.t(
          "activerecord.attributes.enrollment.delayed_phase_date"
        )} #{I18n.localize(phase_date, format: :long)} "
      ])
    end

    course_class_year_semester_filled = (
      search[:course_class_year_semester][:semester].present? ||
      search[:course_class_year_semester][:year].present? ||
      search[:course_class_year_semester][:course].present?
    )
    if course_class_year_semester_filled
      course = search[:course_class_year_semester][:course].empty? ?
        "" : Course.find(search[:course_class_year_semester][:course].to_i).name
      values.push([
        "#{I18n.t("activerecord.attributes.enrollment.course_class_year_semester")}",
        "#{course} #{I18n.t(
          "activerecord.attributes.enrollment.year_semester_label"
        )} #{
          search[:course_class_year_semester][:year]
        }/#{
          search[:course_class_year_semester][:semester]
        }"
      ])
    end

    unless search[:enrollment_hold][:hold].to_i == 0
      values.push([
        "#{I18n.t("activerecord.attributes.enrollment.enrollment_hold")}",
        I18n.t("active_scaffold.true")
      ])
    end

    values.push([
      I18n.t("activerecord.attributes.enrollment.research_area"),
      ResearchArea.find(search[:research_area].to_i).to_label
    ]) if search[:research_area].present?


    widths = [280, 280]

    header = [[
      "<b>#{I18n.t("pdf_content.enrollment.search.attribute")}</b>",
      "<b>#{I18n.t("pdf_content.enrollment.search.value")}</b>"
    ]]

    simple_pdf_table(pdf, widths, header, values) do |table|
      table.column(0).align = :left
      table.column(0).padding = [2, 4]
    end
  end
end