6 changed files with 216 additions and 51 deletions
@ -0,0 +1,8 @@ |
|||||||
|
--- |
||||||
|
has_children: true |
||||||
|
nav_order: 14 |
||||||
|
--- |
||||||
|
|
||||||
|
# Common dev tasks |
||||||
|
|
||||||
|
A collection of guides for tasks that may have to be carried out repeatedly. |
||||||
@ -0,0 +1,124 @@ |
|||||||
|
--- |
||||||
|
parent: Common dev tasks |
||||||
|
nav_order: 1 |
||||||
|
--- |
||||||
|
|
||||||
|
# New Questions |
||||||
|
|
||||||
|
Concerns adding a brand-new question to Lettings Logs or Sales Logs. This question will appear on the website as part of the Sales form and should be handled in Bulk Uploads. |
||||||
|
|
||||||
|
Note: this document focuses on Sales Logs but the steps are equivalent for Lettings Logs by replacing `sales` with `lettings` in file paths etc. |
||||||
|
|
||||||
|
Guide is up-to-date as of 2026. |
||||||
|
|
||||||
|
## Basic checklist of tasks |
||||||
|
|
||||||
|
### 1. Create a migration to add the new field to the database |
||||||
|
|
||||||
|
This allows the answer to the new question to be saved. |
||||||
|
|
||||||
|
You can create a new empty migration file from the terminal if you are in the root of the project: |
||||||
|
|
||||||
|
``` |
||||||
|
bin/rails generate migration NameOfMigration |
||||||
|
``` |
||||||
|
|
||||||
|
The new migration file will be saved in `db/migrate`. |
||||||
|
|
||||||
|
Whilst the specifics will vary, the new migration file should look something like this: |
||||||
|
|
||||||
|
```ruby |
||||||
|
class AddSexRegisteredAtBirthToSalesLogs < ActiveRecord::Migration[7.2] |
||||||
|
def change |
||||||
|
# Add a new column called "name" of type string to the sales_logs table |
||||||
|
change_table :sales_logs, bulk: true do |t| |
||||||
|
t.column :name, :string |
||||||
|
end |
||||||
|
end |
||||||
|
end |
||||||
|
``` |
||||||
|
|
||||||
|
See also: [Active record migrations](https://guides.rubyonrails.org/active_record_migrations.html) |
||||||
|
|
||||||
|
### 2. Run the new migration |
||||||
|
|
||||||
|
`bundle exec rake db:migrate` |
||||||
|
|
||||||
|
This will update `schema.rb`. You should not edit `schema.rb` directly. |
||||||
|
|
||||||
|
### 3. Create a new question class |
||||||
|
|
||||||
|
This will define the question that gets rendered on the online form. |
||||||
|
|
||||||
|
Existing question classes can be found in `app/models/form/sales/questions/`. Depending on the type of question (checkboxes, radio groups, free-text fields), there will almost certainly be an existing question class that you can refer to as a guide. |
||||||
|
|
||||||
|
For example, if you need to create a new radio form, then you may want to copy `armed_forces.rb`. |
||||||
|
|
||||||
|
See also: [Question]({% link form/question.md %}) |
||||||
|
|
||||||
|
### 4. Create a new page class |
||||||
|
|
||||||
|
This creates the page that your new question will be rendered on. |
||||||
|
|
||||||
|
Existing page classes can be found in `app/models/form/sales/pages`. |
||||||
|
|
||||||
|
Usually there is only one question per page, but in some cases there may be multiple. It may not be necessary to create a new page if the new question is being added to an existing one. |
||||||
|
|
||||||
|
See also: [Page]({% link form/page.md %}) |
||||||
|
|
||||||
|
### 5. Add new page to an existing subsection |
||||||
|
|
||||||
|
Without this step, your new page will not be inserted into the form! |
||||||
|
|
||||||
|
Subsections can be found in `app/models/form/sales/subsections`. |
||||||
|
|
||||||
|
You will want to add your new page to the appropriate place in the list returned by `def pages`. |
||||||
|
|
||||||
|
To make your new page only appear in the forms for the upcoming year, you wrap the page class in parentheses and add a conditional expression to the end, like so: |
||||||
|
|
||||||
|
```ruby |
||||||
|
(Form::Sales::Pages::SexRegisteredAtBirth1.new(nil, nil, self) if form.start_year_2026_or_later?), |
||||||
|
``` |
||||||
|
|
||||||
|
Note: the `@id` attribute of a page is what will be displayed in the url when visiting it. It must be unique within a collection year (i.e. two pages in 25/26 cannot share an ID, but two pages in different collection years can share an ID). |
||||||
|
|
||||||
|
### 6. Update the locale file |
||||||
|
|
||||||
|
The locale files define some of the text for the new question, including hints and the question itself. |
||||||
|
|
||||||
|
Locale files can be found in `config/locales/forms/<year>/sales/` and there is one locale file for each form subsection. |
||||||
|
|
||||||
|
Copy the entry for an existing question and substitute in the text for your new one. |
||||||
|
|
||||||
|
### 7. Include the new field in exports |
||||||
|
|
||||||
|
The fields that get exported in CSVs and XMLs are defined in `app/services/exports/sales_log_export_constants.rb`. |
||||||
|
|
||||||
|
If there is not a set for POST\_<year>\_EXPORT_FIELDS, create one. Add your new field to the current year's set. |
||||||
|
|
||||||
|
You may also have to update the `sales_log_export_service.rb` to correctly filter the year-specific fields. |
||||||
|
|
||||||
|
### 8. Update the bulk upload row parser |
||||||
|
|
||||||
|
This will allow bulk upload files to save the new field to the database. |
||||||
|
|
||||||
|
You can find the relevant file at `app/services/bulk_upload/sales/year<year>/row_parser.rb`. |
||||||
|
|
||||||
|
You will need to add a new `field_XXX` for the new field. In total, update the following places: |
||||||
|
|
||||||
|
- Add the new field to `QUESTIONS` with the text of the question. |
||||||
|
- Add a new attribute alongside the existing ones neat the top of the file: |
||||||
|
```ruby |
||||||
|
attribute :field_XXX, :type |
||||||
|
``` |
||||||
|
- Add the new field to `field_mapping_for_errors` with the name of the field in the database. |
||||||
|
- Add the new field to `attributes_for_log` with the name of the field in the database. |
||||||
|
|
||||||
|
You may also have to add some additional validation rules in this file. |
||||||
|
|
||||||
|
Validation for ensuring that the value uploaded is one of the permitted options is handled automatically, using the question class as the original source of truth. |
||||||
|
|
||||||
|
### 9. Update unit tests |
||||||
|
|
||||||
|
- Create new test files for any new classes you have created. Update any test files for files that you have edited. |
||||||
|
- Update `spec/fixtures/variable_definitions/sales_download_25_26.csv` (for sales/lettings and for the relevant collection year) with the new question's field name and definition. |
||||||
Loading…
Reference in new issue