diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb index a7ee469b8..e2d557b77 100644 --- a/app/controllers/form_controller.rb +++ b/app/controllers/form_controller.rb @@ -60,11 +60,34 @@ class FormController < ApplicationController render_not_found end end + define_method("new_log_#{page.id}") do |_errors = {}| + if @lettings_log + save_new_log page + restore_error_field_values + @subsection = @lettings_log.form.subsection_for_page(page) + @page = @lettings_log.form.get_page(page.id) + if @page.routed_to?(@lettings_log, current_user) + render "form/page" + else + redirect_to lettings_log_path(@lettings_log) + end + else + render_not_found + end + end end end private + def save_new_log(page) + if current_user.support? + @lettings_log.save! unless page.id.eql?("organisation") && @lettings_log.id.nil? + else + @lettings_log.save! unless page.id.eql?("needs_type") && @lettings_log.id.nil? + end + end + def restore_error_field_values if session["errors"] JSON(session["errors"]).each do |field, messages| @@ -109,11 +132,27 @@ private end def find_resource - @lettings_log = current_user.lettings_logs.find_by(id: params[:id]) + @lettings_log = if is_new_log_request? || new_log_referrer? + LettingsLog.new(owning_organisation: current_user.support? ? nil : current_user.organisation) + else + current_user.lettings_logs.find_by(id: params[:id]) + end end def find_resource_by_named_id - @lettings_log = current_user.lettings_logs.find_by(id: params[:lettings_log_id]) + @lettings_log = if is_new_log_request? + LettingsLog.new + else + current_user.lettings_logs.find_by(id: params[:lettings_log_id]) + end + end + + def new_log_request? + request.path.split("/").include?("new") + end + + def new_log_request_referrer? + request.referer.split("/").include?("new") end def is_referrer_check_answers? diff --git a/app/controllers/lettings_logs_controller.rb b/app/controllers/lettings_logs_controller.rb index a19fdbe6d..3bb068d3a 100644 --- a/app/controllers/lettings_logs_controller.rb +++ b/app/controllers/lettings_logs_controller.rb @@ -28,18 +28,9 @@ class LettingsLogsController < ApplicationController end def create - lettings_log = LettingsLog.new(lettings_log_params) respond_to do |format| format.html do - lettings_log.save! - redirect_to lettings_log_url(lettings_log) - end - format.json do - if lettings_log.save - render json: lettings_log, status: :created - else - render json: { errors: lettings_log.errors.messages }, status: :unprocessable_entity - end + redirect_to new_log_lettings_logs_path end end end @@ -71,7 +62,12 @@ class LettingsLogsController < ApplicationController end def edit - @lettings_log = current_user.lettings_logs.find_by(id: params[:id]) + @lettings_log = if new_log_request? + LettingsLog.new(lettings_log_params) + else + current_user.lettings_logs.find_by(id: params[:id]) + end + if @lettings_log render :edit, locals: { current_user: } else @@ -95,6 +91,10 @@ private API_ACTIONS = %w[create show update destroy].freeze + def new_log_request? + request.path.split("/").include?("new") + end + def search_term params["search"] end diff --git a/app/helpers/tasklist_helper.rb b/app/helpers/tasklist_helper.rb index e4308d97e..78eaac42e 100644 --- a/app/helpers/tasklist_helper.rb +++ b/app/helpers/tasklist_helper.rb @@ -17,7 +17,11 @@ module TasklistHelper else "lettings_log_#{next_question_page(subsection, lettings_log, current_user)}_path" end - send(path, lettings_log) + if lettings_log.id + send(path, lettings_log) + else + "/logs/new/#{next_question_page(subsection, lettings_log, current_user)}" + end end def next_question_page(subsection, lettings_log, current_user) diff --git a/app/models/form.rb b/app/models/form.rb index 6fa92bba0..f965b14d2 100644 --- a/app/models/form.rb +++ b/app/models/form.rb @@ -60,7 +60,7 @@ class Form if nxt_page == :check_answers "lettings_log_#{subsection_for_page(page).id}_check_answers_path" else - "lettings_log_#{nxt_page}_path" + lettings_log.id ? "lettings_log_#{nxt_page}_path" : "new_#{nxt_page}_lettings_logs_path" end end diff --git a/app/models/form/subsection.rb b/app/models/form/subsection.rb index d42f8dadb..4084789d8 100644 --- a/app/models/form/subsection.rb +++ b/app/models/form/subsection.rb @@ -34,7 +34,8 @@ class Form::Subsection qs = applicable_questions(lettings_log) qs_optional_removed = qs.reject { |q| lettings_log.optional_fields.include?(q.id) } - return :not_started if qs.count.positive? && qs.all? { |question| lettings_log[question.id].blank? || question.read_only? || question.derived? } + return :not_started if lettings_log.id.nil? + return :in_progress if qs.count.positive? && qs.all? { |question| lettings_log[question.id].blank? || question.read_only? || question.derived? } return :completed if qs_optional_removed.all? { |question| question.completed?(lettings_log) } :in_progress diff --git a/app/models/lettings_log.rb b/app/models/lettings_log.rb index 142c48e52..012abc737 100644 --- a/app/models/lettings_log.rb +++ b/app/models/lettings_log.rb @@ -70,7 +70,7 @@ class LettingsLog < ApplicationRecord OPTIONAL_FIELDS = %w[first_time_property_let_as_social_housing tenancycode propcode].freeze RENT_TYPE_MAPPING_LABELS = { 1 => "Social Rent", 2 => "Affordable Rent", 3 => "Intermediate Rent" }.freeze HAS_BENEFITS_OPTIONS = [1, 6, 8, 7].freeze - STATUS = { "not_started" => 0, "in_progress" => 1, "completed" => 2 }.freeze + STATUS = { "in_progress" => 1, "completed" => 2 }.freeze NUM_OF_WEEKS_FROM_PERIOD = { 2 => 26, 3 => 13, 4 => 12, 5 => 50, 6 => 49, 7 => 48, 8 => 47, 9 => 46, 1 => 52 }.freeze SUFFIX_FROM_PERIOD = { 2 => "every 2 weeks", 3 => "every 4 weeks", 4 => "every month" }.freeze RETIREMENT_AGES = { "M" => 67, "F" => 60, "X" => 67 }.freeze @@ -534,8 +534,6 @@ private def update_status! self.status = if all_fields_completed? && errors.empty? "completed" - elsif all_fields_nil? - "not_started" else "in_progress" end diff --git a/app/views/form/page.html.erb b/app/views/form/page.html.erb index 0fe72f647..2803cff4e 100644 --- a/app/views/form/page.html.erb +++ b/app/views/form/page.html.erb @@ -4,8 +4,10 @@ <%= govuk_back_link(href: "javascript:history.back()") %> <% end %> +<% path_url = @lettings_log.id ? form_lettings_log_path(@lettings_log) : new_form_lettings_logs_path %> +
-<%= form_with model: @lettings_log, url: form_lettings_log_path(@lettings_log), method: "post", local: true do |f| %> +<%= form_with model: @lettings_log, url: path_url, method: "post", local: true do |f| %>