Skip to content

Commit 095b080

Browse files
committed
Add confidentiality details to document templates and hard-coded ones for other metadata processes
1 parent 8181394 commit 095b080

File tree

25 files changed

+242
-72
lines changed

25 files changed

+242
-72
lines changed

frontend/src/citizen-frontend/child-documents/ChildDocumentPage.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ const ChildDocumentView = React.memo(function ChildDocumentView({
137137
</FixedSpaceColumn>
138138
<FixedSpaceColumn spacing="xs">
139139
<ChildDocumentStateChip status={document.status} />
140-
{document.template.confidential && (
140+
{document.template.confidentiality !== null && (
141141
<Label>{i18n.children.childDocuments.confidential}</Label>
142142
)}
143143
<span>{document.template.legalBasis}</span>

frontend/src/e2e-test/dev-api/fixtures.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1118,7 +1118,7 @@ export class Fixture {
11181118
],
11191119
language: 'FI',
11201120
name: 'Pedagoginen selvitys',
1121-
confidential: true,
1121+
confidentiality: null,
11221122
legalBasis: '§1',
11231123
published: false,
11241124
validity: new DateRange(LocalDate.of(2000, 1, 1), null),

frontend/src/e2e-test/generated/api-types.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import { DecisionId } from 'lib-common/generated/api-types/shared'
4949
import { DecisionIncome } from 'lib-common/generated/api-types/invoicing'
5050
import { DecisionStatus } from 'lib-common/generated/api-types/decision'
5151
import { DecisionType } from 'lib-common/generated/api-types/decision'
52+
import { DocumentConfidentiality } from 'lib-common/generated/api-types/process'
5253
import { DocumentContent } from 'lib-common/generated/api-types/document'
5354
import { DocumentStatus } from 'lib-common/generated/api-types/document'
5455
import { DocumentTemplateContent } from 'lib-common/generated/api-types/document'
@@ -565,7 +566,7 @@ export interface DevDaycareGroupPlacement {
565566
*/
566567
export interface DevDocumentTemplate {
567568
archiveDurationMonths: number | null
568-
confidential: boolean
569+
confidentiality: DocumentConfidentiality | null
569570
content: DocumentTemplateContent
570571
id: DocumentTemplateId
571572
language: OfficialLanguage

frontend/src/e2e-test/pages/employee/documents/document-templates.ts

+8
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ export class TemplateModal extends Element {
7979
readonly validityStartInput
8080
readonly processDefinitionNumberInput
8181
readonly archiveDurationMonthsInput
82+
readonly confidentialityDurationYearsInput
83+
readonly confidentialityBasisInput
8284
readonly confirmCreateButton
8385

8486
constructor(locator: Locator) {
@@ -95,6 +97,12 @@ export class TemplateModal extends Element {
9597
this.archiveDurationMonthsInput = new TextInput(
9698
this.findByDataQa('archive-duration-months')
9799
)
100+
this.confidentialityDurationYearsInput = new TextInput(
101+
this.findByDataQa('confidentiality-duration-years')
102+
)
103+
this.confidentialityBasisInput = new TextInput(
104+
this.findByDataQa('confidentiality-basis')
105+
)
98106
this.confirmCreateButton = this.findByDataQa('modal-okBtn')
99107
}
100108
}

frontend/src/e2e-test/specs/5_employee/child-documents.spec.ts

+4
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ describe('Employee - Child documents', () => {
6868
await modal.typeSelect.selectOption('HOJKS')
6969
await modal.placementTypesSelect.fillAndSelectFirst('Esiopetus')
7070
await modal.validityStartInput.fill('01.08.2022')
71+
await modal.confidentialityDurationYearsInput.fill('100')
72+
await modal.confidentialityBasisInput.fill('Joku laki §300')
7173
await modal.confirmCreateButton.click()
7274
await documentTemplatesPage.openTemplate(documentName)
7375

@@ -332,6 +334,8 @@ describe('Employee - Child documents', () => {
332334
await modal.typeSelect.selectOption('VASU')
333335
await modal.placementTypesSelect.fillAndSelectFirst('Esiopetus')
334336
await modal.validityStartInput.fill('01.08.2022')
337+
await modal.confidentialityDurationYearsInput.fill('100')
338+
await modal.confidentialityBasisInput.fill('Joku laki §300')
335339
await modal.processDefinitionNumberInput.fill('1234')
336340
await modal.archiveDurationMonthsInput.fill('1320')
337341
await modal.confirmCreateButton.click()

frontend/src/employee-frontend/components/archive-metadata/MetadataSection.tsx

+13-1
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,19 @@ const DocumentMetadata = React.memo(function DocumentMetadata({
8989
: document.confidential === false
9090
? i18n.metadata.public
9191
: i18n.metadata.notSet
92-
}
92+
},
93+
...(document.confidential && document.confidentiality
94+
? [
95+
{
96+
label: i18n.metadata.confidentialityDuration,
97+
value: `${document.confidentiality.durationYears} ${i18n.metadata.years}`
98+
},
99+
{
100+
label: i18n.metadata.confidentialityBasis,
101+
value: document.confidentiality.basis
102+
}
103+
]
104+
: [])
93105
]}
94106
/>
95107
</div>

frontend/src/employee-frontend/components/child-documents/ChildDocumentEditor.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ const DocumentBasics = React.memo(function DocumentBasics({
112112
alignItems="flex-end"
113113
>
114114
<ChildDocumentStateChip status={document.status} />
115-
{document.template.confidential && (
115+
{document.template.confidentiality !== null && (
116116
<strong>{i18n.documentTemplates.templateEditor.confidential}</strong>
117117
)}
118118
{!!document.template.legalBasis && (

frontend/src/employee-frontend/components/document-templates/template-editor/TemplateContentEditor.tsx

+5-2
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ const BasicsSection = React.memo(function BasicsSection({
270270
</GrovingDiv>
271271
<FixedSpaceColumn spacing="xxs">
272272
<span>{template.legalBasis}</span>
273-
{template.confidential && (
273+
{template.confidentiality && (
274274
<span>{i18n.documentTemplates.templateEditor.confidential}</span>
275275
)}
276276
</FixedSpaceColumn>
@@ -323,7 +323,10 @@ const BasicsEditor = React.memo(function BasicsEditor({
323323
domValue: template.language,
324324
options: languageOptions
325325
},
326-
confidential: template.confidential,
326+
confidential: template.confidentiality !== null,
327+
confidentialityDurationYears:
328+
template.confidentiality?.durationYears?.toString() ?? '',
329+
confidentialityBasis: template.confidentiality?.basis ?? '',
327330
legalBasis: template.legalBasis,
328331
validity: openEndedLocalDateRange.fromRange(template.validity),
329332
processDefinitionNumber: template.processDefinitionNumber ?? '',

frontend/src/employee-frontend/components/document-templates/template-editor/TemplateModal.tsx

+67-12
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ export const documentTemplateForm = transformed(
6363
),
6464
language: required(oneOf<OfficialLanguage>()),
6565
confidential: boolean(),
66+
confidentialityDurationYears: required(value<string>()),
67+
confidentialityBasis: required(value<string>()),
6668
legalBasis: string(),
6769
validity: required(openEndedLocalDateRange()),
6870
processDefinitionNumber: required(value<string>()),
@@ -75,20 +77,43 @@ export const documentTemplateForm = transformed(
7577
if (isNaN(archiveDurationMonths) || archiveDurationMonths < 1) {
7678
return ValidationError.field('archiveDurationMonths', 'integerFormat')
7779
}
78-
const output: DocumentTemplateBasicsRequest = {
79-
...value,
80-
processDefinitionNumber: value.processDefinitionNumber.trim(),
81-
archiveDurationMonths: archiveDurationMonths
80+
}
81+
82+
const confidential = value.confidential
83+
if (confidential) {
84+
const confidentialityDurationYears = parseInt(
85+
value.confidentialityDurationYears
86+
)
87+
if (
88+
isNaN(confidentialityDurationYears) ||
89+
confidentialityDurationYears < 1
90+
) {
91+
return ValidationError.field(
92+
'confidentialityDurationYears',
93+
'integerFormat'
94+
)
8295
}
83-
return ValidationSuccess.of(output)
84-
} else {
85-
const output: DocumentTemplateBasicsRequest = {
86-
...value,
87-
processDefinitionNumber: null,
88-
archiveDurationMonths: null
96+
if (value.confidentialityBasis.trim().length === 0) {
97+
return ValidationError.field('confidentialityBasis', 'required')
8998
}
90-
return ValidationSuccess.of(output)
9199
}
100+
101+
const output: DocumentTemplateBasicsRequest = {
102+
...value,
103+
processDefinitionNumber: archived
104+
? value.processDefinitionNumber.trim()
105+
: null,
106+
archiveDurationMonths: archived
107+
? parseInt(value.archiveDurationMonths)
108+
: null,
109+
confidentiality: confidential
110+
? {
111+
durationYears: parseInt(value.confidentialityDurationYears),
112+
basis: value.confidentialityBasis.trim()
113+
}
114+
: null
115+
}
116+
return ValidationSuccess.of(output)
92117
}
93118
)
94119

@@ -154,7 +179,10 @@ export default React.memo(function TemplateModal({ onClose, mode }: Props) {
154179
domValue: mode.data.language,
155180
options: languageOptions
156181
},
157-
confidential: mode.data.confidential,
182+
confidential: mode.data.confidentiality !== null,
183+
confidentialityDurationYears:
184+
mode.data.confidentiality?.durationYears?.toString() ?? '',
185+
confidentialityBasis: mode.data.confidentiality?.basis ?? '',
158186
legalBasis: mode.data.legalBasis,
159187
validity: openEndedLocalDateRange.fromRange(
160188
DateRange.parseJson(mode.data.validity)
@@ -175,6 +203,8 @@ export default React.memo(function TemplateModal({ onClose, mode }: Props) {
175203
options: languageOptions
176204
},
177205
confidential: true,
206+
confidentialityDurationYears: '100',
207+
confidentialityBasis: '',
178208
legalBasis: '',
179209
validity: openEndedLocalDateRange.empty(),
180210
processDefinitionNumber: '',
@@ -191,6 +221,8 @@ export default React.memo(function TemplateModal({ onClose, mode }: Props) {
191221
placementTypes,
192222
language,
193223
confidential,
224+
confidentialityDurationYears,
225+
confidentialityBasis,
194226
legalBasis,
195227
validity,
196228
processDefinitionNumber,
@@ -260,6 +292,29 @@ export default React.memo(function TemplateModal({ onClose, mode }: Props) {
260292
bind={confidential}
261293
label={i18n.documentTemplates.templateModal.confidential}
262294
/>
295+
{confidential.state && (
296+
<>
297+
<Gap />
298+
<Label>
299+
{i18n.documentTemplates.templateModal.confidentialityDuration}
300+
</Label>
301+
<InputFieldF
302+
data-qa="confidentiality-duration-years"
303+
bind={confidentialityDurationYears}
304+
type="number"
305+
hideErrorsBeforeTouched
306+
/>{' '}
307+
<Gap />
308+
<Label>
309+
{i18n.documentTemplates.templateModal.confidentialityBasis}
310+
</Label>
311+
<InputFieldF
312+
data-qa="confidentiality-basis"
313+
bind={confidentialityBasis}
314+
hideErrorsBeforeTouched
315+
/>
316+
</>
317+
)}
263318
<Gap />
264319
<ExpandingInfo
265320
info={i18n.documentTemplates.templateModal.processDefinitionNumberInfo}

frontend/src/lib-common/generated/api-types/document.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import HelsinkiDateTime from '../../helsinki-date-time'
99
import LocalDate from '../../local-date'
1010
import { Action } from '../action'
1111
import { ChildDocumentId } from './shared'
12+
import { DocumentConfidentiality } from './process'
1213
import { DocumentTemplateId } from './shared'
1314
import { EmployeeId } from './shared'
1415
import { JsonOf } from '../../json'
@@ -220,7 +221,7 @@ export type DocumentStatus =
220221
*/
221222
export interface DocumentTemplate {
222223
archiveDurationMonths: number | null
223-
confidential: boolean
224+
confidentiality: DocumentConfidentiality | null
224225
content: DocumentTemplateContent
225226
id: DocumentTemplateId
226227
language: OfficialLanguage
@@ -238,7 +239,7 @@ export interface DocumentTemplate {
238239
*/
239240
export interface DocumentTemplateBasicsRequest {
240241
archiveDurationMonths: number | null
241-
confidential: boolean
242+
confidentiality: DocumentConfidentiality | null
242243
language: OfficialLanguage
243244
legalBasis: string
244245
name: string
@@ -299,7 +300,7 @@ export interface DocumentWriteLock {
299300
*/
300301
export interface ExportedDocumentTemplate {
301302
archiveDurationMonths: number | null
302-
confidential: boolean
303+
confidentiality: DocumentConfidentiality | null
303304
content: DocumentTemplateContent
304305
language: OfficialLanguage
305306
legalBasis: string

frontend/src/lib-common/generated/api-types/process.ts

+12-3
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,19 @@ export type ArchivedProcessState =
4444
| 'COMPLETED'
4545

4646
/**
47-
* Generated from fi.espoo.evaka.process.ProcessMetadataController.DocumentMetadata
47+
* Generated from fi.espoo.evaka.process.DocumentConfidentiality
48+
*/
49+
export interface DocumentConfidentiality {
50+
basis: string
51+
durationYears: number
52+
}
53+
54+
/**
55+
* Generated from fi.espoo.evaka.process.DocumentMetadata
4856
*/
4957
export interface DocumentMetadata {
5058
confidential: boolean | null
59+
confidentiality: DocumentConfidentiality | null
5160
createdAt: HelsinkiDateTime | null
5261
createdBy: EvakaUser | null
5362
documentId: UUID
@@ -57,14 +66,14 @@ export interface DocumentMetadata {
5766
}
5867

5968
/**
60-
* Generated from fi.espoo.evaka.process.ProcessMetadataController.DocumentOrigin
69+
* Generated from fi.espoo.evaka.process.DocumentOrigin
6170
*/
6271
export type DocumentOrigin =
6372
| 'ELECTRONIC'
6473
| 'PAPER'
6574

6675
/**
67-
* Generated from fi.espoo.evaka.process.ProcessMetadataController.ProcessMetadata
76+
* Generated from fi.espoo.evaka.process.ProcessMetadata
6877
*/
6978
export interface ProcessMetadata {
7079
primaryDocument: DocumentMetadata

frontend/src/lib-customizations/defaults/employee/i18n/fi.tsx

+5
Original file line numberDiff line numberDiff line change
@@ -4987,6 +4987,8 @@ export const fi = {
49874987
placementTypes: 'Käytössä sijoituksilla',
49884988
language: 'Lomakkeen kieli',
49894989
confidential: 'Lomake on salassapidettävä',
4990+
confidentialityDuration: 'Salassapitoaika (vuotta)',
4991+
confidentialityBasis: 'Salassapitoperuste (lakiviittaus)',
49904992
legalBasis: 'Lait joihin lomake perustuu (vapaaehtoinen)',
49914993
validity: 'Voimassa ajalla',
49924994
processDefinitionNumber: 'Tehtäväluokka',
@@ -5193,6 +5195,9 @@ export const fi = {
51935195
confidential: 'Salassapidettävä',
51945196
public: 'Julkinen',
51955197
notSet: 'Asettamatta',
5198+
confidentialityDuration: 'Salassapitoaika',
5199+
confidentialityBasis: 'Salassapitoperuste',
5200+
years: 'vuotta',
51965201
receivedBy: {
51975202
label: 'Saapumistapa',
51985203
PAPER: 'Paperilla',

service/src/integrationTest/kotlin/fi/espoo/evaka/assistanceneed/decision/AssistanceNeedDecisionIntegrationTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ class AssistanceNeedDecisionIntegrationTest : FullApplicationTest(resetDbBeforeE
699699
)
700700
assertEquals("Päätös tuesta varhaiskasvatuksessa", metadata.primaryDocument.name)
701701
assertEquals(assistanceWorker.evakaUserId, metadata.primaryDocument.createdBy?.id)
702-
assertEquals(true, metadata.primaryDocument.confidential)
702+
assertEquals(100, metadata.primaryDocument.confidentiality?.durationYears)
703703
assertEquals(
704704
"/employee/assistance-need-decision/${assistanceNeedDecision.id}/pdf",
705705
metadata.primaryDocument.downloadPath,

service/src/integrationTest/kotlin/fi/espoo/evaka/assistanceneed/decision/AssistanceNeedPreschoolDecisionIntegrationTest.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ class AssistanceNeedPreschoolDecisionIntegrationTest :
399399
)
400400
assertEquals("Päätös tuesta esiopetuksessa", metadata.primaryDocument.name)
401401
assertEquals(assistanceWorker.evakaUserId, metadata.primaryDocument.createdBy?.id)
402-
assertEquals(true, metadata.primaryDocument.confidential)
402+
assertEquals(100, metadata.primaryDocument.confidentiality?.durationYears)
403403
assertEquals(
404404
"/employee/assistance-need-preschool-decisions/${assistanceNeedDecision.id}/pdf",
405405
metadata.primaryDocument.downloadPath,

0 commit comments

Comments
 (0)