PM: API: DevelopmentPlan: POST /planning-api/development-plans/{developmentPlanId}/pdf-versions
Üldkirjeldus
Teenus võimaldab genereerida PDF-failina jagatav arengukava versioon. Versioon luuakse asutuse / ametikoha muudetava arengukava hetkeandmete põhjal ning ainult juhul, kui arengukavale on määratud periood.
Seotud andmeobjektid:
- Objektid#DevelopmentPlan
- Objektid#DevelopmentPlanSection
- Objektid#DevelopmentPlanElement
- Objektid#Goal
- Objektid#GoalMetrics
- Objektid#GoalActivity
- Objektid#DevelopmentPlanVersion
- Objektid#File
- Objektid#GoalTeamMember
Seotud Jira taskid
NSIL-1115 - Getting issue details... STATUS
Eeltingimused ja kasutusõigused
- Kui tegemist on asutusepõhise arengukavaga (developmentPlanScope = INSTITUTIONAL):
- Kasutajal peab olema seos arengukava asutusega ning tal peab olema ka selle asutuse juures arengukava lisamise ja muutmise õigus.
- DevelopmentPlan.institution.id = kasutaja valitud rolliga seotud asutus,
- Õigust reguleerib privileeg: HSILM_PLANNING_DEV_PLAN_MANAGE.
- Kasutajal peab olema seos arengukava asutusega ning tal peab olema ka selle asutuse juures arengukava lisamise ja muutmise õigus.
- Kui tegemist on isikupõhise arengukavaga (developmentPlanScope = INDIVIDUAL):
- Kasutaja peab olema arengukava omanik.
- DevelopmentPlan.personalCode = kasutaja isikukood
- Eraldi privileegi ei ole vaja - õiguse luua enda kehtiva ametikoha kohta uusi arengukava PDF-versioone annab kasutajale tema isikukood.
- Kasutaja peab olema arengukava omanik.
- Planeerimise meeskonnaliikme rolli valinud kasutajad ei saa arengukava versioone luua.
Planeerimise mooduli kasutusrollide ja õiguste kohta saab täpsemalt infot leida lehelt Kasutusõigused ja rollid.
Sisendid
| Atribuut | Kohustuslikkus, mitmesus | Tüüp | Vaikeväärtus, valideerimine | Kirjeldus, täiendav info |
|---|---|---|---|---|
| developmentPlanId | 1 | String |
| Viide arengukavale, millele uus PDF-failina jagatav versioon luuakse. |
Väljundid
| Atribuut | Kohustuslikkus, mitmesus | Tüüp | Kirjeldus, täiendav info |
|---|---|---|---|
| Samad nagu teenusel PM: API: DevelopmentPlan: POST /planning-api/development-plans/{developmentPlanId}/url-versions. | |||
Ärireeglid
- PDF-ina jagatavat versiooni saab luua ainult muudetava (editable = true) arengukava põhjal.
- Versiooni loomisel salvestatakse kõik muudetava arengukava andmed PDF-failina vastavalt loomise hetke seisule.
- PDF-faili ei lisata sektsioone, millel on märge "Peida dokumendis" (hidden = true), ega nende alla kuuluvaid vormielemente.
- PDF-faili lisatakse aktiivsed eesmärgid, mis loomise hetkel kattuvad vähemalt osaliselt arengukava perioodiga.
- Eesmärkide valimisel võetakse arvesse järgmine reegel:
- Kui mõnel tegevusel puudub startDate, loetakse selle alguskuupäevaks endDate. Sellisel juhul käsitletakse tegevust kui ühepäevast, mis toimub endDate kuupäeval.
- Eesmärkide valimisel võetakse arvesse järgmine reegel:
- Selgitus: Arengukava andmete koopia salvestatakse andmebaasi ainult juhul, kui luuakse URL-versioon. PDF-versiooni puhul salvestatakse süsteemi üksnes loodud PDF-fail.
Tegevused
- Süsteem kontrollib, kas kasutajal on õigust päringut teostada.
- Kui kasutajal ei ole õigust, lõpetatakse päringu töötlemine ja tagastatakse http veakood.
- Süsteem kontrollib, kas sisendandmed vastavad nõuetele.
- Kui andmed ei vasta nõuetele, lõpetatakse päringu töötlemine ja tagastatakse http veakood.
Süsteem kontrollib, kas sisendis esitatud arengukava (developmentPlanId) eksisteerib ja on muudetav:
- Otsitakse Objektid#DevelopmentPlan objekti, mille:
- id = sisendis esitatud developmentPlanId väärtus
- editable = true
- Kui tingimustele vastavat arengukava ei leita, lõpetatakse päringu töötlemine ja tagastatakse http veakood.
- Otsitakse Objektid#DevelopmentPlan objekti, mille:
- Süsteem kontrollib versiooni loomise eeltingimuste täitmist:
- Kontrollitakse, kas olemasolevate arengukava PDF-versioonide arv ei ületa kehtestatud piirmäära (20 versiooni):
- Selleks otsitakse olemasolevaid arengukava PDF-versioone:
- Otsitakse Objektid#DevelopmentPlanVersion, mille:
- versionType = "PDF"
- fileId != NULL.
- developmentPlanId = Objektid#DevelopmentPlan.id, mille:
- developmentPlanScope = Objektid#DevelopmentPlan.developmentPlanScope, mille id = sisendis esitatud developmentPlanId väärtus
- institution.id = Objektid#DevelopmentPlan.institution.id, mille id = sisendis esitatud developmentPlanId väärtus
- personalCode = Objektid#DevelopmentPlan.personalCode, mille id = sisendis esitatud developmentPlanId väärtus
- jobsite = Objektid#DevelopmentPlan.jobsite, mille id = sisendis esitatud developmentPlanId väärtus
- editable = false
- Kui ühtegi tingimustele vastavat arengukava ei leita, jätkub protsess sammust 5 (asutusel / ametikohal ei ole ühtegi PDF-failina jagatud arengukava versiooni).
- Kui leitud versioone on 20 või rohkem, lõpetatakse päringu töötlemine ja tagastatakse http veakood. (Arengukava PDF-versioonide arvu piirmäär on saavutatud.)
- Otsitakse Objektid#DevelopmentPlanVersion, mille:
- Selleks otsitakse olemasolevaid arengukava PDF-versioone:
- Kontrollitakse, kas olemasolevate arengukava PDF-versioonide arv ei ületa kehtestatud piirmäära (20 versiooni):
- Süsteem loob sisendis esitatud arengukava (developmentPlanId) hetkeseisu andmetest lähtudes PDF-faili.
- Kui arengukavale on lisatud logo (Objektid#DevelopmentPlan.logoFileId != NULL), laaditakse vastav fail failihoidlast alla:
- Otsitakse logo faili metaandmeid:
- Otsitakse Objektid#File objekti, mille:
- id = sisendis esitatud arengukava Objektid#DevelopmentPlan.logoFileId väärtus
- Kui vastavat objekti ei leita, liigub süsteem sammu 5.b juurde.
- Otsitakse Objektid#File objekti, mille:
- Leitud metaandmete alusel leitakse fail failihoidlast:
- Otsitakse failisüsteemist fail, mille:
- id = leitud Objektid#File.fileSystemId väärtus.
- Kui vastavat faili ei leita, liigub süsteem sammu 5.b juurde.
- Otsitakse failisüsteemist fail, mille:
- Leitud fail laaditakse alla.
- Otsitakse logo faili metaandmeid:
- Seejärel leitakse arengukava sektsioonid ja vormielemendid.
- Otsitakse sisendis esitatud arengukava (developmentPlanId) sektsioone:
- Otsitakse Objektid#DevelopmentPlanSection objekte, mille:
- developmentPlanId = sisendis esitatud developmentPlanId väärtus
- Kui ühtegi sektsiooni ei leita, jätkub protsess sammust 5.c.
- Otsitakse Objektid#DevelopmentPlanSection objekte, mille:
- Leitud sektsioonid järjestatakse previousSectionId alusel.
- Nimekirjast eemaldatakse sektsioonid, mille hidden = true.
- Iga eemaldamise järel uuendatakse sellele sektsioonile järgneva sektsiooni previousSectionId väärtus.
- Iga järelejäänud Objektid#DevelopmentPlanSection objekti puhul:
- Otsitakse sektsiooni vormielemente:
- Otsitakse Objektid#DevelopmentPlanElement objekte, mille:
- developmentPlanSectionId = töödeldava sektsiooni ID (Objektid#DevelopmentPlanSection.id).
- Kui ühtegi elementi ei leita, jätkub protsess sammust 5.c.
- Iga leitud Objektid#DevelopmentPlanElement objekti puhul:
- Kui Objektid#DevelopmentPlanElement.inputType = IMAGE, laaditakse alla sellega seotud fail failihoidlast:
- Otsitakse pildi faili metaandmeid:
- Otsitakse Objektid#File objekti, mille:
- id = töödeldava vormielemendiga seotud faili ID (Objektid#DevelopmentPlanElement.file.id).
- Kui vastavat objekti ei leita, jätkub protsess sammust 5.b.v.
- Otsitakse Objektid#File objekti, mille:
- Leitud metaandmete alusel leitakse fail failihoidlast:
- Otsitakse failisüsteemist fail, mille:
- id = leitud Objektid#File.fileSystemId väärtus
- Kui vastavat faili ei leita, jätkub protsess sammust 5.b.v.
- Otsitakse failisüsteemist fail, mille:
- Leitud fail laaditakse alla.
- Otsitakse pildi faili metaandmeid:
- Kui Objektid#DevelopmentPlanElement.inputType = REPORT, luuakse pildid kõigist vormielemendiga seotud PBI-aruannetest.
- Iga report.selectedReports puhul:
- Leitakse seotud PBI aruanne järgmiste parameetrite alusel:
- Objektid#DevelopmentPlanElement.report.selectedReports.workspaceId
- Objektid#DevelopmentPlanElement.report.selectedReports.reportId
- Objektid#DevelopmentPlanElement.report.selectedReports.bookmark
- Leitud aruandest tehakse pilt.
- Loodud pilt laaditakse alla.
- Leitakse seotud PBI aruanne järgmiste parameetrite alusel:
- Süsteem kordab neid tegevusi, kuni kõigist töödeldava vormielemendiga seotud PBI aruannetest on pildid loodud ja alla laetud.
- Iga report.selectedReports puhul:
- Kui Objektid#DevelopmentPlanElement.inputType = IMAGE, laaditakse alla sellega seotud fail failihoidlast:
- Süsteem kordab neid tegevusi seni, kuni kõik töödeldava sektsiooni vormielementide andmed on leitud ja nendega soetud pildid on alla laetud.
- Otsitakse Objektid#DevelopmentPlanElement objekte, mille:
- Otsitakse sektsiooni vormielemente:
- Süsteem kordab neid tegevusi, kuni kõigi sektsioonide ja nendega seotud vormielementide andmed on leitud.
- Otsitakse sisendis esitatud arengukava (developmentPlanId) sektsioone:
- Leitakse arengukava perioodile vastavad aktiivsed eesmärgid.
- Otsitakse kõik Objektid#Goal objektid, mille:
- goalScope = sisendis esitatud arengukava Objektid#DevelopmentPlan.developmentPlanScope väärtus
- institution.id = sisendis esitatud arengukava Objektid#DevelopmentPlan.institution.id väärtus
- personalCode = sisendis esitatud arengukava Objektid#DevelopmentPlan.personalCode väärtus
- jobsite = sisendis esitatud arengukava Objektid#DevelopmentPlan.jobsite väärtus
- archived = false
- Kui eesmärke ei leita, jätkub protsess sammust 6.
- Leitud eesmärgid järjestatakse previousGoalId alusel.
- Nimekirjast eemaldatakse pooleliolevad eesmärgid.
- Iga eesmärgi puhul kontrollitakse, kas:
- Objektid#Goal.name != NULL
- Objektid#Goal.description != NULL
- Eesmärgil on vähemalt üks seotud tegevus:
- Leidub vähemalt üks Objektid#GoalActivity objekt, mille goalId = töödeldava eesmärgi ID.
- Kui mõni tingimus ei ole täidetud, eemaldatakse eesmärk nimekirjast.
- Süsteem kordab neid tegevusi, kuni kõik eesmärgid on töödeldud.
- Iga eesmärgi puhul kontrollitakse, kas:
- Järgmisena eemaldatakse nimekirjast eesmärgid, mille tegevuste periood ei kattu arengukava perioodiga vähemalt osaliselt.
- Iga eesmärgi puhul kontrollitakse:
- Kas eesmärgi perioodi alguskuupäev (st varaseima seotud tegevuse startDate) ei ole hilisem kui arengukava lõpukuupäev (endDate):
- Otsitakse Objektid#GoalActivity objekte, mille:
- goalId = töödeldava eesmärgi ID (Objektid#Goal.id)
- Leitud tegevuste puhul kontrollitakse, kas leidub selline, mille:
- startDate (kui mõne tegevuse startDate = NULL, siis kasutatakse selle endDate väärtust):
- on kõige varasem kõigi selle eesmärgiga seotud tegevuste seas, ja
- ei ole hilisem kui arengukava Objektid#DevelopmentPlan.endDate.
- startDate (kui mõne tegevuse startDate = NULL, siis kasutatakse selle endDate väärtust):
- Kui tingimus ei ole täidetud:
- Eesmärk eemaldatakse nimekirjast.
- Uuendatakse eemaldatud eesmärgile järgneva eesmärgi previousGoalId väärtus.
- Liigutakse järgmise eesmärgi juurde.
- Otsitakse Objektid#GoalActivity objekte, mille:
- Kas eesmärgi perioodi lõpukuupäev (st hiliseima seotud tegevuse endDate) ei ole varasem kui arengukava alguskuupäev (startDate):
- Kontrollitakse, kas eelnevalt leitud Objektid#GoalActivity objektide hulgas on selline, mille:
- endDate:
- on kõige hilisem kõigi selle eesmärgiga seotud tegevuste seas, ja
- ei ole varasem kui arengukava Objektid#DevelopmentPlan.startDate.
- endDate:
- Kui tingimus ei ole täidetud:
- Eesmärk eemaldatakse nimekirjast.
- Uuendatakse eemaldatud eesmärgile järgneva eesmärgi previousGoalId väärtus.
- Liigutakse järgmise eesmärgi juurde.
- Kontrollitakse, kas eelnevalt leitud Objektid#GoalActivity objektide hulgas on selline, mille:
- Süsteem kordab neid samme, kuni kõigi eesmärkide vastavus tingimustele on valideeritud.
- Kas eesmärgi perioodi alguskuupäev (st varaseima seotud tegevuse startDate) ei ole hilisem kui arengukava lõpukuupäev (endDate):
- Iga eesmärgi puhul kontrollitakse:
- Järelejäänud Objektid#Goal objekti kohta otsitakse seotud mõõdikuid ja tegevusi:
- Otsitakse kõiki Objektid#GoalMetrics objekte, mille goalId = töödeldava eesmärgi ID.
- Otsitakse kõiki Objektid#GoalActivity objekte, mille goalId = töödeldava eesmärgi ID.
- Otsitakse kõik Objektid#Goal objektid, mille:
- Kogutud andmete põhjal genereeritakse PDF-fail vastavalt dokumendi PM: UC: Arengukava PDF-i genereerimine peatükis "Andmed" toodud kirjeldusele.
- Kui PDF-fail luuakse edukalt, siis:
- See salvestatakse failisüsteemi.
- Salvestatakse PDF-faili metaandmed:
- Süsteem loob Objektid#File objekti järgmiste andmetega:
- id = UUID
- fileSystemId = Faili asukoha andmestik failisüsteemis
- fileName = Faili nimetus koos faililaiendiga. Nimetus määratakse järgmiselt:
- Kui sisendis esitatud arengukava Objektid#DevelopmentPlan.developmentPlanScope = "INSTITUTIONAL", siis faili nimetuseks määratakse: "Asutuse nimi" + faili genereerimise aeg sekundi täpsusega.
- Asutuse nimi = sisendis esitatud arengukava Objektid#DevelopmentPlan.institution.name väärtus
- Näide: Leiutajate külakool_2025-07-09T14-22-57.pdf
- Kui sisendis esitatud arengukava Objektid#DevelopmentPlan.developmentPlanScope = "INDIVIDUAL", siis faili nimetuseks määratakse "Isiku nimi ja ametikoht koos asutuse nimega" + faili genereerimise aeg sekundi täpsusega.
- Isiku nimi = kasutaja ees- ja perenimi
- Ametikoht = sisendis esitatud arengukava Objektid#DevelopmentPlan.jobsite väärtus
- Asutuse nimi = sisendis esitatud arengukava Objektid#DevelopmentPlan.institution.name väärtus
- Näide: Mari Maasikas_Direktor_Leiutajate külakool_2025-07-09T14-22-57.pdf
- Kui sisendis esitatud arengukava Objektid#DevelopmentPlan.developmentPlanScope = "INSTITUTIONAL", siis faili nimetuseks määratakse: "Asutuse nimi" + faili genereerimise aeg sekundi täpsusega.
- mimeType = Faili mime tüüp (nt. "application/pdf")
- size = Faili suurus baitides
- audit (loomine) = audit (loomine)
- Süsteem loob Objektid#File objekti järgmiste andmetega:
- Kui arengukavale on lisatud logo (Objektid#DevelopmentPlan.logoFileId != NULL), laaditakse vastav fail failihoidlast alla:
- Versiooni genereerinud kasutajale määratakse profiilivärv järgmise loogika alusel:
- Süsteem kontrollib, kas päringu käivitanud kasutajal on meeskonnaliikme kirje arengukava asutuse / ametikoha piires.
- Otsitakse Objektid#GoalTeamMember objekte, mille:
- personalCode = päringu käivitanud kasutaja isikukood
- Kui sobivat meeskonnaliikme kirjet ei leita, liigub süsteem edasi sammu 6.b juurde.
- Kui leitakse sobiv meeskonnaliikme kirje, otsitakse Objektid#Goal objekte, mille:
- goalScope = sisendis esitatud arengukava Objektid#DevelopmentPlan.developmentPlanScope väärtus
- institution.id = sisendis esitatud arengukava Objektid#DevelopmentPlan.institution.id väärtus
- personalCode = sisendis esitatud arengukava Objektid#DevelopmentPlan.personalCode väärtus
- jobsite = sisendis esitatud arengukava Objektid#DevelopmentPlan.jobsite väärtus
- teamMembers.id = üks eelnevalt leitud Objektid#GoalTeamMember.id väärtustest
- Kui leitakse vähemalt üks sobiv eesmärk, määratakse kasutajale sama profiilivärv, mis on meeskonnliikmel, kelle ID-ga see eesmärk seotud on.
- Otsitakse Objektid#GoalTeamMember objekte, mille:
- Kui meeskonnaliikme kirjet ei leita:
- Süsteem kontrollib, kas kasutajaga on seotud mõni varem loodud arengukava versioon.
- Süsteem otsib Objektid#DevelopmentPlanVersion objekte, mille:
- generator.personalCode = kasutaja isikukood
- Kui leitakse sobiv versioon, määratakse kasutajale sama profiilivärv, mis selle versiooni genereerijal.
- Kasutaja profiilivärv = leitud versiooni Objektid#DevelopmentPlanVersion.generator.profileColor väärtus
- Süsteem otsib Objektid#DevelopmentPlanVersion objekte, mille:
- Kui varasemat versiooni ei leita, valitakse kasutaja profiilivärviks üks HS visualiseerimise põhimõtete primaarse värvipaletti hulgast.
- Värvi määramise loogika:
- Eelistatult määratakse kasutajale värv, mida ei ole veel kasutatud ühegi teise sama asutuse/ametikoha eesmärkide meeskonnaliikme ega arengukava versioone genereerija puhul.
- Kui kõik unikaalsed värvid on juba kasutuses, siis valitakse värv, mida on kasutatud kõige vähem sama asutuse/ametikoha eesmärkide ja arengukavade raames.
- Kasutatavad värvid:
- #14AAAD - teal
- #468CDF - sinine
- #9467BD - lilla
- #E377C2 - roosa
- #FF7F0E - oranž
- #E6BC05 - kollane
- #2CA02C - roheline
- #7F7F7F - hall
- #8C564B - pruun
- #D62728 - punane
- #B44FB0 - soe lilla
- #1F77B4 - soe sinine
- #BCBD22 - soe roheline
- #D17805 - ooker
- Värvi määramise loogika:
- Süsteem kontrollib, kas kasutajaga on seotud mõni varem loodud arengukava versioon.
- Süsteem kontrollib, kas päringu käivitanud kasutajal on meeskonnaliikme kirje arengukava asutuse / ametikoha piires.
- Süsteem loob uue arengukava versiooni:
- Luuakse uus Objektid#DevelopmentPlanVersion objekt järgmiste väärtustega:
- id = UUID
- developmentPlanId = NULL
- institution.id = sisendis esitatud arengukava Objektid#DevelopmentPlan.institution.id väärtus
- institution.regCode = sisendis esitatud arengukava Objektid#DevelopmentPlan.institution.regCode väärtus
- personalCode = sisendis esitatud arengukava Objektid#DevelopmentPlan.personalCode väärtus
- jobsite = sisendis esitatud arengukava Objektid#DevelopmentPlan.jobsite väärtus
- versionType = "PDF"
- urlPublic = NULL
- publicUrlAlias = NULL
- fileId = loodud PDF-faili metaandmete kirje ID (Objektid#File.id)
- generator.personalCode = kasutaja isikukood
- generator.firstName = kasutaja eesnimi
- generator.lastName = kasutaja perenimi
- generator.profileColor = eelmises sammus kasutajale määratud profiilivärv
- validFrom = jooksev kuupäeva ja kellaaeg
- Luuakse uus Objektid#DevelopmentPlanVersion objekt järgmiste väärtustega:
- Süsteem tagastab loodud arengukava versiooni andmed.