Codeminer42/Punchclock

View on GitHub
app/admin/vacation.rb

Summary

Maintainability
A
0 mins
Test Coverage
A
100%
# frozen_string_literal: true

ActiveAdmin.register Vacation do
  actions :all, except: [:new, :create]

  permit_params :start_date, :end_date, :status, :user_id, :hr_approver_id, :commercial_approver_id, :denier_id

  menu parent: User.model_name.human(count: 2)

  config.sort_order = 'start_date_asc'

  filter :start_date
  filter :end_date
  filter :user, as: :select, collection: -> { User.includes(:vacations).engineer.active.where.not(vacations: { user: nil } ) }

  member_action :approve, method: :put do
    resource.approve!(current_user)

    if resource.approved?
      VacationMailer.notify_vacation_approved(resource).deliver_later
      VacationMailer.admin_vacation_approved(resource).deliver_later
    end

    redirect_to admin_vacations_path, notice: I18n.t("vacation_approved")
  end

  member_action :denied, method: :put do
    resource.deny!(current_user)
    VacationMailer.notify_vacation_denied(resource).deliver_later
    redirect_to admin_vacations_path(scope: :denied), notice: I18n.t("vacation_denied")
  end

  member_action :cancel, method: :put do
    resource.cancel!(current_user)
    VacationMailer.notify_vacation_cancelled(resource).deliver_later
    redirect_to admin_vacations_path(scope: :cancelled), notice: I18n.t("vacation_cancelled")
  end 

  scope :ongoing_and_scheduled, default: true
  scope :pending
  scope :approved
  scope :denied
  scope :finished
  scope :cancelled 
  scope :all

  index do
    column :user
    column :start_date do |vacation|
      l(vacation.start_date, format: :default)
    end
    column :end_date do |vacation|
      l(vacation.end_date, format: :default)
    end
    column :status, &:status_text
    column :hr_approver
    column :commercial_approver
    column :denier

    if authorized? :approve, Vacation
      actions defaults: false do |vacation|
        link_to I18n.t('approve'), approve_admin_vacation_path(vacation), method: :put if vacation.pending?
      end
    end

    if authorized? :denied, Vacation
      actions defaults: false do |vacation|
        link_to I18n.t('refuse'), denied_admin_vacation_path(vacation), method: :put if vacation.pending?
      end
    end

    if authorized? :cancel, Vacation
      actions defaults: false do |vacation|
        link_to I18n.t('cancel'), cancel_admin_vacation_path(vacation), method: :put if vacation.approved?
      end 
    end 
  end
end