gems-uff/sapos

View on GitHub
app/controllers/admissions/form_templates_controller.rb

Summary

Maintainability
B
5 hrs
Test Coverage
F
46%
# 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

class Admissions::FormTemplatesController < ApplicationController
  authorize_resource

  active_scaffold "Admissions::FormTemplate" do |config|
    config.list.sorting = { name: "ASC" }
    config.create.label = :create_form_template_label

    config.list.columns = [:name, :description, :template_type]
    config.create.columns = [:name, :description, :template_type, :fields]
    config.update.columns = [:name, :description, :template_type, :fields]

    config.columns[:fields].show_blank_record = false
    config.columns[:template_type].form_ui = :select
    config.columns[:template_type].options = {
      options: [
        Admissions::FormTemplate::ADMISSION_FORM,
        Admissions::FormTemplate::RECOMMENDATION_LETTER,
      ]
    }

    config.actions << :duplicate
    config.duplicate.link.label = "
      <i title='#{I18n.t("active_scaffold.duplicate")}' class='fa fa-copy'></i>
    ".html_safe
    config.duplicate.link.method = :get
    config.duplicate.link.position = :after
    config.action_links.add "preview",
      label: "<i title='#{
        I18n.t "active_scaffold.admissions/form_template.preview.title"
      }' class='fa fa-play'></i>".html_safe,
      type: :member
    config.actions.exclude :deleted_records
  end
  record_select(
    per_page: 10, search_on: [:name], order_by: "name", full_text_search: true,
    model: "Admissions::FormTemplate"
  )

  def beginning_of_chain
    super.input_form
  end

  def preview
    @form_template = Admissions::FormTemplate.find(params[:id])
    @filled_form = Admissions::FilledForm.new(form_template: @form_template)
    filled_params = filled_form_params
    @notice = nil
    if filled_params.present?
      @filled_form.is_filled = true
      @filled_form.assign_attributes(filled_params)
      if @filled_form.valid?
        @notice = I18n.t("active_scaffold.admissions/form_template.preview.valid")
      end
      @filled_form.is_filled = false
    end
    @filled_form.prepare_missing_fields
  end

  def populate_field
    @scope = params[:scope]
    @parent_record = params[:id].nil? ?
      new_parent_record : find_if_allowed(params[:id], :update)

    if @parent_record.new_record?
      cache_generated_id(@parent_record, params[:generated_id])
    end
    @column = active_scaffold_config.columns[:fields]

    attribute_configs = [
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.initial_text"),
        field_type: Admissions::FormField::HTML,
        configuration: JSON.dump({
          "html": I18n.t("active_scaffold.admissions/form_template.generate_fields.initial_text_html")
        }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.personal_data"),
        field_type: Admissions::FormField::GROUP },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.name"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        sync: Admissions::FormField::SYNC_NAME,
        configuration: JSON.dump({ "field": "name", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.birthdate"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "birthdate", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.birth_city"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({
          "field": "special_birth_city",
          "required": true
        }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.sex"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "sex", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.race_color"),
        field_type: Admissions::FormField::SELECT,
        configuration: JSON.dump({
          "values": I18n.t("active_scaffold.admissions/form_template.generate_fields.race_colors").values,
          "required": true
        }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.deficiency"),
        field_type: Admissions::FormField::SELECT,
        configuration: JSON.dump({
          "values": I18n.t("active_scaffold.admissions/form_template.generate_fields.deficiencies").values,
          "required": true
        }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.identity_or_passport"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "identity_number", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.identity_issuing_body"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "identity_issuing_body", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.identity_issuing_place"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "identity_issuing_place", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.identity_expedition_date"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "identity_expedition_date", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.cpf"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "cpf", "required": false }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.civil_status"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "civil_status", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.mother_name"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "mother_name", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.father_name"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "father_name" }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.address_group"),
        field_type: Admissions::FormField::GROUP },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.city"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({
          "field": "special_city",
          "required": true
        }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.address"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "special_address", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.neighborhood"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "neighborhood", "required": false }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.zip_code"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "zip_code", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.contact"),
        field_type: Admissions::FormField::GROUP },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.cellphone"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "telephone1", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.telephone"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "telephone2" }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.email"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        sync: Admissions::FormField::SYNC_EMAIL,
        configuration: JSON.dump({ "field": "email", "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.scholarity"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        description: I18n.t("active_scaffold.admissions/form_template.generate_fields.scholarity_description"),
        configuration: JSON.dump({
          "field": "special_majors",
          "values": I18n.t("active_scaffold.admissions/form_template.generate_fields.scholarities").values,
          "statuses": I18n.t("active_scaffold.admissions/form_template.generate_fields.scholarity_statuses").values,
          "scholarity_grade_interval_description": I18n.t("active_scaffold.admissions/form_template.generate_fields.scholarity_grade_interval_description"),
        }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.job"),
        field_type: Admissions::FormField::GROUP },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.employer"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "employer" }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.job_position"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        configuration: JSON.dump({ "field": "job_position" }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.attachments"),
        field_type: Admissions::FormField::GROUP },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.photo"),
        field_type: Admissions::FormField::STUDENT_FIELD,
        description: I18n.t("active_scaffold.admissions/form_template.generate_fields.photo_description"),
        configuration: JSON.dump({ "field": "photo" }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.identity_photo"),
        field_type: Admissions::FormField::FILE,
        description: I18n.t("active_scaffold.admissions/form_template.generate_fields.identity_photo_description"),
        configuration: JSON.dump({ "required": true }) },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.transcript"),
        description: I18n.t("active_scaffold.admissions/form_template.generate_fields.transcript_description"),
        field_type: Admissions::FormField::FILE },
      { name: I18n.t("active_scaffold.admissions/form_template.generate_fields.grades_report"),
        field_type: Admissions::FormField::FILE,
        description: I18n.t("active_scaffold.admissions/form_template.generate_fields.grades_report_description"),
        configuration: JSON.dump({ "required": true }) },
    ]

    @records = attribute_configs.collect do |attributes|
      record = build_associated(@column.association, @parent_record)
      record.assign_attributes(attributes)
      record
    end

    respond_to do |format|
      format.js {
        render action: "populate_field",
          formats: [:js],
          readonly: @column.association.readonly?
      }
    end
  end

  private
    def filled_form_params
      params.permit(
        record: Admissions::FilledFormsController.filled_form_params_definition
      )[:record]
    end
end