-
Notifications
You must be signed in to change notification settings - Fork 58
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
feat(application-system): New application - Work Accident Notification #16632
base: main
Are you sure you want to change the base?
Changes from 74 commits
53e5f91
d55cb7d
6f38470
11fd388
182580f
720ae52
3e3a32e
c6d57ef
06396de
ce2a549
540d265
2ccde07
41fe5a0
051b632
1d23114
9baa16b
9c6c01e
737fbcd
b6d982b
007c1c4
51ec6f0
634f9d3
9680ea0
4f2c597
eb9570c
af094fb
f4b109a
696476b
864b7ca
5cf6008
c7e6703
5f13260
21f1897
c3958b2
2345e05
b18f6c0
94dc11b
9d0f292
f91369a
2f2358a
4043702
7bfb772
de27fbe
7e4108a
7b1582f
69849f4
cf30c95
e6b5e5a
d5a75ef
791942f
44b5d7a
be1e3f7
923bd35
27ef79f
40179fb
3f7bff2
fcb19be
d67f2b2
8c76d8d
02208fe
4b4bac1
8983394
24cb399
1dfa270
c94f5a6
9dc0a54
e7b5157
d8135a9
f88e963
8ef2cae
f2c93ba
bb7045c
8479bcf
6056090
096092b
0c669f5
553c97a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,22 @@ | ||
import { Module } from '@nestjs/common' | ||
import { SharedTemplateAPIModule } from '../../../shared' | ||
import { WorkAccidentNotificationTemplateService } from './work-accident-notification.service' | ||
import { | ||
WorkAccidentClientConfig, | ||
WorkAccidentClientModule, | ||
} from '@island.is/clients/work-accident-ver' | ||
import { ConfigModule } from '@nestjs/config' | ||
|
||
@Module({ | ||
imports: [ | ||
SharedTemplateAPIModule, | ||
WorkAccidentClientModule, | ||
ConfigModule.forRoot({ | ||
isGlobal: true, | ||
load: [WorkAccidentClientConfig], | ||
}), | ||
], | ||
providers: [WorkAccidentNotificationTemplateService], | ||
exports: [WorkAccidentNotificationTemplateService], | ||
}) | ||
export class WorkAccidentNotificationTemplateModule {} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,209 @@ | ||||||||||||||||||||||||||||||||||||||||||||
import { Inject, Injectable } from '@nestjs/common' | ||||||||||||||||||||||||||||||||||||||||||||
import { ApplicationTypes } from '@island.is/application/types' | ||||||||||||||||||||||||||||||||||||||||||||
import { BaseTemplateApiService } from '../../../base-template-api.service' | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
import type { Logger } from '@island.is/logging' | ||||||||||||||||||||||||||||||||||||||||||||
import { LOGGER_PROVIDER } from '@island.is/logging' | ||||||||||||||||||||||||||||||||||||||||||||
import { TemplateApiModuleActionProps } from '../../../../types' | ||||||||||||||||||||||||||||||||||||||||||||
import { WorkAccidentNotification } from '@island.is/application/templates/aosh/work-accident-notification' | ||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||
DataDto, | ||||||||||||||||||||||||||||||||||||||||||||
WorkAccidentClientService, | ||||||||||||||||||||||||||||||||||||||||||||
} from '@island.is/clients/work-accident-ver' | ||||||||||||||||||||||||||||||||||||||||||||
import { | ||||||||||||||||||||||||||||||||||||||||||||
getDateAndTime, | ||||||||||||||||||||||||||||||||||||||||||||
getValueList, | ||||||||||||||||||||||||||||||||||||||||||||
} from './work-accident-notification.utils' | ||||||||||||||||||||||||||||||||||||||||||||
import { getValueViaPath } from '@island.is/application/core' | ||||||||||||||||||||||||||||||||||||||||||||
import { TemplateApiError } from '@island.is/nest/problem' | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
@Injectable() | ||||||||||||||||||||||||||||||||||||||||||||
export class WorkAccidentNotificationTemplateService extends BaseTemplateApiService { | ||||||||||||||||||||||||||||||||||||||||||||
constructor( | ||||||||||||||||||||||||||||||||||||||||||||
@Inject(LOGGER_PROVIDER) private logger: Logger, | ||||||||||||||||||||||||||||||||||||||||||||
private readonly workAccidentClientService: WorkAccidentClientService, | ||||||||||||||||||||||||||||||||||||||||||||
) { | ||||||||||||||||||||||||||||||||||||||||||||
super(ApplicationTypes.WORK_ACCIDENT_NOTIFICATION) | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
async getInputOptions({ | ||||||||||||||||||||||||||||||||||||||||||||
currentUserLocale, | ||||||||||||||||||||||||||||||||||||||||||||
auth, | ||||||||||||||||||||||||||||||||||||||||||||
}: TemplateApiModuleActionProps): Promise<DataDto> { | ||||||||||||||||||||||||||||||||||||||||||||
const data = await this.workAccidentClientService | ||||||||||||||||||||||||||||||||||||||||||||
.getOptionsData(auth, currentUserLocale) | ||||||||||||||||||||||||||||||||||||||||||||
.catch(() => { | ||||||||||||||||||||||||||||||||||||||||||||
this.logger.warn( | ||||||||||||||||||||||||||||||||||||||||||||
'[work-accident-notification-service]: Error fetching data from AOSH', | ||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||
throw new TemplateApiError( | ||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||
summary: | ||||||||||||||||||||||||||||||||||||||||||||
'Ekki tókst að sækja gögn til VER, vinsamlegast reynið síðar', | ||||||||||||||||||||||||||||||||||||||||||||
title: 'Villa í umsókn', | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
400, | ||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
return data | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
async submitApplication({ | ||||||||||||||||||||||||||||||||||||||||||||
application, | ||||||||||||||||||||||||||||||||||||||||||||
auth, | ||||||||||||||||||||||||||||||||||||||||||||
}: TemplateApiModuleActionProps): Promise<void> { | ||||||||||||||||||||||||||||||||||||||||||||
const answers = application.answers as unknown as WorkAccidentNotification | ||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||
await this.workAccidentClientService | ||||||||||||||||||||||||||||||||||||||||||||
.createAccident(auth, { | ||||||||||||||||||||||||||||||||||||||||||||
accidentForCreationDto: { | ||||||||||||||||||||||||||||||||||||||||||||
companySSN: answers.companyInformation.nationalId, | ||||||||||||||||||||||||||||||||||||||||||||
sizeOfEnterprise: parseInt( | ||||||||||||||||||||||||||||||||||||||||||||
answers.companyInformation.numberOfEmployees, | ||||||||||||||||||||||||||||||||||||||||||||
10, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
nameOfBranchOrDepartment: | ||||||||||||||||||||||||||||||||||||||||||||
answers.companyInformation.nameOfBranch ?? '1', // TODO: Vinnueftirlit will decide what number is default | ||||||||||||||||||||||||||||||||||||||||||||
address: answers.companyInformation.address, | ||||||||||||||||||||||||||||||||||||||||||||
postcode: answers.companyInformation.postnumber.slice(0, 3), | ||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Validate postcode slicing. The postcode slicing assumes a fixed format but lacks validation. Apply this diff to add validation: -postcode: answers.companyInformation.postnumber.slice(0, 3),
+postcode: answers.companyInformation.postnumber?.slice(0, 3) ?? '', 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
workplaceHealthAndSafety: | ||||||||||||||||||||||||||||||||||||||||||||
answers.companyLaborProtection.workhealthAndSafetyOccupation?.map( | ||||||||||||||||||||||||||||||||||||||||||||
(code: string) => { | ||||||||||||||||||||||||||||||||||||||||||||
return parseInt(code, 10) | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
buyersSSN: answers.projectPurchase.nationalId ?? '', | ||||||||||||||||||||||||||||||||||||||||||||
dateAndTimeOfAccident: getDateAndTime( | ||||||||||||||||||||||||||||||||||||||||||||
answers.accident.date, | ||||||||||||||||||||||||||||||||||||||||||||
answers.accident.time.slice(0, 2), | ||||||||||||||||||||||||||||||||||||||||||||
answers.accident.time.slice(2, 4), | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
aoshCame: answers.accident.didAoshCome === 'yes', | ||||||||||||||||||||||||||||||||||||||||||||
policeCame: answers.accident.didPoliceCome === 'yes', | ||||||||||||||||||||||||||||||||||||||||||||
numberOfVictims: answers.employee.length, | ||||||||||||||||||||||||||||||||||||||||||||
municipalityWhereAccidentOccured: answers.accident.municipality, | ||||||||||||||||||||||||||||||||||||||||||||
specificLocationOfAccident: answers.accident.exactLocation, | ||||||||||||||||||||||||||||||||||||||||||||
detailedDescriptionOfAccident: answers.accident.wasDoing.concat( | ||||||||||||||||||||||||||||||||||||||||||||
'\n', | ||||||||||||||||||||||||||||||||||||||||||||
answers.accident.wentWrong, | ||||||||||||||||||||||||||||||||||||||||||||
'\n', | ||||||||||||||||||||||||||||||||||||||||||||
answers.accident.how, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
workingEnvironment: answers.accident.accidentLocation.value, | ||||||||||||||||||||||||||||||||||||||||||||
victims: answers.employee.map((employee, index) => { | ||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||
victimsSSN: employee.nationalField.nationalId, | ||||||||||||||||||||||||||||||||||||||||||||
employmentStatusOfVictim: employee.employmentStatus | ||||||||||||||||||||||||||||||||||||||||||||
? parseInt(employee.employmentStatus, 10) | ||||||||||||||||||||||||||||||||||||||||||||
: 0, | ||||||||||||||||||||||||||||||||||||||||||||
employmentAgencySSN: employee.tempEmploymentSSN ?? '', | ||||||||||||||||||||||||||||||||||||||||||||
startedEmploymentForCompany: new Date(employee.startDate), | ||||||||||||||||||||||||||||||||||||||||||||
lengthOfEmployment: employee.employmentTime | ||||||||||||||||||||||||||||||||||||||||||||
? parseInt(employee.employmentTime, 10) | ||||||||||||||||||||||||||||||||||||||||||||
: 0, | ||||||||||||||||||||||||||||||||||||||||||||
percentageOfFullWorkTime: employee.employmentRate | ||||||||||||||||||||||||||||||||||||||||||||
? parseInt(employee.employmentRate, 10) | ||||||||||||||||||||||||||||||||||||||||||||
: 0, | ||||||||||||||||||||||||||||||||||||||||||||
workhourArrangement: employee.workhourArrangement | ||||||||||||||||||||||||||||||||||||||||||||
? parseInt(employee.workhourArrangement, 10) | ||||||||||||||||||||||||||||||||||||||||||||
: 0, | ||||||||||||||||||||||||||||||||||||||||||||
startOfWorkingDay: getDateAndTime( | ||||||||||||||||||||||||||||||||||||||||||||
employee.startOfWorkdayDate, | ||||||||||||||||||||||||||||||||||||||||||||
employee.startTime.slice(0, 2), | ||||||||||||||||||||||||||||||||||||||||||||
employee.startTime.slice(2, 4), | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
workStation: employee.workstation | ||||||||||||||||||||||||||||||||||||||||||||
? parseInt(employee.workstation, 10) | ||||||||||||||||||||||||||||||||||||||||||||
: 0, | ||||||||||||||||||||||||||||||||||||||||||||
victimsOccupation: employee.victimsOccupation.value, | ||||||||||||||||||||||||||||||||||||||||||||
absenceDueToAccident: answers.absence[index] | ||||||||||||||||||||||||||||||||||||||||||||
? parseInt(answers.absence[index], 10) | ||||||||||||||||||||||||||||||||||||||||||||
: 0, | ||||||||||||||||||||||||||||||||||||||||||||
specificPhysicalActivities: getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`circumstances[${index}].physicalActivities`, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
specificPhysicalActivityMostSevere: | ||||||||||||||||||||||||||||||||||||||||||||
(getValueViaPath( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`circumstances[${index}].physicalActivitiesMostSerious`, | ||||||||||||||||||||||||||||||||||||||||||||
undefined, | ||||||||||||||||||||||||||||||||||||||||||||
) as string | undefined) ?? | ||||||||||||||||||||||||||||||||||||||||||||
getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`circumstances[${index}].physicalActivities`, | ||||||||||||||||||||||||||||||||||||||||||||
)[0], | ||||||||||||||||||||||||||||||||||||||||||||
workDeviations: getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`deviations[${index}].workDeviations`, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
workDeviationMostSevere: | ||||||||||||||||||||||||||||||||||||||||||||
(getValueViaPath( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`deviations[${index}].workDeviationsMostSerious`, | ||||||||||||||||||||||||||||||||||||||||||||
undefined, | ||||||||||||||||||||||||||||||||||||||||||||
) as string | undefined) ?? | ||||||||||||||||||||||||||||||||||||||||||||
getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`deviations[${index}].workDeviations`, | ||||||||||||||||||||||||||||||||||||||||||||
)[0], | ||||||||||||||||||||||||||||||||||||||||||||
contactModeOfInjuries: getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`causeOfInjury[${index}].contactModeOfInjury`, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
contactModeOfInjuryMostSevere: | ||||||||||||||||||||||||||||||||||||||||||||
(getValueViaPath( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`causeOfInjury[${index}].contactModeOfInjuryMostSerious`, | ||||||||||||||||||||||||||||||||||||||||||||
undefined, | ||||||||||||||||||||||||||||||||||||||||||||
) as string | undefined) ?? | ||||||||||||||||||||||||||||||||||||||||||||
getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`causeOfInjury[${index}].contactModeOfInjury`, | ||||||||||||||||||||||||||||||||||||||||||||
)[0], | ||||||||||||||||||||||||||||||||||||||||||||
partsOfBodyInjured: getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`injuredBodyParts[${index}].partOfBodyInjured`, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
partOfBodyInjuredMostSevere: | ||||||||||||||||||||||||||||||||||||||||||||
(getValueViaPath( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`injuredBodyParts[${index}].partOfBodyInjuredMostSerious`, | ||||||||||||||||||||||||||||||||||||||||||||
undefined, | ||||||||||||||||||||||||||||||||||||||||||||
) as string | undefined) ?? | ||||||||||||||||||||||||||||||||||||||||||||
getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`injuredBodyParts[${index}].partOfBodyInjured`, | ||||||||||||||||||||||||||||||||||||||||||||
)[0], | ||||||||||||||||||||||||||||||||||||||||||||
typesOfInjury: getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`typeOfInjury[${index}].typeOfInjury`, | ||||||||||||||||||||||||||||||||||||||||||||
), | ||||||||||||||||||||||||||||||||||||||||||||
typeOfInjuryMostSevere: | ||||||||||||||||||||||||||||||||||||||||||||
(getValueViaPath( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`typeOfInjury[${index}].typeOfInjuryMostSerious`, | ||||||||||||||||||||||||||||||||||||||||||||
undefined, | ||||||||||||||||||||||||||||||||||||||||||||
) as string | undefined) ?? | ||||||||||||||||||||||||||||||||||||||||||||
getValueList( | ||||||||||||||||||||||||||||||||||||||||||||
application.answers, | ||||||||||||||||||||||||||||||||||||||||||||
`typeOfInjury[${index}].typeOfInjury`, | ||||||||||||||||||||||||||||||||||||||||||||
)[0], | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
}), | ||||||||||||||||||||||||||||||||||||||||||||
userPhoneNumber: answers.companyInformation.phonenumber, | ||||||||||||||||||||||||||||||||||||||||||||
userEmail: answers.companyInformation.email, | ||||||||||||||||||||||||||||||||||||||||||||
}, | ||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||
.catch(() => { | ||||||||||||||||||||||||||||||||||||||||||||
this.logger.warn( | ||||||||||||||||||||||||||||||||||||||||||||
'[work-accident-notification-service]: Error submitting application to AOSH', | ||||||||||||||||||||||||||||||||||||||||||||
) | ||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||
success: false, | ||||||||||||||||||||||||||||||||||||||||||||
message: 'Villa í umsókn, ekki tókst að skila umsókn til VER.', | ||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+199
to
+207
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Improve error handling in catch block. The catch block returns an object instead of throwing an error, which could lead to silent failures. Apply this diff to maintain consistent error handling: .catch(() => {
this.logger.warn(
'[work-accident-notification-service]: Error submitting application to AOSH',
)
- return {
- success: false,
- message: 'Villa í umsókn, ekki tókst að skila umsókn til VER.',
- }
+ throw new TemplateApiError(
+ {
+ title: 'Villa í umsókn',
+ summary: 'Ekki tókst að skila umsókn til VER.',
+ },
+ 400,
+ )
}) 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
import { getValueViaPath } from '@island.is/application/core' | ||
import { FormValue } from '@island.is/application/types' | ||
|
||
export const getDateAndTime = ( | ||
date: string, | ||
hours: string, | ||
minutes: string, | ||
): Date => { | ||
const finalDate = new Date(date) | ||
finalDate.setHours( | ||
parseInt(hours, 10), // hours | ||
parseInt(minutes, 10), // minutes | ||
) | ||
return finalDate | ||
} | ||
|
||
export const getValueList = (answers: FormValue, answer: string) => { | ||
const objectList = getValueViaPath(answers, answer, {}) as object | ||
|
||
return Object.values(objectList) | ||
.map((values: { label: string; value: string }[]) => { | ||
return values?.map(({ value }) => { | ||
return value | ||
}) | ||
}) | ||
.flat() | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
{ | ||
"presets": [ | ||
[ | ||
"@nx/react/babel", | ||
{ | ||
"runtime": "automatic", | ||
"useBuiltIns": "usage" | ||
} | ||
] | ||
], | ||
"plugins": [] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
{ | ||
"extends": ["plugin:@nx/react", "../../../../../.eslintrc.json"], | ||
"ignorePatterns": ["!**/*"], | ||
"overrides": [ | ||
{ | ||
"files": ["*.ts", "*.tsx", "*.js", "*.jsx"], | ||
"rules": {} | ||
}, | ||
{ | ||
"files": ["*.ts", "*.tsx"], | ||
"rules": {} | ||
}, | ||
{ | ||
"files": ["*.js", "*.jsx"], | ||
"rules": {} | ||
} | ||
] | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,47 @@ | ||
# Work Accident Notification application for The Administration of Occupational Safety and Health | ||
|
||
### Description | ||
|
||
The Work Accident Notification application allows both individual users and users with company delegations to submit accident reports. Individual users may only submit reports for their sole proprietorships, while company submissions require an assigned delegation. The application flow is nearly identical for both user types, with only minor variations in input fields based on the user’s role. | ||
|
||
### URLs | ||
|
||
- [Local](http://localhost:4242/umsoknir/tilkynning-um-vinnuslys) | ||
- [Dev](https://beta.dev01.devland.is/umsoknir/tilkynning-um-vinnuslys) | ||
- [Production](https://island.is/umsoknir/tilkynning-um-vinnuslys) | ||
|
||
### Clients and template-api-modules | ||
|
||
- [Client]('https://github.com/island-is/island.is/tree/main/libs/clients/work-accident-ver/src/lib/workAccident.service.ts') | ||
- [Template-api-module]('https://github.com/island-is/island.is/blob/main/libs/application/template-api-modules/src/lib/modules/templates/aosh/work-accident-notification/work-accident-notification.service.ts') | ||
|
||
### States | ||
|
||
#### Prerequisite | ||
|
||
Data fetching from National Registry, User profile and The Administration of Occupational Safety and Health | ||
|
||
#### Draft | ||
|
||
In the Draft state, users input essential information for the accident report. This includes details about the company involved, specifics of the accident, and information on all injured employees. After entering this data, users can review an overview page, providing a chance to verify all inputs before final submission. | ||
|
||
#### Completed | ||
|
||
User recieves confirmation that reports has been successfully submitted and a PDF overview of the report | ||
|
||
### Localisation | ||
|
||
All localisation can be found on Contentful. | ||
|
||
- [Work Accident Notification translation]('https://app.contentful.com/spaces/8k0h54kbe6bj/entries/aosh.wan.application') | ||
- [Application system translations](https://app.contentful.com/spaces/8k0h54kbe6bj/entries/application.system) | ||
|
||
### Test users | ||
|
||
- **Gervimaður Færeyjar 010130-2399 and 65°ARKTIC ehf delegation** | ||
|
||
### Codeowners | ||
|
||
- [Origo]('https://github.com/orgs/island-is/teams/origo') | ||
- [Baldur Óli]('https://github.com/Ballioli') | ||
- [Sigrún Tinna]('https://github.com/sigruntg') |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Consider safer type handling for application answers.
The type casting using
unknown
could be unsafe. Consider using type guards or validation: