From 992ef025b28aadf8941bebe05e3c88d54ec19a4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9Eorkell=20M=C3=A1ni=20=C3=9Eorkelsson?= Date: Thu, 12 Dec 2024 21:55:36 +0000 Subject: [PATCH 1/8] feat(web): updated grant status logic (#17127) * feat: updated status logic * feat: add time values * feat: add time part * chore: remove conidtional * chore: remove imports * fix: wrong message id * fix: add /en locale * fix: undefined if empty array --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- apps/web/pages/en/grants-plaza/grant/[id].ts | 12 ++ .../web/pages/en/grants-plaza/grants/index.ts | 12 ++ apps/web/pages/en/grants-plaza/index.ts | 11 ++ .../web/screens/Grants/Grant/GrantSidebar.tsx | 23 ++- apps/web/screens/Grants/Home/GrantsHome.tsx | 3 +- .../SearchResults/SearchResultsContent.tsx | 22 +-- apps/web/screens/Grants/messages.ts | 30 +++- apps/web/screens/Grants/utils.ts | 138 ++++++++++++++-- apps/web/screens/queries/Grants.ts | 5 +- libs/cms/src/lib/cms.elasticsearch.service.ts | 30 +--- .../src/lib/generated/contentfulTypes.d.ts | 23 ++- libs/cms/src/lib/models/grant.model.ts | 156 ++++++++++++------ .../lib/search/importers/grants.service.ts | 12 +- 13 files changed, 347 insertions(+), 130 deletions(-) create mode 100644 apps/web/pages/en/grants-plaza/grant/[id].ts create mode 100644 apps/web/pages/en/grants-plaza/grants/index.ts create mode 100644 apps/web/pages/en/grants-plaza/index.ts diff --git a/apps/web/pages/en/grants-plaza/grant/[id].ts b/apps/web/pages/en/grants-plaza/grant/[id].ts new file mode 100644 index 000000000000..bc85b78454d8 --- /dev/null +++ b/apps/web/pages/en/grants-plaza/grant/[id].ts @@ -0,0 +1,12 @@ +import withApollo from '@island.is/web/graphql/withApollo' +import { withLocale } from '@island.is/web/i18n' +import GrantSinglePage from '@island.is/web/screens/Grants/Grant/Grant' +import { getServerSidePropsWrapper } from '@island.is/web/utils/getServerSidePropsWrapper' +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore make web strict +// +const Screen = withApollo(withLocale('en')(GrantSinglePage)) + +export default Screen + +export const getServerSideProps = getServerSidePropsWrapper(Screen) diff --git a/apps/web/pages/en/grants-plaza/grants/index.ts b/apps/web/pages/en/grants-plaza/grants/index.ts new file mode 100644 index 000000000000..15cf49a9aa93 --- /dev/null +++ b/apps/web/pages/en/grants-plaza/grants/index.ts @@ -0,0 +1,12 @@ +import withApollo from '@island.is/web/graphql/withApollo' +import { withLocale } from '@island.is/web/i18n' +import GrantsSearchResults from '@island.is/web/screens/Grants/SearchResults/SearchResults' +import { getServerSidePropsWrapper } from '@island.is/web/utils/getServerSidePropsWrapper' +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore make web strict +// +const Screen = withApollo(withLocale('en')(GrantsSearchResults)) + +export default Screen + +export const getServerSideProps = getServerSidePropsWrapper(Screen) diff --git a/apps/web/pages/en/grants-plaza/index.ts b/apps/web/pages/en/grants-plaza/index.ts new file mode 100644 index 000000000000..a95dff22d022 --- /dev/null +++ b/apps/web/pages/en/grants-plaza/index.ts @@ -0,0 +1,11 @@ +import withApollo from '@island.is/web/graphql/withApollo' +import { withLocale } from '@island.is/web/i18n' +import GrantsHome from '@island.is/web/screens/Grants/Home/GrantsHome' +import { getServerSidePropsWrapper } from '@island.is/web/utils/getServerSidePropsWrapper' +// eslint-disable-next-line @typescript-eslint/ban-ts-comment +// @ts-ignore make web strict +const Screen = withApollo(withLocale('en')(GrantsHome)) + +export default Screen + +export const getServerSideProps = getServerSidePropsWrapper(Screen) diff --git a/apps/web/screens/Grants/Grant/GrantSidebar.tsx b/apps/web/screens/Grants/Grant/GrantSidebar.tsx index fa83f4377950..77ac8aa2ac73 100644 --- a/apps/web/screens/Grants/Grant/GrantSidebar.tsx +++ b/apps/web/screens/Grants/Grant/GrantSidebar.tsx @@ -1,4 +1,5 @@ import { useMemo } from 'react' +import { useIntl } from 'react-intl' import { Box, @@ -16,7 +17,7 @@ import { Grant } from '@island.is/web/graphql/schema' import { LinkType, useLinkResolver } from '@island.is/web/hooks' import { m } from '../messages' -import { generateStatusTag } from '../utils' +import { generateStatusTag, parseStatus } from '../utils' interface Props { grant: Grant @@ -41,7 +42,7 @@ const generateSidebarPanel = ( data: Array, background: BoxProps['background'], ) => { - if (!data) { + if (!data.length) { return undefined } return ( @@ -53,7 +54,12 @@ const generateSidebarPanel = ( export const GrantSidebar = ({ grant, locale }: Props) => { const { linkResolver } = useLinkResolver() - const { formatMessage } = useLocale() + const { formatMessage } = useIntl() + + const status = useMemo( + () => parseStatus(grant, formatMessage, locale), + [grant, formatMessage, locale], + ) const detailPanelData = useMemo( () => @@ -95,20 +101,23 @@ export const GrantSidebar = ({ grant, locale }: Props) => { ), generateLine( formatMessage(m.single.deadline), - grant?.applicationDeadlineStatus ? ( - {grant.applicationDeadlineStatus} + status.deadlineStatus ? ( + {status.deadlineStatus} ) : undefined, ), generateLine( formatMessage(m.single.status), grant?.status ? ( - {generateStatusTag(grant.status, formatMessage)?.label} + { + generateStatusTag(status.applicationStatus, formatMessage) + ?.label + } ) : undefined, ), ].filter(isDefined) ?? [], - [grant, formatMessage, linkResolver], + [grant, formatMessage, linkResolver, status], ) const filesPanelData = useMemo( diff --git a/apps/web/screens/Grants/Home/GrantsHome.tsx b/apps/web/screens/Grants/Home/GrantsHome.tsx index 83ed0453f013..0b75b23ec399 100644 --- a/apps/web/screens/Grants/Home/GrantsHome.tsx +++ b/apps/web/screens/Grants/Home/GrantsHome.tsx @@ -42,8 +42,9 @@ const GrantsHomePage: CustomScreen = ({ locale, customPageData, }) => { - const { formatMessage } = useIntl() + const intl = useIntl() const { linkResolver } = useLinkResolver() + const { formatMessage } = intl const baseUrl = linkResolver('styrkjatorg', [], locale).href const searchUrl = linkResolver('styrkjatorgsearch', [], locale).href diff --git a/apps/web/screens/Grants/SearchResults/SearchResultsContent.tsx b/apps/web/screens/Grants/SearchResults/SearchResultsContent.tsx index 071b7f063483..d57cece2196d 100644 --- a/apps/web/screens/Grants/SearchResults/SearchResultsContent.tsx +++ b/apps/web/screens/Grants/SearchResults/SearchResultsContent.tsx @@ -1,4 +1,3 @@ -import { useIntl } from 'react-intl' import { useWindowSize } from 'react-use' import format from 'date-fns/format' import { useRouter } from 'next/router' @@ -13,7 +12,7 @@ import { Grant } from '@island.is/web/graphql/schema' import { useLinkResolver } from '@island.is/web/hooks' import { m } from '../messages' -import { generateStatusTag } from '../utils' +import { generateStatusTag, parseStatus } from '../utils' interface Props { grants?: Array @@ -44,6 +43,7 @@ export const SearchResultsContent = ({ grants, subheader, locale }: Props) => { return null } + const status = parseStatus(grant, formatMessage, locale) return ( {grant.applicationId && ( @@ -54,11 +54,10 @@ export const SearchResultsContent = ({ grants, subheader, locale }: Props) => { text={grant.description ?? ''} logo={grant.fund?.parentOrganization?.logo?.url ?? ''} logoAlt={grant.fund?.parentOrganization?.logo?.title ?? ''} - tag={ - grant.status - ? generateStatusTag(grant.status, formatMessage) - : undefined - } + tag={generateStatusTag( + status.applicationStatus, + formatMessage, + )} cta={{ label: formatMessage(m.general.seeMore), variant: 'text', @@ -80,14 +79,17 @@ export const SearchResultsContent = ({ grants, subheader, locale }: Props) => { text: `${format( new Date(grant.dateFrom), 'dd.MM.', - )}-${format(new Date(grant.dateTo), 'dd.MM.yyyy')}`, + )} - ${format( + new Date(grant.dateTo), + 'dd.MM.yyyy', + )}`, } : null, - grant.applicationDeadlineStatus + status.deadlineStatus ? { icon: 'time' as const, //todo: fix when the text is ready - text: grant.applicationDeadlineStatus, + text: status.deadlineStatus, } : undefined, grant.categoryTags diff --git a/apps/web/screens/Grants/messages.ts b/apps/web/screens/Grants/messages.ts index 3cc01d29b27d..4cb32b60e623 100644 --- a/apps/web/screens/Grants/messages.ts +++ b/apps/web/screens/Grants/messages.ts @@ -34,7 +34,7 @@ export const m = { }, applicationStatus: { id: 'web.grants:search.applicationStatus', - defaultMessage: 'Staða umsóknar', + defaultMessage: 'Staða umsókna', }, applicationOpen: { id: 'web.grants:search.applicationOpen', @@ -52,6 +52,34 @@ export const m = { id: 'web.grants:search.applicationSeeDescription', defaultMessage: 'Sjá lýsingu', }, + applicationOpensAt: { + id: 'web.grants:search.applicationOpensAt', + defaultMessage: 'Opnar {arg}', + }, + applicationEstimatedOpensAt: { + id: 'web.grants:search.applicationEstimatedOpensAt', + defaultMessage: 'Áætlað næst í {arg}', + }, + applicationOpensTo: { + id: 'web.grants:search.applicationOpensTo', + defaultMessage: 'Frestur til {arg}', + }, + applicationOpensToWithDay: { + id: 'web.grants:search.applicationOpensToWithDay', + defaultMessage: 'Frestur til og með {arg}', + }, + applicationWasOpenTo: { + id: 'web.grants:search.applicationWasOpenTo', + defaultMessage: 'Frestur var til {arg}', + }, + applicationWasOpenToAndWith: { + id: 'web.grants:search.applicationWasOpenToAndWith', + defaultMessage: 'Frestur var til og með {arg}', + }, + applicationAlwaysOpen: { + id: 'web.grants:search.applicationAlwaysOpen', + defaultMessage: 'Opið er allt árið', + }, category: { id: 'web.grants:search.category', defaultMessage: 'Flokkun', diff --git a/apps/web/screens/Grants/utils.ts b/apps/web/screens/Grants/utils.ts index 23ac43a63f74..86920ea957a4 100644 --- a/apps/web/screens/Grants/utils.ts +++ b/apps/web/screens/Grants/utils.ts @@ -1,29 +1,131 @@ -import { TagVariant } from '@island.is/island-ui/core' +import format from 'date-fns/format' +import localeEn from 'date-fns/locale/en-GB' +import localeIS from 'date-fns/locale/is' + import { FormatMessage } from '@island.is/localization' -import { GrantStatus } from '@island.is/web/graphql/schema' +import { Locale } from '@island.is/shared/types' +import { Grant, GrantStatus } from '@island.is/web/graphql/schema' + import { m } from './messages' +import { IntlFormatters, IntlShape } from 'react-intl' -export const generateStatusTag = ( - status: GrantStatus, - formatMessage: FormatMessage, -): { label: string; variant: TagVariant } | undefined => { - switch (status) { - case GrantStatus.Open: +interface Status { + applicationStatus: 'open' | 'closed' | 'unknown' + deadlineStatus: string + note?: string +} + +const formatDate = ( + date: Date, + locale: Locale, + stringFormat = 'dd.MMMM yyyy', +) => + format(date, stringFormat, { + locale: locale === 'is' ? localeIS : localeEn, + }) + +export const containsTimePart = (date: string) => date.includes('T') + +export const parseStatus = ( + grant: Grant, + formatMessage: IntlShape['formatMessage'], + locale: Locale, +): Status => { + switch (grant.status) { + case GrantStatus.Closed: { + return { + applicationStatus: 'closed', + deadlineStatus: grant.dateTo + ? formatMessage( + containsTimePart(grant.dateTo) + ? m.search.applicationWasOpenToAndWith + : m.search.applicationWasOpenTo, + { + arg: formatDate(new Date(grant.dateTo), locale), + }, + ) + : formatMessage(m.search.applicationClosed), + note: grant.statusText ?? undefined, + } + } + case GrantStatus.ClosedOpeningSoon: { + return { + applicationStatus: 'closed', + deadlineStatus: grant.dateFrom + ? formatMessage(m.search.applicationOpensAt, { + arg: formatDate(new Date(grant.dateFrom), locale), + }) + : formatMessage(m.search.applicationClosed), + note: grant.statusText ?? undefined, + } + } + case GrantStatus.ClosedOpeningSoonWithEstimation: { + return { + applicationStatus: 'closed', + deadlineStatus: grant.dateFrom + ? formatMessage(m.search.applicationEstimatedOpensAt, { + arg: formatDate(new Date(grant.dateFrom), locale, 'MMMM yyyy'), + }) + : formatMessage(m.search.applicationClosed), + note: grant.statusText ?? undefined, + } + } + case GrantStatus.ClosedWithNote: { + return { + applicationStatus: 'closed', + deadlineStatus: formatMessage(m.search.applicationSeeDescription), + note: grant.statusText ?? undefined, + } + } + case GrantStatus.AlwaysOpen: { return { - label: formatMessage(m.search.applicationOpen), - variant: 'mint', + applicationStatus: 'open', + deadlineStatus: formatMessage(m.search.applicationAlwaysOpen), + note: grant.statusText ?? undefined, } - case GrantStatus.Closed: + } + case GrantStatus.Open: { return { - label: formatMessage(m.search.applicationClosed), - variant: 'rose', + applicationStatus: 'open', + deadlineStatus: grant.dateTo + ? formatMessage( + containsTimePart(grant.dateTo) + ? m.search.applicationOpensToWithDay + : m.search.applicationOpensTo, + { + arg: formatDate(new Date(grant.dateTo), locale, 'dd.MMMM.'), + }, + ) + : formatMessage(m.search.applicationOpen), + note: grant.statusText ?? undefined, } - case GrantStatus.SeeDescription: + } + case GrantStatus.OpenWithNote: { return { - label: formatMessage(m.search.applicationSeeDescription), - variant: 'purple', + applicationStatus: 'open', + deadlineStatus: formatMessage(m.search.applicationSeeDescription), + note: grant.statusText ?? undefined, } - default: - return + } + default: { + return { + applicationStatus: 'unknown', + deadlineStatus: '', + } + } } } + +export const generateStatusTag = ( + status: Status['applicationStatus'], + formatMessage: IntlShape['formatMessage'], +) => + status !== 'unknown' + ? { + label: + status === 'open' + ? formatMessage(m.search.applicationOpen) + : formatMessage(m.search.applicationClosed), + variant: status === 'open' ? ('mint' as const) : ('rose' as const), + } + : undefined diff --git a/apps/web/screens/queries/Grants.ts b/apps/web/screens/queries/Grants.ts index 59160d38847b..cd120b0afcdc 100644 --- a/apps/web/screens/queries/Grants.ts +++ b/apps/web/screens/queries/Grants.ts @@ -16,8 +16,8 @@ export const GET_GRANTS_QUERY = gql` } dateFrom dateTo - isOpen status + statusText categoryTags { id title @@ -69,6 +69,9 @@ export const GET_GRANT_QUERY = gql` } applicationDeadlineStatus status + statusText + dateFrom + dateTo categoryTags { id title diff --git a/libs/cms/src/lib/cms.elasticsearch.service.ts b/libs/cms/src/lib/cms.elasticsearch.service.ts index e35685d85964..0a20025d9ed0 100644 --- a/libs/cms/src/lib/cms.elasticsearch.service.ts +++ b/libs/cms/src/lib/cms.elasticsearch.service.ts @@ -47,11 +47,8 @@ import { GenericListItem } from './models/genericListItem.model' import { GetTeamMembersInput } from './dto/getTeamMembers.input' import { TeamMemberResponse } from './models/teamMemberResponse.model' import { GetGrantsInput } from './dto/getGrants.input' -import { Grant, GrantStatus } from './models/grant.model' +import { Grant } from './models/grant.model' import { GrantList } from './models/grantList.model' -import { logger } from '@island.is/logging' -import { IGrantFields } from './generated/contentfulTypes' -import { isDefined } from '@island.is/shared/utils' @Injectable() export class CmsElasticsearchService { @@ -614,7 +611,6 @@ export class CmsElasticsearchService { search, page = 1, size = 8, - statuses, categories, types, organizations, @@ -719,30 +715,6 @@ export class CmsElasticsearchService { }) } - if (statuses) { - must.push({ - nested: { - path: 'tags', - query: { - bool: { - must: [ - { - terms: { - 'tags.key': statuses, - }, - }, - { - term: { - 'tags.type': 'status', - }, - }, - ], - }, - }, - }, - }) - } - const grantListResponse: ApiResponse> = await this.elasticService.findByQuery(index, { query: { diff --git a/libs/cms/src/lib/generated/contentfulTypes.d.ts b/libs/cms/src/lib/generated/contentfulTypes.d.ts index ec191a4968b0..aeb745479f33 100644 --- a/libs/cms/src/lib/generated/contentfulTypes.d.ts +++ b/libs/cms/src/lib/generated/contentfulTypes.d.ts @@ -1838,17 +1838,30 @@ export interface IGrantFields { /** Application hints */ grantApplicationHints?: Document | undefined - /** Date from */ + /** Open from */ grantDateFrom?: string | undefined - /** Date to */ + /** Open from hour */ + grantOpenFromHour?: number | undefined + + /** Open to */ grantDateTo?: string | undefined - /** Is open? */ - grantIsOpen?: boolean | undefined + /** Open to hour */ + grantOpenToHour?: number | undefined + + /** From date is estimated */ + grantFromDateIsEstimated?: boolean | undefined /** Status */ - grantStatus: 'open' | 'closed' | 'see_description' + grantStatus: + | 'Automatic' + | 'Always open' + | 'Open with note' + | 'Closed with note' + + /** Status Note */ + grantStatusNote?: string | undefined /** Files */ grantFiles?: Asset[] | undefined diff --git a/libs/cms/src/lib/models/grant.model.ts b/libs/cms/src/lib/models/grant.model.ts index b1f21752a40a..bd5f7247cc9b 100644 --- a/libs/cms/src/lib/models/grant.model.ts +++ b/libs/cms/src/lib/models/grant.model.ts @@ -1,6 +1,6 @@ import { Field, ObjectType, ID, registerEnumType } from '@nestjs/graphql' -import { IGrant } from '../generated/contentfulTypes' +import { IGrant, IGrantFields } from '../generated/contentfulTypes' import { GenericTag, mapGenericTag } from './genericTag.model' import { CacheField } from '@island.is/nest/graphql' import { mapDocument, SliceUnion } from '../unions/slice.union' @@ -9,10 +9,20 @@ import { ReferenceLink, mapReferenceLink } from './referenceLink.model' import { Fund, mapFund } from './fund.model' import { Link, mapLink } from './link.model' +import format from 'date-fns/format' +import addHours from 'date-fns/addHours' +import { isValidDate } from '@island.is/shared/utils' + export enum GrantStatus { CLOSED, + CLOSED_OPENING_SOON, + CLOSED_OPENING_SOON_WITH_ESTIMATION, + CLOSED_WITH_NOTE, OPEN, - SEE_DESCRIPTION, + OPEN_WITH_NOTE, + ALWAYS_OPEN, + INVALID, + UNKNOWN, } registerEnumType(GrantStatus, { name: 'GrantStatus' }) @@ -58,12 +68,12 @@ export class Grant { @Field({ nullable: true }) dateTo?: string - @Field({ nullable: true }) - isOpen?: boolean - @CacheField(() => GrantStatus, { nullable: true }) status?: GrantStatus + @Field({ nullable: true }) + statusText?: string + @CacheField(() => [Asset], { nullable: true }) files?: Array @@ -80,50 +90,94 @@ export class Grant { fund?: Fund } -export const mapGrant = ({ fields, sys }: IGrant): Grant => ({ - id: sys.id, - name: fields.grantName, - description: fields.grantDescription, - applicationId: fields.grantApplicationId, - applicationDeadlineStatus: fields.grantApplicationDeadlineStatus, - applicationUrl: fields.granApplicationUrl?.fields - ? mapReferenceLink(fields.granApplicationUrl) - : undefined, - specialEmphasis: fields.grantSpecialEmphasis - ? mapDocument(fields.grantSpecialEmphasis, sys.id + ':special-emphasis') - : [], - whoCanApply: fields.grantWhoCanApply - ? mapDocument(fields.grantWhoCanApply, sys.id + ':who-can-apply') - : [], - howToApply: fields.grantHowToApply - ? mapDocument(fields.grantHowToApply, sys.id + ':how-to-apply') - : [], - applicationDeadline: fields.grantApplicationDeadline - ? mapDocument( - fields.grantApplicationDeadline, - sys.id + ':application-deadline', - ) - : [], - applicationHints: fields.grantApplicationHints - ? mapDocument(fields.grantApplicationHints, sys.id + ':application-hints') - : [], - dateFrom: fields.grantDateFrom, - dateTo: fields.grantDateTo, - isOpen: fields.grantIsOpen ?? undefined, - status: - fields.grantStatus === 'open' - ? GrantStatus.OPEN - : fields.grantStatus === 'closed' - ? GrantStatus.CLOSED - : fields.grantStatus === 'see_description' - ? GrantStatus.SEE_DESCRIPTION +const parseStatus = (fields: IGrantFields): GrantStatus => { + switch (fields.grantStatus) { + case 'Automatic': { + const parsedDateTo = new Date(fields.grantDateTo ?? '') + const parsedDateFrom = new Date(fields.grantDateFrom ?? '') + + if (!isValidDate(parsedDateTo) || !isValidDate(parsedDateFrom)) { + return GrantStatus.INVALID + } + + const today = new Date() + + //opens soon! + if (today <= parsedDateFrom) { + return fields.grantFromDateIsEstimated + ? GrantStatus.CLOSED_OPENING_SOON_WITH_ESTIMATION + : GrantStatus.CLOSED_OPENING_SOON + } + if (today <= parsedDateTo) { + return GrantStatus.OPEN + } + return GrantStatus.CLOSED + } + case 'Always open': + return GrantStatus.ALWAYS_OPEN + case 'Closed with note': + return GrantStatus.CLOSED_WITH_NOTE + case 'Open with note': + return GrantStatus.OPEN_WITH_NOTE + default: + return GrantStatus.UNKNOWN + } +} + +const parseDate = (date?: string, time?: number): string | undefined => { + if (!date) { + return + } + const parsedDate = new Date(date) + if (!time) { + return format(parsedDate, 'yyyy-MM-dd') + } + return addHours(new Date(date), time).toISOString() +} + +export const mapGrant = ({ fields, sys }: IGrant): Grant => { + return { + id: sys.id, + name: fields.grantName, + description: fields.grantDescription, + applicationId: fields.grantApplicationId, + applicationDeadlineStatus: fields.grantApplicationDeadlineStatus, + applicationUrl: fields.granApplicationUrl?.fields + ? mapReferenceLink(fields.granApplicationUrl) + : undefined, + + specialEmphasis: fields.grantSpecialEmphasis + ? mapDocument(fields.grantSpecialEmphasis, sys.id + ':special-emphasis') + : [], + whoCanApply: fields.grantWhoCanApply + ? mapDocument(fields.grantWhoCanApply, sys.id + ':who-can-apply') + : [], + howToApply: fields.grantHowToApply + ? mapDocument(fields.grantHowToApply, sys.id + ':how-to-apply') + : [], + applicationDeadline: fields.grantApplicationDeadline + ? mapDocument( + fields.grantApplicationDeadline, + sys.id + ':application-deadline', + ) + : [], + applicationHints: fields.grantApplicationHints + ? mapDocument(fields.grantApplicationHints, sys.id + ':application-hints') + : [], + dateFrom: parseDate(fields.grantDateFrom, fields.grantOpenFromHour), + dateTo: parseDate(fields.grantDateTo, fields.grantOpenToHour), + status: parseStatus(fields), + statusText: fields.grantStatusNote, + fund: fields.grantFund ? mapFund(fields.grantFund) : undefined, + files: (fields.grantFiles ?? []).map((file) => mapAsset(file)) ?? [], + supportLinks: + (fields.grantSupportLinks ?? []).map((link) => mapLink(link)) ?? [], + + categoryTags: fields.grantCategoryTags + ? fields.grantCategoryTags.map((tag) => mapGenericTag(tag)) + : undefined, + typeTag: fields.grantTypeTag + ? mapGenericTag(fields.grantTypeTag) : undefined, - fund: fields.grantFund ? mapFund(fields.grantFund) : undefined, - files: (fields.grantFiles ?? []).map((file) => mapAsset(file)) ?? [], - supportLinks: - (fields.grantSupportLinks ?? []).map((link) => mapLink(link)) ?? [], - categoryTags: fields.grantCategoryTags - ? fields.grantCategoryTags.map((tag) => mapGenericTag(tag)) - : undefined, - typeTag: fields.grantTypeTag ? mapGenericTag(fields.grantTypeTag) : undefined, -}) + } +} diff --git a/libs/cms/src/lib/search/importers/grants.service.ts b/libs/cms/src/lib/search/importers/grants.service.ts index 7df8c4328ef6..3a58a59778d5 100644 --- a/libs/cms/src/lib/search/importers/grants.service.ts +++ b/libs/cms/src/lib/search/importers/grants.service.ts @@ -109,14 +109,9 @@ export class GrantsSyncService implements CmsSyncProvider { } switch (mapped.status) { - case GrantStatus.SEE_DESCRIPTION: - tags.push({ - key: 'see_description', - type: 'status', - value: 'see_description', - }) - break case GrantStatus.OPEN: + case GrantStatus.ALWAYS_OPEN: + case GrantStatus.OPEN_WITH_NOTE: tags.push({ key: 'open', type: 'status', @@ -124,6 +119,9 @@ export class GrantsSyncService implements CmsSyncProvider { }) break case GrantStatus.CLOSED: + case GrantStatus.CLOSED_OPENING_SOON: + case GrantStatus.CLOSED_OPENING_SOON_WITH_ESTIMATION: + case GrantStatus.CLOSED_WITH_NOTE: tags.push({ key: 'closed', type: 'status', From b22fd0a545d8de86e1a31e82029afd404d91fc07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B3nas=20G=2E=20Sigur=C3=B0sson?= Date: Thu, 12 Dec 2024 22:26:22 +0000 Subject: [PATCH 2/8] chore(inao-cem): Refactor custom components and fetch tax data (#17195) * chore: houskeeping, split up files and make code more radable * chore: refactor out custom components * fix: remove imports from codeowners * chore: remove console.log * chore: add loading state * chore: simplify logic * fix: coderabbit comments * fix: match indentation to lint * fix: codeowners * chore: add space to match indentation * chore: remove the inao folder from codeowners * chore: . * fix: typo in path * fix: indentation --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .github/CODEOWNERS | 780 +++++++++--------- .../src/dataProviders/index.ts | 13 +- .../src/fields/CemeteryIncomeLimit/index.tsx | 43 - .../fields/CemeteryOverview/AboutOverview.tsx | 48 +- .../CapitalNumbersOverview.tsx | 37 +- .../src/fields/CemeteryOverview/index.tsx | 153 +--- .../FetchDataBasedOnSelectedYear/index.tsx | 123 +++ .../src/fields/PowerOfAttorney/index.tsx | 96 --- .../src/fields/index.ts | 3 +- .../caretakerMultiField.ts | 17 - .../cemeteryCaretakerSection/index.ts | 29 +- .../index.ts | 22 +- .../capitalNumberSubSection.ts | 2 +- .../equityAndLiabilitySubSection.ts | 8 +- .../opperatingCostSubSection.ts | 6 +- .../clientInfoSection/index.ts | 62 +- .../src/hooks/useTotals.ts | 21 - .../src/lib/dataSchema.ts | 6 +- .../src/types/types.ts | 16 + .../src/utils/constants.ts | 1 + .../src/utils/currency.ts | 16 + .../src/utils/helpers.ts | 312 ++----- .../src/utils/overviewUtils.ts | 189 +++++ .../src/utils/sums.ts | 225 +++++ 24 files changed, 1190 insertions(+), 1038 deletions(-) delete mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryIncomeLimit/index.tsx create mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/fields/FetchDataBasedOnSelectedYear/index.tsx delete mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/fields/PowerOfAttorney/index.tsx delete mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/caretakerMultiField.ts delete mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/hooks/useTotals.ts create mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/utils/currency.ts create mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/utils/overviewUtils.ts create mode 100644 libs/application/templates/inao/financial-statement-cemetery/src/utils/sums.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d9d7ad29b0f6..f4bc0d23934e 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -6,401 +6,409 @@ # Organisation name is @island-is, not @island.is # Fallback. If there is no owner, assign to core maintainers. -* @island-is/core +* @island-is/core # Top level project ownership. When a project contains, for example, templates or modules # that are developed by others teams, we first list down the team working on the core and # further below the other team working on other part of the project. -/apps/application-system/ @island-is/norda-applications -/apps/web*/ @island-is/juni @island-is/stefna -/libs/application/ @island-is/norda-applications -/libs/portals/my-pages/ @island-is/hugsmidjan -/libs/portals/admin/ @island-is/aranja -/libs/portals/core/ @island-is/aranja @island-is/hugsmidjan -/libs/shared/connected/ @island-is/stefna - -/* @island-is/core -/libs/api/domains/identity/ @island-is/core +/apps/application-system/ @island-is/norda-applications +/apps/web*/ @island-is/juni @island-is/stefna +/libs/application/ @island-is/norda-applications +/libs/portals/my-pages/ @island-is/hugsmidjan +/libs/portals/admin/ @island-is/aranja +/libs/portals/core/ @island-is/aranja @island-is/hugsmidjan +/libs/shared/connected/ @island-is/stefna + +/* @island-is/core +/libs/api/domains/identity/ @island-is/core # Edge case escaping the /infra/ and **/infra/ devops patterns below -/libs/infra-nest-server/src/lib/infra/ @island-is/core -/libs/testing/ @island-is/core -/libs/nest/swagger/ @island-is/core - -/apps/services/endorsements/ @island-is/juni -/apps/icelandic-names-registry*/ @island-is/juni -/apps/web/screens/PetitionView/ @island-is/juni -/libs/cms/ @island-is/juni @island-is/stefna -/libs/clients/cms/ @island-is/juni @island-is/aranja -/libs/residence-history @island-is/juni -/libs/api/domains/endorsement-system @island-is/juni -/libs/api/domains/icelandic-names-registry/ @island-is/juni -/libs/clients/rsk/ @island-is/juni -/libs/clients/zendesk/ @island-is/juni -/libs/icelandic-names-registry/ @island-is/juni -/libs/portals/my-pages/petitions/ @island-is/juni -/libs/portals/my-pages/signature-collection/ @island-is/juni -/libs/portals/my-pages/education/ @island-is/juni @island-is/hugsmidjan -/libs/portals/my-pages/education-career/ @island-is/juni @island-is/hugsmidjan -/libs/portals/my-pages/education-degree/ @island-is/juni @island-is/hugsmidjan -/libs/portals/my-pages/education-license/ @island-is/juni @island-is/hugsmidjan -/libs/portals/my-pages/education-student-assessment/ @island-is/juni @island-is/norda @island-is/hugsmidjan -/libs/clients/driving-license/ @island-is/juni -/libs/clients/judicial-administration/ @island-is/juni -/libs/application/templates/announcement-of-death/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/announcement-of-death @island-is/juni -/libs/application/templates/driving-license/ @island-is/juni -/libs/application/templates/driving-assessment-approval/ @island-is/juni -/libs/application/templates/driving-learners-permit/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/driving-learners-permit/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/driving-license-submission @island-is/juni -/libs/api/domains/driving-license/ @island-is/juni -/libs/api/domains/education/ @island-is/juni @island-is/hugsmidjan @island-is/deloitte -/libs/application/templates/estate/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/estate @island-is/juni -/libs/application/templates/general-petition/ @island-is/juni -/libs/shared/connected/src/lib/generalPetition/GeneralPetitionLists/ @island-is/juni -/libs/shared/connected/src/lib/SignatureLists/ @island-is/juni -/libs/api/domains/communications/ @island-is/juni @island-is/stefna -/apps/services/user-notification/ @island-is/juni @island-is/aranja -/apps/air-discount-scheme/ @island-is/hugsmidjan -/libs/air-discount-scheme/ @island-is/hugsmidjan -/libs/application/templates/p-sign/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/p-sign-submission @island-is/juni -/libs/application/templates/marriage-conditions/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/marriage-conditions-submission @island-is/juni -/libs/message-queue/ @island-is/juni -/libs/application/templates/example-payment/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/example-payment-actions @island-is/juni -/libs/application/templates/driving-school-confirmation/ @island-is/juni -/libs/application/templates/driving-instructor-registrations/ @island-is/juni -/libs/api/domains/driving-license-book/ @island-is/juni -/libs/clients/driving-license-book/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/passport @island-is/juni -/libs/application/templates/passport/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/passport-annulment @island-is/juni -/libs/application/templates/passport-annulment/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/driving-school-confirmation/ @island-is/juni -/libs/application/templates/operating-license/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/operating-license/ @island-is/juni -/libs/application/templates/driving-license-duplicate/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/driving-license-duplicate/ @island-is/juni -/libs/application/templates/inheritance-report/ @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/inheritance-report @island-is/juni -/libs/application/templates/signature-collection @island-is/juni -/libs/api/domains/disability-license @island-is/juni -/libs/portals/admin/petition @island-is/juni -/libs/portals/admin/signature-collection @island-is/juni -/libs/portals/admin/icelandic-names-registry @island-is/juni -/libs/api/domains/signature-collection @island-is/juni -/libs/clients/signature-collection @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/signature-collection @island-is/juni -/libs/application/template-api-modules/src/lib/modules/templates/general-petition @island-is/juni - -/apps/portals/admin/ @island-is/aranja -/libs/api/domains/auth-admin/ @island-is/aranja -/libs/api/domains/sessions/ @island-is/aranja -/libs/clients/auth/ @island-is/aranja -/libs/clients/middlewares/ @island-is/aranja -libs/clients/rsk/relationships/ @island-is/aranja -/libs/clients/sessions @island-is/aranja -/libs/portals/shared-modules/delegations @island-is/aranja -/libs/portals/admin/ids-admin @island-is/aranja -/libs/portals/my-pages/consent @island-is/aranja -/libs/portals/my-pages/restrictions @island-is/aranja -/libs/portals/my-pages/sessions @island-is/aranja -/apps/native/app/ @island-is/aranja-app -codemagic.yaml @island-is/aranja-app -/apps/web/public/.well-known/ @island-is/aranja-app - -/apps/judicial-system/ @island-is/kolibri-justice-league -/libs/judicial-system/ @island-is/kolibri-justice-league -/libs/nova-sms/ @island-is/kolibri-justice-league -/libs/dokobit-signing/ @island-is/kolibri-justice-league -/libs/email-service/ @island-is/kolibri-justice-league - -/apps/financial-aid/ @island-is/kolibri-robin-hood -/libs/financial-aid/ @island-is/kolibri-robin-hood -/libs/next-ids-auth/ @island-is/kolibri-robin-hood -/libs/clients/rsk/personal-tax-return @island-is/kolibri-robin-hood -/libs/application/templates/financial-aid/ @island-is/kolibri-robin-hood -/libs/api/domains/municipalities-financial-aid @island-is/kolibri-robin-hood -/libs/clients/municipalities-financial-aid @island-is/kolibri-robin-hood -/libs/application/template-api-modules/src/lib/modules/templates/financial-aid @island-is/kolibri-robin-hood - -/apps/download-service/ @island-is/hugsmidjan -/apps/portals/my-pages*/ @island-is/hugsmidjan -/apps/services/regulations-admin-backend/ @island-is/hugsmidjan -/apps/services/user-profile/ @island-is/hugsmidjan @island-is/juni @island-is/aranja -/apps/web/components/Grant/ @island-is/hugsmidjan -/apps/web/components/PlazaCard/ @island-is/hugsmidjan -/apps/web/screens/Grants/ @island-is/hugsmidjan -/apps/web/screens/Regulations/ @island-is/hugsmidjan -/apps/web/components/Regulations/ @island-is/hugsmidjan -/apps/web/screens/OfficialJournalOfIceland/ @island-is/hugsmidjan -/apps/web/components/OfficialJournalOfIceland/ @island-is/hugsmidjan -/libs/api/domains/air-discount-scheme @island-is/hugsmidjan -/libs/api/domains/documents/ @island-is/hugsmidjan -/libs/api/domains/finance/ @island-is/hugsmidjan -/libs/api/domains/assets/ @island-is/hugsmidjan -/libs/api/domains/health-directorate/ @island-is/hugsmidjan -/libs/api/domains/hms-loans/ @island-is/hugsmidjan -/libs/api/domains/license-service/ @island-is/hugsmidjan @island-is/aranja -/libs/api/domains/work-machines/ @island-is/hugsmidjan @island-is/origo -/libs/api/domains/national-registry/ @island-is/hugsmidjan -/libs/api/domains/notifications/ @island-is/hugsmidjan -/libs/api/domains/user-profile/ @island-is/hugsmidjan @island-is/juni @island-is/aranja -/libs/api/domains/passport/ @island-is/hugsmidjan -/libs/api/domains/vehicles/ @island-is/hugsmidjan -/libs/api/domains/university-careers/ @island-is/hugsmidjan -/libs/api/domains/regulations/ @island-is/hugsmidjan -/libs/api/domains/regulations-admin/ @island-is/hugsmidjan -/libs/api/domains/rights-portal @island-is/hugsmidjan -/libs/api/domains/social-insurance @island-is/hugsmidjan @island-is/stefna -/libs/api/domains/occupational-licenses/ @island-is/hugsmidjan -/libs/api/domains/occupational-licenses-v2/ @island-is/hugsmidjan -/libs/api/domains/intellectual-properties/ @island-is/hugsmidjan -/libs/api/domains/official-journal-of-iceland/ @island-is/hugsmidjan -/libs/api/domains/official-journal-of-iceland-application/ @island-is/hugsmidjan -/libs/api/domains/document-provider/ @island-is/hugsmidjan @island-is/core -/libs/api/domains/housing-benefits/ @island-is/hugsmidjan -/libs/api/domains/law-and-order/ @island-is/hugsmidjan -/libs/clients/documents/ @island-is/hugsmidjan -/libs/clients/documents-v2/ @island-is/hugsmidjan -/libs/clients/finance/ @island-is/hugsmidjan -/libs/clients/finance-v2/ @island-is/hugsmidjan -/libs/clients/adr-and-machine-license/ @island-is/hugsmidjan -/libs/clients/work-machines/ @island-is/hugsmidjan @island-is/origo -/libs/clients/disability-license/ @island-is/hugsmidjan -/libs/clients/firearm-license/ @island-is/hugsmidjan -/libs/clients/hunting-license/ @island-is/hugsmidjan -/libs/clients/smartsolutions/ @island-is/hugsmidjan -/libs/clients/smart-solutions-v2/ @island-is/hugsmidjan -/libs/clients/license-client/ @island-is/hugsmidjan @island-is/aranja -/libs/clients/intellectual-properties/ @island-is/hugsmidjan -/libs/clients/islykill/ @island-is/hugsmidjan -/libs/clients/national-registry/v3/ @island-is/hugsmidjan -/libs/clients/district-commissioners-licenses/ @island-is/hugsmidjan -/libs/clients/regulations/ @island-is/hugsmidjan -/libs/clients/vehicles/ @island-is/hugsmidjan @island-is/stefna -/libs/clients/vehicles-mileage/ @island-is/hugsmidjan -/libs/clients/user-notification/ @island-is/hugsmidjan -/libs/clients/passports/ @island-is/hugsmidjan -/libs/clients/p-card/ @island-is/hugsmidjan -/libs/clients/assets/ @island-is/hugsmidjan -/libs/clients/university-careers/ @island-is/hugsmidjan -/libs/clients/regulations-admin/ @island-is/hugsmidjan -/libs/clients/inna/ @island-is/hugsmidjan -/libs/clients/hms-loans/ @island-is/hugsmidjan -/libs/clients/official-journal-of-iceland/ @island-is/hugsmidjan -/libs/clients/hms-housing-benefits/ @island-is/hugsmidjan -/apps/services/license-api/ @island-is/hugsmidjan -/libs/regulations/ @island-is/hugsmidjan -/libs/portals/admin/regulations-admin/ @island-is/hugsmidjan -/libs/portals/admin/document-provider/ @island-is/hugsmidjan @island-is/core -/libs/clients/icelandic-health-insurance/rights-portal/ @island-is/hugsmidjan -/libs/clients/health-directorate @island-is/hugsmidjan -/libs/clients/health-directorate/src/lib/clients/occupational-license @island-is/hugsmidjan @island-is/origo -/libs/clients/mms/grade @island-is/hugsmidjan -/libs/portals/admin/air-discount-scheme @island-is/hugsmidjan -/libs/application/templates/official-journal-of-iceland/ @island-is/hugsmidjan -/libs/application/template-api-modules/src/lib/modules/templates/official-journal-of-iceland/ @island-is/hugsmidjan -/libs/clients/judicial-system-sp/ @island-is/hugsmidjan -/libs/application/templates/data-protection-complaint/ @island-is/norda -/libs/application/templates/institution-collaboration/ @island-is/norda @island-is/fuglar -/libs/application/templates/login-service/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/login-service/ @island-is/norda -/libs/clients/payment-schedule/ @island-is/norda -/libs/api/domains/payment-schedule/ @island-is/norda -/libs/application/templates/funding-government-projects/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/funding-government-projects/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/institution-collaboration/ @island-is/norda -/libs/application/templates/public-debt-payment-plan/ @island-is/norda -/libs/application/templates/complaints-to-althingi-ombudsman/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/complaints-to-althingi-ombudsman/ @island-is/norda -/libs/application/templates/accident-notification/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/accident-notification/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/health-insurance/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/public-debt-payment-plan @island-is/norda -/libs/api/domains/health-insurance/ @island-is/norda -/libs/application/templates/health-insurance/ @island-is/norda -/libs/clients/rsk/company-registry @island-is/norda -/libs/clients/althingi-ombudsman/ @island-is/norda -/libs/api/domains/company-registry @island-is/norda -/libs/clients/icelandic-health-insurance/health-insurance/ @island-is/norda -/libs/clients/data-protection-complaint/ @island-is/norda -/libs/clients/fishing-license/ @island-is/norda -/libs/api/domains/fishing-license/ @island-is/norda -/libs/application/templates/general-fishing-license/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/general-fishing-license/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/data-protection-complaint/ @island-is/norda -/libs/shared/form-fields/ @island-is/norda @island-is/island-ui -/libs/clients/financial-statements-inao @island-is/norda -/libs/api/domains/financial-statements-inao/ @island-is/norda -/libs/application/templates/financial-statements-inao/ @island-is/norda -/libs/application/template-api-modules/src/lib/modules/templates/financial-statements-inao @island-is/norda - -/libs/portals/my-pages/applications/ @island-is/norda-applications -/libs/portals/admin/application-system/ @island-is/norda-applications -/libs/api/domains/application/ @island-is/norda-applications -/libs/api/domains/payment/ @island-is/norda-applications - -/apps/contentful-apps/ @island-is/stefna -/apps/services/search-indexer/ @island-is/stefna @island-is/juni -/apps/services/contentful-entry-tagger/ @island-is/stefna -/apps/tools/contentful-role-permissions/ @island-is/stefna -/apps/web/screens/Organization/ @island-is/stefna -/apps/web/screens/Project/ @island-is/stefna -/apps/web/components/Organization/ @island-is/stefna -/apps/web/components/ChatPanel/ @island-is/stefna -/apps/web/components/Form/ @island-is/stefna -/apps/web/components/Stepper/ @island-is/stefna -/libs/content-search-toolkit/ @island-is/stefna @island-is/juni -/libs/content-search-index-manager/ @island-is/stefna @island-is/juni -/libs/content-search-metrics/ @island-is/stefna @island-is/juni -/libs/content-search-indexer/ @island-is/stefna @island-is/juni -/libs/api/domains/content-search/ @island-is/stefna @island-is/juni -/libs/api/domains/syslumenn/ @island-is/stefna -/libs/api/domains/email-signup/ @island-is/stefna -/libs/api/domains/electronic-registration-statistics/ @island-is/stefna -/libs/clients/electronic-registration-statistics/ @island-is/stefna -/libs/api/domains/fiskistofa/ @island-is/stefna -/libs/clients/fiskistofa/ @island-is/stefna -/libs/clients/syslumenn/ @island-is/stefna @island-is/juni -/libs/api/domains/watson-assistant-chat/ @island-is/stefna -/libs/clients/icelandic-government-institution-vacancies/ @island-is/stefna -/libs/api/domains/icelandic-government-institution-vacancies/ @island-is/stefna -/libs/clients/aircraft-registry/ @island-is/stefna -/libs/api/domains/aircraft-registry/ @island-is/stefna -/libs/api/domains/housing-benefit-calculator/ @island-is/stefna -/libs/clients/housing-benefit-calculator/ @island-is/stefna -/libs/clients/ship-registry/ @island-is/stefna -/libs/api/domains/ship-registry/ @island-is/stefna -/libs/clients/administration-of-occupational-safety-and-health/ @island-is/stefna -/libs/api/domains/administration-of-occupational-safety-and-health/ @island-is/stefna -/libs/clients/ultraviolet-radiation/ @island-is/stefna -/libs/clients/ums-cost-of-living-calculator/ @island-is/stefna -/libs/api/domains/umbodsmadur-skuldara/ @island-is/stefna - -/libs/island-ui/ @island-is/island-ui - -/apps/consultation-portal/ @island-is/advania -/apps/services/form-system/ @island-is/advania -/libs/clients/consultation-portal/ @island-is/advania -/libs/api/domains/consultation-portal/ @island-is/advania - -/apps/skilavottord/ @island-is/deloitte -/libs/skilavottord/ @island-is/deloitte -/libs/application/templates/parental-leave/ @island-is/deloitte -/libs/application/template-api-modules/src/lib/modules/templates/parental-leave/ @island-is/deloitte -/libs/clients/vmst/ @island-is/deloitte -/libs/api/domains/directorate-of-labour/ @island-is/deloitte -/libs/application/template-api-modules/src/lib/modules/templates/social-insurance-administration @island-is/deloitte -/libs/application/templates/social-insurance-administration/ @island-is/deloitte -/libs/clients/social-insurance-administration/ @island-is/deloitte @island-is/stefna @island-is/hugsmidjan -/libs/application/templates/car-recycling/ @island-is/deloitte -/libs/application/template-api-modules/src/lib/modules/templates/car-recycling/ @island-is/deloitte -/libs/clients/car-recycling/ @island-is/deloitte -/libs/application/templates/new-primary-school/ @island-is/deloitte -/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/ @island-is/deloitte -/libs/clients/mms/frigg @island-is/deloitte - -/apps/services/auth/ids-api/ @island-is/fuglar @island-is/aranja -/apps/services/auth/admin-api/ @island-is/fuglar @island-is/aranja -/apps/services/auth/public-api/ @island-is/fuglar @island-is/aranja -/apps/services/auth/delegation-api/ @island-is/fuglar @island-is/aranja -/apps/services/sessions/ @island-is/fuglar @island-is/aranja -/apps/auth-admin-web/ @island-is/fuglar @island-is/aranja -/libs/auth-api-lib/ @island-is/fuglar @island-is/aranja -/libs/auth-api-lib/seeders/ @island-is/fuglar @island-is/aranja @island-is/origo-auth -/libs/auth-nest-tools/ @island-is/fuglar @island-is/aranja -/libs/application/templates/european-health-insurance-card/ @island-is/fuglar -/libs/application/template-api-modules/src/lib/modules/templates/european-health-insurance-card/ @island-is/fuglar -/libs/clients/ehic-client-v1 @island-is/fuglar - -/apps/services/auth/personal-representative/ @island-is/programm @island-is/aranja -/apps/services/auth/personal-representative-public/ @island-is/programm @island-is/aranja - -/libs/application/templates/criminal-record/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/criminal-record-submission/ @island-is/origo -/libs/api/domains/criminal-record/ @island-is/origo -/libs/clients/criminal-record/ @island-is/origo - -/libs/application/templates/mortgage-certificate/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/mortgage-certificate-submission/ @island-is/origo -/libs/api/domains/mortgage-certificate/ @island-is/origo - -/libs/application/templates/no-debt-certificate/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/no-debt-certificate/ @island-is/origo - -/libs/application/templates/id-card/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/id-card/ @island-is/origo - -/libs/clients/charge-fjs-v2/ @island-is/origo -/libs/clients/vehicle-service-fjs-v1/ @island-is/origo - -/libs/application/templates/transport-authority/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/transport-authority/ @island-is/origo -/libs/api/domains/transport-authority/ @island-is/origo -/libs/clients/transport-authority/ @island-is/origo - -/libs/application/templates/driving-license-book-update-instructor/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/driving-license-book-update-instructor/ @island-is/origo - -/apps/services/university-gateway/ @island-is/origo -/libs/clients/university-application/ @island-is/origo -/libs/clients/university-gateway-api/ @island-is/origo -/libs/api/domains/university-gateway/ @island-is/origo -/libs/university-gateway/ @island-is/origo -/apps/web/screens/UniversitySearch/ @island-is/origo -/apps/web/screens/queries/UniversityGateway.ts @island-is/origo -/apps/web/components/ListViewCard/ @island-is/origo - -/libs/application/templates/directorate-of-immigration/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/directorate-of-immigration/ @island-is/origo -/libs/clients/directorate-of-immigration/ @island-is/origo - -/libs/application/templates/aosh/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/aosh @island-is/origo - -/libs/application/templates/healthcare-license-certificate/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/healthcare-license-certificate/ @island-is/origo - - -/libs/application/templates/healthcare-work-permit/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/healthcare-work-permit/ @island-is/origo - -/libs/application/templates/energy-funds/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/energy-funds/ @island-is/origo -/libs/api/domains/energy-funds/ @island-is/origo -/libs/clients/energy-funds/ @island-is/origo - -/libs/application/templates/university/ @island-is/origo -/libs/application/template-api-modules/src/lib/modules/templates/university/ @island-is/origo +/libs/infra-nest-server/src/lib/infra/ @island-is/core +/libs/testing/ @island-is/core +/libs/nest/swagger/ @island-is/core + +/apps/services/endorsements/ @island-is/juni +/apps/icelandic-names-registry*/ @island-is/juni +/apps/web/screens/PetitionView/ @island-is/juni +/libs/cms/ @island-is/juni @island-is/stefna +/libs/clients/cms/ @island-is/juni @island-is/aranja +/libs/residence-history @island-is/juni +/libs/api/domains/endorsement-system @island-is/juni +/libs/api/domains/icelandic-names-registry/ @island-is/juni +/libs/clients/rsk/ @island-is/juni +/libs/clients/zendesk/ @island-is/juni +/libs/icelandic-names-registry/ @island-is/juni +/libs/portals/my-pages/petitions/ @island-is/juni +/libs/portals/my-pages/signature-collection/ @island-is/juni +/libs/portals/my-pages/education/ @island-is/juni @island-is/hugsmidjan +/libs/portals/my-pages/education-career/ @island-is/juni @island-is/hugsmidjan +/libs/portals/my-pages/education-degree/ @island-is/juni @island-is/hugsmidjan +/libs/portals/my-pages/education-license/ @island-is/juni @island-is/hugsmidjan +/libs/portals/my-pages/education-student-assessment/ @island-is/juni @island-is/norda @island-is/hugsmidjan +/libs/clients/driving-license/ @island-is/juni +/libs/clients/judicial-administration/ @island-is/juni +/libs/application/templates/announcement-of-death/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/announcement-of-death @island-is/juni +/libs/application/templates/driving-license/ @island-is/juni +/libs/application/templates/driving-assessment-approval/ @island-is/juni +/libs/application/templates/driving-learners-permit/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/driving-learners-permit/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/driving-license-submission @island-is/juni +/libs/api/domains/driving-license/ @island-is/juni +/libs/api/domains/education/ @island-is/juni @island-is/hugsmidjan @island-is/deloitte +/libs/application/templates/estate/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/estate @island-is/juni +/libs/application/templates/general-petition/ @island-is/juni +/libs/shared/connected/src/lib/generalPetition/GeneralPetitionLists/ @island-is/juni +/libs/shared/connected/src/lib/SignatureLists/ @island-is/juni +/libs/api/domains/communications/ @island-is/juni @island-is/stefna +/apps/services/user-notification/ @island-is/juni @island-is/aranja +/apps/air-discount-scheme/ @island-is/hugsmidjan +/libs/air-discount-scheme/ @island-is/hugsmidjan +/libs/application/templates/p-sign/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/p-sign-submission @island-is/juni +/libs/application/templates/marriage-conditions/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/marriage-conditions-submission @island-is/juni +/libs/message-queue/ @island-is/juni +/libs/application/templates/example-payment/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/example-payment-actions @island-is/juni +/libs/application/templates/driving-school-confirmation/ @island-is/juni +/libs/application/templates/driving-instructor-registrations/ @island-is/juni +/libs/api/domains/driving-license-book/ @island-is/juni +/libs/clients/driving-license-book/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/passport @island-is/juni +/libs/application/templates/passport/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/passport-annulment @island-is/juni +/libs/application/templates/passport-annulment/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/driving-school-confirmation/ @island-is/juni +/libs/application/templates/operating-license/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/operating-license/ @island-is/juni +/libs/application/templates/driving-license-duplicate/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/driving-license-duplicate/ @island-is/juni +/libs/application/templates/inheritance-report/ @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/inheritance-report @island-is/juni +/libs/application/templates/signature-collection @island-is/juni +/libs/api/domains/disability-license @island-is/juni +/libs/portals/admin/petition @island-is/juni +/libs/portals/admin/signature-collection @island-is/juni +/libs/portals/admin/icelandic-names-registry @island-is/juni +/libs/api/domains/signature-collection @island-is/juni +/libs/clients/signature-collection @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/signature-collection @island-is/juni +/libs/application/template-api-modules/src/lib/modules/templates/general-petition @island-is/juni + +/apps/portals/admin/ @island-is/aranja +/libs/api/domains/auth-admin/ @island-is/aranja +/libs/api/domains/sessions/ @island-is/aranja +/libs/clients/auth/ @island-is/aranja +/libs/clients/middlewares/ @island-is/aranja +libs/clients/rsk/relationships/ @island-is/aranja +/libs/clients/sessions @island-is/aranja +/libs/portals/shared-modules/delegations @island-is/aranja +/libs/portals/admin/ids-admin @island-is/aranja +/libs/portals/my-pages/consent @island-is/aranja +/libs/portals/my-pages/restrictions @island-is/aranja +/libs/portals/my-pages/sessions @island-is/aranja +/apps/native/app/ @island-is/aranja-app +codemagic.yaml @island-is/aranja-app +/apps/web/public/.well-known/ @island-is/aranja-app + +/apps/judicial-system/ @island-is/kolibri-justice-league +/libs/judicial-system/ @island-is/kolibri-justice-league +/libs/nova-sms/ @island-is/kolibri-justice-league +/libs/dokobit-signing/ @island-is/kolibri-justice-league +/libs/email-service/ @island-is/kolibri-justice-league + +/apps/financial-aid/ @island-is/kolibri-robin-hood +/libs/financial-aid/ @island-is/kolibri-robin-hood +/libs/next-ids-auth/ @island-is/kolibri-robin-hood +/libs/clients/rsk/personal-tax-return @island-is/kolibri-robin-hood +/libs/application/templates/financial-aid/ @island-is/kolibri-robin-hood +/libs/api/domains/municipalities-financial-aid @island-is/kolibri-robin-hood +/libs/clients/municipalities-financial-aid @island-is/kolibri-robin-hood +/libs/application/template-api-modules/src/lib/modules/templates/financial-aid @island-is/kolibri-robin-hood + +/apps/download-service/ @island-is/hugsmidjan +/apps/portals/my-pages*/ @island-is/hugsmidjan +/apps/services/regulations-admin-backend/ @island-is/hugsmidjan +/apps/services/user-profile/ @island-is/hugsmidjan @island-is/juni @island-is/aranja +/apps/web/components/Grant/ @island-is/hugsmidjan +/apps/web/components/PlazaCard/ @island-is/hugsmidjan +/apps/web/screens/Grants/ @island-is/hugsmidjan +/apps/web/screens/Regulations/ @island-is/hugsmidjan +/apps/web/components/Regulations/ @island-is/hugsmidjan +/apps/web/screens/OfficialJournalOfIceland/ @island-is/hugsmidjan +/apps/web/components/OfficialJournalOfIceland/ @island-is/hugsmidjan +/libs/api/domains/air-discount-scheme @island-is/hugsmidjan +/libs/api/domains/documents/ @island-is/hugsmidjan +/libs/api/domains/finance/ @island-is/hugsmidjan +/libs/api/domains/assets/ @island-is/hugsmidjan +/libs/api/domains/health-directorate/ @island-is/hugsmidjan +/libs/api/domains/hms-loans/ @island-is/hugsmidjan +/libs/api/domains/license-service/ @island-is/hugsmidjan @island-is/aranja +/libs/api/domains/work-machines/ @island-is/hugsmidjan @island-is/origo +/libs/api/domains/national-registry/ @island-is/hugsmidjan +/libs/api/domains/notifications/ @island-is/hugsmidjan +/libs/api/domains/user-profile/ @island-is/hugsmidjan @island-is/juni @island-is/aranja +/libs/api/domains/passport/ @island-is/hugsmidjan +/libs/api/domains/vehicles/ @island-is/hugsmidjan +/libs/api/domains/university-careers/ @island-is/hugsmidjan +/libs/api/domains/regulations/ @island-is/hugsmidjan +/libs/api/domains/regulations-admin/ @island-is/hugsmidjan +/libs/api/domains/rights-portal @island-is/hugsmidjan +/libs/api/domains/social-insurance @island-is/hugsmidjan @island-is/stefna +/libs/api/domains/occupational-licenses/ @island-is/hugsmidjan +/libs/api/domains/occupational-licenses-v2/ @island-is/hugsmidjan +/libs/api/domains/intellectual-properties/ @island-is/hugsmidjan +/libs/api/domains/official-journal-of-iceland/ @island-is/hugsmidjan +/libs/api/domains/official-journal-of-iceland-application/ @island-is/hugsmidjan +/libs/api/domains/document-provider/ @island-is/hugsmidjan @island-is/core +/libs/api/domains/housing-benefits/ @island-is/hugsmidjan +/libs/api/domains/law-and-order/ @island-is/hugsmidjan +/libs/clients/documents/ @island-is/hugsmidjan +/libs/clients/documents-v2/ @island-is/hugsmidjan +/libs/clients/finance/ @island-is/hugsmidjan +/libs/clients/finance-v2/ @island-is/hugsmidjan +/libs/clients/adr-and-machine-license/ @island-is/hugsmidjan +/libs/clients/work-machines/ @island-is/hugsmidjan @island-is/origo +/libs/clients/disability-license/ @island-is/hugsmidjan +/libs/clients/firearm-license/ @island-is/hugsmidjan +/libs/clients/hunting-license/ @island-is/hugsmidjan +/libs/clients/smartsolutions/ @island-is/hugsmidjan +/libs/clients/smart-solutions-v2/ @island-is/hugsmidjan +/libs/clients/license-client/ @island-is/hugsmidjan @island-is/aranja +/libs/clients/intellectual-properties/ @island-is/hugsmidjan +/libs/clients/islykill/ @island-is/hugsmidjan +/libs/clients/national-registry/v3/ @island-is/hugsmidjan +/libs/clients/district-commissioners-licenses/ @island-is/hugsmidjan +/libs/clients/regulations/ @island-is/hugsmidjan +/libs/clients/vehicles/ @island-is/hugsmidjan @island-is/stefna +/libs/clients/vehicles-mileage/ @island-is/hugsmidjan +/libs/clients/user-notification/ @island-is/hugsmidjan +/libs/clients/passports/ @island-is/hugsmidjan +/libs/clients/p-card/ @island-is/hugsmidjan +/libs/clients/assets/ @island-is/hugsmidjan +/libs/clients/university-careers/ @island-is/hugsmidjan +/libs/clients/regulations-admin/ @island-is/hugsmidjan +/libs/clients/inna/ @island-is/hugsmidjan +/libs/clients/hms-loans/ @island-is/hugsmidjan +/libs/clients/official-journal-of-iceland/ @island-is/hugsmidjan +/libs/clients/hms-housing-benefits/ @island-is/hugsmidjan +/apps/services/license-api/ @island-is/hugsmidjan +/libs/regulations/ @island-is/hugsmidjan +/libs/portals/admin/regulations-admin/ @island-is/hugsmidjan +/libs/portals/admin/document-provider/ @island-is/hugsmidjan @island-is/core +/libs/clients/icelandic-health-insurance/rights-portal/ @island-is/hugsmidjan +/libs/clients/health-directorate @island-is/hugsmidjan +/libs/clients/health-directorate/src/lib/clients/occupational-license @island-is/hugsmidjan @island-is/origo +/libs/clients/mms/grade @island-is/hugsmidjan +/libs/portals/admin/air-discount-scheme @island-is/hugsmidjan +/libs/application/templates/official-journal-of-iceland/ @island-is/hugsmidjan +/libs/application/template-api-modules/src/lib/modules/templates/official-journal-of-iceland/ @island-is/hugsmidjan +/libs/clients/judicial-system-sp/ @island-is/hugsmidjan +/libs/application/templates/data-protection-complaint/ @island-is/norda +/libs/application/templates/institution-collaboration/ @island-is/norda @island-is/fuglar +/libs/application/templates/login-service/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/login-service/ @island-is/norda +/libs/clients/payment-schedule/ @island-is/norda +/libs/api/domains/payment-schedule/ @island-is/norda +/libs/application/templates/funding-government-projects/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/funding-government-projects/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/institution-collaboration/ @island-is/norda +/libs/application/templates/public-debt-payment-plan/ @island-is/norda +/libs/application/templates/complaints-to-althingi-ombudsman/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/complaints-to-althingi-ombudsman/ @island-is/norda +/libs/application/templates/accident-notification/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/accident-notification/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/health-insurance/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/public-debt-payment-plan @island-is/norda +/libs/api/domains/health-insurance/ @island-is/norda +/libs/application/templates/health-insurance/ @island-is/norda +/libs/clients/rsk/company-registry @island-is/norda +/libs/clients/althingi-ombudsman/ @island-is/norda +/libs/api/domains/company-registry @island-is/norda +/libs/clients/icelandic-health-insurance/health-insurance/ @island-is/norda +/libs/clients/data-protection-complaint/ @island-is/norda +/libs/clients/fishing-license/ @island-is/norda +/libs/api/domains/fishing-license/ @island-is/norda +/libs/application/templates/general-fishing-license/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/general-fishing-license/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/data-protection-complaint/ @island-is/norda +/libs/shared/form-fields/ @island-is/norda @island-is/island-ui +/libs/clients/financial-statements-inao @island-is/norda +/libs/api/domains/financial-statements-inao/ @island-is/norda +/libs/application/templates/financial-statements-inao/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/financial-statements-inao @island-is/norda +/libs/application/templates/inao/ @island-is/norda +/libs/application/templates/inao/financial-statement-cemetery/ @island-is/norda +/libs/application/templates/inao/financial-statement-individual-election/ @island-is/norda +/libs/application/templates/inao/financial-statement-political-party/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/financial-statement-cemetery/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/financial-statement-individual-election/ @island-is/norda +/libs/application/template-api-modules/src/lib/modules/templates/financial-statement-political-party/ @island-is/norda + + +/libs/portals/my-pages/applications/ @island-is/norda-applications +/libs/portals/admin/application-system/ @island-is/norda-applications +/libs/api/domains/application/ @island-is/norda-applications +/libs/api/domains/payment/ @island-is/norda-applications + +/apps/contentful-apps/ @island-is/stefna +/apps/services/search-indexer/ @island-is/stefna @island-is/juni +/apps/services/contentful-entry-tagger/ @island-is/stefna +/apps/tools/contentful-role-permissions/ @island-is/stefna +/apps/web/screens/Organization/ @island-is/stefna +/apps/web/screens/Project/ @island-is/stefna +/apps/web/components/Organization/ @island-is/stefna +/apps/web/components/ChatPanel/ @island-is/stefna +/apps/web/components/Form/ @island-is/stefna +/apps/web/components/Stepper/ @island-is/stefna +/libs/content-search-toolkit/ @island-is/stefna @island-is/juni +/libs/content-search-index-manager/ @island-is/stefna @island-is/juni +/libs/content-search-metrics/ @island-is/stefna @island-is/juni +/libs/content-search-indexer/ @island-is/stefna @island-is/juni +/libs/api/domains/content-search/ @island-is/stefna @island-is/juni +/libs/api/domains/syslumenn/ @island-is/stefna +/libs/api/domains/email-signup/ @island-is/stefna +/libs/api/domains/electronic-registration-statistics/ @island-is/stefna +/libs/clients/electronic-registration-statistics/ @island-is/stefna +/libs/api/domains/fiskistofa/ @island-is/stefna +/libs/clients/fiskistofa/ @island-is/stefna +/libs/clients/syslumenn/ @island-is/stefna @island-is/juni +/libs/api/domains/watson-assistant-chat/ @island-is/stefna +/libs/clients/icelandic-government-institution-vacancies/ @island-is/stefna +/libs/api/domains/icelandic-government-institution-vacancies/ @island-is/stefna +/libs/clients/aircraft-registry/ @island-is/stefna +/libs/api/domains/aircraft-registry/ @island-is/stefna +/libs/api/domains/housing-benefit-calculator/ @island-is/stefna +/libs/clients/housing-benefit-calculator/ @island-is/stefna +/libs/clients/ship-registry/ @island-is/stefna +/libs/api/domains/ship-registry/ @island-is/stefna +/libs/clients/administration-of-occupational-safety-and-health/ @island-is/stefna +/libs/api/domains/administration-of-occupational-safety-and-health/ @island-is/stefna +/libs/clients/ultraviolet-radiation/ @island-is/stefna +/libs/clients/ums-cost-of-living-calculator/ @island-is/stefna +/libs/api/domains/umbodsmadur-skuldara/ @island-is/stefna + +/libs/island-ui/ @island-is/island-ui + +/apps/consultation-portal/ @island-is/advania +/apps/services/form-system/ @island-is/advania +/libs/clients/consultation-portal/ @island-is/advania +/libs/api/domains/consultation-portal/ @island-is/advania + +/apps/skilavottord/ @island-is/deloitte +/libs/skilavottord/ @island-is/deloitte +/libs/application/templates/parental-leave/ @island-is/deloitte +/libs/application/template-api-modules/src/lib/modules/templates/parental-leave/ @island-is/deloitte +/libs/clients/vmst/ @island-is/deloitte +/libs/api/domains/directorate-of-labour/ @island-is/deloitte +/libs/application/template-api-modules/src/lib/modules/templates/social-insurance-administration @island-is/deloitte +/libs/application/templates/social-insurance-administration/ @island-is/deloitte +/libs/clients/social-insurance-administration/ @island-is/deloitte @island-is/stefna @island-is/hugsmidjan +/libs/application/templates/car-recycling/ @island-is/deloitte +/libs/application/template-api-modules/src/lib/modules/templates/car-recycling/ @island-is/deloitte +/libs/clients/car-recycling/ @island-is/deloitte +/libs/application/templates/new-primary-school/ @island-is/deloitte +/libs/application/template-api-modules/src/lib/modules/templates/new-primary-school/ @island-is/deloitte +/libs/clients/mms/frigg @island-is/deloitte + +/apps/services/auth/ids-api/ @island-is/fuglar @island-is/aranja +/apps/services/auth/admin-api/ @island-is/fuglar @island-is/aranja +/apps/services/auth/public-api/ @island-is/fuglar @island-is/aranja +/apps/services/auth/delegation-api/ @island-is/fuglar @island-is/aranja +/apps/services/sessions/ @island-is/fuglar @island-is/aranja +/apps/auth-admin-web/ @island-is/fuglar @island-is/aranja +/libs/auth-api-lib/ @island-is/fuglar @island-is/aranja +/libs/auth-api-lib/seeders/ @island-is/fuglar @island-is/aranja @island-is/origo-auth +/libs/auth-nest-tools/ @island-is/fuglar @island-is/aranja +/libs/application/templates/european-health-insurance-card/ @island-is/fuglar +/libs/application/template-api-modules/src/lib/modules/templates/european-health-insurance-card/ @island-is/fuglar +/libs/clients/ehic-client-v1 @island-is/fuglar + +/apps/services/auth/personal-representative/ @island-is/programm @island-is/aranja +/apps/services/auth/personal-representative-public/ @island-is/programm @island-is/aranja + +/libs/application/templates/criminal-record/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/criminal-record-submission/ @island-is/origo +/libs/api/domains/criminal-record/ @island-is/origo +/libs/clients/criminal-record/ @island-is/origo + +/libs/application/templates/mortgage-certificate/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/mortgage-certificate-submission/ @island-is/origo +/libs/api/domains/mortgage-certificate/ @island-is/origo + +/libs/application/templates/no-debt-certificate/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/no-debt-certificate/ @island-is/origo + +/libs/application/templates/id-card/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/id-card/ @island-is/origo + +/libs/clients/charge-fjs-v2/ @island-is/origo +/libs/clients/vehicle-service-fjs-v1/ @island-is/origo + +/libs/application/templates/transport-authority/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/transport-authority/ @island-is/origo +/libs/api/domains/transport-authority/ @island-is/origo +/libs/clients/transport-authority/ @island-is/origo + +/libs/application/templates/driving-license-book-update-instructor/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/driving-license-book-update-instructor/ @island-is/origo + +/apps/services/university-gateway/ @island-is/origo +/libs/clients/university-application/ @island-is/origo +/libs/clients/university-gateway-api/ @island-is/origo +/libs/api/domains/university-gateway/ @island-is/origo +/libs/university-gateway/ @island-is/origo +/apps/web/screens/UniversitySearch/ @island-is/origo +/apps/web/screens/queries/UniversityGateway.ts @island-is/origo +/apps/web/components/ListViewCard/ @island-is/origo + +/libs/application/templates/directorate-of-immigration/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/directorate-of-immigration/ @island-is/origo +/libs/clients/directorate-of-immigration/ @island-is/origo + +/libs/application/templates/aosh/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/aosh @island-is/origo + +/libs/application/templates/healthcare-license-certificate/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/healthcare-license-certificate/ @island-is/origo + + +/libs/application/templates/healthcare-work-permit/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/healthcare-work-permit/ @island-is/origo + +/libs/application/templates/energy-funds/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/energy-funds/ @island-is/origo +/libs/api/domains/energy-funds/ @island-is/origo +/libs/clients/energy-funds/ @island-is/origo + +/libs/application/templates/university/ @island-is/origo +/libs/application/template-api-modules/src/lib/modules/templates/university/ @island-is/origo # DevOps -/.github/ @island-is/devops -/.githooks/ @island-is/devops -/apps/reference-backend/ @island-is/devops -/apps/github-actions-cache/ @island-is/devops -/infra/ @island-is/devops -**/infra/ @island-is/devops -/libs/logging/ @island-is/devops -/scripts/ @island-is/devops -/scripts/postinstall.js @island-is/devops @island-is/core -/scripts/codegen.js @island-is/devops @island-is/core -/charts/ @island-is/devops -.dockerignore @island-is/devops +/.github/ @island-is/devops +/.githooks/ @island-is/devops +/apps/reference-backend/ @island-is/devops +/apps/github-actions-cache/ @island-is/devops +/infra/ @island-is/devops +**/infra/ @island-is/devops +/libs/logging/ @island-is/devops +/scripts/ @island-is/devops +/scripts/postinstall.js @island-is/devops @island-is/core +/scripts/codegen.js @island-is/devops @island-is/core +/charts/ @island-is/devops +.dockerignore @island-is/devops # QA -/apps/system-e2e/ @island-is/qa -/libs/testing/e2e @island-is/qa +/apps/system-e2e/ @island-is/qa +/libs/testing/e2e @island-is/qa # Islandis -/apps/system-e2e/src/tests/islandis/admin-portal/ @island-is/aranja -/apps/system-e2e/src/tests/islandis/application-system/ @island-is/norda-applications -/apps/system-e2e/src/tests/islandis/application-system/acceptance/parental-leave.spec.ts @island-is/deloitte -/apps/system-e2e/src/tests/islandis/consultation-portal/ @island-is/advania -/apps/system-e2e/src/tests/islandis/service-portal/ @island-is/hugsmidjan @island-is/juni @island-is/norda-applications -/apps/system-e2e/src/tests/islandis/web/ @island-is/hugsmidjan @island-is/juni @island-is/stefna +/apps/system-e2e/src/tests/islandis/admin-portal/ @island-is/aranja +/apps/system-e2e/src/tests/islandis/application-system/ @island-is/norda-applications +/apps/system-e2e/src/tests/islandis/application-system/acceptance/parental-leave.spec.ts @island-is/deloitte +/apps/system-e2e/src/tests/islandis/consultation-portal/ @island-is/advania +/apps/system-e2e/src/tests/islandis/service-portal/ @island-is/hugsmidjan @island-is/juni @island-is/norda-applications +/apps/system-e2e/src/tests/islandis/web/ @island-is/hugsmidjan @island-is/juni @island-is/stefna # Judicial system -/apps/system-e2e/src/tests/judicial-system/ @island-is/kolibri-justice-league +/apps/system-e2e/src/tests/judicial-system/ @island-is/kolibri-justice-league diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/dataProviders/index.ts b/libs/application/templates/inao/financial-statement-cemetery/src/dataProviders/index.ts index dd52c79ad7f2..b0b604d16ca3 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/dataProviders/index.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/dataProviders/index.ts @@ -1,10 +1,7 @@ import { defineTemplateApi } from '@island.is/application/types' import { UserProfileApi } from '@island.is/application/types' - -export { - NationalRegistryUserApi, - IdentityApi as IdentityApiProvider, -} from '@island.is/application/types' +import { IdentityApi } from '@island.is/application/types' +export { NationalRegistryUserApi } from '@island.is/application/types' export const CurrentUserTypeProvider = defineTemplateApi({ action: 'getUserType', @@ -16,3 +13,9 @@ export const UserInfoApi = UserProfileApi.configure({ catchMock: true, }, }) + +export const IdentityApiProvider = IdentityApi.configure({ + params: { + includeActorInfo: true, + }, +}) diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryIncomeLimit/index.tsx b/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryIncomeLimit/index.tsx deleted file mode 100644 index 3e78d43e4af1..000000000000 --- a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryIncomeLimit/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { useEffect } from 'react' -import { AlertMessage, ContentBlock } from '@island.is/island-ui/core' -import { useLocale } from '@island.is/localization' -import { useQuery } from '@apollo/client' -import { useFormContext } from 'react-hook-form' -import { m } from '../../lib/messages' -import { financialLimitQuery } from '../../graphql' -import { CEMETERYOPERATIONIDS } from '../../utils/constants' -import { FSIUSERTYPE } from '../../types/types' - -export const CemeteryIncomeLimit = () => { - const { getValues, setValue } = useFormContext() - const { formatMessage } = useLocale() - - const values = getValues() - const year: string = values?.conditionalAbout?.operatingYear - - const { data, error } = useQuery(financialLimitQuery, { - variables: { input: { year, clientType: `${FSIUSERTYPE.CEMETRY}` } }, - }) - - useEffect(() => { - const limit = data?.financialStatementsInaoClientFinancialLimit?.toString() - - if (limit) { - setValue(CEMETERYOPERATIONIDS.incomeLimit, limit) - } - }, [data, setValue]) - - if (error) { - return ( - - - - ) - } - - return null -} diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/AboutOverview.tsx b/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/AboutOverview.tsx index 926d2038faba..f0d0177b8a94 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/AboutOverview.tsx +++ b/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/AboutOverview.tsx @@ -1,61 +1,61 @@ import { GridColumn, GridRow } from '@island.is/island-ui/core' -import { formatPhoneNumber } from '@island.is/application/ui-components' - import { format as formatNationalId } from 'kennitala' -import { m } from '../../lib/messages' import { sectionColumn } from './overviewStyles.css' -import { FinancialStatementCemetery } from '../../lib/dataSchema' import { ValueLine } from './ValueLine' +import { FormValue } from '@island.is/application/types' +import { getAboutOverviewNumbers } from '../../utils/overviewUtils' +import { m } from '../../lib/messages' -export const AboutOverview = ({ - answers, -}: { - answers: FinancialStatementCemetery -}) => { +type Props = { + answers: FormValue +} + +export const AboutOverview = ({ answers }: Props) => { + const { + fullName, + nationalId, + powerOfAttorneyName, + powerOfAttorneyNationalId, + email, + phoneNumber, + } = getAboutOverviewNumbers(answers) return ( <> - + - {answers.about.powerOfAttorneyName ? ( + {powerOfAttorneyName ? ( ) : null} - {answers.about.powerOfAttorneyNationalId ? ( + {powerOfAttorneyNationalId ? ( ) : null} - + - + diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/CapitalNumbersOverview.tsx b/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/CapitalNumbersOverview.tsx index f3e18079a7cf..8814e7cb42b8 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/CapitalNumbersOverview.tsx +++ b/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/CapitalNumbersOverview.tsx @@ -1,18 +1,19 @@ import { Box, GridColumn, GridRow, Text } from '@island.is/island-ui/core' - -import { m } from '../../lib/messages' import { ValueLine } from './ValueLine' import { sectionColumn, starterColumnStyle } from './overviewStyles.css' import { useLocale } from '@island.is/localization' -import { FinancialStatementCemetery } from '../../lib/dataSchema' -import { formatCurrency } from '../../utils/helpers' +import { FormValue } from '@island.is/application/types' +import { getCapitalNumbersOverviewNumbers } from '../../utils/overviewUtils' +import { m } from '../../lib/messages' + +type Props = { + answers: FormValue +} -export const CapitalNumberOverview = ({ - answers, -}: { - answers: FinancialStatementCemetery -}) => { +export const CapitalNumberOverview = ({ answers }: Props) => { const { formatMessage } = useLocale() + const { capitalIncome, capitalCost, totalCapital } = + getCapitalNumbersOverviewNumbers(answers) return ( <> @@ -22,27 +23,17 @@ export const CapitalNumberOverview = ({ - + - {answers.capitalNumbers?.capitalCost ? ( + {capitalCost ? ( - + ) : null} - + diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/index.tsx b/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/index.tsx index 0f8c89f2c9f0..b5e45641c1fd 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/index.tsx +++ b/libs/application/templates/inao/financial-statement-cemetery/src/fields/CemeteryOverview/index.tsx @@ -1,6 +1,5 @@ import { Fragment } from 'react' import { FieldBaseProps } from '@island.is/application/types' -import { getValueViaPath } from '@island.is/application/core' import { AlertBanner, Box, @@ -11,9 +10,6 @@ import { } from '@island.is/island-ui/core' import { useLocale } from '@island.is/localization' import { format as formatNationalId } from 'kennitala' -import { m } from '../../lib/messages' -import { FinancialStatementCemetery } from '../../lib/dataSchema' -import { formatCurrency } from '../../utils/helpers' import { AboutOverview } from './AboutOverview' import { ValueLine } from './ValueLine' import { CapitalNumberOverview } from './CapitalNumbersOverview' @@ -24,117 +20,53 @@ import { sectionColumn, starterColumnStyle, } from './overviewStyles.css' +import { formatCurrency } from '../../utils/currency' +import { isCemetryUnderFinancialLimit } from '../../utils/helpers' +import { getOverviewNumbers } from '../../utils/overviewUtils' +import { m } from '../../lib/messages' export const CemeteryOverview = ({ application }: FieldBaseProps) => { const { formatMessage } = useLocale() - - const answers = application.answers as FinancialStatementCemetery - const file = getValueViaPath>(answers, 'attachments.file') - const fileName = file?.[0]?.name - const incomeLimit = - getValueViaPath(answers, 'cemeteryOperations.incomeLimit') ?? '0' - const email = getValueViaPath(answers, 'about.email') - const cemeteryCaretakers = answers.cemeteryCaretaker - - const careIncome = getValueViaPath( - answers, - 'cemeteryIncome.careIncome', - ) - const burialRevenue = getValueViaPath( - answers, - 'cemeteryIncome.burialRevenue', - ) - const grantFromTheCemeteryFund = getValueViaPath( - answers, - 'cemeteryIncome.grantFromTheCemeteryFund', - ) - const otherIncome = getValueViaPath( - answers, - 'cemeteryIncome.otherIncome', - ) - const totalIncome = getValueViaPath(answers, 'cemeteryIncome.total') - - const payroll = getValueViaPath(answers, 'cemeteryExpense.payroll') - const funeralCost = getValueViaPath( - answers, - 'cemeteryExpense.funeralCost', - ) - const chapelExpense = getValueViaPath( - answers, - 'cemeteryExpense.chapelExpense', - ) - const donationsToCemeteryFund = getValueViaPath( - answers, - 'cemeteryExpense.cemeteryFundExpense', - ) - const donationsToOther = getValueViaPath( - answers, - 'cemeteryExpense.donationsToOther', - ) - const otherOperationCost = getValueViaPath( - answers, - 'cemeteryExpense.otherOperationCost', - ) - const depreciation = getValueViaPath( - answers, - 'cemeteryExpense.depreciation', - ) - const totalExpenses = getValueViaPath( - answers, - 'cemeteryExpense.total', - ) - - const fixedAssetsTotal = getValueViaPath( - answers, - 'cemeteryAsset.fixedAssetsTotal', - ) - const currentAssets = getValueViaPath( - answers, - 'cemeteryAsset.currentAssets', - ) - const totalAssets = getValueViaPath(answers, 'assetsTotal') - - const longTerm = getValueViaPath( - answers, - 'cemeteryLiability.longTerm', - ) - const shortTerm = getValueViaPath( - answers, - 'cemeteryLiability.shortTerm', - ) - const totalLiabilities = getValueViaPath( - answers, - 'equityAndLiabilitiesTotals.liabilitiesTotal', - ) - - const equityAtTheBeginningOfTheYear = getValueViaPath( - answers, - 'cemeteryEquity.equityAtTheBeginningOfTheYear', - ) - const revaluationDueToPriceChanges = getValueViaPath( - answers, - 'cemeteryEquity.revaluationDueToPriceChanges', - ) - const reevaluateOther = getValueViaPath( - answers, - 'cemeteryEquity.reevaluateOther', - ) - const operationResult = getValueViaPath( - answers, - 'cemeteryEquity.operationResult', - ) - const totalEquity = getValueViaPath(answers, 'cemeteryEquity.total') - - const debtsAndCash = getValueViaPath( - answers, - 'equityAndLiabilitiesTotals.equityAndLiabilitiesTotal', + const cemeteryUnderFinancialLimit = isCemetryUnderFinancialLimit( + application.answers, ) + const { + careIncome, + burialRevenue, + grantFromTheCemeteryFund, + otherIncome, + totalIncome, + payroll, + funeralCost, + chapelExpense, + donationsToCemeteryFund, + donationsToOther, + otherOperationCost, + depreciation, + totalExpenses, + fixedAssetsTotal, + currentAssets, + totalAssets, + longTerm, + shortTerm, + totalLiabilities, + equityAtTheBeginningOfTheYear, + revaluationDueToPriceChanges, + reevaluateOther, + operationResult, + totalEquity, + debtsAndCash, + email, + fileName, + incomeLimit, + cemeteryCaretakers, + } = getOverviewNumbers(application.answers) return ( - + @@ -214,7 +146,7 @@ export const CemeteryOverview = ({ application }: FieldBaseProps) => { - + @@ -294,8 +226,9 @@ export const CemeteryOverview = ({ application }: FieldBaseProps) => { - {Number(totalIncome) < Number(incomeLimit) && - cemeteryCaretakers?.length > 0 ? ( + {cemeteryUnderFinancialLimit && + cemeteryCaretakers && + cemeteryCaretakers.length > 0 ? ( <> @@ -338,7 +271,7 @@ export const CemeteryOverview = ({ application }: FieldBaseProps) => { ) : null} {fileName ? ( <> - + ) : null} diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/fields/FetchDataBasedOnSelectedYear/index.tsx b/libs/application/templates/inao/financial-statement-cemetery/src/fields/FetchDataBasedOnSelectedYear/index.tsx new file mode 100644 index 000000000000..1fbb78acc661 --- /dev/null +++ b/libs/application/templates/inao/financial-statement-cemetery/src/fields/FetchDataBasedOnSelectedYear/index.tsx @@ -0,0 +1,123 @@ +import { useEffect } from 'react' +import { + AlertMessage, + ContentBlock, + LoadingDots, +} from '@island.is/island-ui/core' +import { useLocale } from '@island.is/localization' +import { useQuery } from '@apollo/client' +import { useFormContext } from 'react-hook-form' +import { financialLimitQuery, taxInfoQuery } from '../../graphql' +import { CEMETERYOPERATIONIDS } from '../../utils/constants' +import { FSIUSERTYPE, TaxInfoData } from '../../types/types' +import { + getCareIncomeAndBurialRevenueAndGrant, + getTaxInfoFromAnswers, +} from '../../utils/helpers' +import { m } from '../../lib/messages' + +export const FetchDataBasedOnSelectedYear = () => { + const { getValues, setValue } = useFormContext() + const { formatMessage } = useLocale() + + const values = getValues() + const year: string = values?.conditionalAbout?.operatingYear + + const { data, error, loading } = useQuery(financialLimitQuery, { + variables: { input: { year, clientType: `${FSIUSERTYPE.CEMETRY}` } }, + }) + + const { data: taxInfoData, loading: taxInfoLoading } = useQuery( + taxInfoQuery, + { + variables: { year }, + }, + ) + + const { + careIncomeFromAnswers, + burialRevenueFromAnswers, + grantFromTheCemeteryFundFromAnswers, + donationsToCemeteryFundFromAnswers, + } = getTaxInfoFromAnswers(values) + + useEffect(() => { + const limit = data?.financialStatementsInaoClientFinancialLimit?.toString() + + if (limit) { + setValue(CEMETERYOPERATIONIDS.incomeLimit, limit) + } + }, [data, setValue]) + + useEffect(() => { + if (!taxInfoData) return + + const { + careIncome, + burialRevenue, + grantFromTheCemeteryFund, + donationsToCemeteryFund, + } = getCareIncomeAndBurialRevenueAndGrant( + taxInfoData.financialStatementsInaoTaxInfo, + ) + + const updates = [ + { + id: CEMETERYOPERATIONIDS.careIncome, + value: careIncome, + exists: careIncomeFromAnswers, + }, + { + id: CEMETERYOPERATIONIDS.burialRevenue, + value: burialRevenue, + exists: burialRevenueFromAnswers, + }, + { + id: CEMETERYOPERATIONIDS.grantFromTheCemeteryFund, + value: grantFromTheCemeteryFund, + exists: grantFromTheCemeteryFundFromAnswers, + }, + { + id: CEMETERYOPERATIONIDS.donationsToCemeteryFund, + value: donationsToCemeteryFund, + exists: donationsToCemeteryFundFromAnswers, + }, + ] + + updates.forEach((update) => { + if (!update.exists) { + setValue(update.id, update.value) + } + }) + }, [ + taxInfoData, + setValue, + careIncomeFromAnswers, + burialRevenueFromAnswers, + grantFromTheCemeteryFundFromAnswers, + donationsToCemeteryFundFromAnswers, + CEMETERYOPERATIONIDS, + ]) + + if (loading || taxInfoLoading) { + return ( + + + + ) + } + + if (error) { + return ( + + + + ) + } + + return null +} diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/fields/PowerOfAttorney/index.tsx b/libs/application/templates/inao/financial-statement-cemetery/src/fields/PowerOfAttorney/index.tsx deleted file mode 100644 index f4dcf6f77248..000000000000 --- a/libs/application/templates/inao/financial-statement-cemetery/src/fields/PowerOfAttorney/index.tsx +++ /dev/null @@ -1,96 +0,0 @@ -import { useEffect } from 'react' -import { useFormContext } from 'react-hook-form' -import { useLazyQuery } from '@apollo/client' -import { - Box, - GridColumn, - GridContainer, - GridRow, - InputError, -} from '@island.is/island-ui/core' -import { InputController } from '@island.is/shared/form-fields' -import { useLocale } from '@island.is/localization' -import { IdentityInput, Query } from '@island.is/api/schema' -import { m } from '../../lib/messages' -import { FieldBaseProps } from '@island.is/application/types' -import { getErrorViaPath } from '@island.is/application/core' -import { IdentityQuery } from '../../graphql' -import { ABOUTIDS } from '../../utils/constants' - -export const PowerOfAttorneyFields = ({ application }: FieldBaseProps) => { - const { formatMessage } = useLocale() - const { - formState: { errors }, - setValue, - } = useFormContext() - - const currentActor = - application.applicantActors[application.applicantActors.length - 1] - - const [getIdentity, { loading, error: queryError }] = useLazyQuery< - Query, - { input: IdentityInput } - >(IdentityQuery, { - onCompleted: (data) => { - setValue(ABOUTIDS.powerOfAttorneyName, data.identity?.name ?? '') - }, - }) - - useEffect(() => { - if (currentActor) { - getIdentity({ - variables: { - input: { - nationalId: currentActor, - }, - }, - }) - } - }, []) - - if (application.applicantActors.length === 0) { - return null - } - - return ( - - - - - - - - - - - {queryError ? ( - - ) : null} - - - - - ) -} diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/fields/index.ts b/libs/application/templates/inao/financial-statement-cemetery/src/fields/index.ts index 9903bafb3734..5c8739dcdcab 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/fields/index.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/fields/index.ts @@ -1,4 +1,3 @@ export { CemeteryCaretaker } from './CemeteryCareteker' -export { PowerOfAttorneyFields } from './PowerOfAttorney' export { CemeteryOverview } from './CemeteryOverview' -export { CemeteryIncomeLimit } from './CemeteryIncomeLimit' +export { FetchDataBasedOnSelectedYear } from './FetchDataBasedOnSelectedYear' diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/caretakerMultiField.ts b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/caretakerMultiField.ts deleted file mode 100644 index 21b59e7439fe..000000000000 --- a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/caretakerMultiField.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { buildCustomField, buildMultiField } from '@island.is/application/core' -import { m } from '../../../lib/messages' -import { CEMETERYCARETAKER } from '../../../utils/constants' - -export const caretakerMultiField = buildMultiField({ - id: 'caretakers', - title: m.cemeteryBoardmembers, - description: m.cemeteryRegisterCaretakers, - children: [ - buildCustomField({ - id: 'cemeteryCaretaker', - title: m.cemeteryBoardmembers, - component: 'CemeteryCaretaker', - childInputIds: Object.values(CEMETERYCARETAKER), - }), - ], -}) diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/index.ts b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/index.ts index a5805af6e458..384036b026d1 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/index.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryCaretakerSection/index.ts @@ -1,9 +1,32 @@ -import { buildSection } from '@island.is/application/core' +import { + buildCustomField, + buildMultiField, + buildSection, +} from '@island.is/application/core' import { m } from '../../../lib/messages' -import { caretakerMultiField } from './caretakerMultiField' +import { CEMETERYCARETAKER } from '../../../utils/constants' +import { isCemetryUnderFinancialLimit } from '../../../utils/helpers' +// This section should appear if the cemetries total income is under the income limit export const cemeteryCaretekerSection = buildSection({ + condition: (answers) => { + return isCemetryUnderFinancialLimit(answers) + }, id: 'cemeteryCaretekerSection', title: m.cemeteryCaretakers, - children: [caretakerMultiField], + children: [ + buildMultiField({ + id: 'caretakers', + title: m.cemeteryBoardmembers, + description: m.cemeteryRegisterCaretakers, + children: [ + buildCustomField({ + id: 'cemeteryCaretaker', + title: m.cemeteryBoardmembers, + component: 'CemeteryCaretaker', + childInputIds: Object.values(CEMETERYCARETAKER), + }), + ], + }), + ], }) diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryFinancialStatementSection/index.ts b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryFinancialStatementSection/index.ts index 8df2c99ea9cd..b46b820b5714 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryFinancialStatementSection/index.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryFinancialStatementSection/index.ts @@ -1,30 +1,18 @@ import { buildFileUploadField, buildSection } from '@island.is/application/core' import { m } from '../../../lib/messages' -import { currencyStringToNumber } from '../../../utils/helpers' -import { FinancialStatementCemetery } from '../../../lib/dataSchema' +import { isCemetryUnderFinancialLimit } from '../../../utils/helpers' +// This section should appear if the cemetries total income is over the income limit export const cemeteryFinancialStatementSection = buildSection({ + condition: (answers) => { + return !isCemetryUnderFinancialLimit(answers) + }, id: 'documents', title: m.financialStatement, children: [ buildFileUploadField({ id: 'attachments.file', title: m.upload, - condition: (answers) => { - const applicationAnswers = answers as FinancialStatementCemetery - const careTakerLimit = - applicationAnswers.cemeteryOperation?.incomeLimit ?? '0' - const fixedAssetsTotal = - applicationAnswers.cemeteryAsset?.fixedAssetsTotal - const totalIncome = applicationAnswers.cemeteryIncome?.total - const longTermDebt = applicationAnswers.cemeteryLiability?.longTerm - const isUnderLimit = - currencyStringToNumber(totalIncome) < careTakerLimit - if (isUnderLimit && fixedAssetsTotal === '0' && longTermDebt === '0') { - return false - } - return true - }, introduction: m.uploadIntro, description: m.uploadDescription, uploadHeader: m.uploadHeader, diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/capitalNumberSubSection.ts b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/capitalNumberSubSection.ts index 86bc4ae3eaa0..c8f3ff8e67a3 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/capitalNumberSubSection.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/capitalNumberSubSection.ts @@ -6,7 +6,7 @@ import { } from '@island.is/application/core' import { m } from '../../../lib/messages' import { CAPITALNUMBERS } from '../../../utils/constants' -import { sumCapitalNumbers } from '../../../utils/helpers' +import { sumCapitalNumbers } from '../../../utils/sums' export const capitalNumberSubSection = buildSubSection({ id: 'keynumbers.capitalNumbers', diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/equityAndLiabilitySubSection.ts b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/equityAndLiabilitySubSection.ts index 1e0f6a2987f2..5a1b3b970132 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/equityAndLiabilitySubSection.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/equityAndLiabilitySubSection.ts @@ -13,12 +13,12 @@ import { } from '../../../utils/constants' import { operationResult, - showEquitiesAndLiabilitiesAlert, - sumAssets, sumLiabilities, - sumTotalEquity, sumTotalEquityAndLiabilities, -} from '../../../utils/helpers' + sumTotalEquity, + showEquitiesAndLiabilitiesAlert, + sumAssets, +} from '../../../utils/sums' export const equityAndLiabilitiesSubSection = buildSubSection({ id: 'keyNumbers.cemetryEquitiesAndLiabilities', diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/opperatingCostSubSection.ts b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/opperatingCostSubSection.ts index 34329fa8ee15..d15128bfd667 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/opperatingCostSubSection.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/cemeteryKeyNumbersSection/opperatingCostSubSection.ts @@ -12,7 +12,7 @@ import { sumExpenses, sumIncome, sumOperatingResults, -} from '../../../utils/helpers' +} from '../../../utils/sums' export const opperatingCostSubSection = buildSubSection({ id: 'operatingCost', @@ -24,9 +24,9 @@ export const opperatingCostSubSection = buildSubSection({ description: m.fillOutAppopriate, children: [ buildCustomField({ - id: 'cemetryIncomeLimit', + id: 'fetchDataBasedOnYear', title: '', - component: 'CemeteryIncomeLimit', + component: 'FetchDataBasedOnSelectedYear', }), // Income buildDescriptionField({ diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/clientInfoSection/index.ts b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/clientInfoSection/index.ts index 9916366fd934..718b55a3d021 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/clientInfoSection/index.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/forms/applicationForm/clientInfoSection/index.ts @@ -1,12 +1,13 @@ import { buildAsyncSelectField, - buildCustomField, buildDescriptionField, buildMultiField, + buildPhoneField, buildSection, buildTextField, + getValueViaPath, } from '@island.is/application/core' -import { Application, UserProfile } from '@island.is/application/types' +import { Application } from '@island.is/application/types' import { m } from '../../../lib/messages' import { ABOUTIDS } from '../../../utils/constants' import { Identity } from '@island.is/api/schema' @@ -58,42 +59,49 @@ export const clientInfoSection = buildSection({ return nationalRegistry.name }, }), - buildDescriptionField({ - id: 'about.description2', - title: '', + buildTextField({ + id: ABOUTIDS.powerOfAttorneyNationalId, + title: m.powerOfAttorneyNationalId, + width: 'half', + readOnly: true, + format: '######-####', + defaultValue: (application: Application) => + getValueViaPath( + application.externalData, + 'identity.data.actor.nationalId', + ), }), - buildCustomField({ - id: 'powerOfAttorney', - title: '', - description: '', - component: 'PowerOfAttorneyFields', - childInputIds: [ - ABOUTIDS.powerOfAttorneyNationalId, - ABOUTIDS.powerOfAttorneyName, - ], + buildTextField({ + id: ABOUTIDS.powerOfAttorneyName, + title: m.powerOfAttorneyName, + width: 'half', + readOnly: true, + defaultValue: (application: Application) => + getValueViaPath( + application.externalData, + 'identity.data.actor.name', + ), }), - buildTextField({ id: 'about.email', title: m.email, width: 'half', variant: 'email', - defaultValue: (application: Application) => { - const userProfile = application.externalData.userProfile - .data as UserProfile - return userProfile.email - }, + defaultValue: (application: Application) => + getValueViaPath( + application.externalData, + 'userProfile.data.email', + ), }), - buildTextField({ + buildPhoneField({ id: 'about.phoneNumber', title: m.phoneNumber, width: 'half', - variant: 'tel', - defaultValue: (application: Application) => { - const userProfile = application.externalData.userProfile - .data as UserProfile - return userProfile.mobilePhoneNumber - }, + defaultValue: (application: Application) => + getValueViaPath( + application.externalData, + 'userProfile.data.mobilePhoneNumber', + ), }), ], }), diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/hooks/useTotals.ts b/libs/application/templates/inao/financial-statement-cemetery/src/hooks/useTotals.ts deleted file mode 100644 index 15a5873fdd5e..000000000000 --- a/libs/application/templates/inao/financial-statement-cemetery/src/hooks/useTotals.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { useCallback, useEffect, useState } from 'react' -import { useFormContext } from 'react-hook-form' -import { getTotal } from '../utils/helpers' - -const useTotals = (key: string): [() => void, number] => { - const [total, setTotal] = useState(0) - const { getValues } = useFormContext() - const getSum = useCallback(() => { - const values = getValues() - const sum = getTotal(values, key) - setTotal(sum) - }, [key, getValues, setTotal]) - - useEffect(() => { - getSum() - }, [getSum]) - - return [getSum, total] -} - -export { useTotals } diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/lib/dataSchema.ts b/libs/application/templates/inao/financial-statement-cemetery/src/lib/dataSchema.ts index 97379678b103..35a8aefa428f 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/lib/dataSchema.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/lib/dataSchema.ts @@ -3,11 +3,9 @@ import { m } from './messages' import * as kennitala from 'kennitala' import { parsePhoneNumberFromString } from 'libphonenumber-js' import { BOARDMEMEBER, CARETAKER } from '../utils/constants' -import { - isPositiveNumberInString, - getBoardmembersAndCaretakers, -} from '../utils/helpers' +import { getBoardmembersAndCaretakers } from '../utils/helpers' import { YES } from '@island.is/application/types' +import { isPositiveNumberInString } from '../utils/currency' const FileSchema = z.object({ name: z.string(), diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/types/types.ts b/libs/application/templates/inao/financial-statement-cemetery/src/types/types.ts index 53e29233513f..edd111488a8c 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/types/types.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/types/types.ts @@ -46,3 +46,19 @@ type InaoConfigItem = { export type AuditConfig = { financialStatementsInaoConfig: Array } + +export type CareTaker = { + nationalId: string + name: string + role: string +} + +export type TaxInfoItem = { + __typename: string + key: number + value: string +} + +export type TaxInfoData = { + financialStatementsInaoTaxInfo: Array +} diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/utils/constants.ts b/libs/application/templates/inao/financial-statement-cemetery/src/utils/constants.ts index 2c0cb3bb6afe..190000af6700 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/utils/constants.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/utils/constants.ts @@ -26,6 +26,7 @@ export enum TaxInfoTypes { CARE_INCOME = 300, BURIAL_REVENUE = 301, GRANT_FROM_THE_CEMETERY_FUND = 302, + DONATIONS_TO_CEMETERYFUND = 334, } export const CEMETERYOPERATIONIDS = { diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/utils/currency.ts b/libs/application/templates/inao/financial-statement-cemetery/src/utils/currency.ts new file mode 100644 index 000000000000..7ffe7149224c --- /dev/null +++ b/libs/application/templates/inao/financial-statement-cemetery/src/utils/currency.ts @@ -0,0 +1,16 @@ +export const currencyStringToNumber = (str: string) => { + if (!str) { + return str + } + const cleanString = str.replace(/[,\s]+|[.\s]+/g, '') + return parseInt(cleanString, 10) +} + +export const formatCurrency = (answer?: string) => { + if (!answer) return '0. kr' + return answer.replace(/\B(?=(\d{3})+(?!\d))/g, '.') + ' kr.' +} + +export const isPositiveNumberInString = (input: string) => { + return Number(input) >= 0 +} diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/utils/helpers.ts b/libs/application/templates/inao/financial-statement-cemetery/src/utils/helpers.ts index aec943d790e8..9a6d72727122 100644 --- a/libs/application/templates/inao/financial-statement-cemetery/src/utils/helpers.ts +++ b/libs/application/templates/inao/financial-statement-cemetery/src/utils/helpers.ts @@ -1,42 +1,16 @@ -import { ExternalData, FormValue } from '@island.is/application/types' +import { FormValue } from '@island.is/application/types' import { getValueViaPath } from '@island.is/application/core' import { BOARDMEMEBER, - CAPITALNUMBERS, CARETAKER, CemeteriesBackwardLimit, CemeteriesYearAllowed, - CEMETERYEQUITIESANDLIABILITIESIDS, CEMETERYOPERATIONIDS, - EQUITYANDLIABILITIESTOTALS, - OPERATINGCOST, - TOTAL, + TaxInfoTypes, } from './constants' -import { FinancialStatementCemetery } from '../lib/dataSchema' import getYear from 'date-fns/getYear' import subYears from 'date-fns/subYears' -import { AuditConfig, BoardMember, Config, FSIUSERTYPE } from '../types/types' - -export const getTotal = (values: Record, key: string) => { - if (!values[key]) { - return 0 - } - const total = Object.entries(values[key]) - .filter(([k, v]) => k !== TOTAL && !isNaN(Number(v))) - .map(([_k, v]) => Number(v)) - .reduce((prev, current) => { - return (prev += current) - }, 0) - return total -} - -export const currencyStringToNumber = (str: string) => { - if (!str) { - return str - } - const cleanString = str.replace(/[,\s]+|[.\s]+/g, '') - return parseInt(cleanString, 10) -} +import { AuditConfig, BoardMember, TaxInfoItem } from '../types/types' export const getBoardmembersAndCaretakers = (members: Array) => { const careTakers = members @@ -60,11 +34,7 @@ export const isCemetryUnderFinancialLimit = (answers: FormValue) => { getValueViaPath(answers, 'cemeteryLiability.longTerm') || '0' const isUnderLimit = Number(totalIncome) < Number(incomeLimit) - if (isUnderLimit && fixedAssetsTotal === '0' && longTermDebt === '0') { - return true - } - - return false + return isUnderLimit && fixedAssetsTotal === '0' && longTermDebt === '0' } export const getYearOptions = (data: AuditConfig) => { @@ -103,226 +73,64 @@ export const possibleOperatingYears = ( return operationYears } -export const getConfigInfoForKey = (config: Config[], configKey: string) => { - return config?.filter((config: Config) => config.key === configKey)[0].value -} - -export const formatCurrency = (answer?: string) => { - if (!answer) return '0. kr' - return answer.replace(/\B(?=(\d{3})+(?!\d))/g, '.') + ' kr.' -} - -export const isPositiveNumberInString = (input: string) => { - return Number(input) > 0 -} - -export const sumIncome = (answers: FormValue) => { - const careIncome = - getValueViaPath(answers, CEMETERYOPERATIONIDS.careIncome) || '0' - const burialRevenue = - getValueViaPath(answers, CEMETERYOPERATIONIDS.burialRevenue) || '0' - const grantFromTheCemeteryFund = - getValueViaPath( - answers, - CEMETERYOPERATIONIDS.grantFromTheCemeteryFund, - ) || '0' - const otherIncome = - getValueViaPath(answers, CEMETERYOPERATIONIDS.otherIncome) || '0' - - return `${ - Number(careIncome) + - Number(burialRevenue) + - Number(grantFromTheCemeteryFund) + - Number(otherIncome) - }` -} - -export const sumExpenses = (answers: FormValue) => { - const payroll = getValueViaPath(answers, CEMETERYOPERATIONIDS.payroll) - const funeralCost = - getValueViaPath(answers, CEMETERYOPERATIONIDS.funeralCost) || '0' - const chapelExpense = - getValueViaPath(answers, CEMETERYOPERATIONIDS.chapelExpense) || '0' - const donationsToCemeteryFund = - getValueViaPath( - answers, - CEMETERYOPERATIONIDS.donationsToCemeteryFund, - ) || '0' - const donationsToOther = - getValueViaPath(answers, CEMETERYOPERATIONIDS.donationsToOther) || - '0' - const otherOperationCost = - getValueViaPath(answers, CEMETERYOPERATIONIDS.otherOperationCost) || - '0' - const depreciation = - getValueViaPath(answers, CEMETERYOPERATIONIDS.depreciation) || '0' - - return `${ - Number(payroll) + - Number(funeralCost) + - Number(chapelExpense) + - Number(donationsToCemeteryFund) + - Number(donationsToOther) + - Number(otherOperationCost) + - Number(depreciation) - }` -} - -export const sumOperatingResults = (answers: FormValue) => { - const income = - getValueViaPath(answers, CEMETERYOPERATIONIDS.totalIncome) || '0' - const expenses = - getValueViaPath(answers, CEMETERYOPERATIONIDS.totalExpense) || '0' - - return `${Number(income) - Number(expenses)}` -} - -export const sumCapitalNumbers = (answers: FormValue) => { - const capitalIncome = - getValueViaPath(answers, CAPITALNUMBERS.capitalIncome) || '0' - const capitalCost = - getValueViaPath(answers, CAPITALNUMBERS.capitalCost) || '0' - return `${Number(capitalIncome) - Number(capitalCost)}` -} - -export const sumAssets = (answers: FormValue) => { - const fixedAssetsTotal = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.fixedAssetsTotal, - ) || '0' - const currentAssets = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.currentAssets, - ) || '0' - return `${Number(fixedAssetsTotal) + Number(currentAssets)}` -} - -export const sumLiabilities = (answers: FormValue) => { - const longTerm = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.longTerm, - ) || '0' - const shortTerm = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.shortTerm, - ) || '0' - return `${Number(longTerm) + Number(shortTerm)}` -} - -export const operationResult = (answers: FormValue) => { - const operatingTotalCost = - getValueViaPath(answers, OPERATINGCOST.total) || '0' - const capitalTotal = - getValueViaPath(answers, CAPITALNUMBERS.total) || '0' - return `${Number(operatingTotalCost) + Number(capitalTotal)}` -} - -export const sumTotalEquity = (answers: FormValue) => { - const equityAtTheBeginningOfTheYear = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.equityAtTheBeginningOfTheYear, - ) || '0' - const revaluationDueToPriceChanges = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.revaluationDueToPriceChanges, - ) || '0' - const reevaluateOther = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.reevaluateOther, - ) || '0' - const operationResult = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.operationResult, - ) || '0' - - return `${ - Number(equityAtTheBeginningOfTheYear) + - Number(revaluationDueToPriceChanges) + - Number(reevaluateOther) + - Number(operationResult) - }` -} - -export const sumTotalEquityAndLiabilities = (answers: FormValue) => { - const liabilityTotal = - getValueViaPath( - answers, - EQUITYANDLIABILITIESTOTALS.liabilitiesTotal, - ) || '0' - const totalEquity = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.equityTotal, - ) || '0' +export const getCareIncomeAndBurialRevenueAndGrant = ( + taxInfo?: Array, +) => { + if (!taxInfo) { + return { + careIncome: undefined, + burialRevenue: undefined, + grantFromTheCemeteryFund: undefined, + } + } - return `${Number(totalEquity) + Number(liabilityTotal)}` + const careIncome = taxInfo.find( + (item) => item.key === TaxInfoTypes.CARE_INCOME, + ) + const burialRevenue = taxInfo.find( + (item) => item.key === TaxInfoTypes.BURIAL_REVENUE, + ) + const grantFromTheCemeteryFund = taxInfo.find( + (item) => item.key === TaxInfoTypes.GRANT_FROM_THE_CEMETERY_FUND, + ) + const donationsToCemeteryFund = taxInfo.find( + (item) => item.key === TaxInfoTypes.DONATIONS_TO_CEMETERYFUND, + ) + + return { + careIncome: careIncome ? careIncome.value : undefined, + burialRevenue: burialRevenue ? burialRevenue.value : undefined, + grantFromTheCemeteryFund: grantFromTheCemeteryFund + ? grantFromTheCemeteryFund.value + : undefined, + donationsToCemeteryFund: donationsToCemeteryFund + ? donationsToCemeteryFund.value + : undefined, + } } -export const showEquitiesAndLiabilitiesAlert = (answers: FormValue) => { - const fixedAssetsTotal = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.fixedAssetsTotal, - ) || '0' - const currentAssets = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.currentAssets, - ) || '0' - const longTerm = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.longTerm, - ) || '0' - const shortTerm = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.shortTerm, - ) || '0' - const equityAtTheBeginningOfTheYear = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.equityAtTheBeginningOfTheYear, - ) || '0' - const revaluationDueToPriceChanges = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.revaluationDueToPriceChanges, - ) || '0' - const reevaluateOther = - getValueViaPath( - answers, - CEMETERYEQUITIESANDLIABILITIESIDS.reevaluateOther, - ) || '0' - - const totalAssets = - getValueViaPath(answers, EQUITYANDLIABILITIESTOTALS.assetsTotal) || - '0' - const totalEquityAndLiabilities = - getValueViaPath( - answers, - EQUITYANDLIABILITIESTOTALS.equityAndLiabilitiesTotal, - ) || '0' - - if ( - !fixedAssetsTotal || - !currentAssets || - !longTerm || - !shortTerm || - !equityAtTheBeginningOfTheYear || - !revaluationDueToPriceChanges || - !reevaluateOther || - !operationResult - ) { - return false +export const getTaxInfoFromAnswers = (answers: FormValue) => { + const careIncome = getValueViaPath( + answers, + CEMETERYOPERATIONIDS.careIncome, + ) + const burialRevenue = getValueViaPath( + answers, + CEMETERYOPERATIONIDS.burialRevenue, + ) + const grantFromTheCemeteryFund = getValueViaPath( + answers, + CEMETERYOPERATIONIDS.grantFromTheCemeteryFund, + ) + const donationsToCemeteryFund = getValueViaPath( + answers, + CEMETERYOPERATIONIDS.donationsToCemeteryFund, + ) + + return { + careIncomeFromAnswers: careIncome, + burialRevenueFromAnswers: burialRevenue, + grantFromTheCemeteryFundFromAnswers: grantFromTheCemeteryFund, + donationsToCemeteryFundFromAnswers: donationsToCemeteryFund, } - return totalAssets !== totalEquityAndLiabilities } diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/utils/overviewUtils.ts b/libs/application/templates/inao/financial-statement-cemetery/src/utils/overviewUtils.ts new file mode 100644 index 000000000000..f27cb0ef6f96 --- /dev/null +++ b/libs/application/templates/inao/financial-statement-cemetery/src/utils/overviewUtils.ts @@ -0,0 +1,189 @@ +import { FormValue } from '@island.is/application/types' +import { getValueViaPath } from '@island.is/application/core' +import { CareTaker } from '../types/types' +import { formatPhoneNumber } from '@island.is/application/ui-components' +import { format as formatNationalId } from 'kennitala' +import { formatCurrency } from './currency' + +export const getOverviewNumbers = (answers: FormValue) => { + const file = getValueViaPath>(answers, 'attachments.file') + const fileName = file?.[0]?.name + const incomeLimit = + getValueViaPath(answers, 'cemeteryOperations.incomeLimit') ?? '0' + const email = getValueViaPath(answers, 'about.email') + const careIncome = getValueViaPath( + answers, + 'cemeteryIncome.careIncome', + ) + const cemeteryCaretakers = getValueViaPath>( + answers, + 'cemeteryCaretaker', + ) + const burialRevenue = getValueViaPath( + answers, + 'cemeteryIncome.burialRevenue', + ) + const grantFromTheCemeteryFund = getValueViaPath( + answers, + 'cemeteryIncome.grantFromTheCemeteryFund', + ) + const otherIncome = getValueViaPath( + answers, + 'cemeteryIncome.otherIncome', + ) + const totalIncome = getValueViaPath(answers, 'cemeteryIncome.total') + + const payroll = getValueViaPath(answers, 'cemeteryExpense.payroll') + const funeralCost = getValueViaPath( + answers, + 'cemeteryExpense.funeralCost', + ) + const chapelExpense = getValueViaPath( + answers, + 'cemeteryExpense.chapelExpense', + ) + const donationsToCemeteryFund = getValueViaPath( + answers, + 'cemeteryExpense.cemeteryFundExpense', + ) + const donationsToOther = getValueViaPath( + answers, + 'cemeteryExpense.donationsToOther', + ) + const otherOperationCost = getValueViaPath( + answers, + 'cemeteryExpense.otherOperationCost', + ) + const depreciation = getValueViaPath( + answers, + 'cemeteryExpense.depreciation', + ) + const totalExpenses = getValueViaPath( + answers, + 'cemeteryExpense.total', + ) + + const fixedAssetsTotal = getValueViaPath( + answers, + 'cemeteryAsset.fixedAssetsTotal', + ) + const currentAssets = getValueViaPath( + answers, + 'cemeteryAsset.currentAssets', + ) + const totalAssets = getValueViaPath(answers, 'assetsTotal') + + const longTerm = getValueViaPath( + answers, + 'cemeteryLiability.longTerm', + ) + const shortTerm = getValueViaPath( + answers, + 'cemeteryLiability.shortTerm', + ) + const totalLiabilities = getValueViaPath( + answers, + 'equityAndLiabilitiesTotals.liabilitiesTotal', + ) + + const equityAtTheBeginningOfTheYear = getValueViaPath( + answers, + 'cemeteryEquity.equityAtTheBeginningOfTheYear', + ) + const revaluationDueToPriceChanges = getValueViaPath( + answers, + 'cemeteryEquity.revaluationDueToPriceChanges', + ) + const reevaluateOther = getValueViaPath( + answers, + 'cemeteryEquity.reevaluateOther', + ) + const operationResult = getValueViaPath( + answers, + 'cemeteryEquity.operationResult', + ) + const totalEquity = getValueViaPath(answers, 'cemeteryEquity.total') + + const debtsAndCash = getValueViaPath( + answers, + 'equityAndLiabilitiesTotals.equityAndLiabilitiesTotal', + ) + + return { + file, + fileName, + incomeLimit, + email, + cemeteryCaretakers, + careIncome, + burialRevenue, + grantFromTheCemeteryFund, + otherIncome, + totalIncome, + payroll, + funeralCost, + chapelExpense, + donationsToCemeteryFund, + donationsToOther, + otherOperationCost, + depreciation, + totalExpenses, + fixedAssetsTotal, + currentAssets, + totalAssets, + longTerm, + shortTerm, + totalLiabilities, + equityAtTheBeginningOfTheYear, + revaluationDueToPriceChanges, + reevaluateOther, + operationResult, + totalEquity, + debtsAndCash, + } +} + +export const getAboutOverviewNumbers = (answers: FormValue) => { + const fullName = getValueViaPath(answers, 'about.fullName') + const nationalId = formatNationalId( + getValueViaPath(answers, 'about.nationalId') ?? '', + ) + const powerOfAttorneyName = getValueViaPath( + answers, + 'about.powerOfAttorneyName', + ) + const powerOfAttorneyNationalId = formatNationalId( + getValueViaPath(answers, 'about.powerOfAttorneyNationalId') ?? '', + ) + const email = getValueViaPath(answers, 'about.email') + const phoneNumber = formatPhoneNumber( + getValueViaPath(answers, 'about.phoneNumber') ?? '', + ) + + return { + fullName, + nationalId, + powerOfAttorneyName, + powerOfAttorneyNationalId, + email, + phoneNumber, + } +} + +export const getCapitalNumbersOverviewNumbers = (answers: FormValue) => { + const capitalIncome = formatCurrency( + getValueViaPath(answers, 'capitalNumbers.capitalIncome'), + ) + const capitalCost = formatCurrency( + getValueViaPath(answers, 'capitalNumbers.capitalCost'), + ) + const totalCapital = formatCurrency( + getValueViaPath(answers, 'capitalNumbers.total'), + ) + + return { + capitalIncome, + capitalCost, + totalCapital, + } +} diff --git a/libs/application/templates/inao/financial-statement-cemetery/src/utils/sums.ts b/libs/application/templates/inao/financial-statement-cemetery/src/utils/sums.ts new file mode 100644 index 000000000000..4b8e6c2e1738 --- /dev/null +++ b/libs/application/templates/inao/financial-statement-cemetery/src/utils/sums.ts @@ -0,0 +1,225 @@ +import { FormValue } from '@island.is/application/types' +import { getValueViaPath } from '@island.is/application/core' +import { + CAPITALNUMBERS, + CEMETERYEQUITIESANDLIABILITIESIDS, + CEMETERYOPERATIONIDS, + EQUITYANDLIABILITIESTOTALS, + OPERATINGCOST, +} from './constants' + +export const sumIncome = (answers: FormValue) => { + const careIncome = + getValueViaPath(answers, CEMETERYOPERATIONIDS.careIncome) || '0' + const burialRevenue = + getValueViaPath(answers, CEMETERYOPERATIONIDS.burialRevenue) || '0' + const grantFromTheCemeteryFund = + getValueViaPath( + answers, + CEMETERYOPERATIONIDS.grantFromTheCemeteryFund, + ) || '0' + const otherIncome = + getValueViaPath(answers, CEMETERYOPERATIONIDS.otherIncome) || '0' + + return `${ + Number(careIncome) + + Number(burialRevenue) + + Number(grantFromTheCemeteryFund) + + Number(otherIncome) + }` +} + +export const sumExpenses = (answers: FormValue) => { + const payroll = getValueViaPath(answers, CEMETERYOPERATIONIDS.payroll) + const funeralCost = + getValueViaPath(answers, CEMETERYOPERATIONIDS.funeralCost) || '0' + const chapelExpense = + getValueViaPath(answers, CEMETERYOPERATIONIDS.chapelExpense) || '0' + const donationsToCemeteryFund = + getValueViaPath( + answers, + CEMETERYOPERATIONIDS.donationsToCemeteryFund, + ) || '0' + const donationsToOther = + getValueViaPath(answers, CEMETERYOPERATIONIDS.donationsToOther) || + '0' + const otherOperationCost = + getValueViaPath(answers, CEMETERYOPERATIONIDS.otherOperationCost) || + '0' + const depreciation = + getValueViaPath(answers, CEMETERYOPERATIONIDS.depreciation) || '0' + + return `${ + Number(payroll) + + Number(funeralCost) + + Number(chapelExpense) + + Number(donationsToCemeteryFund) + + Number(donationsToOther) + + Number(otherOperationCost) + + Number(depreciation) + }` +} + +export const sumOperatingResults = (answers: FormValue) => { + const income = + getValueViaPath(answers, CEMETERYOPERATIONIDS.totalIncome) || '0' + const expenses = + getValueViaPath(answers, CEMETERYOPERATIONIDS.totalExpense) || '0' + + return `${Number(income) - Number(expenses)}` +} + +export const sumCapitalNumbers = (answers: FormValue) => { + const capitalIncome = + getValueViaPath(answers, CAPITALNUMBERS.capitalIncome) || '0' + const capitalCost = + getValueViaPath(answers, CAPITALNUMBERS.capitalCost) || '0' + return `${Number(capitalIncome) - Number(capitalCost)}` +} + +export const sumAssets = (answers: FormValue) => { + const fixedAssetsTotal = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.fixedAssetsTotal, + ) || '0' + const currentAssets = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.currentAssets, + ) || '0' + return `${Number(fixedAssetsTotal) + Number(currentAssets)}` +} + +export const sumLiabilities = (answers: FormValue) => { + const longTerm = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.longTerm, + ) || '0' + const shortTerm = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.shortTerm, + ) || '0' + return `${Number(longTerm) + Number(shortTerm)}` +} + +export const operationResult = (answers: FormValue) => { + const operatingTotalCost = + getValueViaPath(answers, OPERATINGCOST.total) || '0' + const capitalTotal = + getValueViaPath(answers, CAPITALNUMBERS.total) || '0' + return `${Number(operatingTotalCost) + Number(capitalTotal)}` +} + +export const sumTotalEquity = (answers: FormValue) => { + const equityAtTheBeginningOfTheYear = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.equityAtTheBeginningOfTheYear, + ) || '0' + const revaluationDueToPriceChanges = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.revaluationDueToPriceChanges, + ) || '0' + const reevaluateOther = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.reevaluateOther, + ) || '0' + const operationResult = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.operationResult, + ) || '0' + + return `${ + Number(equityAtTheBeginningOfTheYear) + + Number(revaluationDueToPriceChanges) + + Number(reevaluateOther) + + Number(operationResult) + }` +} + +export const sumTotalEquityAndLiabilities = (answers: FormValue) => { + const liabilityTotal = + getValueViaPath( + answers, + EQUITYANDLIABILITIESTOTALS.liabilitiesTotal, + ) || '0' + const totalEquity = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.equityTotal, + ) || '0' + + return `${Number(totalEquity) + Number(liabilityTotal)}` +} + +export const showEquitiesAndLiabilitiesAlert = (answers: FormValue) => { + const fixedAssetsTotal = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.fixedAssetsTotal, + ) || '0' + const currentAssets = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.currentAssets, + ) || '0' + const longTerm = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.longTerm, + ) || '0' + const shortTerm = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.shortTerm, + ) || '0' + const equityAtTheBeginningOfTheYear = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.equityAtTheBeginningOfTheYear, + ) || '0' + const revaluationDueToPriceChanges = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.revaluationDueToPriceChanges, + ) || '0' + const reevaluateOther = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.reevaluateOther, + ) || '0' + + const totalAssets = + getValueViaPath(answers, EQUITYANDLIABILITIESTOTALS.assetsTotal) || + '0' + const totalEquityAndLiabilities = + getValueViaPath( + answers, + EQUITYANDLIABILITIESTOTALS.equityAndLiabilitiesTotal, + ) || '0' + const operationResult = + getValueViaPath( + answers, + CEMETERYEQUITIESANDLIABILITIESIDS.operationResult, + ) || '0' + + if ( + !fixedAssetsTotal || + !currentAssets || + !longTerm || + !shortTerm || + !equityAtTheBeginningOfTheYear || + !revaluationDueToPriceChanges || + !reevaluateOther || + !operationResult + ) { + return false + } + return totalAssets !== totalEquityAndLiabilities +} From 04563fd4d14e94693b0ef6edba5c1bde1ccf13d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8Dvar=20Oddsson?= Date: Thu, 12 Dec 2024 22:43:52 +0000 Subject: [PATCH 3/8] feat(j-s): Add court name abbr. to prison cases table (#17171) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../src/routes/Shared/Cases/PrisonCases.tsx | 31 ++++++++++++++----- .../routes/Shared/Cases/prisonCases.graphql | 4 +++ 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/apps/judicial-system/web/src/routes/Shared/Cases/PrisonCases.tsx b/apps/judicial-system/web/src/routes/Shared/Cases/PrisonCases.tsx index ad91229428cb..3027b2e998f6 100644 --- a/apps/judicial-system/web/src/routes/Shared/Cases/PrisonCases.tsx +++ b/apps/judicial-system/web/src/routes/Shared/Cases/PrisonCases.tsx @@ -3,7 +3,10 @@ import { useIntl } from 'react-intl' import partition from 'lodash/partition' import { AlertMessage, Box, Tag, Text } from '@island.is/island-ui/core' -import { capitalize } from '@island.is/judicial-system/formatters' +import { + capitalize, + districtCourtAbbreviation, +} from '@island.is/judicial-system/formatters' import { core, errors, @@ -166,6 +169,10 @@ export const PrisonCases: FC = () => { thead={[ { title: formatMessage(tables.caseNumber), + sortable: { + isSortable: true, + key: 'courtCaseNumber', + }, }, { title: capitalize(formatMessage(core.defendant, { suffix: 'i' })), @@ -182,13 +189,21 @@ export const PrisonCases: FC = () => { data={cases} columns={[ { - cell: (row) => ( - - ), + cell: (row) => { + const courtAbbreviation = districtCourtAbbreviation( + row.court?.name, + ) + + return ( + + ) + }, }, { cell: (row) => , diff --git a/apps/judicial-system/web/src/routes/Shared/Cases/prisonCases.graphql b/apps/judicial-system/web/src/routes/Shared/Cases/prisonCases.graphql index 23b25b22538c..04f635815e1e 100644 --- a/apps/judicial-system/web/src/routes/Shared/Cases/prisonCases.graphql +++ b/apps/judicial-system/web/src/routes/Shared/Cases/prisonCases.graphql @@ -44,6 +44,10 @@ query PrisonCases { role active } + court { + id + name + } prosecutor { id created From 4241fe5d49e70332323c2f27eb40f13ae7bd2b0c Mon Sep 17 00:00:00 2001 From: HjorturJ <34068269+HjorturJ@users.noreply.github.com> Date: Thu, 12 Dec 2024 22:54:01 +0000 Subject: [PATCH 4/8] fix(application-system): Possible to go back to hidden screens (#17162) * Early investigation * chore: nx format:write update dirty files * More investigation and testing * Cleaning up a bit * chore: nx format:write update dirty files * Changing into a 1 liner change * chore: nx format:write update dirty files * Reverting test changes * Going another route to avoid bugs * Removing whitespace --------- Co-authored-by: andes-it Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../ui-shell/src/components/Screen.tsx | 3 +++ .../ui-shell/src/components/ScreenFooter.tsx | 5 +++-- .../ui-shell/src/lib/FormShell.tsx | 2 ++ .../ui-shell/src/reducer/reducerUtils.ts | 19 +++++++++++++++++++ 4 files changed, 27 insertions(+), 2 deletions(-) diff --git a/libs/application/ui-shell/src/components/Screen.tsx b/libs/application/ui-shell/src/components/Screen.tsx index 52bcbcce6625..907a34d76624 100644 --- a/libs/application/ui-shell/src/components/Screen.tsx +++ b/libs/application/ui-shell/src/components/Screen.tsx @@ -76,6 +76,7 @@ type ScreenProps = { renderLastScreenBackButton?: boolean goToScreen: (id: string) => void setUpdateForbidden: (value: boolean) => void + canGoBack: boolean } const getServerValidationErrors = (error: ApolloError | undefined) => { @@ -107,6 +108,7 @@ const Screen: FC> = ({ renderLastScreenBackButton, screen, sections, + canGoBack, }) => { const { answers: formValue, externalData, id: applicationId } = application const { lang: locale, formatMessage } = useLocale() @@ -416,6 +418,7 @@ const Screen: FC> = ({ numberOfScreens={numberOfScreens} mode={mode} goBack={goBack} + canGoBack={canGoBack} submitField={submitField} loading={loading} canProceed={!isLoadingOrPending} diff --git a/libs/application/ui-shell/src/components/ScreenFooter.tsx b/libs/application/ui-shell/src/components/ScreenFooter.tsx index 253e4665c354..2c6b653dada9 100644 --- a/libs/application/ui-shell/src/components/ScreenFooter.tsx +++ b/libs/application/ui-shell/src/components/ScreenFooter.tsx @@ -27,6 +27,7 @@ interface FooterProps { renderLastScreenBackButton?: boolean submitButtonDisabled?: boolean nextButtonText?: FormText + canGoBack: boolean } type SubmitButton = Omit & { @@ -68,13 +69,13 @@ export const ScreenFooter: FC> = ({ renderLastScreenBackButton, submitButtonDisabled, nextButtonText, + canGoBack, }) => { const { formatMessage } = useLocale() const user = useUserInfo() const hasSubmitField = submitField !== undefined const isLastScreen = activeScreenIndex === numberOfScreens - 1 - const showGoBack = - activeScreenIndex > 0 && (!isLastScreen || renderLastScreenBackButton) + const showGoBack = canGoBack && (!isLastScreen || renderLastScreenBackButton) if ( (isLastScreen && !renderLastScreenButton) || diff --git a/libs/application/ui-shell/src/lib/FormShell.tsx b/libs/application/ui-shell/src/lib/FormShell.tsx index d3be0a1e4747..8e1beef1c9ee 100644 --- a/libs/application/ui-shell/src/lib/FormShell.tsx +++ b/libs/application/ui-shell/src/lib/FormShell.tsx @@ -25,6 +25,7 @@ import { } from '../reducer/ApplicationFormReducer' import { ActionTypes } from '../reducer/ReducerTypes' import * as styles from './FormShell.css' +import { canGoBack } from '../reducer/reducerUtils' export const FormShell: FC< React.PropsWithChildren<{ @@ -142,6 +143,7 @@ export const FormShell: FC< payload, }) }} + canGoBack={canGoBack(screens, activeScreen)} prevScreen={() => dispatch({ type: ActionTypes.PREV_SCREEN })} activeScreenIndex={activeScreen} numberOfScreens={screens.length} diff --git a/libs/application/ui-shell/src/reducer/reducerUtils.ts b/libs/application/ui-shell/src/reducer/reducerUtils.ts index 72c76a0f9c92..8b3a0b6f38ed 100644 --- a/libs/application/ui-shell/src/reducer/reducerUtils.ts +++ b/libs/application/ui-shell/src/reducer/reducerUtils.ts @@ -181,6 +181,25 @@ export const moveToScreen = ( return screenIndex } +export const canGoBack = ( + screens: FormScreen[], + screenIndex: number, +): boolean => { + // Check if we're already at the start + if (screenIndex <= 0) { + return false + } + + // Look for any navigable screen behind where we are + for (let i = screenIndex - 1; i >= 0; i--) { + if (screens[i].isNavigable) { + return true + } + } + + return false +} + const convertFieldToScreen = ( field: Field, answers: FormValue, From 920eb26f9a2623282f59c066d49760907289a40d Mon Sep 17 00:00:00 2001 From: unakb Date: Thu, 12 Dec 2024 23:29:47 +0000 Subject: [PATCH 5/8] fix(j-s): Police case number in robot e-mail (#17218) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../backend/src/app/modules/court/court.service.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/judicial-system/backend/src/app/modules/court/court.service.ts b/apps/judicial-system/backend/src/app/modules/court/court.service.ts index df13b35a90be..33f9c74c7c83 100644 --- a/apps/judicial-system/backend/src/app/modules/court/court.service.ts +++ b/apps/judicial-system/backend/src/app/modules/court/court.service.ts @@ -577,12 +577,12 @@ export class CourtService { try { const subject = `${courtName} - ${courtCaseNumber} - upplýsingar` - const sanitizedPoliceCaseNumber = policeCaseNumber?.replace(/-/g, '') + policeCaseNumber = policeCaseNumber?.replace(/-/g, '') const content = JSON.stringify({ receivedByCourtDate, indictmentDate, - sanitizedPoliceCaseNumber, + policeCaseNumber, subtypes, defendants, prosecutor, From 09111419376a00eab84eeddea3bbc363840ab01f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafn=20=C3=81rnason?= Date: Fri, 13 Dec 2024 00:09:41 +0000 Subject: [PATCH 6/8] feat(user-notification): Firebase Credentials Setup for Local Development (#17199) * fix get-secrets and env cleanup * chore: nx format:write update dirty files * string cleaner for local * chore: nx format:write update dirty files * update get-secrets * cleanup * cleanup * move logic to render-secrets --------- Co-authored-by: andes-it Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- infra/src/cli/render-secrets.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/infra/src/cli/render-secrets.ts b/infra/src/cli/render-secrets.ts index 9c859e2afba8..0ba1ba705b36 100644 --- a/infra/src/cli/render-secrets.ts +++ b/infra/src/cli/render-secrets.ts @@ -68,9 +68,7 @@ export const renderSecrets = async (service: string) => { logger.debug('env when rendering', { envMap }) Object.entries(envMap).forEach(([key, value]) => { - const escapedValue = (value ?? '') - .replace(/\n/g, '\\n') - .replace(/"/g, '\\"') + const escapedValue = (value ?? '').replace(/'/g, "\\'") console.log(`export ${key}='${escapedValue}'`) }) return envMap From 1e607631e6e0c35f89b044cc2a6bd553598aa872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=9E=C3=B3rey=20J=C3=B3na?= Date: Fri, 13 Dec 2024 00:17:25 +0000 Subject: [PATCH 7/8] feat(native-app): Update passkey information link (#17221) * chore: update podfile.lock * feat: update link address for further info about passkeys --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- apps/native/app/ios/Podfile.lock | 70 ++++++++++++++++++- .../app/src/screens/passkey/passkey.tsx | 5 +- 2 files changed, 72 insertions(+), 3 deletions(-) diff --git a/apps/native/app/ios/Podfile.lock b/apps/native/app/ios/Podfile.lock index 4a489728f683..8223c8bef141 100644 --- a/apps/native/app/ios/Podfile.lock +++ b/apps/native/app/ios/Podfile.lock @@ -1531,7 +1531,73 @@ PODS: - React-Core - RNQuickAction (0.3.13): - React - - RNReanimated (3.12.1): + - RNReanimated (3.16.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated (= 3.16.5) + - RNReanimated/worklets (= 3.16.5) + - Yoga + - RNReanimated/reanimated (3.16.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - RNReanimated/reanimated/apple (= 3.16.5) + - Yoga + - RNReanimated/reanimated/apple (3.16.5): + - DoubleConversion + - glog + - hermes-engine + - RCT-Folly (= 2024.01.01.00) + - RCTRequired + - RCTTypeSafety + - React-Codegen + - React-Core + - React-debug + - React-Fabric + - React-featureflags + - React-graphics + - React-ImageManager + - React-NativeModulesApple + - React-RCTFabric + - React-rendererdebug + - React-utils + - ReactCommon/turbomodule/bridging + - ReactCommon/turbomodule/core + - Yoga + - RNReanimated/worklets (3.16.5): - DoubleConversion - glog - hermes-engine @@ -2030,7 +2096,7 @@ SPEC CHECKSUMS: RNInAppBrowser: e36d6935517101ccba0e875bac8ad7b0cb655364 RNKeychain: ff836453cba46938e0e9e4c22e43d43fa2c90333 RNQuickAction: 6d404a869dc872cde841ad3147416a670d13fa93 - RNReanimated: d093daf3973a7ee9f77c10a9337e10390b2969e2 + RNReanimated: 73acffa7201bc9caee34b6f26878342cc9d8ab47 RNShare: 0fad69ae2d71de9d1f7b9a43acf876886a6cb99c RNSVG: 43b64ed39c14ce830d840903774154ca0c1f27ec SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d diff --git a/apps/native/app/src/screens/passkey/passkey.tsx b/apps/native/app/src/screens/passkey/passkey.tsx index a6ba79951324..ead1271ebc47 100644 --- a/apps/native/app/src/screens/passkey/passkey.tsx +++ b/apps/native/app/src/screens/passkey/passkey.tsx @@ -150,7 +150,10 @@ export const PasskeyScreen: NavigationFunctionComponent<{ - openBrowser('https://island.is/adgangslyklar', componentId) + openBrowser( + 'https://island.is/innskraning-umbod-og-adgangsstyring-a-island-is#innskraning-med-adgangslykli-i-island-is-appinu', + componentId, + ) } > From 2523e39cb434d95322738b4fe2078b2552cbee98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=BAnar=20Vestmann?= <43557895+RunarVestmann@users.noreply.github.com> Date: Fri, 13 Dec 2024 00:29:39 +0000 Subject: [PATCH 8/8] =?UTF-8?q?feat(web):=20Service=20web=20contact=20form?= =?UTF-8?q?=20-=20Add=20custom=20fields=20for=20'Vinnueftirliti=C3=B0'=20(?= =?UTF-8?q?#17202)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../Forms/StandardForm/StandardForm.tsx | 172 +++++++++++++++++- .../ServiceWeb/Forms/StandardForm/types.ts | 2 + apps/web/screens/ServiceWeb/Forms/utils.ts | 15 ++ 3 files changed, 187 insertions(+), 2 deletions(-) diff --git a/apps/web/components/ServiceWeb/Forms/StandardForm/StandardForm.tsx b/apps/web/components/ServiceWeb/Forms/StandardForm/StandardForm.tsx index 3f469edd3828..3054bbc88e70 100644 --- a/apps/web/components/ServiceWeb/Forms/StandardForm/StandardForm.tsx +++ b/apps/web/components/ServiceWeb/Forms/StandardForm/StandardForm.tsx @@ -26,7 +26,10 @@ import { Stack, Text, } from '@island.is/island-ui/core' -import { InputController } from '@island.is/shared/form-fields' +import { + CheckboxController, + InputController, +} from '@island.is/shared/form-fields' import { sortAlpha } from '@island.is/shared/utils' import { ContentLanguage, @@ -42,6 +45,7 @@ import { GET_SUPPORT_SEARCH_RESULTS_QUERY } from '@island.is/web/screens/queries import { FiskistofaCategories, SjukratryggingarCategories, + VinnueftirlitidCategories, } from '@island.is/web/screens/ServiceWeb/Forms/utils' import { getServiceWebSearchTagQuery } from '@island.is/web/screens/ServiceWeb/utils' @@ -93,6 +97,14 @@ const labels: Record = { malsnumer_ef_til_stadar: 'Málsnúmer (ef til staðar)', faedingardagur_eda_kennitala_malsadila: 'Fæðingardagur/Kennitala málsaðila', skipaskrarnumer: 'Skipaskrárnúmer', + vinnuvelanumer_kaupanda: 'Vinnuvélanúmer kaupanda', + vinnuvelanumer_seljanda: 'Vinnuvélanúmer seljanda', + vinnuvelanumer_vegna_skodunar: 'Vinnuvélanúmer vegna skoðunar', + stadsetning_taekis: 'Staðsetning tækis', + stadsetning_verkstadar: 'Staðsetning verkstaðar', + nafn_fyrirtaekis: 'Nafn fyrirtækis', + starfsstod: 'Starfsstöð', + oska_eftir_vernd_uppljostrara: 'Óska eftir vernd uppljóstrara', } // these should be skipped in the message itself @@ -154,6 +166,35 @@ const BasicInput = ({ ) } +interface BasicCheckboxProps { + name: keyof typeof labels + label: string +} + +const BasicCheckbox = ({ name, label }: BasicCheckboxProps) => { + const { + formState: { errors }, + register, + } = useFormContext() + + return ( + + ) +} + const MIN_SEARCH_QUERY_LENGTH = 1 export const StandardForm = ({ @@ -482,6 +523,129 @@ export const StandardForm = ({ ) break + case VinnueftirlitidCategories.NAMSKEID: + case VinnueftirlitidCategories.VINNUSLYS: + case VinnueftirlitidCategories.VINNUVELARETTINDI: + case VinnueftirlitidCategories.VINNUVERND: + case VinnueftirlitidCategories.MARKADSEFTIRLIT: + case VinnueftirlitidCategories.EKKO_OG_SAMSKIPTI: + case VinnueftirlitidCategories.LOG_OG_REGLUGERDIR: + case VinnueftirlitidCategories.LEYFI_OG_UMSAGNIR: + case VinnueftirlitidCategories.ONNUR_THJONUSTA: + fields = ( + + + + ) + break + case VinnueftirlitidCategories.SKRANING_OG_SKODUN_VINNUVELA: + fields = ( + <> + + + + + + + + + + + + + + + + + ) + break + case VinnueftirlitidCategories.MANNVIRKJAGERD: + fields = ( + <> + + + + + + + + ) + break + case VinnueftirlitidCategories.VINNUADSTADA: + fields = ( + <> + + + + + + + + ) + break default: break } @@ -571,7 +735,11 @@ export const StandardForm = ({ const label = labels[k] const value = values[k] - if (label && value) { + if ( + label && + ((Array.isArray(value) && value.length > 0) || + (!Array.isArray(value) && Boolean(value))) + ) { message += `${label}:\n${value}\n\n` } diff --git a/apps/web/components/ServiceWeb/Forms/StandardForm/types.ts b/apps/web/components/ServiceWeb/Forms/StandardForm/types.ts index 26ca5c2e89a1..0934e1dc2baf 100644 --- a/apps/web/components/ServiceWeb/Forms/StandardForm/types.ts +++ b/apps/web/components/ServiceWeb/Forms/StandardForm/types.ts @@ -1,12 +1,14 @@ import type { FiskistofaCategories, SjukratryggingarCategories, + VinnueftirlitidCategories, } from '@island.is/web/screens/ServiceWeb/Forms/utils' export type CategoryId = | SyslumennCategories | SjukratryggingarCategories | FiskistofaCategories + | VinnueftirlitidCategories export enum SyslumennCategories { FJOLSKYLDUMAL = '4vQ4htPOAZvzcXBcjx06SH', diff --git a/apps/web/screens/ServiceWeb/Forms/utils.ts b/apps/web/screens/ServiceWeb/Forms/utils.ts index e84d8a93ed75..4a0b84c7c836 100644 --- a/apps/web/screens/ServiceWeb/Forms/utils.ts +++ b/apps/web/screens/ServiceWeb/Forms/utils.ts @@ -97,6 +97,21 @@ export enum FiskistofaCategories { VEIDIHEIMILDIR = '1agbWJCHTDVfVR4yQZPaEK', } +export enum VinnueftirlitidCategories { + NAMSKEID = '41SeTRazu0qKIixRhWpDLA', + SKRANING_OG_SKODUN_VINNUVELA = '1ulMblBQwDkfSNgh2NyKpw', + VINNUSLYS = '3VY4skpcXo7XyniStyxrVc', + VINNUVELARETTINDI = '1AkjZQc1CO6hMPXYaLSqTw', + VINNUVERND = '4Wmxb25h9R7L0kuYsz19jG', + MARKADSEFTIRLIT = '61OI7gY23wC80mRRA4yrbA', + MANNVIRKJAGERD = '7fLoJqpyojUHgdDofIpqlU', + EKKO_OG_SAMSKIPTI = '3SAlg8Xt7AKBQFrGUCTkG1', + VINNUADSTADA = '7FPsjPxRHA2aIOUXY3Xr3V', + LOG_OG_REGLUGERDIR = '7vb5yId3HMigcXEDMYN9uN', + LEYFI_OG_UMSAGNIR = '7nLIjBeO5EovoPYwINWoyv', + ONNUR_THJONUSTA = 'fdkCIdREoNlYmgkr37DTl', +} + export const filterSupportCategories = ( supportCategories: SupportCategory[] | undefined, slug: string,