From bd05b8e531a64255c66862af84b0a55f085f7f1f Mon Sep 17 00:00:00 2001
From: Dushan Despotovic <dushan@madetech.com>
Date: Fri, 1 Apr 2022 17:13:39 +0100
Subject: [PATCH 1/8] WIP

---
 app/controllers/form_controller.rb       | 12 +++++-
 app/frontend/application.js              | 10 ++++-
 app/frontend/styles/application.scss     |  6 ++-
 app/views/case_logs/_tasklist.html.erb   |  4 ++
 app/views/form/review.html.erb           | 33 +++++++++++++++
 config/forms/2021_2022.json              | 51 +++++++-----------------
 config/routes.rb                         |  1 +
 db/schema.rb                             |  2 +-
 package.json                             |  1 +
 spec/features/form/review_page_spec.rb   | 34 ++++++++++++++++
 spec/features/form/tasklist_page_spec.rb |  7 ++++
 webpack.config.js                        |  2 +-
 yarn.lock                                | 22 +++++++++-
 13 files changed, 141 insertions(+), 44 deletions(-)
 create mode 100644 app/views/form/review.html.erb
 create mode 100644 spec/features/form/review_page_spec.rb

diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb
index 295a82c16..1160fcf06 100644
--- a/app/controllers/form_controller.rb
+++ b/app/controllers/form_controller.rb
@@ -1,7 +1,7 @@
 class FormController < ApplicationController
   before_action :authenticate_user!
-  before_action :find_resource, only: [:submit_form]
-  before_action :find_resource_by_named_id, except: [:submit_form]
+  before_action :find_resource, only: [:submit_form, :review]
+  before_action :find_resource_by_named_id, except: [:submit_form, :review]
 
   def submit_form
     if @case_log
@@ -37,6 +37,14 @@ class FormController < ApplicationController
     end
   end
 
+  def review
+    if @case_log
+      render "form/review"
+    else
+      render_not_found
+    end
+  end 
+
   FormHandler.instance.forms.each do |_key, form|
     form.pages.map do |page|
       define_method(page.id) do |_errors = {}|
diff --git a/app/frontend/application.js b/app/frontend/application.js
index 98742bb09..708629ad9 100644
--- a/app/frontend/application.js
+++ b/app/frontend/application.js
@@ -12,9 +12,15 @@ import "custom-event-polyfill"
 import "intersection-observer"
 //
 
+// Import GOV.UK Frontend
+import GOVUKFrontend from 'govuk-frontend'
+
+// Import GOV.UK Prototype Components
+import GOVUKPrototypeComponents from 'govuk-prototype-components'
+
 require.context("govuk-frontend/govuk/assets")
-import { initAll } from "govuk-frontend"
 import "./styles/application.scss"
 import "./controllers"
 
-initAll()
+GOVUKFrontend.initAll()
+GOVUKPrototypeComponents.initAll()
diff --git a/app/frontend/styles/application.scss b/app/frontend/styles/application.scss
index 3d01074ec..f2251ea5d 100644
--- a/app/frontend/styles/application.scss
+++ b/app/frontend/styles/application.scss
@@ -10,7 +10,11 @@ $govuk-font-url-function: frontend-font-url;
 $govuk-image-url-function: frontend-image-url;
 $govuk-global-styles: true;
 
-@import "~govuk-frontend/govuk/all";
+// Import GOV.UK Frontend
+@import "govuk-frontend/govuk/all";
+
+// Import GOV.UK Prototype Components
+// @import "govuk-prototype-components/x-govuk/all";
 
 @import "accessible-autocomplete";
 @import "button";
diff --git a/app/views/case_logs/_tasklist.html.erb b/app/views/case_logs/_tasklist.html.erb
index 42adcd340..a1ae6d2f6 100644
--- a/app/views/case_logs/_tasklist.html.erb
+++ b/app/views/case_logs/_tasklist.html.erb
@@ -24,3 +24,7 @@
     </li>
   <% end %>
 </ol>
+
+<h2 class="govuk-heading-m">Review and submit</h2>
+<p>Review your answers and submit this log to the Department of Levelling Up, Housing & Communities.</p>
+<%= govuk_button_link_to 'Review lettings log', "/logs/#{@case_log.id}/review" %>
\ No newline at end of file
diff --git a/app/views/form/review.html.erb b/app/views/form/review.html.erb
new file mode 100644
index 000000000..b5827d854
--- /dev/null
+++ b/app/views/form/review.html.erb
@@ -0,0 +1,33 @@
+<% content_for :title, "Review lettings log" %>
+<% content_for :breadcrumbs, govuk_breadcrumbs(breadcrumbs: {
+  "Logs" => "/logs",
+  "Log #{@case_log.id.to_s}" => "/logs/" + @case_log.id.to_s,
+  "Review lettings log" => ""
+}) %>
+
+<%= turbo_frame_tag "case_log_form", target: "_top" do %>
+  <div class="govuk-grid-row">
+    <div class="govuk-grid-column-two-thirds-from-desktop">
+      <h1 class="govuk-heading-xl">
+        <%= content_for(:title) %>
+      </h1>
+      <% @case_log.form.sections.map do |section|  %>
+      <h2 class="govuk-heading-m"><%= section.label %></h2>
+        <% section.subsections.map do |subsection|  %>
+          <div class="x-govuk-summary-card govuk-!-margin-bottom-6">
+            <div class="x-govuk-summary-card__header">
+              <h3 class="x-govuk-summary-card__title"><%= subsection.label %></h3>
+            </div>
+            <div class="x-govuk-summary-card__body">
+              <dl class="govuk-summary-list">
+                <% subsection.applicable_questions(@case_log).each do |question| %>
+                  <%= render partial: 'form/check_answers_table', locals: { question: question, case_log: @case_log } %>
+                <% end %>
+              </dl>
+            </div>
+          </div>
+        <% end %>
+      <% end %>
+    </div>
+  </div>
+<% end %>
\ No newline at end of file
diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json
index 0b92bf3b2..10efab899 100644
--- a/config/forms/2021_2022.json
+++ b/config/forms/2021_2022.json
@@ -1110,6 +1110,21 @@
             }
           ],
           "pages": {
+            "declaration": {
+              "header": "",
+              "description": "",
+              "questions": {
+                "declaration": {
+                  "check_answer_label": "",
+                  "header": "Submit this lettings log ",
+                  "hint_text": "",
+                  "type": "checkbox",
+                  "answer_options": {
+                    "declaration": "The tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice"
+                  }
+                }
+              }
+            },
             "household_members": {
               "header": "",
               "description": "",
@@ -5685,42 +5700,6 @@
           }
         }
       }
-    },
-    "submission": {
-      "label": "Submission",
-      "subsections": {
-        "declaration": {
-          "label": "Declaration",
-          "depends_on": [
-            {
-              "setup": "completed",
-              "household_characteristics": "completed",
-              "household_situation": "completed",
-              "household_needs": "completed",
-              "tenancy_information": "completed",
-              "property_information": "completed",
-              "income_and_benefits": "completed"
-            }
-          ],
-          "pages": {
-            "declaration": {
-              "header": "",
-              "description": "",
-              "questions": {
-                "declaration": {
-                  "check_answer_label": "",
-                  "header": "Submit this lettings log ",
-                  "hint_text": "",
-                  "type": "checkbox",
-                  "answer_options": {
-                    "declaration": "The tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice"
-                  }
-                }
-              }
-            }
-          }
-        }
-      }
     }
   }
 }
diff --git a/config/routes.rb b/config/routes.rb
index 4cb364878..3c8995519 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -77,6 +77,7 @@ Rails.application.routes.draw do
 
     member do
       post "form", to: "form#submit_form"
+      get "review", to: "form#review"
     end
 
     FormHandler.instance.forms.each do |_key, form|
diff --git a/db/schema.rb b/db/schema.rb
index 61368691c..882dde6f6 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -321,9 +321,9 @@ ActiveRecord::Schema[7.0].define(version: 202202071123100) do
     t.integer "failed_attempts", default: 0
     t.string "unlock_token"
     t.datetime "locked_at", precision: nil
+    t.string "phone"
     t.boolean "is_dpo", default: false
     t.boolean "is_key_contact", default: false
-    t.string "phone"
     t.integer "second_factor_attempts_count", default: 0
     t.string "encrypted_otp_secret_key"
     t.string "encrypted_otp_secret_key_iv"
diff --git a/package.json b/package.json
index 463c20606..856c0c124 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
     "custom-event-polyfill": "^1.0.7",
     "file-loader": "^6.2.0",
     "govuk-frontend": "^4.0.1",
+    "govuk-prototype-components": "^0.1.5",
     "html5shiv": "^3.7.3",
     "intersection-observer": "^0.12.0",
     "mini-css-extract-plugin": "^2.6.0",
diff --git a/spec/features/form/review_page_spec.rb b/spec/features/form/review_page_spec.rb
new file mode 100644
index 000000000..ece35c82e
--- /dev/null
+++ b/spec/features/form/review_page_spec.rb
@@ -0,0 +1,34 @@
+require "rails_helper"
+require_relative "helpers"
+
+RSpec.describe "Form Review Page" do
+  include Helpers
+  let(:user) { FactoryBot.create(:user) }
+  let(:completed_unsubmitted_case_log) do
+    FactoryBot.create(
+      :case_log,
+      :completed,
+      status: 1,
+      owning_organisation: user.organisation,
+      managing_organisation: user.organisation,
+    )
+  end
+
+  before do
+    sign_in user
+  end
+
+  context "when the user wishes to review their case log" do
+    it "the review page can be visited by URL" do
+      visit("/logs/#{completed_unsubmitted_case_log.id}/review")
+      expect(page).to have_content("Review lettings log")
+    end
+
+    it "the review page allows the user to submit a completed case log" do
+      visit("/logs/#{completed_unsubmitted_case_log.id}/review")
+      click_button("Submit lettings log")
+      expect(page).to have_content("Success")
+      expect(page).to have_content("Log #{completed_unsubmitted_case_log.id} has been submitted")
+    end 
+  end
+end
diff --git a/spec/features/form/tasklist_page_spec.rb b/spec/features/form/tasklist_page_spec.rb
index 7f869ded4..6acb1ef6a 100644
--- a/spec/features/form/tasklist_page_spec.rb
+++ b/spec/features/form/tasklist_page_spec.rb
@@ -42,4 +42,11 @@ RSpec.describe "Task List" do
     visit("/logs/#{empty_case_log.id}")
     expect(page).to have_link("Skip to next incomplete section", href: /#household-characteristics/)
   end
+
+  it "has a review section which has a button that allows the data inputter to review the case log" do
+    visit("/logs/#{case_log.id}")
+    expect(page).to have_content("Review your answers and submit this log to the Department of Levelling Up, Housing & Communities.")
+    click_link(text: "Review lettings log")
+    expect(page).to have_current_path("/logs/#{case_log.id}/review")
+  end 
 end
diff --git a/webpack.config.js b/webpack.config.js
index 14ff8fd36..0f7e8f987 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -43,7 +43,7 @@ module.exports = {
     ],
   },
   resolve: {
-    modules: ['node_modules', 'node_modules/govuk-frontend/govuk']
+    modules: ['node_modules', 'node_modules/govuk-frontend/govuk', 'node_modules/govuk-prototype-components/x-govuk']
   },
   output: {
     filename: "[name].js",
diff --git a/yarn.lock b/yarn.lock
index 9270ef046..51118f2d5 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1164,7 +1164,7 @@
   resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d"
   integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
 
-accessible-autocomplete@^2.0.3:
+accessible-autocomplete@^2.0.3, accessible-autocomplete@^2.0.4:
   version "2.0.4"
   resolved "https://registry.yarnpkg.com/accessible-autocomplete/-/accessible-autocomplete-2.0.4.tgz#e295256c8d268b97c5ab456a1cb084b553ed3eb0"
   integrity sha512-2p0txrSpvs5wXFUeQJHMheDPTZVSEmiUHWlEPb7vJnv2Dd1xPfoLnBQQMfNbTSit2pL/9sSQYESuD2Yyohd4Yw==
@@ -1647,6 +1647,11 @@ events@^3.2.0:
   resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
   integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
 
+eventslibjs@^1.2.0:
+  version "1.2.0"
+  resolved "https://registry.yarnpkg.com/eventslibjs/-/eventslibjs-1.2.0.tgz#5d242b1d71d7376b999611448e91b7947d8cb9d0"
+  integrity sha512-nui7FHXHeeZjWkQ1dZ4R3RchkT+164+y1/puiOY1Zc3CPU9W8XzAzdhqvuVQ4EJt7F/W94O5U26/oVFpBOPY3w==
+
 execa@^5.0.0:
   version "5.1.1"
   resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
@@ -1797,6 +1802,16 @@ govuk-frontend@^4.0.1:
   resolved "https://registry.yarnpkg.com/govuk-frontend/-/govuk-frontend-4.0.1.tgz#bceff58ecb399272cba32bd2b357fe16198e3249"
   integrity sha512-X+B88mqYHoxAz0ID87Uxo3oHqdKBRnNHd3Cz8+u8nvQUAsrEzROFLK+t7sAu7e+fKqCCrJyIgx6Cmr6dIGnohQ==
 
+govuk-prototype-components@^0.1.5:
+  version "0.1.5"
+  resolved "https://registry.yarnpkg.com/govuk-prototype-components/-/govuk-prototype-components-0.1.5.tgz#e420c3200660fc6ff0f4df66474e8796ec446d37"
+  integrity sha512-ssUW5qcxnyJ9B+TRafRjLdeMmAK67cC5TE5TzkVhoMDzdYTQWzfp+FtFg2SFM0dO9pAc1npMVxZ8rUxEA174IQ==
+  dependencies:
+    accessible-autocomplete "^2.0.4"
+    eventslibjs "^1.2.0"
+    govuk-frontend "^4.0.1"
+    lodash "^4.17.21"
+
 graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9:
   version "4.2.9"
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
@@ -2040,6 +2055,11 @@ lodash.debounce@^4.0.8:
   resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
   integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
 
+lodash@^4.17.21:
+  version "4.17.21"
+  resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
 lru-cache@^6.0.0:
   version "6.0.0"
   resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"

From 0056946aa3e0a557631e9256c7e5f47adcfcf80a Mon Sep 17 00:00:00 2001
From: baarkerlounger <db@slothlife.xyz>
Date: Mon, 4 Apr 2022 16:43:47 +0100
Subject: [PATCH 2/8] Unpleasant but works

---
 app/frontend/application.js                          | 8 ++------
 app/frontend/controllers/govukfrontend_controller.js | 6 ++++--
 app/frontend/styles/application.scss                 | 7 ++-----
 webpack.config.js                                    | 2 +-
 4 files changed, 9 insertions(+), 14 deletions(-)

diff --git a/app/frontend/application.js b/app/frontend/application.js
index 708629ad9..4bff5c3e9 100644
--- a/app/frontend/application.js
+++ b/app/frontend/application.js
@@ -12,13 +12,9 @@ import "custom-event-polyfill"
 import "intersection-observer"
 //
 
-// Import GOV.UK Frontend
-import GOVUKFrontend from 'govuk-frontend'
-
-// Import GOV.UK Prototype Components
-import GOVUKPrototypeComponents from 'govuk-prototype-components'
-
 require.context("govuk-frontend/govuk/assets")
+import GOVUKFrontend from "govuk-frontend"
+import GOVUKPrototypeComponents from "govuk-prototype-components"
 import "./styles/application.scss"
 import "./controllers"
 
diff --git a/app/frontend/controllers/govukfrontend_controller.js b/app/frontend/controllers/govukfrontend_controller.js
index 74af6408a..9fdc001af 100644
--- a/app/frontend/controllers/govukfrontend_controller.js
+++ b/app/frontend/controllers/govukfrontend_controller.js
@@ -1,8 +1,10 @@
-import { initAll } from "govuk-frontend";
+import GOVUKFrontend from "govuk-frontend";
+import GOVUKPrototypeComponents from "govuk-prototype-components"
 import { Controller } from "@hotwired/stimulus";
 
 export default class extends Controller {
   connect() {
-    initAll()
+    GOVUKFrontend.initAll()
+    GOVUKPrototypeComponents.initAll()
   }
 }
diff --git a/app/frontend/styles/application.scss b/app/frontend/styles/application.scss
index f2251ea5d..07e8c675a 100644
--- a/app/frontend/styles/application.scss
+++ b/app/frontend/styles/application.scss
@@ -10,11 +10,8 @@ $govuk-font-url-function: frontend-font-url;
 $govuk-image-url-function: frontend-image-url;
 $govuk-global-styles: true;
 
-// Import GOV.UK Frontend
-@import "govuk-frontend/govuk/all";
-
-// Import GOV.UK Prototype Components
-// @import "govuk-prototype-components/x-govuk/all";
+@import "node_modules/govuk-frontend/govuk/all";
+@import "node_modules/govuk-prototype-components/x-govuk/all";
 
 @import "accessible-autocomplete";
 @import "button";
diff --git a/webpack.config.js b/webpack.config.js
index 0f7e8f987..14ff8fd36 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -43,7 +43,7 @@ module.exports = {
     ],
   },
   resolve: {
-    modules: ['node_modules', 'node_modules/govuk-frontend/govuk', 'node_modules/govuk-prototype-components/x-govuk']
+    modules: ['node_modules', 'node_modules/govuk-frontend/govuk']
   },
   output: {
     filename: "[name].js",

From 6cac98ccd4a0140b93647aae69e7a180fd6816fe Mon Sep 17 00:00:00 2001
From: baarkerlounger <db@slothlife.xyz>
Date: Mon, 4 Apr 2022 17:46:45 +0100
Subject: [PATCH 3/8] Alias is maybe better?

---
 app/frontend/styles/application.scss | 4 ++--
 webpack.config.js                    | 4 ++++
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/app/frontend/styles/application.scss b/app/frontend/styles/application.scss
index 07e8c675a..dace6c0a4 100644
--- a/app/frontend/styles/application.scss
+++ b/app/frontend/styles/application.scss
@@ -10,8 +10,8 @@ $govuk-font-url-function: frontend-font-url;
 $govuk-image-url-function: frontend-image-url;
 $govuk-global-styles: true;
 
-@import "node_modules/govuk-frontend/govuk/all";
-@import "node_modules/govuk-prototype-components/x-govuk/all";
+@import "govuk-frontend-styles";
+@import "govuk-prototype-styles";
 
 @import "accessible-autocomplete";
 @import "button";
diff --git a/webpack.config.js b/webpack.config.js
index 14ff8fd36..77eebab44 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -43,6 +43,10 @@ module.exports = {
     ],
   },
   resolve: {
+    alias: {
+      'govuk-frontend-styles': path.resolve(__dirname, 'node_modules/govuk-frontend/govuk/all.scss'),
+      'govuk-prototype-styles': path.resolve(__dirname, 'node_modules/govuk-prototype-components/x-govuk/all.scss')
+    },
     modules: ['node_modules', 'node_modules/govuk-frontend/govuk']
   },
   output: {

From cc35a483e5be7362ec19e694325eff3a49d431e3 Mon Sep 17 00:00:00 2001
From: Dushan Despotovic <dushan@madetech.com>
Date: Wed, 6 Apr 2022 17:11:50 +0100
Subject: [PATCH 4/8] WIP

---
 app/controllers/form_controller.rb    |  9 +++++++++
 app/models/form/question.rb           |  1 +
 app/views/case_logs/_success.html.erb | 12 ++++++++++++
 app/views/case_logs/index.html.erb    |  4 ++++
 app/views/form/review.html.erb        |  8 +++++++-
 config/forms/2021_2022.json           |  6 +++---
 6 files changed, 36 insertions(+), 4 deletions(-)
 create mode 100644 app/views/case_logs/_success.html.erb

diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb
index 1160fcf06..6d3af2f75 100644
--- a/app/controllers/form_controller.rb
+++ b/app/controllers/form_controller.rb
@@ -5,6 +5,10 @@ class FormController < ApplicationController
 
   def submit_form
     if @case_log
+      if is_referrer_review?
+        @case_log.update!(@case_log.attributes)
+        redirect_to(send(case_logs_path, @case_log))
+      else
       @page = @case_log.form.get_page(params[:case_log][:page])
       responses_for_page = responses_for_page(@page)
       if @case_log.update(responses_for_page)
@@ -110,4 +114,9 @@ private
     referrer = request.headers["HTTP_REFERER"].presence || ""
     referrer.present? && CGI.parse(referrer.split("?")[-1]).present? && CGI.parse(referrer.split("?")[-1])["referrer"][0] == "check_answers"
   end
+
+  def is_referrer_review?
+    referrer = request.headers["HTTP_REFERER"].presence || ""
+    referrer.present? && referrer.split("/")[-1].present? && referrer.split("/")[-1] == "review"
+  end
 end
diff --git a/app/models/form/question.rb b/app/models/form/question.rb
index 8d1d43a7c..69cafbe4a 100644
--- a/app/models/form/question.rb
+++ b/app/models/form/question.rb
@@ -168,6 +168,7 @@ private
 
   def checkbox_answer_label(case_log)
     answer = []
+    return "Yes" if id == "declaration" && value_is_yes?(case_log["declaration"])
     answer_options.each { |key, options| value_is_yes?(case_log[key]) ? answer << options["value"] : nil }
     answer.join(", ")
   end
diff --git a/app/views/case_logs/_success.html.erb b/app/views/case_logs/_success.html.erb
new file mode 100644
index 000000000..769b4de1c
--- /dev/null
+++ b/app/views/case_logs/_success.html.erb
@@ -0,0 +1,12 @@
+<div class="govuk-notification-banner govuk-notification-banner--success" role="alert" aria-labelledby="govuk-notification-banner-title" data-module="govuk-notification-banner">
+  <div class="govuk-notification-banner__header">
+    <h2 class="govuk-notification-banner__title" id="govuk-notification-banner-title">
+      Success
+    </h2>
+  </div>
+  <div class="govuk-notification-banner__content">
+    <h3 class="govuk-notification-banner__heading">
+      Log <%= case_log.id %> has been submitted
+    </h3>
+  </div>
+</div>
\ No newline at end of file
diff --git a/app/views/case_logs/index.html.erb b/app/views/case_logs/index.html.erb
index 8060f3c99..db44e88a4 100644
--- a/app/views/case_logs/index.html.erb
+++ b/app/views/case_logs/index.html.erb
@@ -1,5 +1,9 @@
 <% content_for :title, "Logs" %>
 
+<% if @case_log.present? %>
+<%= render partial: "success", locals: { case_log: @case_log } %>
+<% end %>
+
 <h1 class="govuk-heading-l">
   <%= content_for(:title) %>
 </h1>
diff --git a/app/views/form/review.html.erb b/app/views/form/review.html.erb
index b5827d854..fa01de259 100644
--- a/app/views/form/review.html.erb
+++ b/app/views/form/review.html.erb
@@ -12,7 +12,7 @@
         <%= content_for(:title) %>
       </h1>
       <% @case_log.form.sections.map do |section|  %>
-      <h2 class="govuk-heading-m"><%= section.label %></h2>
+        <h2 class="govuk-heading-m"><%= section.label %></h2>
         <% section.subsections.map do |subsection|  %>
           <div class="x-govuk-summary-card govuk-!-margin-bottom-6">
             <div class="x-govuk-summary-card__header">
@@ -28,6 +28,12 @@
           </div>
         <% end %>
       <% end %>
+      <div class="govuk-inset-text">
+        You can submit changes to this log until the close of the current collection year, 31 March 2022.
+      </div>
+      <%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post" do |f| %>
+        <%= f.govuk_submit "Submit lettings log", accesskey: "s" %>
+      <% end %>
     </div>
   </div>
 <% end %>
\ No newline at end of file
diff --git a/config/forms/2021_2022.json b/config/forms/2021_2022.json
index 10efab899..99aa82e44 100644
--- a/config/forms/2021_2022.json
+++ b/config/forms/2021_2022.json
@@ -1115,9 +1115,9 @@
               "description": "",
               "questions": {
                 "declaration": {
-                  "check_answer_label": "",
-                  "header": "Submit this lettings log ",
-                  "hint_text": "",
+                  "check_answer_label": "Tenant has seen the privacy notice",
+                  "header": "Department for Levelling Up, Housing & Communities privacy notice ",
+                  "hint_text": "Make sure the tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice before submitting this log",
                   "type": "checkbox",
                   "answer_options": {
                     "declaration": "The tenant has seen the Department for Levelling Up, Housing & Communities (DLUHC) privacy notice"

From 185fcfa0ed280121ce47f090ead5d5f87e15bca0 Mon Sep 17 00:00:00 2001
From: Dushan Despotovic <dushan@madetech.com>
Date: Mon, 11 Apr 2022 12:09:01 +0100
Subject: [PATCH 5/8] remove unneeded partial

---
 app/views/case_logs/_success.html.erb | 12 ------------
 1 file changed, 12 deletions(-)
 delete mode 100644 app/views/case_logs/_success.html.erb

diff --git a/app/views/case_logs/_success.html.erb b/app/views/case_logs/_success.html.erb
deleted file mode 100644
index 769b4de1c..000000000
--- a/app/views/case_logs/_success.html.erb
+++ /dev/null
@@ -1,12 +0,0 @@
-<div class="govuk-notification-banner govuk-notification-banner--success" role="alert" aria-labelledby="govuk-notification-banner-title" data-module="govuk-notification-banner">
-  <div class="govuk-notification-banner__header">
-    <h2 class="govuk-notification-banner__title" id="govuk-notification-banner-title">
-      Success
-    </h2>
-  </div>
-  <div class="govuk-notification-banner__content">
-    <h3 class="govuk-notification-banner__heading">
-      Log <%= case_log.id %> has been submitted
-    </h3>
-  </div>
-</div>
\ No newline at end of file

From 3c8c196aec620f5ec9042c4b66e9d79fa951e9cb Mon Sep 17 00:00:00 2001
From: Dushan Despotovic <dushan@madetech.com>
Date: Mon, 11 Apr 2022 13:52:58 +0100
Subject: [PATCH 6/8] error and success when submitting

---
 app/controllers/form_controller.rb     | 43 +++++++++++++++++---------
 app/views/case_logs/index.html.erb     |  4 ---
 app/views/form/review.html.erb         |  7 ++---
 spec/features/form/review_page_spec.rb | 27 ++++++++++++----
 4 files changed, 52 insertions(+), 29 deletions(-)

diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb
index 6d3af2f75..444be4df8 100644
--- a/app/controllers/form_controller.rb
+++ b/app/controllers/form_controller.rb
@@ -6,25 +6,31 @@ class FormController < ApplicationController
   def submit_form
     if @case_log
       if is_referrer_review?
-        @case_log.update!(@case_log.attributes)
-        redirect_to(send(case_logs_path, @case_log))
+        if @case_log.completed?
+          redirect_to(case_logs_path, flash: { notice: "Log #{@case_log.id} has been submitted" })
+        else
+          @case_log.errors.add :base, "All mandatory fields have not been completed, please refer to section status"
+          session[:errors][:review] = @case_log.errors.to_json
+          redirect_to(review_case_log_path)
+        end
       else
-      @page = @case_log.form.get_page(params[:case_log][:page])
-      responses_for_page = responses_for_page(@page)
-      if @case_log.update(responses_for_page)
-        session[:errors] = nil
-        if is_referrer_check_answers? && !@case_log.form.next_page(@page, @case_log).to_s.include?("value_check")
-          redirect_to(send("case_log_#{@case_log.form.subsection_for_page(@page).id}_check_answers_path", @case_log))
-        elsif @case_log.form.is_last_question?(@page, @case_log.form.subsection_for_page(@page), @case_log)
-          redirect_to(case_logs_path)
+        @page = @case_log.form.get_page(params[:case_log][:page])
+        responses_for_page = responses_for_page(@page)
+        if @case_log.update(responses_for_page)
+          session[:errors] = nil
+          if is_referrer_check_answers? && !@case_log.form.next_page(@page, @case_log).to_s.include?("value_check")
+            redirect_to(send("case_log_#{@case_log.form.subsection_for_page(@page).id}_check_answers_path", @case_log))
+          elsif @case_log.form.is_last_question?(@page, @case_log.form.subsection_for_page(@page), @case_log)
+            redirect_to(case_logs_path)
+          else
+            redirect_path = @case_log.form.next_page_redirect_path(@page, @case_log)
+            redirect_to(send(redirect_path, @case_log))
+          end
         else
-          redirect_path = @case_log.form.next_page_redirect_path(@page, @case_log)
+          redirect_path = "case_log_#{@page.id}_path"
+          session[:errors] = @case_log.errors.to_json
           redirect_to(send(redirect_path, @case_log))
         end
-      else
-        redirect_path = "case_log_#{@page.id}_path"
-        session[:errors] = @case_log.errors.to_json
-        redirect_to(send(redirect_path, @case_log))
       end
     else
       render_not_found
@@ -32,6 +38,7 @@ class FormController < ApplicationController
   end
 
   def check_answers
+    session[:review_errors] = nil
     if @case_log
       current_url = request.env["PATH_INFO"]
       subsection = @case_log.form.get_subsection(current_url.split("/")[-2])
@@ -43,6 +50,11 @@ class FormController < ApplicationController
 
   def review
     if @case_log
+      if session["errors"]
+        JSON(session["errors"]).each do |field, messages|
+          messages.each { |message| @case_log.errors.add field.to_sym, message }
+        end
+      end
       render "form/review"
     else
       render_not_found
@@ -52,6 +64,7 @@ class FormController < ApplicationController
   FormHandler.instance.forms.each do |_key, form|
     form.pages.map do |page|
       define_method(page.id) do |_errors = {}|
+        session[:review_errors] = nil
         if @case_log
           if session["errors"]
             JSON(session["errors"]).each do |field, messages|
diff --git a/app/views/case_logs/index.html.erb b/app/views/case_logs/index.html.erb
index db44e88a4..8060f3c99 100644
--- a/app/views/case_logs/index.html.erb
+++ b/app/views/case_logs/index.html.erb
@@ -1,9 +1,5 @@
 <% content_for :title, "Logs" %>
 
-<% if @case_log.present? %>
-<%= render partial: "success", locals: { case_log: @case_log } %>
-<% end %>
-
 <h1 class="govuk-heading-l">
   <%= content_for(:title) %>
 </h1>
diff --git a/app/views/form/review.html.erb b/app/views/form/review.html.erb
index fa01de259..b3131a200 100644
--- a/app/views/form/review.html.erb
+++ b/app/views/form/review.html.erb
@@ -5,7 +5,8 @@
   "Review lettings log" => ""
 }) %>
 
-<%= turbo_frame_tag "case_log_form", target: "_top" do %>
+<%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post" do |f| %>
+  <%= f.govuk_error_summary %>
   <div class="govuk-grid-row">
     <div class="govuk-grid-column-two-thirds-from-desktop">
       <h1 class="govuk-heading-xl">
@@ -31,9 +32,7 @@
       <div class="govuk-inset-text">
         You can submit changes to this log until the close of the current collection year, 31 March 2022.
       </div>
-      <%= form_with model: @case_log, url: form_case_log_path(@case_log), method: "post" do |f| %>
-        <%= f.govuk_submit "Submit lettings log", accesskey: "s" %>
-      <% end %>
     </div>
   </div>
+  <%= f.govuk_submit "Submit lettings log", accesskey: "s" %>
 <% end %>
\ No newline at end of file
diff --git a/spec/features/form/review_page_spec.rb b/spec/features/form/review_page_spec.rb
index ece35c82e..23f55cb92 100644
--- a/spec/features/form/review_page_spec.rb
+++ b/spec/features/form/review_page_spec.rb
@@ -4,11 +4,18 @@ require_relative "helpers"
 RSpec.describe "Form Review Page" do
   include Helpers
   let(:user) { FactoryBot.create(:user) }
-  let(:completed_unsubmitted_case_log) do
+  let(:case_log) do
+    FactoryBot.create(
+      :case_log,
+      :in_progress,
+      owning_organisation: user.organisation,
+      managing_organisation: user.organisation,
+    )
+  end
+  let(:completed_case_log) do
     FactoryBot.create(
       :case_log,
       :completed,
-      status: 1,
       owning_organisation: user.organisation,
       managing_organisation: user.organisation,
     )
@@ -20,15 +27,23 @@ RSpec.describe "Form Review Page" do
 
   context "when the user wishes to review their case log" do
     it "the review page can be visited by URL" do
-      visit("/logs/#{completed_unsubmitted_case_log.id}/review")
+      visit("/logs/#{completed_case_log.id}/review")
       expect(page).to have_content("Review lettings log")
     end
 
     it "the review page allows the user to submit a completed case log" do
-      visit("/logs/#{completed_unsubmitted_case_log.id}/review")
+      visit("/logs/#{completed_case_log.id}/review")
       click_button("Submit lettings log")
+      expect(page).to have_current_path("/logs")
       expect(page).to have_content("Success")
-      expect(page).to have_content("Log #{completed_unsubmitted_case_log.id} has been submitted")
-    end 
+      expect(page).to have_content("Log #{completed_case_log.id} has been submitted")
+    end
+    
+    it "the review page displays an error message if all mandatory questions have not been completed when submitting" do
+      visit("/logs/#{case_log.id}/review")
+      click_button("Submit lettings log")
+      expect(page).to have_current_path("/logs/#{case_log.id}/review")
+      expect(page).to have_content("All mandatory fields have not been completed, please refer to section status")
+    end
   end
 end

From 55d549bd16bf52c15f0b49db511f2dff803d69b4 Mon Sep 17 00:00:00 2001
From: Dushan Despotovic <dushan@madetech.com>
Date: Tue, 12 Apr 2022 15:03:23 +0100
Subject: [PATCH 7/8] add request specs for review page

---
 app/controllers/form_controller.rb    |  6 ++--
 spec/requests/form_controller_spec.rb | 43 +++++++++++++++++++++++++++
 2 files changed, 46 insertions(+), 3 deletions(-)

diff --git a/app/controllers/form_controller.rb b/app/controllers/form_controller.rb
index 444be4df8..5182aeea5 100644
--- a/app/controllers/form_controller.rb
+++ b/app/controllers/form_controller.rb
@@ -10,7 +10,7 @@ class FormController < ApplicationController
           redirect_to(case_logs_path, flash: { notice: "Log #{@case_log.id} has been submitted" })
         else
           @case_log.errors.add :base, "All mandatory fields have not been completed, please refer to section status"
-          session[:errors][:review] = @case_log.errors.to_json
+          session[:review_errors] = @case_log.errors.to_json
           redirect_to(review_case_log_path)
         end
       else
@@ -50,8 +50,8 @@ class FormController < ApplicationController
 
   def review
     if @case_log
-      if session["errors"]
-        JSON(session["errors"]).each do |field, messages|
+      if session[:review_errors]
+        JSON(session[:review_errors]).each do |field, messages|
           messages.each { |message| @case_log.errors.add field.to_sym, message }
         end
       end
diff --git a/spec/requests/form_controller_spec.rb b/spec/requests/form_controller_spec.rb
index 32d8016d9..994ed09fa 100644
--- a/spec/requests/form_controller_spec.rb
+++ b/spec/requests/form_controller_spec.rb
@@ -18,6 +18,25 @@ RSpec.describe FormController, type: :request do
       managing_organisation: other_organisation,
     )
   end
+  let(:setup_complete_case_log) do
+    FactoryBot.create(
+      :case_log,
+      :about_completed,
+      status: 1,
+      year: 2021,
+      startdate: Time.zone.local(2021, 10, 10),
+      owning_organisation: organisation,
+      managing_organisation: organisation,
+    )
+  end
+  let(:completed_case_log) do
+    FactoryBot.create(
+      :case_log,
+      :completed,
+      owning_organisation: organisation,
+      managing_organisation: organisation,
+    )
+  end
   let(:headers) { { "Accept" => "text/html" } }
 
   context "when a user is not signed in" do
@@ -97,6 +116,13 @@ RSpec.describe FormController, type: :request do
           expect(response).to redirect_to("/logs/#{case_log.id}")
         end
       end
+
+      context "when visiting the review page" do
+        it "renders the review page for the case log" do
+          get "/logs/#{setup_complete_case_log.id}/review", headers: headers, params: {}
+          expect(response.body).to match("Review lettings log")
+        end 
+      end
     end
 
     describe "Submit Form" do
@@ -338,6 +364,23 @@ RSpec.describe FormController, type: :request do
           expect(response).to have_http_status(:not_found)
         end
       end
+
+      context "When submitting the case log from the review page" do
+
+        it "redirects to the case logs page on a successful submission of a complete case log" do
+          post "/logs/#{completed_case_log.id}/form", headers: { "HTTP_REFERER": "/logs/#{completed_case_log.id}/review" }
+          expect(response).to redirect_to("/logs")
+          follow_redirect!
+          expect(Capybara::Node::Simple.new(response.body)).to have_content("Log #{completed_case_log.id} has been submitted")
+        end
+
+        it "redirects to the review page and presents an error to the user if submitting an incomplete case log" do
+          post "/logs/#{setup_complete_case_log.id}/form", headers: { "HTTP_REFERER": "/logs/#{setup_complete_case_log.id}/review" }
+          expect(response).to redirect_to("/logs/#{setup_complete_case_log.id}/review")
+          follow_redirect!
+          expect(Capybara::Node::Simple.new(response.body)).to have_content("All mandatory fields have not been completed, please refer to section status")
+        end
+      end
     end
   end
 end

From 717484590c935f814ca8564971ab7aa32c5659e6 Mon Sep 17 00:00:00 2001
From: Dushan Despotovic <dushan@madetech.com>
Date: Tue, 12 Apr 2022 15:04:00 +0100
Subject: [PATCH 8/8] delete unneeded feature spec

---
 spec/features/form/review_page_spec.rb | 49 --------------------------
 1 file changed, 49 deletions(-)
 delete mode 100644 spec/features/form/review_page_spec.rb

diff --git a/spec/features/form/review_page_spec.rb b/spec/features/form/review_page_spec.rb
deleted file mode 100644
index 23f55cb92..000000000
--- a/spec/features/form/review_page_spec.rb
+++ /dev/null
@@ -1,49 +0,0 @@
-require "rails_helper"
-require_relative "helpers"
-
-RSpec.describe "Form Review Page" do
-  include Helpers
-  let(:user) { FactoryBot.create(:user) }
-  let(:case_log) do
-    FactoryBot.create(
-      :case_log,
-      :in_progress,
-      owning_organisation: user.organisation,
-      managing_organisation: user.organisation,
-    )
-  end
-  let(:completed_case_log) do
-    FactoryBot.create(
-      :case_log,
-      :completed,
-      owning_organisation: user.organisation,
-      managing_organisation: user.organisation,
-    )
-  end
-
-  before do
-    sign_in user
-  end
-
-  context "when the user wishes to review their case log" do
-    it "the review page can be visited by URL" do
-      visit("/logs/#{completed_case_log.id}/review")
-      expect(page).to have_content("Review lettings log")
-    end
-
-    it "the review page allows the user to submit a completed case log" do
-      visit("/logs/#{completed_case_log.id}/review")
-      click_button("Submit lettings log")
-      expect(page).to have_current_path("/logs")
-      expect(page).to have_content("Success")
-      expect(page).to have_content("Log #{completed_case_log.id} has been submitted")
-    end
-    
-    it "the review page displays an error message if all mandatory questions have not been completed when submitting" do
-      visit("/logs/#{case_log.id}/review")
-      click_button("Submit lettings log")
-      expect(page).to have_current_path("/logs/#{case_log.id}/review")
-      expect(page).to have_content("All mandatory fields have not been completed, please refer to section status")
-    end
-  end
-end