From c912696e143003aee6d43a3f814ddcdb8f97c4f7 Mon Sep 17 00:00:00 2001
From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com>
Date: Tue, 9 Jan 2024 11:28:30 +0000
Subject: [PATCH 1/2] CLDC-2253 Add collection resources (#2120)
* Update collection resources, add to homepage
* Add guidance link to an empty page
* Update headings
* Rebase fix
* Update title
* Update file names
* Add section break
---
 app/frontend/styles/_document-list.scss       |   2 +-
 app/views/home/index.html.erb                 |   5 +
 .../layouts/_collection_resources.html.erb    | 115 ++++++------------
 app/views/organisations/show.html.erb         |   4 -
 app/views/start/index.html.erb                |   7 +-
 .../requests/organisations_controller_spec.rb |  36 ------
 spec/requests/start_controller_spec.rb        |  29 +++++
 7 files changed, 81 insertions(+), 117 deletions(-)
diff --git a/app/frontend/styles/_document-list.scss b/app/frontend/styles/_document-list.scss
index 47936a365..e8cef0625 100644
--- a/app/frontend/styles/_document-list.scss
+++ b/app/frontend/styles/_document-list.scss
@@ -12,7 +12,7 @@
 }
 
 .app-document-list__item-title {
-  @include govuk-font($size: 16, $weight: "bold");
+  @include govuk-font($size: 16);
   margin: 0 0 govuk-spacing(1);
 }
 
diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb
index e691b3e5b..7469ed18f 100644
--- a/app/views/home/index.html.erb
+++ b/app/views/home/index.html.erb
@@ -1 +1,6 @@
 
<%= "Welcome back, #{@current_user.name}" %>
+
+  
+    <%= render partial: "layouts/collection_resources" %>
+  
+
 
diff --git a/app/views/layouts/_collection_resources.html.erb b/app/views/layouts/_collection_resources.html.erb
index e2d56e4a5..0c084596e 100644
--- a/app/views/layouts/_collection_resources.html.erb
+++ b/app/views/layouts/_collection_resources.html.erb
@@ -1,94 +1,59 @@
-
+<% if current_user %>
+  
Collection resources
+  
<%= govuk_link_to "Guidance for submitting social housing lettings and sales data (CORE)", guidance_path %>
+<% else %>
   
Collection resources
-  
For lettings starting during 1 April 2023 to 31 March 2024 and sales completing during the same period, use the 2023/24 forms.
-
+<% end %>
+
Use the 2023 to 2024 forms for lettings that start and sales that complete between 1 April 2023 and 31 March 2024.
+<%= govuk_tabs(title: "Collection resources") do |c| %>
   <% if FormHandler.instance.lettings_form_for_start_year(2023) && FormHandler.instance.lettings_form_for_start_year(2023).edit_end_date > Time.zone.today %>
-    
Lettings 2023/24
-    <%= render DocumentListComponent.new(items: [
+    <% c.with_tab(label: "Lettings 2023/24") do %>
+      <%= render DocumentListComponent.new(items: [
       {
-        name: "Lettings log for tenants (2023/24)",
+        name: "Download the lettings log for tenants (2023 to 2024)",
         href: download_23_24_lettings_form_path,
         metadata: file_type_size_and_pages("2023_24_lettings_paper_form.pdf", number_of_pages: 8),
       },
       {
-        name: "Lettings bulk upload template (2023/24) – New question ordering",
+        name: "Download the lettings bulk upload template (2023 to 2024) – New question ordering",
         href: download_23_24_lettings_bulk_upload_template_path,
         metadata: file_type_size_and_pages("bulk-upload-lettings-template-2023-24.xlsx"),
       },
       {
-        name: "Lettings bulk upload template (2023/24)",
+        name: "Download the lettings bulk upload template (2023 to 2024) – Legacy version",
         href: download_23_24_lettings_bulk_upload_legacy_template_path,
         metadata: file_type_size_and_pages("bulk-upload-lettings-legacy-template-2023-24.xlsx"),
       },
       {
-        name: "Lettings bulk upload specification (2023/24)",
+        name: "Download the lettings bulk upload specification (2023 to 2024)",
         href: download_23_24_lettings_bulk_upload_specification_path,
         metadata: file_type_size_and_pages("bulk-upload-lettings-specification-2023-24.xlsx"),
       },
-    ]) %>
-
-    
Sales 2023/24
-    <%= render DocumentListComponent.new(items: [
-      {
-        name: "Sales log for buyers (2023/24)",
-        href: download_23_24_sales_form_path,
-        metadata: file_type_size_and_pages("2023_24_sales_paper_form.pdf", number_of_pages: 8),
-      },
-      {
-        name: "Sales bulk upload template (2023/24) – New question ordering",
-        href: download_23_24_sales_bulk_upload_template_path,
-        metadata: file_type_size_and_pages("bulk-upload-sales-template-2023-24.xlsx"),
-      },
-      {
-        name: "Sales bulk upload template (2023/24)",
-        href: download_23_24_sales_bulk_upload_legacy_template_path,
-        metadata: file_type_size_and_pages("bulk-upload-sales-legacy-template-2023-24.xlsx"),
-      },
-      {
-        name: "Sales bulk upload specification (2023/24)",
-        href: download_23_24_sales_bulk_upload_specification_path,
-        metadata: file_type_size_and_pages("bulk-upload-sales-specification-2023-24.xlsx"),
-      },
-    ]) %>
-  <% end %>
-
-  <% if FormHandler.instance.lettings_form_for_start_year(2022) && FormHandler.instance.lettings_form_for_start_year(2022).edit_end_date > Time.zone.today %>
-    
Lettings 2022/23
-    <%= render DocumentListComponent.new(items: [
-      {
-        name: "Lettings log for tenants (2022/23)",
-        href: download_22_23_lettings_form_path,
-        metadata: file_type_size_and_pages("2022_23_lettings_paper_form.pdf", number_of_pages: 4),
-      },
-      {
-        name: "Lettings bulk upload template (2022/23)",
-        href: download_22_23_lettings_bulk_upload_template_path,
-        metadata: file_type_size_and_pages("bulk-upload-lettings-template-2022-23.xlsx"),
-      },
-      {
-        name: "Lettings bulk upload specification (2022/23)",
-        href: download_22_23_lettings_bulk_upload_specification_path,
-        metadata: file_type_size_and_pages("bulk-upload-lettings-specification-2022-23.xlsx"),
-      },
-    ]) %>
-
-    
Sales 2022/23
-    <%= render DocumentListComponent.new(items: [
-      {
-        name: "Sales log for buyers (2022/23)",
-        href: download_22_23_sales_form_path,
-        metadata: file_type_size_and_pages("2022_23_sales_paper_form.pdf", number_of_pages: 5),
-      },
-      {
-        name: "Sales bulk upload template (2022/23)",
-        href: download_22_23_sales_bulk_upload_template_path,
-        metadata: file_type_size_and_pages("bulk-upload-sales-template-2022-23.xlsx"),
-      },
-      {
-        name: "Sales bulk upload specification (2022/23)",
-        href: download_22_23_sales_bulk_upload_specification_path,
-        metadata: file_type_size_and_pages("bulk-upload-sales-template-2022-23.xlsx"),
-      },
-    ]) %>
+      ]) %>
+    <% end %>
+    <% c.with_tab(label: "Sales 2023/24") do %>
+      <%= render DocumentListComponent.new(items: [
+        {
+          name: "Download the sales log for buyers (2023 to 2024)",
+          href: download_23_24_sales_form_path,
+          metadata: file_type_size_and_pages("2023_24_sales_paper_form.pdf", number_of_pages: 8),
+        },
+        {
+          name: "Download the sales bulk upload template (2023 to 2024) – New question ordering",
+          href: download_23_24_sales_bulk_upload_template_path,
+          metadata: file_type_size_and_pages("bulk-upload-sales-template-2023-24.xlsx"),
+        },
+        {
+          name: "Download the sales bulk upload template (2023 to 2024) – Legacy version",
+          href: download_23_24_sales_bulk_upload_legacy_template_path,
+          metadata: file_type_size_and_pages("bulk-upload-sales-legacy-template-2023-24.xlsx"),
+        },
+        {
+          name: "Download the sales bulk upload specification (2023 to 2024)",
+          href: download_23_24_sales_bulk_upload_specification_path,
+          metadata: file_type_size_and_pages("bulk-upload-sales-specification-2023-24.xlsx"),
+        },
+      ]) %>
+    <% end %>
   <% end %>
-
 
+<% end %>
diff --git a/app/views/organisations/show.html.erb b/app/views/organisations/show.html.erb
index 9cfecda26..93b47fb03 100644
--- a/app/views/organisations/show.html.erb
+++ b/app/views/organisations/show.html.erb
@@ -41,8 +41,4 @@
     <% end %>
     <%= render partial: "organisations/merged_organisation_details" %>
   
-
-  
-    <%= render partial: "layouts/collection_resources" %>
-  
 
diff --git a/app/views/start/index.html.erb b/app/views/start/index.html.erb
index d6ec6d392..17e15d34e 100644
--- a/app/views/start/index.html.erb
+++ b/app/views/start/index.html.erb
@@ -16,14 +16,19 @@
       href: start_path,
     ) %>
 
+    
+
     Before you start
     Use your account details to sign in.
     If you need to set up a new account, speak to your organisation’s CORE data coordinator. If you don’t know who that is, <%= govuk_link_to("contact the helpdesk", GlobalConstants::HELPDESK_URL) %>.
     You can <%= govuk_mail_to("dluhc.digital-services@levellingup.gov.uk", "request an account", subject: "CORE: Request a new account") %> if your organisation doesn’t have one.
     <%= govuk_link_to guidance_path do %>Guidance for submitting social housing lettings and sales data (CORE)<% end %>
   
+
 
-  
+
+
+  
     <%= render partial: "layouts/collection_resources" %>
   
 
diff --git a/spec/requests/organisations_controller_spec.rb b/spec/requests/organisations_controller_spec.rb
index 97665f8ca..68de93c51 100644
--- a/spec/requests/organisations_controller_spec.rb
+++ b/spec/requests/organisations_controller_spec.rb
@@ -310,42 +310,6 @@ RSpec.describe OrganisationsController, type: :request do
         it "redirects to details" do
           expect(response).to have_http_status(:redirect)
         end
-
-        context "and 2022 collection window is open" do
-          let(:set_time) { allow(Time).to receive(:now).and_return(Time.zone.local(2023, 1, 1)) }
-
-          it "displays correct resources for 2022/23 and 2023/24 collection years" do
-            follow_redirect!
-            expect(page).to have_content("Lettings 2023/24")
-            expect(page).to have_content("Sales 2023/24")
-            expect(page).to have_content("Lettings 2022/23")
-            expect(page).to have_content("Sales 2022/23")
-          end
-        end
-
-        context "and 2022 collection window is closed for editing" do
-          let(:set_time) { allow(Time).to receive(:now).and_return(Time.zone.local(2024, 1, 1)) }
-
-          it "displays correct resources for 2022/23 and 2023/24 collection years" do
-            follow_redirect!
-            expect(page).to have_content("Lettings 2023/24")
-            expect(page).to have_content("Sales 2023/24")
-            expect(page).not_to have_content("Lettings 2022/23")
-            expect(page).not_to have_content("Sales 2022/23")
-          end
-        end
-
-        context "and 2023 collection window is closed for editing" do
-          let(:set_time) { allow(Time).to receive(:now).and_return(Time.zone.local(2025, 1, 1)) }
-
-          it "displays correct resources for 2022/23 and 2023/24 collection years" do
-            follow_redirect!
-            expect(page).not_to have_content("Lettings 2023/24")
-            expect(page).not_to have_content("Sales 2023/24")
-            expect(page).not_to have_content("Lettings 2022/23")
-            expect(page).not_to have_content("Sales 2022/23")
-          end
-        end
       end
 
       context "with an organisation that are not in scope for the user, i.e. that they do not belong to" do
diff --git a/spec/requests/start_controller_spec.rb b/spec/requests/start_controller_spec.rb
index 1bfd2b4b9..2287280dc 100644
--- a/spec/requests/start_controller_spec.rb
+++ b/spec/requests/start_controller_spec.rb
@@ -31,6 +31,35 @@ RSpec.describe StartController, type: :request do
         get "/", headers:, params: {}
         expect(page).to have_content("Welcome back")
       end
+
+      context "and 2023 collection window is open for editing" do
+        before do
+          allow(Time).to receive(:now).and_return(Time.zone.local(2024, 1, 1))
+        end
+
+        it "displays correct resources for 2022/23 and 2023/24 collection years" do
+          get "/", headers: headers, params: {}
+          expect(page).to have_content("Lettings 2023/24")
+          expect(page).to have_content("Sales 2023/24")
+        end
+      end
+
+      context "and 2023 collection window is closed for editing" do
+        before do
+          allow(Time).to receive(:now).and_return(Time.zone.local(2025, 1, 1))
+        end
+
+        it "displays correct resources for 2022/23 and 2023/24 collection years" do
+          get "/", headers: headers, params: {}
+          expect(page).not_to have_content("Lettings 2023/24")
+          expect(page).not_to have_content("Sales 2023/24")
+        end
+      end
+
+      it "shows guidance link" do
+        get "/", headers: headers, params: {}
+        expect(page).to have_content("Guidance for submitting social housing lettings and sales data (CORE)")
+      end
     end
   end
 
From bf92c52635b4c06df66e81ff7ff3ddaf6127bdc4 Mon Sep 17 00:00:00 2001
From: kosiakkatrina <54268893+kosiakkatrina@users.noreply.github.com>
Date: Tue, 9 Jan 2024 12:05:42 +0000
Subject: [PATCH 2/2] CLDC-2593 Add upcoming deadlines section (#2119)
* Add upcoming deadlines section
* Update the content to use the correct dates
* Update content
* lint
* typos
---
 app/helpers/collection_time_helper.rb       | 20 ++++++++++++
 app/models/form_handler.rb                  |  4 +++
 app/views/home/_upcoming_deadlines.html.erb | 35 +++++++++++++++++++++
 app/views/home/index.html.erb               |  2 ++
 spec/helpers/collection_time_helper_spec.rb | 30 ++++++++++++++++++
 5 files changed, 91 insertions(+)
 create mode 100644 app/views/home/_upcoming_deadlines.html.erb
diff --git a/app/helpers/collection_time_helper.rb b/app/helpers/collection_time_helper.rb
index ea7601c70..6f8ef62fc 100644
--- a/app/helpers/collection_time_helper.rb
+++ b/app/helpers/collection_time_helper.rb
@@ -45,4 +45,24 @@ module CollectionTimeHelper
   def previous_collection_start_date
     current_collection_start_date - 1.year
   end
+
+  def quarter_for_date(date: Time.zone.now)
+    quarters = [
+      { quarter: "Q3", cutoff_date: Time.zone.local(2024, 1, 12), start_date: Time.zone.local(2023, 10, 1), end_date: Time.zone.local(2023, 12, 31) },
+      { quarter: "Q1", cutoff_date: Time.zone.local(2024, 7, 12), start_date: Time.zone.local(2024, 4, 1), end_date: Time.zone.local(2024, 6, 30) },
+      { quarter: "Q2", cutoff_date: Time.zone.local(2024, 10, 11), start_date: Time.zone.local(2024, 7, 1), end_date: Time.zone.local(2024, 9, 30) },
+      { quarter: "Q3", cutoff_date: Time.zone.local(2025, 1, 10), start_date: Time.zone.local(2024, 10, 1), end_date: Time.zone.local(2024, 12, 31) },
+    ]
+
+    quarter = quarters.find { |q| date.between?(q[:start_date], q[:cutoff_date] + 1.day) }
+
+    return unless quarter
+
+    OpenStruct.new(
+      quarter: quarter[:quarter],
+      cutoff_date: quarter[:cutoff_date],
+      quarter_start_date: quarter[:start_date],
+      quarter_end_date: quarter[:end_date],
+    )
+  end
 end
diff --git a/app/models/form_handler.rb b/app/models/form_handler.rb
index 83bfb0f8a..d9a3d4a35 100644
--- a/app/models/form_handler.rb
+++ b/app/models/form_handler.rb
@@ -28,6 +28,10 @@ class FormHandler
     forms["current_lettings"]
   end
 
+  def previous_lettings_form
+    forms["previous_lettings"]
+  end
+
   def current_sales_form
     forms["current_sales"]
   end
diff --git a/app/views/home/_upcoming_deadlines.html.erb b/app/views/home/_upcoming_deadlines.html.erb
new file mode 100644
index 000000000..ffed67ca1
--- /dev/null
+++ b/app/views/home/_upcoming_deadlines.html.erb
@@ -0,0 +1,35 @@
+
Upcoming deadlines
+
+<% current_lettings_form = FormHandler.instance.in_crossover_period? ? FormHandler.instance.previous_lettings_form : FormHandler.instance.current_lettings_form %>
+<% formatted_deadline = "#{current_lettings_form.submission_deadline.strftime('%A')} #{current_lettings_form.submission_deadline.to_formatted_s(:govuk_date)}" %>
+<% if FormHandler.instance.in_crossover_period? %>
+  
End of year deadline - <%= formatted_deadline %>: Deadline to submit logs for tenancies starting between <%= collection_start_date(Time.zone.now).to_formatted_s(:govuk_date) %> to <%= collection_end_date(Time.zone.now).to_formatted_s(:govuk_date) %>
+<% end %>
+
+<% current_quarter = quarter_for_date(date: Time.zone.now) %>
+<% if current_quarter.present? %>
+  
<%= "#{current_quarter.quarter} - #{current_quarter.cutoff_date.strftime('%A')} #{current_quarter.cutoff_date.to_formatted_s(:govuk_date)}" %>: Quarterly cut off date for tenancies and sales starting between <%= current_quarter.quarter_start_date.to_formatted_s(:govuk_date) %> and <%= current_quarter.quarter_end_date.to_formatted_s(:govuk_date) %>.
+<% end %>
+
+<% if !FormHandler.instance.in_crossover_period? %>
+
Try to complete your logs for each quarter by the cut-off date.
+
You can still create logs for a previous quarter after its cut-off date, as long as you complete them by the end-of-year deadline: <%= formatted_deadline %>.
+<% end %>
+
+<% if FormHandler.instance.in_crossover_period? %>
+<% previous_lettings_form = FormHandler.instance.previous_lettings_form %>
+
Prioritise completing logs for the closing collection year. You must complete all <%= previous_lettings_form.start_date.year %> to <%= previous_lettings_form.submission_deadline.year %> logs must by the end-of-year deadline. You can still create <%= current_lettings_form.start_date.year %> to <%= current_lettings_form.submission_deadline.year %> logs for this quarter after the quarterly cut-off date.
+<% end %>
+
+<%= govuk_details(summary_text: "Quarterly cut-off dates for 2023 to 2024") do %>
+  
The 2023 to 2024 quarterly cut-off dates are:
+  
+    - Q1 - Friday 14 July 2023: Quarterly cut-off date for tenancies and sales starting between 1 April 2023 and 30 June 2023.
 
+    - Q2 - Friday 13 October 2023: Quarterly cut-off date for tenancies and sales starting between 1 July 2023 and 30 September 2023.
 
+    - Q3 - Friday 12 January 2024: Quarterly cut-off date for tenancies and sales starting between 1 October 2023 and 31 December 2023.
 
+    - End of year deadline - Friday 7 June 2024: Deadline for tenancies and sales starting between 1 January 2024 and 31 March 2024, plus any late submissions for the 2023 to 2024 collection year.
 
+  
+  
It is important that you meet these cut-off dates because we submit data to the Office for National Statistics quarterly, helping them create essential inflation statistics.
+  
Meeting these cut-off dates also gives you more accurate data for your own analysis, and reduces the burden at the end of the year.
+  
If you are not able to meet these quarterly dates, submit your logs as soon as you can so that they can be included in the annual data.
+<% end %>
diff --git a/app/views/home/index.html.erb b/app/views/home/index.html.erb
index 7469ed18f..e87fde287 100644
--- a/app/views/home/index.html.erb
+++ b/app/views/home/index.html.erb
@@ -2,5 +2,7 @@
 
   
     <%= render partial: "layouts/collection_resources" %>
+    
+    <%= render partial: "home/upcoming_deadlines" %>
   
  
diff --git a/spec/helpers/collection_time_helper_spec.rb b/spec/helpers/collection_time_helper_spec.rb
index 3eef01b5e..859431c57 100644
--- a/spec/helpers/collection_time_helper_spec.rb
+++ b/spec/helpers/collection_time_helper_spec.rb
@@ -109,4 +109,34 @@ RSpec.describe CollectionTimeHelper do
       end
     end
   end
+
+  describe "#quarter_for_date" do
+    it "returns correct cutoff date for curent quarter" do
+      quarter = quarter_for_date(date: Time.zone.local(2023, 10, 1))
+      expect(quarter.cutoff_date).to eq(Time.zone.local(2024, 1, 12))
+      expect(quarter.quarter_start_date).to eq(Time.zone.local(2023, 10, 1))
+      expect(quarter.quarter_end_date).to eq(Time.zone.local(2023, 12, 31))
+    end
+
+    it "returns correct cutoff date for the first quarter of 2024/25" do
+      quarter = quarter_for_date(date: Time.zone.local(2024, 4, 1))
+      expect(quarter.cutoff_date).to eq(Time.zone.local(2024, 7, 12))
+      expect(quarter.quarter_start_date).to eq(Time.zone.local(2024, 4, 1))
+      expect(quarter.quarter_end_date).to eq(Time.zone.local(2024, 6, 30))
+    end
+
+    it "returns correct cutoff date for the second quarter of 2024/25" do
+      quarter = quarter_for_date(date: Time.zone.local(2024, 9, 30))
+      expect(quarter.cutoff_date).to eq(Time.zone.local(2024, 10, 11))
+      expect(quarter.quarter_start_date).to eq(Time.zone.local(2024, 7, 1))
+      expect(quarter.quarter_end_date).to eq(Time.zone.local(2024, 9, 30))
+    end
+
+    it "returns correct cutoff date for the third quarter of 2024/25" do
+      quarter = quarter_for_date(date: Time.zone.local(2024, 10, 25))
+      expect(quarter.cutoff_date).to eq(Time.zone.local(2025, 1, 10))
+      expect(quarter.quarter_start_date).to eq(Time.zone.local(2024, 10, 1))
+      expect(quarter.quarter_end_date).to eq(Time.zone.local(2024, 12, 31))
+    end
+  end
 end