Submit social housing lettings and sales data (CORE)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

203 lines
6.4 KiB

class MergeRequestsController < ApplicationController
before_action :find_resource, exclude: %i[create new]
before_action :authenticate_user!
before_action :authenticate_scope!
before_action :set_organisations_answer_options, only: %i[merging_organisations absorbing_organisation update_merging_organisations remove_merging_organisation update]
def absorbing_organisation; end
def merge_date; end
def existing_absorbing_organisation; end
def helpdesk_ticket; end
def merge_start_confirmation; end
def user_outcomes; end
def relationship_outcomes; end
def scheme_outcomes; end
def logs_outcomes; end
def create
ActiveRecord::Base.transaction do
@merge_request = MergeRequest.create!(merge_request_params.merge(status: :incomplete, requester: current_user))
end
redirect_to absorbing_organisation_merge_request_path(@merge_request)
rescue ActiveRecord::RecordInvalid
render_not_found
end
def update
validate_response
if @merge_request.errors.blank? && @merge_request.update(merge_request_params)
add_merging_organsations if page == "merging_organisations"
remove_absorbing_org_from_merging_organisations if page == "absorbing_organisation" && @merge_request.absorbing_organisation_id.present?
redirect_to next_page_path
else
render previous_template, status: :unprocessable_entity
end
end
def update_merging_organisations
@new_merging_org_ids = params["merge_request"]["new_merging_org_ids"].split(" ")
merge_request_organisation = MergeRequestOrganisation.new(merge_request_organisation_params)
if merge_request_organisation.valid?
@new_merging_org_ids.push(merge_request_organisation_params[:merging_organisation_id])
render :merging_organisations
else
render :merging_organisations, status: :unprocessable_entity
end
end
def remove_merging_organisation
@new_merging_org_ids = params["merge_request"]["new_merging_org_ids"] || []
org_id_to_remove = merge_request_organisation_params[:merging_organisation_id]
@new_merging_org_ids.delete(org_id_to_remove)
MergeRequestOrganisation.find_by(merge_request_organisation_params)&.destroy!
render :merging_organisations
end
def delete
@merge_request.discard!
flash[:notice] = "The merge request has been deleted."
redirect_to organisations_path(tab: "merge-requests")
end
def merging_organisations
@new_merging_org_ids = []
end
def start_merge
if @merge_request.status == "ready_to_merge"
@merge_request.start_merge!
ProcessMergeRequestJob.perform_later(merge_request: @merge_request)
end
redirect_to merge_request_path(@merge_request)
end
private
def page
params.dig(:merge_request, :page)
end
def next_page_path
return merge_request_path if is_referrer_type?("check_answers")
case page
when "absorbing_organisation"
merging_organisations_merge_request_path(@merge_request)
when "merging_organisations"
merge_date_merge_request_path(@merge_request)
when "merge_date"
existing_absorbing_organisation_merge_request_path(@merge_request)
when "existing_absorbing_organisation"
helpdesk_ticket_merge_request_path(@merge_request)
when "helpdesk_ticket"
merge_request_path(@merge_request)
end
end
def previous_template
page
end
def set_organisations_answer_options
answer_options = { "" => "Select an option" }
if current_user.support?
Organisation.all.pluck(:id, :name).each do |organisation|
answer_options[organisation[0]] = organisation[1]
end
end
@answer_options = answer_options
end
def merge_request_params
merge_params = params.fetch(:merge_request, {}).permit(
:requesting_organisation_id,
:helpdesk_ticket,
:status,
:absorbing_organisation_id,
:merge_date,
:existing_absorbing_organisation,
)
merge_params[:requesting_organisation_id] = current_user.organisation.id
merge_params
end
def validate_response
case page
when "absorbing_organisation"
if merge_request_params[:absorbing_organisation_id].blank?
@merge_request.errors.add(:absorbing_organisation_id, :blank)
end
when "merge_date"
day = merge_request_params["merge_date(3i)"]
month = merge_request_params["merge_date(2i)"]
year = merge_request_params["merge_date(1i)"]
return @merge_request.errors.add(:merge_date, :blank) if [day, month, year].all?(&:blank?)
if [day, month, year].none?(&:blank?) && Date.valid_date?(year.to_i, month.to_i, day.to_i)
merge_request_params["merge_date"] = Time.zone.local(year.to_i, month.to_i, day.to_i)
@merge_request.errors.add(:merge_date, :more_than_year_from_today) if Time.zone.local(year.to_i, month.to_i, day.to_i) - 1.year > Time.zone.today
else
@merge_request.errors.add(:merge_date, :invalid)
end
when "existing_absorbing_organisation"
if merge_request_params[:existing_absorbing_organisation].nil?
@merge_request.errors.add(:existing_absorbing_organisation, :blank)
end
end
end
def merge_request_organisation_params
{
merge_request: @merge_request,
merging_organisation_id: params.dig(:merge_request, :merging_organisation),
}
end
def find_resource
return if params[:id].blank?
@merge_request = MergeRequest.find(params[:id])
end
def authenticate_scope!
unless current_user.support?
render_not_found
end
end
def is_referrer_type?(referrer_type)
from_referrer_query("referrer") == referrer_type
end
def from_referrer_query(query_param)
referrer = request.headers["HTTP_REFERER"]
return unless referrer
query_params = URI.parse(referrer).query
return unless query_params
parsed_params = CGI.parse(query_params)
parsed_params[query_param]&.first
end
def add_merging_organsations
new_merging_org_ids = params["merge_request"]["new_merging_org_ids"].split(" ")
new_merging_org_ids.each do |org_id|
MergeRequestOrganisation.create!(merge_request: @merge_request, merging_organisation_id: org_id)
end
end
def remove_absorbing_org_from_merging_organisations
if @merge_request.merge_request_organisations.where(merging_organisation_id: @merge_request.absorbing_organisation_id).exists?
MergeRequestOrganisation.find_by(merge_request: @merge_request, merging_organisation_id: @merge_request.absorbing_organisation_id).destroy!
end
end
end