Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Local authority application type #2185

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions app/models/application_type.rb
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,13 @@ class ApplicationType < ApplicationRecord
belongs_to :legislation, optional: true
has_many :planning_applications, -> { kept }, dependent: :restrict_with_exception

has_many :local_authority_application_types

with_options through: :local_authority_application_types do
has_many :local_authorities,
has_many :planning_applications
end

accepts_nested_attributes_for :legislation, :document_tags

scope :not_retired, -> { where.not(status: "retired") }
Expand Down
13 changes: 0 additions & 13 deletions app/models/application_type_overrides.rb

This file was deleted.

13 changes: 5 additions & 8 deletions app/models/local_authority.rb
Original file line number Diff line number Diff line change
@@ -1,14 +1,6 @@
# frozen_string_literal: true

class LocalAuthority < ApplicationRecord
include StoreModel::NestedAttributes

attribute :application_type_overrides, ApplicationTypeOverrides.to_array_type

validates :application_type_overrides, store_model: {merge_errors: true}

accepts_nested_attributes_for :application_type_overrides

with_options dependent: :destroy do
has_many :users
has_many :planning_applications, -> { kept }
Expand All @@ -31,6 +23,11 @@ class LocalAuthority < ApplicationRecord

has_many :neighbour_responses, through: :consultations

has_many :local_authority_application_types, class_name: "LocalAuthority::ApplicationType", dependent: :destroy
has_many :application_types, through: :local_authority_application_types

accepts_nested_attributes_for :local_authority_application_types

with_options presence: true do
validates :council_code, :subdomain
validates :short_name, :council_name
Expand Down
16 changes: 16 additions & 0 deletions app/models/local_authority/application_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

class LocalAuthority < ApplicationRecord
class ApplicationType < ApplicationRecord
belongs_to :local_authority
belongs_to :application_type, class_name: "::ApplicationType"

has_many :planning_applications

def determination_period_in_days
super || application_type.determination_period_in_days
end
end

has_many :application_types
end
4 changes: 2 additions & 2 deletions app/models/planning_application.rb
Original file line number Diff line number Diff line change
Expand Up @@ -120,7 +120,7 @@ class WithdrawOrCancelError < RuntimeError; end
belongs_to :api_user, optional: true
belongs_to :boundary_created_by, class_name: "User", optional: true
belongs_to :local_authority
belongs_to :application_type
belongs_to :application_type, class_name: "LocalAuthority::ApplicationType"

scope :by_created_at_desc, -> { order(created_at: :desc) }
scope :by_determined_at_desc, -> { order(determined_at: :desc) }
Expand Down Expand Up @@ -989,7 +989,7 @@ def application_type_determination_period
end

def determination_period_days_for_pre_app
local_authority.application_type_overrides.find { |ato| ato.code == "preApp" }&.determination_period_days if pre_application?
local_authority.local_authority_application_types.pre_app.pick(:determination_period_days)
end

def set_change_access_id
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
# frozen_string_literal: true

class CreateLocalAuthorityApplicationTypes < ActiveRecord::Migration[7.2]
def change
create_table :local_authority_application_types do |t|
t.references :local_authority, null: false, foreign_key: true
t.references :application_type, null: false, foreign_key: true

t.timestamps
end

add_index :local_authority_application_types, [:local_authority_id, :application_type_id], unique: true, name: "index_local_authority_application_types"
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# frozen_string_literal: true

class MigrateLocalAuthorityApplicationType < ActiveRecord::Migration[7.2]
def change
up_only do
PlanningApplication.find_each do |planning_application|
next unless planning_application.local_authority_id.present? && planning_application.application_type_id.present?

LocalAuthority::ApplicationType.find_or_create_by!(
local_authority_id: planning_application.local_authority_id,
application_type_id: planning_application.application_type_id
)
end
end
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# frozen_string_literal: true

class AddDeterminationPeriodDaysToLocalAuthorityApplicationType < ActiveRecord::Migration[7.2]
disable_ddl_transaction!

def change
add_column :local_authority_application_types, :determination_period_days, :integer

reversible do |dir|
dir.up do
application_types = ApplicationType.pluck(:code, :id).to_h

LocalAuthority.find_each do |local_authority|
next if local_authority.application_type_overrides.blank?

local_authority.application_type_overrides.each do |override|
application_type_id = application_types[override["code"]]
next unless application_type_id

lap = LocalAuthority::ApplicationType.find_or_initialize_by(
local_authority_id: local_authority.id,
application_type_id: application_type_id
)

if lap.new_record? || lap.determination_period_days != override["determination_period_days"]
lap.update!(determination_period_days: override["determination_period_days"])
end
end
end
end
end
end
end
15 changes: 14 additions & 1 deletion db/schema.rb
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
#
# It's strongly recommended that you check this file into your version control system.

ActiveRecord::Schema[7.2].define(version: 2025_02_18_160812) do
ActiveRecord::Schema[7.2].define(version: 2025_02_24_131628) do
# These are extensions that must be enabled in order to support this database
enable_extension "btree_gin"
enable_extension "plpgsql"
Expand Down Expand Up @@ -513,6 +513,17 @@
t.index ["subdomain"], name: "index_local_authorities_on_subdomain", unique: true
end

create_table "local_authority_application_types", force: :cascade do |t|
t.bigint "local_authority_id", null: false
t.bigint "application_type_id", null: false
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "determination_period_days"
t.index ["application_type_id"], name: "ix_local_authority_application_types_on_application_type_id"
t.index ["local_authority_id", "application_type_id"], name: "index_local_authority_application_types", unique: true
t.index ["local_authority_id"], name: "ix_local_authority_application_types_on_local_authority_id"
end

create_table "local_authority_informatives", force: :cascade do |t|
t.bigint "local_authority_id"
t.string "title"
Expand Down Expand Up @@ -1164,6 +1175,8 @@
add_foreign_key "evidence_groups", "immunity_details"
add_foreign_key "fee_calculations", "planning_applications"
add_foreign_key "immunity_details", "planning_applications"
add_foreign_key "local_authority_application_types", "application_types"
add_foreign_key "local_authority_application_types", "local_authorities"
add_foreign_key "local_authority_policy_areas", "local_authorities"
add_foreign_key "local_authority_policy_areas_references", "local_authority_policy_areas", column: "policy_area_id"
add_foreign_key "local_authority_policy_areas_references", "local_authority_policy_references", column: "policy_reference_id"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

module BopsAdmin
class DeterminationPeriodsController < ApplicationController
before_action :set_pre_app_local_authority_application_type, only: %i[edit update]

def edit
respond_to do |format|
format.html
Expand All @@ -10,10 +12,8 @@ def edit

def update
respond_to do |format|
if current_local_authority.update(application_type_overrides_params, :application_type_overrides)
format.html do
redirect_to setting_path, notice: t(".success")
end
if @pre_app_application_type.update(determination_period_days_params, :application_type_overrides)
format.html { redirect_to setting_path, notice: t(".success") }
else
format.html { render :edit }
end
Expand All @@ -22,15 +22,16 @@ def update

private

def application_type_overrides_params
params.require(:local_authority).permit(application_type_overrides_attributes:)
def determination_period_days_params
params.require(:local_authority_application_type).permit(:determination_period_days)
end

def application_type_overrides_attributes
[
:code,
:determination_period_days
]
def set_pre_app_local_authority_application_type
@pre_app_application_type = current_local_authority.local_authority_application_types.pre_app.take

unless @pre_app_application_type
redirect_to setting_path, alert: t(".not_found")
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

module BopsAdmin
class SettingsController < ApplicationController
before_action :set_application_type_overrides
before_action :set_pre_app_local_authority_application_type, only: %i[show]

def show
respond_to do |format|
Expand All @@ -12,8 +12,12 @@ def show

private

def set_application_type_overrides
@application_type_overrides = current_local_authority.application_type_overrides
def set_pre_app_local_authority_application_type
@pre_app_application_type = current_local_authority.local_authority_application_types.pre_app.take

unless @pre_app_application_type
redirect_to setting_path, alert: t(".not_found")
end
end
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -11,20 +11,24 @@
<%= render "side_navigation" %>
</div>
<div class="govuk-grid-column-three-quarters">
<%= form_with model: current_local_authority, url: [:setting, :determination_period] do |form| %>
<% if @pre_app_application_type %>
<%= form_with model: @pre_app_application_type, url: setting_determination_period_path, method: :patch do |form| %>
<%= form.govuk_error_summary %>

<%= form.fields_for :application_type_overrides do |ff| %>
<%= ff.hidden_field :code, value: :preApp %>
<%= ff.govuk_text_field :determination_period_days, width: 5,
label: {text: t(".set_determination_period"), size: "l"},
hint: {text: t(".hint")},
suffix_text: t(".days"),
value: current_local_authority&.application_type_overrides&.map(&:determination_period_days) %>
<% end %>
<%= form.hidden_field :id %>
<%= form.hidden_field :application_type_id %>

<%= form.govuk_text_field :determination_period_days, width: 5,
label: {text: t(".set_determination_period"), size: "l"},
hint: {text: t(".hint")},
suffix_text: t(".days"),
value: @pre_app_application_type.determination_period_days %>

<%= form.govuk_submit(t(".save")) %>
<%= govuk_button_link_to t("back"), setting_path, secondary: true %>
<% end %>
<% else %>
<p class="govuk-body"><%= t(".no_pre_app_found") %></p>
<% end %>
</div>
</div>
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
<%= govuk_summary_list do |summary_list|
summary_list.with_row do |row|
row.with_key { t(".pre_app_determination_period") }
row.with_value { t(".determination_period_including_bank_holidays", count: @application_type_overrides.map(&:determination_period_days).join(" ")) if @application_type_overrides.map(&:determination_period_days).join(" ") }
row.with_value { t(".determination_period_including_bank_holidays", count: @pre_app_application_type.determination_period_days) }
row.with_action(text: t(".change"), href: url_for([:edit, :setting, :determination_period]), visually_hidden_text: t(".determination_period"))
end
end %>
Expand Down
2 changes: 2 additions & 0 deletions engines/bops_admin/config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ en:
days: days
determination_period: Determination period
hint: Choose the length of the determination period for the pre-application type.
no_pre_app_found: No pre-application type found
save: Save
set_determination_period: Set determination period
update:
Expand Down Expand Up @@ -312,6 +313,7 @@ en:
determination_period_including_bank_holidays:
one: 1 day - bank holidays included
other: "%{count} days - bank holidays included"
not_found: Determination period not found
pre_app_determination_period: Pre-application determination period
tokens:
create:
Expand Down
5 changes: 3 additions & 2 deletions engines/bops_admin/spec/system/application_settings_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
let(:local_authority) { create(:local_authority, :default, :with_api_user) }
let(:user) { create(:user, :administrator, local_authority:) }

let!(:local_authority_application_type) { create(:local_authority_application_type, :pre_app, local_authority: local_authority) }

before do
sign_in(user)
end
Expand Down Expand Up @@ -73,7 +75,6 @@

expect(page).to have_content("Determination period successfully updated")

expect(local_authority.reload.application_type_overrides.first&.code).to eq("preApp")
expect(local_authority.reload.application_type_overrides.first&.determination_period_days).to eq(25)
expect(local_authority_application_type.reload.determination_period_days).to eq(25)
end
end
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def parsers
"AgentParser" => data_params[:applicant][:agent],
"FeeParser" => data_params[:application][:fee],
"AddressParser" => data_params[:property][:address],
"ApplicationTypeParser" => data_params[:application][:type],
"ApplicationTypeParser" => data_params[:application][:type].merge(local_authority: local_authority),
"PreAssessmentParser" => params[:preAssessment],
"ProposalParser" => data_params[:proposal],
"ProposalDetailsParser" => params[:responses]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ def parse
private

def application_type
ApplicationType.active.find_by!(code: params[:value])
application_type = ApplicationType.active.find_by!(code: params[:value])
params[:local_authority].local_authority_application_types.find_or_create_by!(application_type_id: application_type.id)
application_type
end
end
end
Expand Down
10 changes: 3 additions & 7 deletions spec/factories/local_authorities.rb
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,9 @@
feedback_email { "[email protected]" }
email_reply_to_id { "4896bb50-4f4c-4b4d-ad67-2caddddde125" }
active { true }
application_type_overrides do
[
{
code: :preApp,
determination_period_days: 30
}
]

after(:create) do |local_authority|
create(:local_authority_application_type, local_authority: local_authority)
end

trait :default do
Expand Down
13 changes: 13 additions & 0 deletions spec/factories/local_authority_application_type.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# frozen_string_literal: true

FactoryBot.define do
factory :local_authority_application_type, class: "LocalAuthority::ApplicationType" do
local_authority
application_type

trait :pre_app do
association :application_type, :pre_application
determination_period_days { 30 }
end
end
end
Loading