|
|
|
class MergeRequestsController < ApplicationController
|
|
|
|
before_action :find_resource, only: %i[
|
|
|
|
update
|
|
|
|
organisations
|
|
|
|
update_organisations
|
|
|
|
remove_merging_organisation
|
|
|
|
absorbing_organisation
|
|
|
|
confirm_telephone_number
|
|
|
|
new_organisation_name
|
|
|
|
new_organisation_address
|
|
|
|
merge_date
|
|
|
|
]
|
|
|
|
before_action :authenticate_user!
|
|
|
|
before_action :authenticate_scope!, except: [:create]
|
|
|
|
|
|
|
|
def absorbing_organisation; end
|
|
|
|
def confirm_telephone_number; end
|
|
|
|
def new_organisation_name; end
|
|
|
|
def new_organisation_address; end
|
|
|
|
def merge_date; end
|
|
|
|
|
|
|
|
def create
|
|
|
|
ActiveRecord::Base.transaction do
|
|
|
|
@merge_request = MergeRequest.create!(merge_request_params.merge(status: :unsubmitted))
|
|
|
|
MergeRequestOrganisation.create!({ merge_request: @merge_request, merging_organisation: @merge_request.requesting_organisation })
|
|
|
|
end
|
|
|
|
redirect_to organisations_merge_request_path(@merge_request)
|
|
|
|
rescue ActiveRecord::RecordInvalid
|
|
|
|
render_not_found
|
|
|
|
end
|
|
|
|
|
|
|
|
def organisations
|
|
|
|
@answer_options = organisations_answer_options
|
|
|
|
end
|
|
|
|
|
|
|
|
def update
|
|
|
|
validate_response
|
|
|
|
|
|
|
|
if @merge_request.errors.blank? && @merge_request.update(merge_request_params)
|
|
|
|
redirect_to next_page_path
|
|
|
|
else
|
|
|
|
render previous_template, status: :unprocessable_entity
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def update_organisations
|
|
|
|
merge_request_organisation = MergeRequestOrganisation.new(merge_request_organisation_params)
|
|
|
|
@answer_options = organisations_answer_options
|
|
|
|
if merge_request_organisation.save
|
|
|
|
render :organisations
|
|
|
|
else
|
|
|
|
render :organisations, status: :unprocessable_entity
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def remove_merging_organisation
|
|
|
|
MergeRequestOrganisation.find_by(merge_request_organisation_params)&.destroy!
|
|
|
|
@answer_options = organisations_answer_options
|
|
|
|
render :organisations
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def page
|
|
|
|
params.dig(:merge_request, :page)
|
|
|
|
end
|
|
|
|
|
|
|
|
def next_page_path
|
|
|
|
case page
|
|
|
|
when "absorbing_organisation"
|
|
|
|
if create_new_organisation?
|
|
|
|
new_organisation_name_merge_request_path(@merge_request)
|
|
|
|
else
|
|
|
|
confirm_telephone_number_merge_request_path(@merge_request)
|
|
|
|
end
|
|
|
|
when "organisations"
|
|
|
|
absorbing_organisation_merge_request_path(@merge_request)
|
|
|
|
when "confirm_telephone_number"
|
|
|
|
merge_date_merge_request_path(@merge_request)
|
|
|
|
when "new_organisation_name"
|
|
|
|
new_organisation_address_merge_request_path(@merge_request)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def previous_template
|
|
|
|
page
|
|
|
|
end
|
|
|
|
|
|
|
|
def create_new_organisation?
|
|
|
|
params.dig(:merge_request, :absorbing_organisation_id) == "other"
|
|
|
|
end
|
|
|
|
|
|
|
|
def organisations_answer_options
|
|
|
|
answer_options = { "" => "Select an option" }
|
|
|
|
|
|
|
|
Organisation.all.pluck(:id, :name).each do |organisation|
|
|
|
|
answer_options[organisation[0]] = organisation[1]
|
|
|
|
end
|
|
|
|
answer_options
|
|
|
|
end
|
|
|
|
|
|
|
|
def merge_request_params
|
|
|
|
merge_params = params.fetch(:merge_request, {}).permit(
|
|
|
|
:requesting_organisation_id,
|
|
|
|
:other_merging_organisations,
|
|
|
|
:status,
|
|
|
|
:absorbing_organisation_id,
|
|
|
|
:telephone_number_correct,
|
|
|
|
:new_telephone_number,
|
|
|
|
:new_organisation_name,
|
|
|
|
)
|
|
|
|
|
|
|
|
if merge_params[:requesting_organisation_id].present? && (current_user.data_coordinator? || current_user.data_provider?)
|
|
|
|
merge_params[:requesting_organisation_id] = current_user.organisation.id
|
|
|
|
end
|
|
|
|
|
|
|
|
if merge_params[:absorbing_organisation_id].present?
|
|
|
|
if create_new_organisation?
|
|
|
|
merge_params[:new_absorbing_organisation] = true
|
|
|
|
merge_params[:absorbing_organisation_id] = nil
|
|
|
|
else
|
|
|
|
merge_params[:new_absorbing_organisation] = false
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
if merge_params[:telephone_number_correct] == "true"
|
|
|
|
merge_params[:new_telephone_number] = nil
|
|
|
|
end
|
|
|
|
|
|
|
|
merge_params
|
|
|
|
end
|
|
|
|
|
|
|
|
def validate_response
|
|
|
|
case page
|
|
|
|
when "absorbing_organisation"
|
|
|
|
if merge_request_params[:absorbing_organisation_id].blank? && merge_request_params[:new_absorbing_organisation].blank?
|
|
|
|
@merge_request.errors.add(:absorbing_organisation_id, :blank)
|
|
|
|
end
|
|
|
|
when "confirm_telephone_number"
|
|
|
|
if merge_request_params[:telephone_number_correct].blank?
|
|
|
|
@merge_request.errors.add(:telephone_number_correct, :blank) if @merge_request.absorbing_organisation.phone.present?
|
|
|
|
@merge_request.errors.add(:new_telephone_number, :blank) if @merge_request.absorbing_organisation.phone.blank?
|
|
|
|
end
|
|
|
|
when "new_organisation_name"
|
|
|
|
@merge_request.errors.add(:new_organisation_name, :blank) if merge_request_params[:new_organisation_name].blank?
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def merge_request_organisation_params
|
|
|
|
{
|
|
|
|
merge_request: @merge_request,
|
|
|
|
merging_organisation_id: params.dig(:merge_request, :merging_organisation),
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
def find_resource
|
|
|
|
@merge_request = MergeRequest.find(params[:id])
|
|
|
|
end
|
|
|
|
|
|
|
|
def authenticate_scope!
|
|
|
|
if current_user.organisation != @merge_request.requesting_organisation && !current_user.support?
|
|
|
|
render_not_found
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|