Skip to content

Commit

Permalink
Make validity period end date nullable
Browse files Browse the repository at this point in the history
  • Loading branch information
reynders committed Oct 1, 2024
1 parent 7b9f88f commit bd679df
Show file tree
Hide file tree
Showing 19 changed files with 96 additions and 11 deletions.
2 changes: 2 additions & 0 deletions frontend/src/e2e-test/dev-api/fixtures.ts
Original file line number Diff line number Diff line change
Expand Up @@ -596,6 +596,7 @@ export class Fixture {
},
servicesMotivation: null,
validityPeriod: new DateRange(LocalDate.of(2019, 1, 2), null),
endDateNotKnown: false,
status: 'DRAFT',
structuralMotivationDescription: null,
structuralMotivationOptions: {
Expand Down Expand Up @@ -659,6 +660,7 @@ export class Fixture {
},
servicesMotivation: 'Services motivation text',
validityPeriod: new DateRange(LocalDate.of(2019, 1, 2), null),
endDateNotKnown: false,
status: 'DRAFT',
structuralMotivationDescription: 'Structural motivation description text',
structuralMotivationOptions: {
Expand Down
1 change: 1 addition & 0 deletions frontend/src/e2e-test/generated/api-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,7 @@ export interface DevAssistanceNeedDecision {
decisionMade: LocalDate | null
decisionMaker: AssistanceNeedDecisionEmployee | null
decisionNumber: number | null
endDateNotKnown: boolean
expertResponsibilities: string | null
guardianInfo: AssistanceNeedDecisionGuardian[]
guardiansHeardOn: LocalDate | null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,20 @@
// SPDX-License-Identifier: LGPL-2.1-or-later

import { waitUntilEqual } from '../../../utils'
import { Page, TextInput, Combobox, Element } from '../../../utils/page'
import {
Page,
TextInput,
Combobox,
Element,
Checkbox
} from '../../../utils/page'

export default class AssistanceNeedDecisionEditPage {
#decisionMakerSelect: Element
pedagogicalMotivationInput: TextInput
guardiansHeardOnInput: TextInput
validityEndDateInput: TextInput
validityEndDateNotKnownCheckbox: Checkbox
constructor(private readonly page: Page) {
this.#decisionMakerSelect = page.findByDataQa('decision-maker-select')
this.pedagogicalMotivationInput = new TextInput(
Expand All @@ -17,6 +25,12 @@ export default class AssistanceNeedDecisionEditPage {
this.guardiansHeardOnInput = new TextInput(
page.findByDataQa('guardians-heard-on')
)
this.validityEndDateInput = new TextInput(
page.findByDataQa('validity-end-date')
)
this.validityEndDateNotKnownCheckbox = new Checkbox(
page.findByDataQa('end-date-not-known-checkbox')
)
}

async assertDeciderSelectVisible() {
Expand Down Expand Up @@ -75,6 +89,26 @@ export default class AssistanceNeedDecisionEditPage {
await this.fillEmployee('prepared-by-1', name, title)
}

async toggleAssistanceServicesForTime(): Promise<void> {
await new Checkbox(
this.page.findByDataQa('assistance-services-for-time')
).toggle()
}

async assertValidationMessageShown(
messageId: string,
visible: boolean
): Promise<void> {
if (visible)
await this.page
.findByDataQa(`validation-message-${messageId}`)
.waitUntilVisible()
else
await this.page
.findByDataQa(`validation-message-${messageId}`)
.waitUntilHidden()
}

private async fillEmployee(
selector: string,
name: string,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,22 @@ describe('Assistance Need Decisions - Edit page', () => {
await assistanceNeedDecisionEditPage.assertDeciderSelectVisible()
})

test('Shows info that validity period end date is not mandatory for assistance services for time being', async () => {
await assistanceNeedDecisionEditPage.validityEndDateInput.waitUntilHidden()
await assistanceNeedDecisionEditPage.toggleAssistanceServicesForTime()
await assistanceNeedDecisionEditPage.validityEndDateInput.waitUntilVisible()
await assistanceNeedDecisionEditPage.clickPreviewButton()
await assistanceNeedDecisionEditPage.assertValidationMessageShown(
'endDate',
true
)
await assistanceNeedDecisionEditPage.validityEndDateNotKnownCheckbox.click()
await assistanceNeedDecisionEditPage.assertValidationMessageShown(
'endDate',
false
)
})

test('Info header shows correct information', async () => {
await assistanceNeedDecisionEditPage.assertDecisionStatus('Luonnos')
await assistanceNeedDecisionEditPage.assertDecisionNumber(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,6 +150,7 @@ export default React.memo(function AssistanceNeedDecisionSection({
LocalDate.todayInHelsinkiTz(),
null
),
endDateNotKnown: false,
viewOfGuardians: null
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,10 @@ export default React.memo(function AssistanceNeedDecisionEditPage() {
formState?.preparedBy2 &&
!formState.preparedBy2.title &&
'preparator2Title',
// there must be an end date if ASSISTANCE_SERVICES_FOR_TIME is selected
// there must be an end date or end_date_not_known = TRUE if ASSISTANCE_SERVICES_FOR_TIME is selected
formState?.assistanceLevels.includes('ASSISTANCE_SERVICES_FOR_TIME') &&
formState?.validityPeriod.end === null &&
!formState.endDateNotKnown &&
'endDate',
// at least one assistance level must be selected
formState?.assistanceLevels.length === 0 && 'futureLevelOfAssistance'
Expand Down Expand Up @@ -310,7 +311,7 @@ export default React.memo(function AssistanceNeedDecisionEditPage() {
InputInfo
][]
).map(([field, value]) => (
<li key={field}>
<li key={field} data-qa={`validation-message-${field}`}>
{getFieldTranslation(
i18n.childInformation.assistanceNeedDecision,
field
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ export default React.memo(function AssistanceNeedDecisionForm({
)

const renderAssistanceLevelMultiCheckbox = useCallback(
(level: AssistanceLevel, label: string) => (
(level: AssistanceLevel, label: string, dataQa: string) => (
<Checkbox
checked={formState.assistanceLevels.includes(level)}
label={label}
Expand All @@ -243,6 +243,7 @@ export default React.memo(function AssistanceNeedDecisionForm({
: formState.assistanceLevels.filter((level2) => level !== level2)
})
}
data-qa={dataQa}
/>
),
[formState, setFieldVal]
Expand Down Expand Up @@ -511,19 +512,23 @@ export default React.memo(function AssistanceNeedDecisionForm({
<Label>{t.futureLevelOfAssistance}</Label>
{renderAssistanceLevelMultiCheckbox(
'SPECIAL_ASSISTANCE',
t.assistanceLevel.specialAssistance
t.assistanceLevel.specialAssistance,
'special-assistance'
)}
{renderAssistanceLevelMultiCheckbox(
'ENHANCED_ASSISTANCE',
t.assistanceLevel.enhancedAssistance
t.assistanceLevel.enhancedAssistance,
'enchanced-assistance'
)}
{renderAssistanceLevelMultiCheckbox(
'ASSISTANCE_SERVICES_FOR_TIME',
t.assistanceLevel.assistanceServicesForTime
t.assistanceLevel.assistanceServicesForTime,
'assistance-services-for-time'
)}
{renderAssistanceLevelMultiCheckbox(
'ASSISTANCE_ENDS',
t.assistanceLevel.assistanceEnds
t.assistanceLevel.assistanceEnds,
'assistance-ends'
)}
{fieldInfos.assistanceLevels &&
fieldInfos.assistanceLevels.status === 'warning' && (
Expand Down Expand Up @@ -556,6 +561,7 @@ export default React.memo(function AssistanceNeedDecisionForm({
info={fieldInfos.startDate}
maxDate={formState.validityPeriod.end ?? undefined}
required
data-qa="validity-start-date"
/>
</FieldWithInfo>

Expand All @@ -573,6 +579,14 @@ export default React.memo(function AssistanceNeedDecisionForm({
hideErrorsBeforeTouched={!fieldInfos.endDate}
info={fieldInfos.endDate}
minDate={formState.validityPeriod.start}
data-qa="validity-end-date"
/>
<Gap size="xs" />
<Checkbox
label={t.endDateNotKnown}
checked={formState.endDateNotKnown}
onChange={(checked) => setFieldVal({ endDateNotKnown: checked })}
data-qa="end-date-not-known-checkbox"
/>
</FixedSpaceColumn>
)}
Expand Down
2 changes: 2 additions & 0 deletions frontend/src/lib-common/generated/api-types/assistanceneed.ts
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ export interface AssistanceNeedDecision {
decisionMade: LocalDate | null
decisionMaker: AssistanceNeedDecisionMaker | null
decisionNumber: number | null
endDateNotKnown: boolean
expertResponsibilities: string | null
guardianInfo: AssistanceNeedDecisionGuardian[]
guardiansHeardOn: LocalDate | null
Expand Down Expand Up @@ -143,6 +144,7 @@ export interface AssistanceNeedDecisionForm {
decisionMade: LocalDate | null
decisionMaker: AssistanceNeedDecisionMakerForm | null
decisionNumber: number | null
endDateNotKnown: boolean
expertResponsibilities: string | null
guardianInfo: AssistanceNeedDecisionGuardian[]
guardiansHeardOn: LocalDate | null
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1194,6 +1194,7 @@ export const fi = {
disclaimer:
'Varhaiskasvatuslain 15 e §:n mukaan tämä päätös voidaan panna täytäntöön muutoksenhausta huolimatta.',
decisionNumber: 'Päätösnumero',
endDateNotKnown: 'Tukipalvelun päättymisajankohta ei tiedossa',
statuses: {
DRAFT: 'Luonnos',
NEEDS_WORK: 'Korjattava',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -843,6 +843,7 @@ class AssistanceNeedDecisionIntegrationTest : FullApplicationTest(resetDbBeforeE
dateOfBirth = LocalDate.of(2012, 1, 4),
),
annulmentReason = "",
endDateNotKnown = false,
),
)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,7 @@ class EspooBiTest : PureJdbiTest(resetDbBeforeEach = true) {
motivationForDecision = null,
unreadGuardianIds = null,
annulmentReason = "",
endDateNotKnown = false,
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -452,6 +452,7 @@ class InactivePeopleCleanupIntegrationTest : PureJdbiTest(resetDbBeforeEach = tr
motivationForDecision = null,
unreadGuardianIds = null,
annulmentReason = "",
endDateNotKnown = false,
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,7 @@ class AssistanceNeedDecisionAccessControlTest : AccessControlTest() {
motivationForDecision = null,
unreadGuardianIds = null,
annulmentReason = "",
endDateNotKnown = false,
),
)
}
Expand Down Expand Up @@ -144,6 +145,7 @@ class AssistanceNeedDecisionAccessControlTest : AccessControlTest() {
motivationForDecision = null,
unreadGuardianIds = null,
annulmentReason = "",
endDateNotKnown = false,
),
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ data class AssistanceNeedDecision(
val decisionNumber: Long? = null,
@Nested("child") val child: AssistanceNeedDecisionChild?,
val validityPeriod: DateRange,
val endDateNotKnown: Boolean,
val status: AssistanceNeedDecisionStatus,
val language: OfficialLanguage,
val decisionMade: LocalDate?,
Expand Down Expand Up @@ -54,6 +55,7 @@ data class AssistanceNeedDecision(
AssistanceNeedDecisionForm(
decisionNumber,
validityPeriod,
endDateNotKnown,
status,
language,
decisionMade,
Expand Down Expand Up @@ -84,6 +86,7 @@ data class AssistanceNeedDecision(
data class AssistanceNeedDecisionForm(
val decisionNumber: Long? = null,
val validityPeriod: DateRange,
val endDateNotKnown: Boolean = false,
val status: AssistanceNeedDecisionStatus,
val language: OfficialLanguage,
val decisionMade: LocalDate?,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@ fun Database.Read.getAssistanceNeedDecisionById(
createQuery {
sql(
"""
SELECT ad.id, decision_number, child_id, concat(child.first_name, ' ', child.last_name) child_name, validity_period, status,
SELECT ad.id, decision_number, child_id, concat(child.first_name, ' ', child.last_name) child_name, validity_period, end_date_not_known, status,
ad.language, decision_made, sent_for_decision, pedagogical_motivation, structural_motivation_opt_smaller_group,
structural_motivation_opt_special_group, structural_motivation_opt_small_group,
structural_motivation_opt_group_assistant, structural_motivation_opt_child_assistant,
Expand Down Expand Up @@ -161,6 +161,7 @@ fun Database.Transaction.updateAssistanceNeedDecision(
UPDATE assistance_need_decision
SET
validity_period = ${bind(data.validityPeriod)},
end_date_not_known = ${bind(data.endDateNotKnown)},
status = ${bind(data.status)},
language = ${bind(data.language)},
decision_made = ${bind(data.decisionMade)},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -758,7 +758,7 @@ fun Database.Transaction.insertTestAssistanceNeedDecision(
sql(
"""
INSERT INTO assistance_need_decision (
id, decision_number, child_id, validity_period, status, language, decision_made, sent_for_decision,
id, decision_number, child_id, validity_period, end_date_not_known, status, language, decision_made, sent_for_decision,
selected_unit, pedagogical_motivation, structural_motivation_opt_smaller_group,
structural_motivation_opt_special_group, structural_motivation_opt_small_group,
structural_motivation_opt_group_assistant, structural_motivation_opt_child_assistant,
Expand All @@ -771,7 +771,7 @@ INSERT INTO assistance_need_decision (
preparer_1_phone_number, preparer_2_phone_number, unread_guardian_ids, annulment_reason
)
VALUES (
${bind(data.id)}, ${bind(data.decisionNumber)}, ${bind(childId)}, ${bind(data.validityPeriod)}, ${bind(data.status)},
${bind(data.id)}, ${bind(data.decisionNumber)}, ${bind(childId)}, ${bind(data.validityPeriod)}, ${bind(data.endDateNotKnown)}, ${bind(data.status)},
${bind(data.language)}, ${bind(data.decisionMade)}, ${bind(data.sentForDecision)}, ${bind(data.selectedUnit)}, ${bind(data.pedagogicalMotivation)},
${bind(data.structuralMotivationOptions.smallerGroup)}, ${bind(data.structuralMotivationOptions.specialGroup)}, ${bind(data.structuralMotivationOptions.smallGroup)},
${bind(data.structuralMotivationOptions.groupAssistant)}, ${bind(data.structuralMotivationOptions.childAssistant)}, ${bind(data.structuralMotivationOptions.additionalStaff)},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1933,6 +1933,7 @@ data class DevAssistanceNeedDecision(
val decisionNumber: Long?,
val childId: ChildId,
val validityPeriod: DateRange,
val endDateNotKnown: Boolean,
val status: AssistanceNeedDecisionStatus,
val language: OfficialLanguage,
val decisionMade: LocalDate?,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
ALTER TABLE assistance_need_decision
ADD COLUMN end_date_not_known BOOLEAN DEFAULT FALSE NOT NULL;
1 change: 1 addition & 0 deletions service/src/main/resources/migrations.txt
Original file line number Diff line number Diff line change
Expand Up @@ -436,3 +436,4 @@ V437__service_application.sql
V438__service_applications_unit_feature.sql
V439__income_statement_and_income_indexes.sql
V440__rename_curriculum_tables_to_backup.sql
V441__assistance_need_decision_no_end_date.sql

0 comments on commit bd679df

Please sign in to comment.