Newer
Older
dmpopidor / app / controllers / org_admin / plans_controller.rb
# frozen_string_literal: true

class OrgAdmin::PlansController < ApplicationController

  prepend Dmpopidor::Controllers::OrgAdmin::Plans

  # GET org_admin/plans
  # SEE MODULE
  def index
    # Test auth directly and throw Pundit error sincePundit
    # is unaware of namespacing
    unless current_user.present? && current_user.can_org_admin?
      raise Pundit::NotAuthorizedError
    end

    feedback_ids = Role.creator.joins(:user,:plan)
      .where('users.org_id = ? AND plans.feedback_requested is TRUE AND roles.active is TRUE',
               current_user.org_id).pluck(:plan_id)
    @feedback_plans = Plan.where(id: feedback_ids).reject{|p| p.nil?}
    @plans = current_user.org.plans.page(1)
  end

  # GET org_admin/plans/:id/feedback_complete
  def feedback_complete
    plan = Plan.find(params[:id])
    requestor = User.find(plan.feedback_requestor)
    # Test auth directly and throw Pundit error sincePundit is
    # unaware of namespacing
    unless current_user.present? && current_user.can_org_admin?
      raise Pundit::NotAuthorizedError
    end
    unless plan.reviewable_by?(current_user.id)
      raise Pundit::NotAuthorizedError
    end

    if plan.complete_feedback(current_user)
      # rubocop:disable Metrics/LineLength
      redirect_to(org_admin_plans_path,
        notice: _("%{plan_owner} has been notified that you have finished providing feedback") % {
          plan_owner: requestor.name(false)
        }
      )
      # rubocop:enable Metrics/LineLength
    else
      redirect_to org_admin_plans_path,
        alert: _("Unable to notify user that you have finished providing feedback.")
    end
  end

  # GET /org_admin/download_plans
  # SEE MODULE
  def download_plans
    # Test auth directly and throw Pundit error sincePundit
    # is unaware of namespacing
    unless current_user.present? && current_user.can_org_admin?
      raise Pundit::NotAuthorizedError
    end

    org = current_user.org
    file_name = org.name.gsub(/ /, "_")
                        .gsub(/[\.;,]/, "")
    header_cols = [
      "#{_('Project title')}",
      "#{_('Template')}",
      "#{_('Organisation')}",
      "#{_('Owner name')}",
      "#{_('Owner email')}",
      "#{_('Updated')}",
      "#{_('Visibility')}"
    ]

    plans = CSV.generate do |csv|
      csv << header_cols
      org.plans.includes(template: :org).order(updated_at: :desc).each do |plan|
        owner = plan.owner
        csv << [
          "#{plan.title}",
          "#{plan.template.title}",
          "#{plan.owner.org.present? ? plan.owner.org.name : ''}",
          "#{plan.owner.name(false)}",
          "#{plan.owner.email}",
          "#{l(plan.latest_update.to_date, format: :csv)}",
          "#{Plan::VISIBILITY_MESSAGE[plan.visibility.to_sym].capitalize}"
        ]
      end
    end

    respond_to do |format|
      format.csv  { send_data plans,  filename: "#{file_name}.csv" }
    end
  end

end