diff --git a/app/frontend/controllers/index.js b/app/frontend/controllers/index.js
index 944e32e2d..35385e46e 100644
--- a/app/frontend/controllers/index.js
+++ b/app/frontend/controllers/index.js
@@ -19,6 +19,8 @@ import FilterLayoutController from './filter_layout_controller.js'
import TabsController from './tabs_controller.js'
+import OrganisationsController from './organisations_controller.js'
+
application.register('accessible-autocomplete', AccessibleAutocompleteController)
application.register('conditional-filter', ConditionalFilterController)
application.register('conditional-question', ConditionalQuestionController)
@@ -27,3 +29,4 @@ application.register('numeric-question', NumericQuestionController)
application.register('filter-layout', FilterLayoutController)
application.register('search', SearchController)
application.register('tabs', TabsController)
+application.register('organisations', OrganisationsController)
diff --git a/app/frontend/controllers/organisations_controller.js b/app/frontend/controllers/organisations_controller.js
new file mode 100644
index 000000000..855081dab
--- /dev/null
+++ b/app/frontend/controllers/organisations_controller.js
@@ -0,0 +1,14 @@
+import { Controller } from '@hotwired/stimulus'
+
+export default class extends Controller {
+ static targets = ["groupSelect"]
+
+ connect() {
+ this.toggleGroupSelect()
+ }
+
+ toggleGroupSelect() {
+ const groupMemberYes = this.element.querySelector('input[name="organisation[group_member]"]:checked')?.value === 'true'
+ this.groupSelectTarget.style.display = groupMemberYes ? 'block' : 'none'
+ }
+}
diff --git a/app/models/organisation.rb b/app/models/organisation.rb
index c3d0a8ca0..a1ccc95f8 100644
--- a/app/models/organisation.rb
+++ b/app/models/organisation.rb
@@ -53,7 +53,16 @@ class Organisation < ApplicationRecord
PRP: 2,
}.freeze
+ PROFIT_STATUS = {
+ non_profit: 1,
+ profit: 2,
+ local_authority: 3,
+ }.freeze
+
enum :provider_type, PROVIDER_TYPE
+ enum :profit_status, PROFIT_STATUS
+
+ attribute :group_member, :boolean
alias_method :la?, :LA?
diff --git a/app/views/organisations/new.html.erb b/app/views/organisations/new.html.erb
index 20d4d2cc6..0b3c85cbd 100644
--- a/app/views/organisations/new.html.erb
+++ b/app/views/organisations/new.html.erb
@@ -56,6 +56,37 @@
:name,
legend: { text: "Does the organisation hold its own stock?", size: "m" } %>
+ <%= f.govuk_collection_radio_buttons :group_member,
+ [OpenStruct.new(id: true, name: "Yes"), OpenStruct.new(id: false, name: "No")],
+ :id,
+ :name,
+ legend: { text: "Is this organisation part of a housing provider group structure?", size: "m" },
+ "data-action": "change->group-member#toggleGroupSelect" %>
+
+ <% group_organisation_options = Organisation.visible.map { |org| OpenStruct.new(id: org.id, name: org.name) } %>
+
+
+ <%= f.govuk_collection_select :group,
+ group_organisation_options,
+ :id,
+ :name,
+ label: { text: "Search for an organisation that is part of the same group as this organisation", size: "m" },
+ "data-controller": %w[accessible-autocomplete conditional-filter organisations] %>
+
+
+ <% profit_options = [
+ OpenStruct.new(id: 1, name: "Non-profit"),
+ OpenStruct.new(id: 2, name: "Profit"),
+ OpenStruct.new(id: 3, name: "Local authority")
+ ] %>
+
+ <%= f.govuk_collection_select :profit_status,
+ profit_options,
+ :id,
+ :name,
+ label: { text: "Is the organisation for-profit?", size: "m" },
+ options: { disabled: [""], selected: @organisation.profit_status || "" } %>
+
<%= f.govuk_check_boxes_fieldset :rent_periods,
legend: { text: "What are the rent periods for the organisation?" } do %>
<% @rent_periods.map do |key, period| %>
diff --git a/db/migrate/20250227085622_add_new_question_fields_to_organisation.rb b/db/migrate/20250227085622_add_new_question_fields_to_organisation.rb
new file mode 100644
index 000000000..08b3ff2bf
--- /dev/null
+++ b/db/migrate/20250227085622_add_new_question_fields_to_organisation.rb
@@ -0,0 +1,7 @@
+class AddNewQuestionFieldsToOrganisation < ActiveRecord::Migration[7.2]
+ def change
+ add_column :organisations, :profit_status, :integer
+ add_column :organisations, :group_member, :boolean
+ add_column :organisations, :group, :integer
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 894bb1638..f00ffb5d4 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -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_01_10_150609) do
+ActiveRecord::Schema[7.2].define(version: 2025_02_27_085622) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -84,7 +84,7 @@ ActiveRecord::Schema[7.2].define(version: 2025_01_10_150609) do
t.datetime "last_accessed"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
- t.check_constraint "log_type::text = ANY (ARRAY['lettings'::character varying, 'sales'::character varying]::text[])", name: "log_type_check"
+ t.check_constraint "log_type::text = ANY (ARRAY['lettings'::character varying::text, 'sales'::character varying::text])", name: "log_type_check"
t.check_constraint "year >= 2000 AND year <= 2099", name: "year_check"
end
@@ -245,14 +245,14 @@ ActiveRecord::Schema[7.2].define(version: 2025_01_10_150609) do
t.integer "hb"
t.integer "hbrentshortfall"
t.integer "property_relet"
- t.datetime "mrcdate", precision: nil
+ t.datetime "mrcdate"
t.integer "incref"
- t.datetime "startdate", precision: nil
+ t.datetime "startdate"
t.integer "armedforces"
t.integer "first_time_property_let_as_social_housing"
t.integer "unitletas"
t.integer "builtype"
- t.datetime "voiddate", precision: nil
+ t.datetime "voiddate"
t.bigint "owning_organisation_id"
t.bigint "managing_organisation_id"
t.integer "renttype"
@@ -373,6 +373,8 @@ ActiveRecord::Schema[7.2].define(version: 2025_01_10_150609) do
t.integer "partner_under_16_value_check"
t.integer "multiple_partners_value_check"
t.bigint "created_by_id"
+ t.boolean "manual_address_entry_selected", default: false
+ t.integer "referral_type"
t.index ["assigned_to_id"], name: "index_lettings_logs_on_assigned_to_id"
t.index ["bulk_upload_id"], name: "index_lettings_logs_on_bulk_upload_id"
t.index ["created_by_id"], name: "index_lettings_logs_on_created_by_id"
@@ -546,6 +548,9 @@ ActiveRecord::Schema[7.2].define(version: 2025_01_10_150609) do
t.datetime "available_from"
t.datetime "discarded_at"
t.datetime "schemes_deduplicated_at"
+ t.integer "profit_status"
+ t.boolean "group_member"
+ t.integer "group"
t.index ["absorbing_organisation_id"], name: "index_organisations_on_absorbing_organisation_id"
t.index ["name"], name: "index_organisations_on_name", unique: true
t.index ["old_visible_id"], name: "index_organisations_on_old_visible_id", unique: true
@@ -762,13 +767,14 @@ ActiveRecord::Schema[7.2].define(version: 2025_01_10_150609) do
t.integer "partner_under_16_value_check"
t.integer "multiple_partners_value_check"
t.bigint "created_by_id"
- t.integer "has_management_fee"
- t.decimal "management_fee", precision: 10, scale: 2
t.integer "firststair"
t.integer "numstair"
t.decimal "mrentprestaircasing", precision: 10, scale: 2
t.datetime "lasttransaction"
t.datetime "initialpurchase"
+ t.integer "has_management_fee"
+ t.decimal "management_fee", precision: 10, scale: 2
+ t.boolean "manual_address_entry_selected", default: false
t.index ["assigned_to_id"], name: "index_sales_logs_on_assigned_to_id"
t.index ["bulk_upload_id"], name: "index_sales_logs_on_bulk_upload_id"
t.index ["created_by_id"], name: "index_sales_logs_on_created_by_id"
@@ -822,8 +828,8 @@ ActiveRecord::Schema[7.2].define(version: 2025_01_10_150609) do
t.string "name"
t.bigint "organisation_id"
t.integer "sign_in_count", default: 0, null: false
- t.datetime "current_sign_in_at", precision: nil
- t.datetime "last_sign_in_at", precision: nil
+ t.datetime "current_sign_in_at"
+ t.datetime "last_sign_in_at"
t.string "current_sign_in_ip"
t.string "last_sign_in_ip"
t.integer "role"