SpeciesFileGroup/taxonworks

View on GitHub
app/controllers/loans_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
class LoansController < ApplicationController
  include DataControllerConfiguration::ProjectDataControllerConfiguration

  before_action :set_loan, only: [:show, :edit, :update, :destroy, :recipient_form]

  after_action -> { set_pagination_headers(:loans) }, only: [:index], if: :json_request?

  # GET /loans
  # GET /loans.json
  def index
    @recent_objects = Loan.includes(:loan_items, :identifiers).recent_from_project_id(sessions_current_project_id).order(updated_at: :desc).limit(10)
    render '/shared/data/all/index'
  end

  # GET /loans
  # GET /loans.json
  def index
    respond_to do |format|
      format.html do
        @recent_objects = Loan.recent_from_project_id(sessions_current_project_id).order(updated_at: :desc).limit(10)
        render '/shared/data/all/index'
      end
      format.json {
        @loans = ::Queries::Loan::Filter.new(params).all
          .page(params[:page])
          .per(params[:per])
      }
    end
  end

  # GET /loans/1
  # GET /loans/1.json
  def show
  end

  # GET /loans/new
  def new
    redirect_to edit_loan_task_path
    # @loan = Loan.new(params.permit(:clone_from))
  end

  # GET /loans/1/edit
  def edit
    redirect_to edit_loan_task_path(id: params[:id])
  end

  # POST /loans
  # POST /loans.json
  def create
    @loan = Loan.new(loan_params)

    respond_to do |format|
      if @loan.save
        format.html { redirect_to @loan, notice: 'Loan was successfully created.' }
        format.json { render :show, status: :created, location: @loan }
      else
        format.html { render :new }
        format.json { render json: @loan.errors, status: :unprocessable_entity }
      end
    end
  end

  def recipient_form
    render layout: 'us_letter'
  end

  def attributes
    render json: ::Loan.columns.select{
      |a| ::Queries::Loan::Filter::ATTRIBUTES.include?(
        a.name.to_sym)
    }.collect{|b| {'name' => b.name, 'type' => b.type } }
  end

  # PATCH/PUT /loans/1
  # PATCH/PUT /loanss/1.json
  def update
    respond_to do |format|
      if @loan.update(loan_params)
        @loan.reload
        format.html { redirect_to @loan, notice: 'Loan was successfully updated.' }
        format.json { render :show, status: :ok, location: @loan }
      else
        format.html { render :edit }
        format.json { render json: @loan.errors, status: :unprocessable_entity }
      end
    end
  end

  # DELETE /loans/1
  # DELETE /loans/1.json
  def destroy
    @loan.destroy
    respond_to do |format|
      format.html { redirect_to loans_url }
      format.json { head :no_content }
    end
  end

  def list
    @loans = Loan.includes(:identifiers).with_project_id(sessions_current_project_id)
      .order(Arel.sql('LENGTH(identifier), identifier')).references(:identifiers).page(params[:page])
  end

  def search
    if params[:id].blank?
      redirect_to loan_path, alert: 'You must select an item from the list with a click or tab press before clicking show.'
    else
      redirect_to loan_path(params[:id])
    end
  end

  def autocomplete
    @loans = ::Queries::Loan::Autocomplete.new(params[:term], project_id: sessions_current_project_id).autocomplete
  end

  # GET /loans/download
  def download
    send_data Export::CSV.generate_csv(Loan.where(project_id: sessions_current_project_id)), type: 'text', filename: "loans_#{DateTime.now}.tsv"
  end

  # GET /loans/select_options
  def select_options
    @loans = Loan.select_optimized(sessions_current_user_id, sessions_current_project_id)
  end

  private

  def set_loan
    @loan = Loan.with_project_id(sessions_current_project_id).find(params[:id])
    @recent_object = @loan
  end

  def loan_params
    params.require(:loan).permit(
      :date_requested, :request_method, :date_sent, :date_received,
      :date_return_expected, :recipient_person_id, :recipient_address,
      :recipient_email, :recipient_phone, :recipient_country, :supervisor_person_id,
      :supervisor_email, :supervisor_phone, :date_closed, :recipient_honorific,
      :lender_address,
      :is_gift,
      :clone_from,
      :is_gift,
      loan_items_attributes: [
        :_destroy,
        :id,
        :global_entity,
        :loan_item_object_type,
        :loan_item_object_id,
        :position,
        :total,
        :disposition,
        :date_,
        :date_returned_jquery ],
        roles_attributes: [
          :id, :_destroy, :type, :person_id, :position,
          person_attributes: [
            :last_name, :first_name, :suffix, :prefix]],
    )
  end
end