Skip to content

Commit

Permalink
fix: Lisää oma virheilmoitus virheelliselle vastuuhenkilösähköpostille (
Browse files Browse the repository at this point in the history
#268)

* fix: Lisää oma virheilmoitus virheelliselle vastuuhenkilösähköpostille

* korjaa case importista
  • Loading branch information
tkork committed Jun 14, 2022
1 parent 43126bb commit 113a4e5
Show file tree
Hide file tree
Showing 10 changed files with 111 additions and 39 deletions.
8 changes: 4 additions & 4 deletions backend/src/handler/kayttoOikeudetManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ export class KayttoOikeudetManager {
this.users = resultUsers;
}

getKayttoOikeudet() : DBVaylaUser[]{
getKayttoOikeudet(): DBVaylaUser[] {
return this.users;
}

Expand All @@ -84,11 +84,11 @@ export class KayttoOikeudetManager {
}));
}

addProjektiPaallikkoFromEmail(vastuuhenkiloEmail: string) : DBVaylaUser|undefined{
addProjektiPaallikkoFromEmail(vastuuhenkiloEmail: string): DBVaylaUser | undefined {
return this.resolveProjektiPaallikkoFromVelhoVastuuhenkilo(vastuuhenkiloEmail);
}

resolveProjektiPaallikkoFromVelhoVastuuhenkilo(vastuuhenkiloEmail: string): DBVaylaUser|undefined {
resolveProjektiPaallikkoFromVelhoVastuuhenkilo(vastuuhenkiloEmail: string): DBVaylaUser | undefined {
// Replace or create new projektipaallikko
this.removeProjektiPaallikko();
const projektiPaallikko = this.fillInUserInfoFromUserManagement({
Expand All @@ -105,7 +105,7 @@ export class KayttoOikeudetManager {
}
}

addUserByKayttajatunnus(kayttajatunnus: string, rooli: ProjektiRooli) : DBVaylaUser | undefined{
addUserByKayttajatunnus(kayttajatunnus: string, rooli: ProjektiRooli): DBVaylaUser | undefined {
const user = this.fillInUserInfoFromUserManagement({
user: { kayttajatunnus, rooli } as Partial<DBVaylaUser>,
searchMode: SearchMode.UID,
Expand Down
3 changes: 2 additions & 1 deletion backend/src/handler/projektiAdapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ export type ProjektiAdaptationResult = {
};

export class ProjektiAdapter {
public adaptProjekti(dbProjekti: DBProjekti): API.Projekti {
public adaptProjekti(dbProjekti: DBProjekti, virhetiedot?: API.ProjektiVirhe): API.Projekti {
const {
kayttoOikeudet,
aloitusKuulutus,
Expand Down Expand Up @@ -74,6 +74,7 @@ export class ProjektiAdapter {
kielitiedot: adaptKielitiedot(kielitiedot),
suunnitteluVaihe: adaptSuunnitteluVaihe(suunnitteluVaihe, vuorovaikutukset, palautteet),
nahtavillaoloVaihe: adaptNahtavillaoloVaihe(nahtavillaoloVaihe),
virhetiedot,
...fieldsToCopyAsIs,
}) as API.Projekti;
if (apiProjekti.tallennettu) {
Expand Down
26 changes: 21 additions & 5 deletions backend/src/handler/projektiHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,8 +50,13 @@ async function loadProjektiYllapito(oid: string, vaylaUser: NykyinenKayttaja): P
return projektiAdapter.adaptProjekti(projektiFromDB);
} else {
requirePermissionLuonti();
const projekti = await createProjektiFromVelho(oid, vaylaUser);
return projektiAdapter.adaptProjekti(projekti);
const { projekti, virhetiedot: projektipaallikkoVirhetieto } = await createProjektiFromVelho(oid, vaylaUser);
let virhetiedot: API.ProjektiVirhe | undefined;
if (projektipaallikkoVirhetieto) {
virhetiedot = { __typename: "ProjektiVirhe", projektipaallikko: projektipaallikkoVirhetieto };
}

return projektiAdapter.adaptProjekti(projekti, virhetiedot);
}
}

Expand Down Expand Up @@ -87,7 +92,7 @@ export async function createOrUpdateProjekti(input: TallennaProjektiInput): Prom
await vuorovaikutusService.handleAineistot(projektiAdaptationResult);
} else {
requirePermissionLuonti();
const projekti = await createProjektiFromVelho(input.oid, requireVaylaUser(), input);
const { projekti } = await createProjektiFromVelho(input.oid, requireVaylaUser(), input);
log.info("Creating projekti to Hassu", { oid });
await projektiDatabase.createProjekti(projekti);
log.info("Created projekti to Hassu", { projekti });
Expand All @@ -106,10 +111,11 @@ export async function createProjektiFromVelho(
oid: string,
vaylaUser: NykyinenKayttaja,
input?: TallennaProjektiInput
): Promise<DBProjekti> {
): Promise<{ projekti: DBProjekti; virhetiedot?: API.ProjektipaallikkoVirhe }> {
try {
log.info("Loading projekti from Velho", { oid });
const { projekti, vastuuhenkilo } = await velho.loadProjekti(oid);
const result: { projekti: DBProjekti; virhetiedot?: API.ProjektipaallikkoVirhe } = { projekti };

const kayttoOikeudet = new KayttoOikeudetManager([], await personSearch.getKayttajas());

Expand All @@ -123,14 +129,24 @@ export async function createProjektiFromVelho(
// Loading a projekti from Velho for a first time
const projektiPaallikko = kayttoOikeudet.addProjektiPaallikkoFromEmail(vastuuhenkilo);

if (!vastuuhenkilo) {
result.virhetiedot = { __typename: "ProjektipaallikkoVirhe", tyyppi: API.ProjektiPaallikkoVirheTyyppi.PUUTTUU };
} else if (!projektiPaallikko) {
result.virhetiedot = {
__typename: "ProjektipaallikkoVirhe",
tyyppi: API.ProjektiPaallikkoVirheTyyppi.EI_LOYDY,
sahkoposti: vastuuhenkilo,
};
}

// Prefill current user as sihteeri if it is different from project manager
if ((!projektiPaallikko || projektiPaallikko.kayttajatunnus !== vaylaUser.uid) && vaylaUser.uid) {
kayttoOikeudet.addUserByKayttajatunnus(vaylaUser.uid, ProjektiRooli.OMISTAJA);
}
}

projekti.kayttoOikeudet = kayttoOikeudet.getKayttoOikeudet();
return projekti;
return result;
} catch (e) {
log.error(e);
throw e;
Expand Down
15 changes: 15 additions & 0 deletions graphql/types.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,20 @@ interface IProjekti {
paivitetty: String
}

enum ProjektiPaallikkoVirheTyyppi {
PUUTTUU
EI_LOYDY
}

type ProjektipaallikkoVirhe {
tyyppi: ProjektiPaallikkoVirheTyyppi!
sahkoposti: String
}

type ProjektiVirhe {
projektipaallikko: ProjektipaallikkoVirhe
}

type Projekti implements IProjekti {
oid: String!
muistiinpano: String
Expand All @@ -85,6 +99,7 @@ type Projekti implements IProjekti {
liittyvatSuunnitelmat: [Suunnitelma!]
kielitiedot: Kielitiedot
paivitetty: String
virhetiedot: ProjektiVirhe
}

type SuunnitteluVaihe {
Expand Down
4 changes: 0 additions & 4 deletions src/components/projekti/KayttoOikeusHallinta.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -193,10 +193,6 @@ const UserFields = ({
[getKayttajaNimi, disableFields, minSearchLength, kayttaja]
);

if (!kayttaja || isLoadingKayttajat) {
return <></>;
}

return (
<HassuStack direction={["column", "column", "row"]}>
<HassuGrid sx={{ width: "100%" }} cols={[1, 1, 3]}>
Expand Down
35 changes: 25 additions & 10 deletions src/components/projekti/ProjektiErrorNotification.tsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React, { ReactElement, ReactNode, useState } from "react";
import { Projekti } from "../../../common/graphql/apiModel";
import { Projekti, ProjektiPaallikkoVirheTyyppi } from "../../../common/graphql/apiModel";
import Notification, { NotificationType } from "@components/notification/Notification";
import { ProjektiSchema, ProjektiTestType } from "src/schemas/projekti";
import { ValidationError } from "yup";
Expand All @@ -21,17 +21,32 @@ type ErrorNotificationFunction = (projekti?: Projekti | null) => ErrorNotificati
const projektiErrorToNotificationMap = new Map<ProjektiTestType, ErrorNotificationFunction>([
[
ProjektiTestType.PROJEKTI_IS_LOADED,
() => "Projektin tietoja hakiessa tapahtui virhe. Tarkista tiedot velhosta ja yritä myöhemmin uudelleen.",
() => "Projektin tietoja hakiessa tapahtui virhe. Tarkista tiedot Projektivelhosta ja yritä myöhemmin uudelleen.",
],
[
ProjektiTestType.PROJEKTI_HAS_PAALLIKKO,
(projekti) => (
<p>
Projektilta puuttuu projektipäällikkö- / vastuuhenkilötieto projektivelhosta. Lisää vastuuhenkilötieto
projektivelhossa ja yritä projektin perustamista uudelleen.
<ExtLink href={velhobaseurl + projekti?.oid}>Projektin sivu Projektivelhossa</ExtLink>
</p>
),
(projekti) => {
const virhetieto = projekti?.virhetiedot?.projektipaallikko;
let message = (
<p>
Projektilta puuttuu projektipäällikkö- / vastuuhenkilötieto projektivelhosta. Lisää vastuuhenkilötieto
projektivelhossa ja yritä projektin perustamista uudelleen.
<ExtLink href={velhobaseurl + projekti?.oid}>Projektin sivu Projektivelhossa</ExtLink>
</p>
);
if (virhetieto?.tyyppi === ProjektiPaallikkoVirheTyyppi.EI_LOYDY) {
message = (
<p>
{`Projektille asetettua vastuuhenkilön sähköpostia '${
virhetieto.sahkoposti || ""
}' ei löydy käyttäjähallinnasta tai kyseinen käyttäjä ei täytä projektipäällikön edellytyksiä. `}
{"Korjaa vastuuhenkilötieto Projektivelhossa ja yritä projektin perustamista uudelleen."}
<ExtLink href={velhobaseurl + projekti?.oid}>Projektin sivu Projektivelhossa</ExtLink>
</p>
);
}
return message;
},
],
[
ProjektiTestType.PROJEKTI_IS_CREATED,
Expand Down Expand Up @@ -73,7 +88,7 @@ export default function ProjektiErrorNotification({
}
setNotificationMessage(null);
} catch (err) {
let message: ErrorNotification;
let message: ErrorNotification = null;
if (err instanceof ValidationError && Object.values(ProjektiTestType).includes(err.type as ProjektiTestType)) {
message = projektiErrorToNotificationMap.get(err.type as ProjektiTestType)?.(projekti);
}
Expand Down
24 changes: 15 additions & 9 deletions src/pages/yllapito/perusta/[oid].tsx
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,12 @@ export default function PerustaProjekti({ setRouteLabels }: PageProps): ReactEle
}
}, [projekti, reset]);

const onKayttajatUpdate = useCallback((kayttajat : Kayttaja[]) => {
setFormContext({ kayttajat });
}, [setFormContext]);
const onKayttajatUpdate = useCallback(
(kayttajat: Kayttaja[]) => {
setFormContext({ kayttajat });
},
[setFormContext]
);

return (
<section>
Expand All @@ -124,16 +127,19 @@ export default function PerustaProjekti({ setRouteLabels }: PageProps): ReactEle
/>
<ProjektiPerustiedot projekti={projekti} />
</Section>
<KayttoOikeusHallinta
disableFields={disableFormEdit}
onKayttajatUpdate={onKayttajatUpdate}
/>
<KayttoOikeusHallinta disableFields={disableFormEdit} onKayttajatUpdate={onKayttajatUpdate} />
<Section noDivider>
<div className="flex gap-6 flex-col md:flex-row">
<ButtonLink className="mr-auto" href="/yllapito/perusta">
Takaisin
</ButtonLink>
<Button id="save_and_open_projekti" type="button" primary onClick={handleSubmit(submitMoveToProject)} disabled={disableFormEdit}>
<Button
id="save_and_open_projekti"
type="button"
primary
onClick={handleSubmit(submitMoveToProject)}
disabled={disableFormEdit}
>
Tallenna ja siirry projektiin
</Button>
<Button type="button" onClick={handleSubmit(submitCreateAnotherOne)} disabled={disableFormEdit}>
Expand All @@ -144,7 +150,7 @@ export default function PerustaProjekti({ setRouteLabels }: PageProps): ReactEle
</fieldset>
</form>
</FormProvider>
<HassuSpinner open={formIsSubmitting || isLoadingProjekti}/>
<HassuSpinner open={formIsSubmitting || isLoadingProjekti} />
</section>
);
}
12 changes: 8 additions & 4 deletions src/schemas/projekti.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,11 @@ const projektiTestMap = new Map<ProjektiTestType, TestFunction>([
[
ProjektiTestType.PROJEKTI_IS_LOADED,
(objectSchema) =>
objectSchema.test(ProjektiTestType.PROJEKTI_IS_LOADED, "Projekti ei latautunut oikein", (projekti) => !!projekti),
objectSchema.test(
ProjektiTestType.PROJEKTI_IS_LOADED,
"Projekti ei latautunut oikein",
(projekti) => !!projekti?.oid
),
],
[
ProjektiTestType.PROJEKTI_HAS_PAALLIKKO,
Expand All @@ -37,7 +41,7 @@ const projektiTestMap = new Map<ProjektiTestType, TestFunction>([
ProjektiTestType.PROJEKTI_HAS_PAALLIKKO,
"Projektille ei ole asetettu projektipäällikköä",
(projekti) =>
!projekti || !!projekti?.kayttoOikeudet?.some(({ rooli }) => rooli === ProjektiRooli.PROJEKTIPAALLIKKO)
!projekti?.oid || !!projekti?.kayttoOikeudet?.some(({ rooli }) => rooli === ProjektiRooli.PROJEKTIPAALLIKKO)
),
],
[
Expand All @@ -46,7 +50,7 @@ const projektiTestMap = new Map<ProjektiTestType, TestFunction>([
objectSchema.test(
ProjektiTestType.PROJEKTI_IS_CREATED,
"Projektia ei ole perustettu",
(projekti) => !projekti || !!projekti?.tallennettu
(projekti) => !projekti?.oid || !!projekti?.tallennettu
),
],
[
Expand All @@ -55,7 +59,7 @@ const projektiTestMap = new Map<ProjektiTestType, TestFunction>([
objectSchema.test(
ProjektiTestType.PROJEKTI_NOT_CREATED,
"Projekti on jo perustettu",
(projekti) => !projekti || !projekti?.tallennettu
(projekti) => !projekti?.oid || !projekti?.tallennettu
),
],
]);
Expand Down
5 changes: 3 additions & 2 deletions src/services/api/commonApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -100,11 +100,12 @@ export class API extends AbstractApi {
errorPolicy: "all",
fetchResults: true,
});
if (queryResponse.errors && !queryResponse.data) {
const data = queryResponse.data?.[operation.name];
if (queryResponse.errors && !data) {
log.warn(queryResponse.errors);
throw new Error("API palautti virheen.");
}
return queryResponse.data?.[operation.name];
return data;
case OperationType.Mutation:
const fetchResponse: FetchResult<any> = await client.mutate({
mutation: gql(operation.graphql),
Expand Down
18 changes: 18 additions & 0 deletions src/services/api/fragmentTypes.json
Original file line number Diff line number Diff line change
Expand Up @@ -373,6 +373,18 @@
"possibleTypes": null,
"__typename": "__Type"
},
{
"kind": "OBJECT",
"name": "ProjektipaallikkoVirhe",
"possibleTypes": null,
"__typename": "__Type"
},
{
"kind": "ENUM",
"name": "ProjektiPaallikkoVirheTyyppi",
"possibleTypes": null,
"__typename": "__Type"
},
{
"kind": "ENUM",
"name": "ProjektiRooli",
Expand All @@ -391,6 +403,12 @@
"possibleTypes": null,
"__typename": "__Type"
},
{
"kind": "OBJECT",
"name": "ProjektiVirhe",
"possibleTypes": null,
"__typename": "__Type"
},
{
"kind": "OBJECT",
"name": "Query",
Expand Down

0 comments on commit 113a4e5

Please sign in to comment.