tamaloa/direktkreditverwaltung

View on GitHub
app/controllers/contracts_controller.rb

Summary

Maintainability
A
1 hr
Test Coverage
class ContractsController < ApplicationController
  # GET /contracts
  # GET /contracts.json
  def index
    @contracts = Contract.active
    @terminated_contracts = Contract.terminated

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @contracts }
    end
  end

  # GET /contracts/1
  # GET /contracts/1.json
  def show
    @contract = Contract.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.json { render json: @contract }
    end
  end

  # GET /contracts/new
  # GET /contracts/new.json
  def new
    @contact = Contact.find(params[:contact_id])

    respond_to do |format|
      format.html # new.html.erb
      format.json { render json: @contract }
    end
  end

  # GET /contracts/1/edit
  def edit
    @contract = Contract.find(params[:id])
    @contact = Contact.find(@contract.contact_id)
  end

  # POST /contracts
  # POST /contracts.json
  def create
    @contact = Contact.find(params[:contact_id])
    @contract = Contract.new(contract_params)
    @contract.contact = @contact

    respond_to do |format|
      if @contract.save
        format.html { redirect_to @contract, notice: 'Der Vertrag wurde erfolgreich erstellt' }
        format.json { render json: @contract, status: :created, location: @contract }
      else
        format.html { render action: "new" }
        format.json { render json: @contract.errors, status: :unprocessable_entity }
      end
    end
  end

  # PUT /contracts/1
  # PUT /contracts/1.json
  def update
    @contract = Contract.find(params[:id])

    respond_to do |format|
      if @contract.update_attributes(contract_params)
        format.html { redirect_to @contract, notice: 'Der Vertrag wurde erfolgreich aktualisiert.' }
        format.json { head :no_content }
      else
        format.html { render action: "edit" }
        format.json { render json: @contract.errors, status: :unprocessable_entity }
      end
    end
  end

  def prepare_last_version(contract_version, params)
    new_start = params[:last_version_start]
    contract_version.start = Date.new(new_start["(1i)"].to_i, 
                                  new_start["(2i)"].to_i, 
                                  new_start["(3i)"].to_i)
    
    new_end = params[:last_version_end_date]
    if new_end["(1i)"].eql?("") || new_end["(2i)"].eql?("") || new_end["(3i)"].eql?("")
      contract_version.end_date = nil
    else
      contract_version.end_date = Date.new(new_end["(1i)"].to_i, 
                                           new_end["(2i)"].to_i, 
                                           new_end["(3i)"].to_i)
    end
    
    contract_version.duration_months = params[:last_version_duration_months]
    contract_version.duration_years = params[:last_version_duration_years]
    contract_version.interest_rate = params[:last_version_interest_rate]
    contract_version.notice_period = params[:last_version_notice_period]
  end

  # DELETE /contracts/1
  # DELETE /contracts/1.json
  def destroy
    @contract = Contract.find(params[:id])
    @contract.destroy

    respond_to do |format|
      format.html { redirect_to contracts_url }
      format.json { head :no_content }
    end
  end

  # GET /contracts/interest
  def interest
    params[:year] ||= DateTime.now.year
    @contracts = []
    if params[:contract]
      @contracts = [params[:contract]]
    elsif
      @contracts = Contract.order(:number)      
    end
    @year = params[:year].to_i

    if params[:output] && params[:output].index("pdf") == 0
      if params[:output] == "pdf_overview"
        render_pdf(PdfInterestOverview) and return
      elsif params[:output] == "pdf_interest_letter"
        render_pdf(PdfInterestLetter) and return
      elsif params[:output] == "pdf_thanks_letter"
        render_pdf(PdfInterestThanks) and return
      end
    end

    respond_to do |format|
      format.html 
      format.json { render json: @contracts }
    end
  end

  def render_pdf klass
    pdf = klass.new(@contracts, @year, view_context)
    single = @contracts.length == 1 ? "_#{@contracts.first.number}" : ""
    send_data pdf.render, filename: "#{klass.to_s}_#{@year}_contract#{single}.pdf", 
                          type: "application/pdf",
                          disposition: "inline"
  end

  # GET /contracts/interest_transfer_list
  def interest_transfer_list
    params[:year] ||= DateTime.now.year
    @contracts = Contract.order(:number)      
    @year = params[:year].to_i

    respond_to do |format|
      format.html 
      format.json { render json: @contracts }
    end
  end
  
  # GET /contracts/interest_average
  def interest_average
    @contracts = Contract.order(:number)      

    respond_to do |format|
      format.html 
      format.json { render json: @contracts }
    end
  end

  # GET /contracts/expiring
  def expiring
    # get all contracts with specified duration and determine expiring date
    contracts_with_duration = Contract.all.select{ |c| c.last_version.duration_months ||
                                                       c.last_version.duration_years }
    contracts_with_duration.each do |contract|
      last_version = contract.last_version
      duration_in_month = last_version.duration_months || last_version.duration_years * 12
      contract.expiring = duration_in_month.months.since(last_version.start)
    end

    # get alle contracts with specified end_date and set expiring date
    contracts_with_end_date = Contract.all.select{ |c| c.last_version.end_date }
    contracts_with_end_date.each do |contract|
      contract.expiring = contract.last_version.end_date
    end

    # merge both
    @contracts = (contracts_with_duration.concat(contracts_with_end_date)).sort_by(&:expiring)

    respond_to do |format|
      format.html # expiring.html.erb
      format.json { render json: @contracts }
    end
  end

  # GET /contracts/remaining_term
  def remaining_term
    params[:year] ||= DateTime.now.year
    @year = params[:year].to_i
    # determine contracts with account_entries relevant for year
    @contracts = Contract.all_with_remaining_month(@year)
    respond_to do |format|
      format.html # remaining_term.html.erb
    end
  end

  private
  def contract_params
    params.require(:contract).permit(:number, :add_interest_to_deposit_annually, :comment, :category,
                                    contract_versions_attributes: [:version, :start, :interest_rate, :notice_period,
                                                                  :end_date, :duration_month, :duration_years])
  end
end