Skip to content

Commit

Permalink
feat: varahenkilön lisäys, roolien käsittelyn muutos vaatimuksia vast…
Browse files Browse the repository at this point in the history
…aavaksi
  • Loading branch information
haapamakim committed Sep 27, 2022
1 parent ccd314b commit 9eee9b1
Show file tree
Hide file tree
Showing 55 changed files with 830 additions and 546 deletions.
20 changes: 19 additions & 1 deletion backend/integrationtest/api/__snapshots__/api.test.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -1297,12 +1297,28 @@ Object {
},
Object {
"__typename": "ProjektiKayttajaJulkinen",
"email": "mikko.haapamaki@cgi.com",
"email": "mikko.haapamaki02@cgi.com",
"id": "1",
"nimi": "Hassu, A-tunnus3",
"organisaatio": "CGI Suomi Oy",
"puhelinnumero": "123",
},
Object {
"__typename": "ProjektiKayttajaJulkinen",
"email": "mikko.haapamaki@cgi.com",
"id": "2",
"nimi": "Hassu, A-Tunnus",
"organisaatio": "CGI Suomi Oy",
"puhelinnumero": "123",
},
Object {
"__typename": "ProjektiKayttajaJulkinen",
"email": "mikko.haapamaki@cgi.com",
"id": "3",
"nimi": "Hassu, Testi1",
"organisaatio": "CGI Suomi Oy",
"puhelinnumero": "123",
},
],
"status": "ALOITUSKUULUTUS",
"velho": Object {
Expand Down Expand Up @@ -2544,6 +2560,7 @@ Object {
"nimi": "HASSU AUTOMAATTITESTIPROJEKTI1",
"suunnittelustaVastaavaViranomainen": "VAYLAVIRASTO",
"tyyppi": "TIE",
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"vastuuhenkilonEmail": "mikko.haapamki@cgi.com",
"vaylamuoto": Array [
"tie",
Expand Down Expand Up @@ -3144,6 +3161,7 @@ Object {
"nimi": "HASSU AUTOMAATTITESTIPROJEKTI1",
"suunnittelustaVastaavaViranomainen": "VAYLAVIRASTO",
"tyyppi": "TIE",
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"vastuuhenkilonEmail": "mikko.haapamki@cgi.com",
"vaylamuoto": Array [
"tie",
Expand Down
2 changes: 1 addition & 1 deletion backend/integrationtest/api/api.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ describe("Api", () => {
const projekti = await readProjektiFromVelho();
expect(oid).to.eq(projekti.oid);
await cleanProjektiS3Files(oid);
const projektiPaallikko = await testProjektiHenkilot(projekti, oid);
const projektiPaallikko = await testProjektiHenkilot(projekti, oid, userFixture);
await testProjektinTiedot(oid);
await testAloitusKuulutusEsikatselu(oid);
await testNullifyProjektiField(oid);
Expand Down
31 changes: 27 additions & 4 deletions backend/integrationtest/api/records/HYVAKSYMISPAATOS_APPROVED.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"maakunnat": [
"Uusimaa"
],
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"kunnat": [
"Helsinki",
" Vantaa"
Expand Down Expand Up @@ -115,6 +116,7 @@
"maakunnat": [
"Uusimaa"
],
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"kunnat": [
"Helsinki",
" Vantaa"
Expand Down Expand Up @@ -142,6 +144,7 @@
"maakunnat": [
"Uusimaa"
],
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"kunnat": [
"Helsinki",
" Vantaa"
Expand Down Expand Up @@ -495,18 +498,37 @@
{
"kayttajatunnus": "A000112",
"nimi": "Hassu, A-tunnus1",
"rooli": "PROJEKTIPAALLIKKO",
"organisaatio": "CGI Suomi Oy",
"tyyppi": "PROJEKTIPAALLIKKO",
"puhelinnumero": "123",
"email": "mikko.haapamki@cgi.com"
"email": "mikko.haapamki@cgi.com",
"muokattavissa": false
},
{
"kayttajatunnus": "A000114",
"nimi": "Hassu, A-tunnus3",
"organisaatio": "CGI Suomi Oy",
"tyyppi": "VARAHENKILO",
"puhelinnumero": "123",
"email": "mikko.haapamaki02@cgi.com",
"muokattavissa": false
},
{
"kayttajatunnus": "A000111",
"nimi": "Hassu, A-Tunnus",
"rooli": "OMISTAJA",
"organisaatio": "CGI Suomi Oy",
"__typename": "ProjektiKayttaja",
"puhelinnumero": "123",
"email": "mikko.haapamaki@cgi.com"
"email": "mikko.haapamaki@cgi.com",
"muokattavissa": true
},
{
"kayttajatunnus": "LX581241",
"nimi": "Hassu, Testi1",
"puhelinnumero": "123",
"organisaatio": "CGI Suomi Oy",
"email": "mikko.haapamaki@cgi.com",
"muokattavissa": true
}
],
"kasittelynTila": {
Expand Down Expand Up @@ -582,6 +604,7 @@
"maakunnat": [
"Uusimaa"
],
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"kunnat": [
"Helsinki",
" Vantaa"
Expand Down
29 changes: 25 additions & 4 deletions backend/integrationtest/api/records/NAHTAVILLAOLO.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
"maakunnat": [
"Uusimaa"
],
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"kunnat": [
"Helsinki",
" Vantaa"
Expand Down Expand Up @@ -115,6 +116,7 @@
"maakunnat": [
"Uusimaa"
],
"varahenkilonEmail": "mikko.haapamaki02@cgi.com",
"kunnat": [
"Helsinki",
" Vantaa"
Expand Down Expand Up @@ -148,18 +150,37 @@
{
"kayttajatunnus": "A000112",
"nimi": "Hassu, A-tunnus1",
"rooli": "PROJEKTIPAALLIKKO",
"organisaatio": "CGI Suomi Oy",
"tyyppi": "PROJEKTIPAALLIKKO",
"puhelinnumero": "123",
"email": "mikko.haapamki@cgi.com"
"email": "mikko.haapamki@cgi.com",
"muokattavissa": false
},
{
"kayttajatunnus": "A000114",
"nimi": "Hassu, A-tunnus3",
"organisaatio": "CGI Suomi Oy",
"tyyppi": "VARAHENKILO",
"puhelinnumero": "123",
"email": "mikko.haapamaki02@cgi.com",
"muokattavissa": false
},
{
"kayttajatunnus": "A000111",
"nimi": "Hassu, A-Tunnus",
"rooli": "OMISTAJA",
"organisaatio": "CGI Suomi Oy",
"__typename": "ProjektiKayttaja",
"puhelinnumero": "123",
"email": "mikko.haapamaki@cgi.com"
"email": "mikko.haapamaki@cgi.com",
"muokattavissa": true
},
{
"kayttajatunnus": "LX581241",
"nimi": "Hassu, Testi1",
"puhelinnumero": "123",
"organisaatio": "CGI Suomi Oy",
"email": "mikko.haapamaki@cgi.com",
"muokattavissa": true
}
],
"aloitusKuulutus": {
Expand Down
54 changes: 38 additions & 16 deletions backend/integrationtest/api/testUtil/tests.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import {
AineistoInput,
AsiakirjaTyyppi,
KayttajaTyyppi,
Kieli,
Projekti,
ProjektiJulkinen,
ProjektiKayttaja,
ProjektiKayttajaInput,
ProjektiRooli,
Status,
TilasiirtymaToiminto,
TilasiirtymaTyyppi,
Expand Down Expand Up @@ -60,44 +60,66 @@ export async function loadProjektiJulkinenFromDatabase(oid: string, expectedStat
return savedProjekti;
}

export async function testProjektiHenkilot(projekti: Projekti, oid: string): Promise<ProjektiKayttaja> {
export async function testProjektiHenkilot(projekti: Projekti, oid: string, userFixture: UserFixture): Promise<ProjektiKayttaja> {
await api.tallennaProjekti({
oid,
kayttoOikeudet: projekti.kayttoOikeudet?.map(
(value) =>
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
({
rooli: value.rooli,
kayttajatunnus: value.kayttajatunnus,
// Emulate migration where the phone number may be empty
} as ProjektiKayttajaInput)
),
kayttoOikeudet: projekti.kayttoOikeudet?.map((value) => {
const input: ProjektiKayttajaInput = {
kayttajatunnus: value.kayttajatunnus,
// Emulate migration where the phone number may be empty
puhelinnumero: undefined,
};
return input;
}),
});
const p = await loadProjektiFromDatabase(oid, Status.EI_JULKAISTU_PROJEKTIN_HENKILOT);

// Expect that projektipaallikko is found
const projektiPaallikko = p.kayttoOikeudet
?.filter((kayttaja) => kayttaja.rooli === ProjektiRooli.PROJEKTIPAALLIKKO && kayttaja.email)
?.filter((kayttaja) => kayttaja.tyyppi === KayttajaTyyppi.PROJEKTIPAALLIKKO && kayttaja.email && kayttaja.muokattavissa === false)
.pop();
expect(projektiPaallikko).is.not.empty;

const kayttoOikeudet = p.kayttoOikeudet?.map((value) => ({
rooli: value.rooli,
kayttajatunnus: value.kayttajatunnus,
// Expect that varahenkilo from Velho is found
const varahenkilo = p.kayttoOikeudet
?.filter((kayttaja) => kayttaja.tyyppi == KayttajaTyyppi.VARAHENKILO && kayttaja.muokattavissa === false)
.pop();
expect(varahenkilo).is.not.empty;

const kayttoOikeudet: ProjektiKayttajaInput[] = p.kayttoOikeudet?.map((value) => ({
...value,
puhelinnumero: "123",
}));

kayttoOikeudet.push({ kayttajatunnus: UserFixture.testi1Kayttaja.uid, puhelinnumero: "123" });

// Save and load projekti
await api.tallennaProjekti({
oid,
kayttoOikeudet,
});
await loadProjektiFromDatabase(oid, Status.EI_JULKAISTU);

// Verify only omistaja can modify varahenkilo-field
try {
userFixture.loginAs(UserFixture.testi1Kayttaja);
const kayttoOikeudetWithVarahenkiloChanges = cloneDeep(kayttoOikeudet);
kayttoOikeudetWithVarahenkiloChanges
.filter((user) => user.kayttajatunnus == UserFixture.testi1Kayttaja.uid)
.forEach((user) => (user.tyyppi = KayttajaTyyppi.VARAHENKILO));
await api.tallennaProjekti({
oid,
kayttoOikeudet: kayttoOikeudetWithVarahenkiloChanges,
});
fail("Vain omistajan pitää pystyä muokkaamaan varahenkilöyttä");
} catch (e) {
expect(e.className).to.eq("IllegalAccessError");
}

return { ...projektiPaallikko, puhelinnumero: "123" };
}

export async function tallennaLogo() {
export async function tallennaLogo(): Promise<string> {
const uploadProperties = await api.valmisteleTiedostonLataus("logo.png", "image/png");
expect(uploadProperties).to.not.be.empty;
expect(uploadProperties.latausLinkki).to.not.be.undefined;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@ import log from "loglevel";
import sinon from "sinon";

export function expectNotEmptyKayttaja(kayttaja: Kayttaja): void {
expect(kayttaja.vaylaKayttajaTyyppi).to.not.be.empty;
expect(kayttaja.etuNimi).to.not.be.empty;
expect(kayttaja.sukuNimi).to.not.be.empty;
expect(kayttaja.uid).to.not.be.empty;
Expand Down
4 changes: 2 additions & 2 deletions backend/src/asiakirja/suunnittelunAloitus/Kutsu20.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { DBProjekti, DBVaylaUser, SuunnitteluSopimus, SuunnitteluVaihe, Vuorovaikutus, VuorovaikutusTilaisuus } from "../../database/model";
import { Kieli, ProjektiTyyppi, VuorovaikutusTilaisuusTyyppi } from "../../../../common/graphql/apiModel";
import { KayttajaTyyppi, Kieli, ProjektiTyyppi, VuorovaikutusTilaisuusTyyppi } from "../../../../common/graphql/apiModel";
import { formatProperNoun } from "../../../../common/util/formatProperNoun";
import dayjs from "dayjs";
import { linkSuunnitteluVaihe } from "../../../../common/links";
Expand Down Expand Up @@ -300,7 +300,7 @@ export class Kutsu20 extends CommonPdf {
tilaisuus.esitettavatYhteystiedot?.yhteysHenkilot.forEach((kayttajatunnus) => {
const user = this.kayttoOikeudet.filter((kayttaja) => kayttaja.kayttajatunnus == kayttajatunnus).pop();
if (user) {
const role = translate("rooli." + user.rooli, this.kieli);
const role = user.tyyppi == KayttajaTyyppi.PROJEKTIPAALLIKKO ? translate("rooli.PROJEKTIPAALLIKKO", this.kieli) : undefined;
this.doc.text(safeConcatStrings(", ", [user.nimi, role, user.puhelinnumero]));
}
});
Expand Down
6 changes: 3 additions & 3 deletions backend/src/asiakirja/suunnittelunAloitus/KutsuAdapter.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { Kieli, ProjektiRooli, ProjektiTyyppi, Viranomainen } from "../../../../common/graphql/apiModel";
import { KayttajaTyyppi, Kieli, ProjektiTyyppi, Viranomainen } from "../../../../common/graphql/apiModel";
import { DBVaylaUser, Kielitiedot, SuunnitteluSopimus, Velho, Vuorovaikutus, Yhteystieto } from "../../database/model";
import { AsiakirjanMuoto } from "../asiakirjaService";
import { translate } from "../../util/localization";
Expand Down Expand Up @@ -226,7 +226,7 @@ export class KutsuAdapter {
throw new Error("BUG: Kayttöoikeudet pitää antaa jos yhteyshenkilöt on annettu.");
}
const yhteysHenkilotWithProjectManager = union(
this.kayttoOikeudet.filter((user) => user.rooli == ProjektiRooli.PROJEKTIPAALLIKKO).map((user) => user.kayttajatunnus),
this.kayttoOikeudet.filter((user) => user.tyyppi == KayttajaTyyppi.PROJEKTIPAALLIKKO).map((user) => user.kayttajatunnus),
yhteysHenkilot
);
this.getUsersForUsernames(yhteysHenkilotWithProjectManager).forEach((user) => {
Expand Down Expand Up @@ -288,7 +288,7 @@ export class KutsuAdapter {
return usernames
?.map((kayttajatunnus) =>
this.kayttoOikeudet
.filter((kayttaja) => kayttaja.kayttajatunnus == kayttajatunnus || kayttaja.rooli == ProjektiRooli.PROJEKTIPAALLIKKO)
.filter((kayttaja) => kayttaja.kayttajatunnus == kayttajatunnus || kayttaja.tyyppi == KayttajaTyyppi.PROJEKTIPAALLIKKO)
.pop()
)
.filter((o) => o);
Expand Down
13 changes: 7 additions & 6 deletions backend/src/database/model/projekti.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
import { AloitusKuulutusTila, Kieli, ProjektiRooli, ProjektiTyyppi, Viranomainen } from "../../../../common/graphql/apiModel";
import { AloitusKuulutusTila, KayttajaTyyppi, Kieli, ProjektiTyyppi, Viranomainen } from "../../../../common/graphql/apiModel";
import { SuunnitteluVaihe, Vuorovaikutus } from "./suunnitteluVaihe";
import { NahtavillaoloVaihe, NahtavillaoloVaiheJulkaisu } from "./nahtavillaoloVaihe";
import { HyvaksymisPaatosVaihe, HyvaksymisPaatosVaiheJulkaisu } from "./hyvaksymisPaatosVaihe";
import { StandardiYhteystiedot, LocalizedMap, Yhteystieto, IlmoituksenVastaanottajat } from "./common";
import { IlmoituksenVastaanottajat, LocalizedMap, StandardiYhteystiedot, Yhteystieto } from "./common";

export type DBVaylaUser = {
rooli: ProjektiRooli;
email: string;
kayttajatunnus: string;

puhelinnumero: string;
puhelinnumero?: string;
organisaatio: string;
nimi: string;
tyyppi?: KayttajaTyyppi;
muokattavissa?: boolean;
};

export type AloitusKuulutus = {
Expand Down Expand Up @@ -87,8 +88,8 @@ export type Velho = {
toteuttavaOrganisaatio?: string | null;
vastuuhenkilonNimi?: string | null;
vastuuhenkilonEmail?: string | null;
varahenkiloNimi?: string | null;
varahenkiloEmail?: string | null;
varahenkilonNimi?: string | null;
varahenkilonEmail?: string | null;
maakunnat?: string[] | null;
kunnat?: string[] | null;
linkki?: string | null;
Expand Down
10 changes: 4 additions & 6 deletions backend/src/email/lahetekirje/LahetekirjeAdapter.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import log from "loglevel";
import { Kieli, ProjektiRooli, ProjektiTyyppi, Viranomainen } from "../../../../common/graphql/apiModel";
import { KayttajaTyyppi, Kieli, ProjektiTyyppi, Viranomainen } from "../../../../common/graphql/apiModel";
import { AsiakirjanMuoto, determineAsiakirjaMuoto } from "../../asiakirja/asiakirjaService";
import { DBProjekti, Yhteystieto } from "../../database/model";
import { translate } from "../../util/localization";
Expand Down Expand Up @@ -56,8 +56,7 @@ export class LahetekirjeAdapter {

protected get isElyTilaaja(): boolean {
return (
this.projekti?.velho?.suunnittelustaVastaavaViranomainen &&
this.projekti?.velho?.suunnittelustaVastaavaViranomainen.endsWith("ELY")
this.projekti?.velho?.suunnittelustaVastaavaViranomainen && this.projekti?.velho?.suunnittelustaVastaavaViranomainen.endsWith("ELY")
);
}

Expand Down Expand Up @@ -195,9 +194,8 @@ export class LahetekirjeAdapter {

kayttoOikeudet
?.filter(
({ kayttajatunnus, rooli }) =>
rooli === ProjektiRooli.PROJEKTIPAALLIKKO ||
kuulutusYhteystiedot?.yhteysHenkilot?.find((yh) => yh === kayttajatunnus)
({ kayttajatunnus, tyyppi }) =>
tyyppi === KayttajaTyyppi.PROJEKTIPAALLIKKO || kuulutusYhteystiedot?.yhteysHenkilot?.find((yh) => yh === kayttajatunnus)
)
.forEach((oikeus) => {
yt.push(vaylaUserToYhteystieto(oikeus));
Expand Down
Loading

0 comments on commit 9eee9b1

Please sign in to comment.