From 8de818e737ecc85a11c6afb7bd46cdfbfbc03a0d Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Mon, 6 May 2024 09:45:34 +0300 Subject: [PATCH 01/43] =?UTF-8?q?Render=C3=B6i=20kuvaukseen=20my=C3=B6s=20?= =?UTF-8?q?html:=C3=A4=C3=A4=20kannasta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs b/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs index cdbdbbf0079..966af1d3c01 100644 --- a/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs +++ b/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs @@ -49,7 +49,7 @@ (:pisteet vastaus) (str "Pisteet 0 - " (:kyselypisteet vastaus)))]] [:div.caption.vastauslomake-lupaus-kuvaus (:kuvaus vastaus)] - [:p.sisalto (:sisalto vastaus)]]]) + [:p.sisalto {:dangerouslySetInnerHTML {:__html (:sisalto vastaus)}}]]]) (defn- kommentti-rivi [e! {:keys [id luotu luoja etunimi sukunimi kommentti poistettu]}] [:div.kommentti-rivi From 91280f1c8450b369887d74a1b0dda22f4d765d4f Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Mon, 6 May 2024 09:50:20 +0300 Subject: [PATCH 02/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20alustava=202024=20lupau?= =?UTF-8?q?sten=20migraatio?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/V1_1109__.sql | 410 ++++++++++++++++++ 1 file changed, 410 insertions(+) create mode 100644 tietokanta/src/main/resources/db/migration/V1_1109__.sql diff --git a/tietokanta/src/main/resources/db/migration/V1_1109__.sql b/tietokanta/src/main/resources/db/migration/V1_1109__.sql new file mode 100644 index 00000000000..3a5e50ea273 --- /dev/null +++ b/tietokanta/src/main/resources/db/migration/V1_1109__.sql @@ -0,0 +1,410 @@ +--- TODO: Tarkista vielä Espoon ja Vantaan nimet kun saapuvat Samposta ja tee tarvittavat korjaukset +-- - Kun linkitetään Espoon ja Vantaan urakoiden lupausryhmät molempiin urakoihin +-- - Kun linkitetään muut urakat myös + + +-- Lupausten pohjadata hoitokaudelle 2024-2025 +INSERT INTO lupausryhma(otsikko, jarjestys, "urakan-alkuvuosi", luotu, "rivin-tunnistin-selite") +VALUES + ('Kannustavat alihankintasopimukset', 1, 2024, NOW(), 'Yleinen'), + ('Kannustavat alihankintasopimukset', 1, 2024, NOW(), 'Espoo ja Vantaa'), + ('Toiminnan suunnitelmallisuus', 2, 2024, NOW(), 'Yleinen'), + ('Toiminnan suunnitelmallisuus', 2, 2024, NOW(), 'Espoo ja Vantaa'), + ('Laadunvarmistus ja reagointikyky', 3, 2024, NOW(), 'Yleinen'), + ('Laadunvarmistus ja reagointikyky', 3, 2024, NOW(), 'Espoo ja Vantaa'), + ('Turvallisuus ja osaamisen kehittäminen', 4, 2024, NOW(), 'Yleinen'), + ('Turvallisuus ja osaamisen kehittäminen', 4, 2024, NOW(), 'Espoo ja Vantaa'), + ('Viestintä ja tienkäyttäjäasiakkaan palvelu', 5, 2024, NOW(), 'Yleinen'), + ('Viestintä ja tienkäyttäjäasiakkaan palvelu', 5, 2024, NOW(), 'Espoo ja Vantaa'); + +-- Lupausryhmien ja urakoiden linkitykset lupausryhma_urakka taululla + +--- Linkitetään Espoon ja Vantaan urakoiden lupausryhmät molempiin urakoihin +--- TODO: Tarkista vielä Espoon ja Vantaan nimet kun saapuvat Samposta ja tee tarvittavat korjaukset + +DO $$ +DECLARE + tarkistus_lapaisty BOOLEAN; + urakka_id_espoo INTEGER; + urakka_id_vantaa INTEGER; +BEGIN + urakka_id_espoo = (SELECT id FROM urakka WHERE nimi ILIKE '%Espoo%' AND EXTRACT(YEAR FROM urakka.alkupvm) = 2024); + urakka_id_vantaa = (SELECT id FROM urakka WHERE nimi ILIKE '%Vantaa%' AND EXTRACT(YEAR FROM urakka.alkupvm) = 2024); + -- Tarkista löytyykö ympäristöstä + IF urakka_id_espoo IS NULL OR urakka_id_vantaa IS NULL THEN + RAISE NOTICE 'Vantaan ja Espoon urakoita ei löytynyt lupauksia varten. Tämä on ok lokaalisti.'; + tarkistus_lapaisty := FALSE; + ELSE + RAISE NOTICE 'Vantaan ja Espoon urakat linkitetty lupauksiin!'; + tarkistus_lapaisty := TRUE; + END IF; + + IF tarkistus_lapaisty THEN + INSERT INTO lupausryhma_urakka(lupausryhma_id, urakka_id) VALUES +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa); + END IF; +END $$; + + +--- Linkitetään muut urakat myös +INSERT INTO lupausryhma_urakka (lupausryhma_id, urakka_id) +SELECT lupausryhma.id AS "lupausryhma_id", urakka.id AS "urakka_id" +FROM urakka + JOIN lupausryhma ON lupausryhma."urakan-alkuvuosi" = EXTRACT(YEAR FROM urakka.alkupvm) +WHERE lupausryhma."urakan-alkuvuosi" = 2024 +AND lupausryhma."rivin-tunnistin-selite" = 'Yleinen' +AND urakka.nimi NOT LIKE '%Espoo%' -- TODO: Tarkista osuma oikeaan urakkaan +AND urakka.nimi NOT LIKE '%Vantaa%'; -- TODO: Tarkista osuma oikeaan urakkaan + +-- Lupaukset + +INSERT INTO lupaus (jarjestys, "lupausryhma-id", "urakka-id", lupaustyyppi, "pisteet", "kirjaus-kkt", "paatos-kk", "joustovara-kkta", kuvaus, sisalto, "urakan-alkuvuosi") VALUES +-- A. Kannustavat alihankintasopimukset +(1, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, '{10}', 6, 0, + 'Talvihoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa talvihoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), +(1, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 10, '{10}', 6, 0, + 'Talvihoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa talvihoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 10 000 € ja me vähintään 20 000 € +tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), + +(2, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, '{10}', 9, 0, + 'Kesähoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa kesähoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), +(2, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, '{10}', 9, 0, + 'Kesähoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa kesähoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), + +(3, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'kysely', 15, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kyselytutkimus alihankkijoille', + 'Kyselytutkimus alihankkijoille (6 sisäistä pistevaihtoehtoa). Tarjoaja antaa lupauksen tarjoamansa hoitourakan kyselytutkimuksen keskiarvosta. + Kyselytutkimusten vastausprosentin keskiarvon ollessa 0 %, saa tästä lupauksesta 0 pistettä. Jos kyselytutkimuksen vastausprosentin keskiarvo jää välille > 0 % ja ≤ 25 %, saa tästä lupauksesta 2 pistettä riippumatta kyselytutkimuksen tuloksesta.', + 2024), + +(3, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'kysely', 15, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kyselytutkimus alihankkijoille', + 'Kyselytutkimus alihankkijoille (6 sisäistä pistevaihtoehtoa). Tarjoaja antaa lupauksen tarjoamansa hoitourakan kyselytutkimuksen keskiarvosta. + Kyselytutkimusten vastausprosentin keskiarvon ollessa 0 %, saa tästä lupauksesta 0 pistettä. Jos kyselytutkimuksen vastausprosentin keskiarvo jää välille > 0 % ja ≤ 25 %, saa tästä lupauksesta 2 pistettä riippumatta kyselytutkimuksen tuloksesta.', + 2024), + +-- B. Toiminnan suunnitelmallisuus +(4, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 10, null, 0, 1, + 'Kuukausittainen töiden suunnittelu', + 'Suunnittelemme yhdessä tilaajan ja alihankkijoiden kanssa urakan töitä vähintään kerran +kuukaudessa. Töitä voidaan suunnitella esimerkiksi palaverein tai sähköisin menettelyin. +Suunnittelussa ja töiden sisältöjen (laatuvaatimukset, töiden yhteensovittaminen yms.) +läpikäynnissä tulee olla mukana ne alihankkijatahot, jotka tulevat tekemään töitä urakassa +seuraavan kuukauden aikana.', + 2024), + (4, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, null, 0, 1, + 'Kuukausittainen töiden suunnittelu', + 'Suunnittelemme yhdessä tilaajan ja alihankkijoiden kanssa urakan töitä vähintään kerran +kuukaudessa. Töitä voidaan suunnitella esimerkiksi palaverein tai sähköisin menettelyin. +Suunnittelussa ja töiden sisältöjen (laatuvaatimukset, töiden yhteensovittaminen yms.) +läpikäynnissä tulee olla mukana ne alihankkijatahot, jotka tulevat tekemään töitä urakassa +seuraavan kuukauden aikana.', + 2024), + +--- Vain Espoo ja Vantaa + + (5, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'monivalinta', 16, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Budjetissa pysyminen', + '

Lupaustaso 1

+

Urakoitsija suunnitelmallisella toiminnallaan varmistaa rahavarauksen A budjetissa pysymisen +/-10 %.

+

Lupaustaso 2

+

Urakoitsija suunnitelmallisella toiminnallaan varmistaa rahavarauksen A budjetissa pysymisen +/-5 %.

', + 2024), + (6, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'monivalinta', 12, '{10, 11, 12, 1, 2, 3, 4}', 5, 0, + 'Talvihoidon mitoitus- ja reittisuunnitelmat', + '

Lupaustaso 1

+

Laadimme talvihoidon mitoitus-, reitti- ja toiminnanohjaussuunnitelmia eri säätilanteisiin voidaksemme toteuttaa työt aina optimaalisella kalustolla. Näin pyrimme tehokkaasti estämään kunnossapidon toimin mahdollisesti laajatkin liikennehäiriöt urakka-alueella. Suunnitelmia on sekä liukkaudentorjuntaan että lumenpoistoon.

+ + +

Toimitamme viikkoa ennen sopimuskatselmusta talvihoidon reitti- ja mitoitussuunnitelman (LO 1/2017 perustuva), josta selviää suunnitellut reitit, reittien pituudet, suunniteltu kalusto varusteineen sekä mitoitusnopeus talvihoitoluokittain.

+

Päivitämme ja ylläpidämme talvihoidon suunnitelmaa vuosittain ja aina tarvittaessa, noudatamme mitoitusperiaatteita kaikkina vuosina.

+

Lupaustaso 2

+

Seuraamme talvihoidon toteutuneita toimenpideaikoja tilaajan kanssa ennalta sovituista reiteistä (2-5 kpl) tai talvihoitotoimenpiteistä ja raportoimme tilaajalle toimenpideaikojen toteutumisen kuukausittain. Käymme raportin yhdessä tilaajan kanssa läpi kuukausittain. Laatupuutteita havaitessa käynnistämme viipymättä korjaavat toimenpiteet.

', + 2024), + + +-- C. Laadunvarmistus ja reagointikyky +(5, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'monivalinta', 10, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kunnossapitoilmoitukset', + 'Toimenpiteitä aiheuttaneiden ilmoitusten (urakoitsijaviestien) %-osuus talvihoitoon ja sorateiden +kunnossapitoon liittyvistä ilmoituksista. (6 sisäistä pistevaihtoehtoa).', + 2024), + +(6, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Luovutuksen menettely', + 'Meillä (pääurakoitsijalla) on käytössä itselle luovutuksen menettely määräaikaan sidotuista töistä +/ työkokonaisuuksista, varusteiden ja laitteiden lisäämisestä ja uusimisesta, sorateiden ja siltojen +hoidosta sekä ojituksesta. Alihankkijamme tekevät itselle luovutuksen vastaavista omista +töistään / työkokonaisuuksista, jotka tarkastamme ennen tilaajalle luovuttamista.', + 2024), + + +(7, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Luovutuksen menettely', + 'Meillä (pääurakoitsijalla) on käytössä itselle luovutuksen menettely määräaikaan sidotuista töistä +/ työkokonaisuuksista, varusteiden ja laitteiden lisäämisestä ja uusimisesta, sorateiden ja siltojen +hoidosta sekä ojituksesta. Alihankkijamme tekevät itselle luovutuksen vastaavista omista +töistään / työkokonaisuuksista, jotka tarkastamme ennen tilaajalle luovuttamista.', + 2024), + + +(7, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5}', 6, 0, + 'Talvihoidon pistokokeet', + 'Teemme urakassa muuttuvissa keliolosuhteissa laadunseurantaa myös pistokokeina > 6 kertaa talvessa tilaajan kanssa ennalta sovittuna ajankohtana (esim. toimenpideajassa pysyminen, työn jälki, työmenetelmä, reagointikyky ja liukkaudentorjuntamateriaalien annosmäärät), joista kolme tehdään klo 20–06 välillä ja/tai viikonloppuisin. + Laadimme jokaisesta pistokokeesta erillisen raportin ja luovutamme sen tilaajalle viimeistään seuraavassa työmaakokouksessa.', + 2024), +(8, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5}', 6, 0, + 'Talvihoidon pistokokeet', + 'Teemme urakassa muuttuvissa keliolosuhteissa laadunseurantaa myös pistokokeina > 6 kertaa talvessa tilaajan kanssa ennalta sovittuna ajankohtana (esim. toimenpideajassa pysyminen, työn jälki, työmenetelmä, reagointikyky ja liukkaudentorjuntamateriaalien annosmäärät), joista kolme tehdään klo 20–06 välillä ja/tai viikonloppuisin. + Laadimme jokaisesta pistokokeesta erillisen raportin ja luovutamme sen tilaajalle viimeistään seuraavassa työmaakokouksessa.', + 2024), + +-- D. Turvallisuus ja osaamisen kehittäminen +(8, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 6, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Turvallisuuden teemakokoukset', + 'Pidämme vähintään 80 %:lle alihankkijoiden operatiivisesta henkilöstöstä vuosittain +työlajikohtaiset tai synergisesti yli työlajien nivoutuvat turvallisuuden teemakokoukset. +Kokouksien ohjelmat ja osallistujalistat todetaan viimeistään kokousta seuraavassa +työmaakokouksessa', + 2024), +(9, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Turvallisuuden teemakokoukset', + 'Pidämme vähintään 80 %:lle alihankkijoiden operatiivisesta henkilöstöstä vuosittain +työlajikohtaiset tai synergisesti yli työlajien nivoutuvat turvallisuuden teemakokoukset. +Kokouksien ohjelmat ja osallistujalistat todetaan viimeistään kokousta seuraavassa +työmaakokouksessa', + 2024), + +(9, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Koulutukset', + 'Järjestämme urakassa koulutuksia, joiden aiheita voivat olla esim. menetelmätieto, +laatutietoisuus, raportointi, seurantalaitteiden käyttö ja työturvallisuus. Järjestämäämme +koulutukseen (1 htp / hoitovuosi) osallistuu vähintään 1 alihankkijan henkilö kultakin +sopimussuhteessa olevalta alihankkijalta. Osallistumisvelvollisuus on kirjattu +alihankintasopimuksiimme.', + 2024), +(10, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Koulutukset', + 'Järjestämme urakassa koulutuksia, joiden aiheita voivat olla esim. menetelmätieto, +laatutietoisuus, raportointi, seurantalaitteiden käyttö ja työturvallisuus. Järjestämäämme +koulutukseen (1 htp / hoitovuosi) osallistuu vähintään 1 alihankkijan henkilö kultakin +sopimussuhteessa olevalta alihankkijalta. Osallistumisvelvollisuus on kirjattu +alihankintasopimuksiimme.', + 2024), + +-- E. Viestintä ja tienkäyttäjäasiakkaan palvelu +(10, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen',5, null, 0, 0, + 'Tilanne- ja ennakkotiedotus', + 'Toteutamme tilanne- ja ennakkotiedotusta tiedotusvälineiden tai sosiaalisen median alustojen kautta vähintään kerran viikossa*. Tilanne- ja ennakkotiedotusjulkaisu on kuvallinen ja paikkasidonnainen julkaisu tulevista tai käynnissä olevista urakan töistä. Julkaisuiksi ei lasketa muiden laatimien julkaisujen jakamista. +*Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), +(11, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen',5, null, 0, 0, + 'Tilanne- ja ennakkotiedotus', + 'Toteutamme tilanne- ja ennakkotiedotusta tiedotusvälineiden tai sosiaalisen median alustojen kautta vähintään kerran viikossa*. Tilanne- ja ennakkotiedotusjulkaisu on kuvallinen ja paikkasidonnainen julkaisu tulevista tai käynnissä olevista urakan töistä. Julkaisuiksi ei lasketa muiden laatimien julkaisujen jakamista. +*Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), + +(11, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 12, null, 9, 0, + 'Viestintä sidosryhmien kanssa', + 'Tunnistamme urakka-alueen tärkeimmät sidosryhmät (esim. Vapo, metsäyhtiöt, linja-autoyhtiöt, +koululaiskuljetukset, yms.). Sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä. Vuoropuhelun perusteella kehitämme toimintaamme siten, että +sidosryhmien tarpeet sopimuksen puitteissa tulevat huomioiduiksi mahdollisimman hyvin. +Olemme yhteydessä paikallismedioihin ja sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä.', + 2024), +(12, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, null, 9, 0, + 'Viestintä sidosryhmien kanssa', + 'Tunnistamme urakka-alueen tärkeimmät sidosryhmät (esim. Vapo, metsäyhtiöt, linja-autoyhtiöt, +koululaiskuljetukset, yms.). Sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä. Vuoropuhelun perusteella kehitämme toimintaamme siten, että +sidosryhmien tarpeet sopimuksen puitteissa tulevat huomioiduiksi mahdollisimman hyvin. +Olemme yhteydessä paikallismedioihin ja sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä.', + 2024), + +--- Vain Espoo ja Vantaa + +(13, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 4, null, 0, 0, + 'Palautteet ja tienkäyttäjätyytyväisyys', + 'Teemme analyyseja Harja-ilmoituksista kuukausittain. Saatamme analyysien tulokset henkilöstön, alihankkijoiden ja tilaajan tietoisuuteen. + +Toimitamme alihankkijoille heidän työtään koskevat tienkäyttäjäpalautteet ja urakoitsijaviestit. Analyysien, palautteiden ja omien sekä alihankkijoidemme havaintojen perusteella kehitämme ja teemme tienkäyttäjiä palvelevia toimenpiteitä esim. reititykseen, työmenetelmiin ja alihankinnan ohjaukseen. Keskustelemme kehittämistoimista tilaajan kanssa sekä huomioimme ne viestinnässä. + +Teemme Talven tienkäyttäjätyytyväisyystutkimustuloksista (ml. vapaat vastaukset) analyysin kerran vuodessa. Saatamme tutkimuksen ja analyysin tulokset henkilöstön ja alihankkijoiden tietoisuuteen. Huomioimme havaitut kehitystarpeet toiminnassa ja viestinnässä. Esitämme analyysit, havainnot ja kehitystoimet tilaajalle 2 kk:n kuluessa tulosten saamisesta.', + 2024), + +--- + +(12, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, null, 0, 0, + 'Palautteet ja kehittäminen', + 'Toimitamme tienkäyttäjäpalautteet ja urakoitsijaviestit henkilöstön ja alihankkijoiden +tietoisuuteen viikoittain. Näiden palautteiden ja omien sekä alihankkijoidemme havaintojen +perusteella kehitämme ja teemme tienkäyttäjiä palvelevia toimenpiteitä esim. reititykseen, +työmenetelmiin ja alihankinnan ohjaukseen. Keskustelemme kehittämistoimista tilaajan kanssa +sekä huomioimme ne viestinnässä. + +* Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), + +(13, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 3, null, 9, 0, + 'Tyytyväisyystutkimustulokset', + 'Teemme Talven tienkäyttäjätyytyväisyystutkimustuloksista (ml. vapaat vastaukset) analyysin +kerran vuodessa. Saatamme tutkimuksen ja analyysin tulokset henkilöstön ja alihankkijoiden +tietoisuuteen. Huomioimme havaitut kehitystarpeet toiminnassa ja viestinnässä. Esitämme +analyysit, havainnot ja kehitystoimet tilaajalle 2 kk:n kuluessa tulosten saamisesta.', + 2024); + +-- Lupaus nro. 3 - Vaihtoehdot - kaikki urakat + +INSERT INTO lupaus_vaihtoehto_ryhma("ryhma-otsikko") +VALUES + ('Vastausprosentti'), + ('Kyselytutkimuksen tulos'); + +DO $$ + DECLARE + ryhma_otsikko_id_1 INTEGER; + ryhma_otsikko_id_2 INTEGER; + BEGIN + ryhma_otsikko_id_1 = (SELECT id FROM lupaus_vaihtoehto_ryhma where "ryhma-otsikko" = 'Vastausprosentti'); + ryhma_otsikko_id_2 = (SELECT id FROM lupaus_vaihtoehto_ryhma where "ryhma-otsikko" = 'Kyselytutkimuksen tulos'); + + -- Yleinen + -- Askel 1. josta päätyy 2 valinnasta askeleeseen 2 ja 3 valinnasta Askeleeseen 3 + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0%', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, null, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0 % ja ≤ 25 %', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, 2, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 25 %', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, 3, ryhma_otsikko_id_1); + + -- Askel 2. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + + -- Askel 3. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 3,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 5,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 7,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 11,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 15,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + + -- Espoo ja Vantaa + -- Askel 1. josta päätyy 2 valinnasta askeleeseen 2 ja 3 valinnasta Askeleeseen 3 + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0%', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, null, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0 % ja ≤ 25 %', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, 2, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 25 %', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, 3, ryhma_otsikko_id_1); + + -- Askel 2. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + + -- Askel 3. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 3,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 5,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 7,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 11,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 15,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + + + END +$$ LANGUAGE plpgsql; + +-- Lupaus nro. 5 Kunnossapitoilmoitukset - Vaihtoehdot- kaikki urakat + +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '> 25 % / hoitovuosi', 0,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '10-25 % / hoitovuosi', 2,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '15-20 % / hoitovuosi', 4,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '10-15 % / hoitovuosi', 6,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '5-10 % / hoitovuosi', 8,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '0-5 % / hoitovuosi', 10,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); + +-- Lupaus nro. 5 Budjetissa pysyminen - Vaihtoehdot - Espoon ja Vantaa +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaus ei toteutunut, > +/- 10%', 0,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaustaso 1, < +/- 10%', 12,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaustasot 2 < +/- 5 %', 16,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); + +-- Lupaus nro. 6 Talvihoidon mitoitus- ja reittisuunnitelmat - Vaihtoehdot - Espoon ja Vantaa +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaus ei toteutunut', 0,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaustaso 1', 8,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaustasot 1 ja 2', 12,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); \ No newline at end of file From 1f71c0f631d0366d972d696abb0e749bce2088af Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 7 May 2024 09:40:51 +0300 Subject: [PATCH 03/43] =?UTF-8?q?P=C3=A4ivit=C3=A4=20viel=C3=A4=20p=20tag?= =?UTF-8?q?=20diviksi?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dev-resources/less/pages/lupaus_tyylit.less | 2 +- src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-resources/less/pages/lupaus_tyylit.less b/dev-resources/less/pages/lupaus_tyylit.less index 0453e0afd9c..9ca0d10da86 100644 --- a/dev-resources/less/pages/lupaus_tyylit.less +++ b/dev-resources/less/pages/lupaus_tyylit.less @@ -391,7 +391,7 @@ input.kuukausipisteet { font-size: 14px; } - p.sisalto { + div.sisalto { font-size: 16px; } } diff --git a/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs b/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs index 966af1d3c01..8f1559af911 100644 --- a/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs +++ b/src/cljs/harja/views/urakka/lupaus/vastauslomake.cljs @@ -49,7 +49,7 @@ (:pisteet vastaus) (str "Pisteet 0 - " (:kyselypisteet vastaus)))]] [:div.caption.vastauslomake-lupaus-kuvaus (:kuvaus vastaus)] - [:p.sisalto {:dangerouslySetInnerHTML {:__html (:sisalto vastaus)}}]]]) + [:div.sisalto {:dangerouslySetInnerHTML {:__html (:sisalto vastaus)}}]]]) (defn- kommentti-rivi [e! {:keys [id luotu luoja etunimi sukunimi kommentti poistettu]}] [:div.kommentti-rivi From fada9ae84df097eab4f36fc26a4ad0ebe8e71aeb Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Mon, 3 Jun 2024 13:25:50 +0300 Subject: [PATCH 04/43] =?UTF-8?q?Nime=C3=A4=20migraatio=20uudelleen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/{V1_1109__.sql => V1_1112__.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tietokanta/src/main/resources/db/migration/{V1_1109__.sql => V1_1112__.sql} (100%) diff --git a/tietokanta/src/main/resources/db/migration/V1_1109__.sql b/tietokanta/src/main/resources/db/migration/V1_1112__.sql similarity index 100% rename from tietokanta/src/main/resources/db/migration/V1_1109__.sql rename to tietokanta/src/main/resources/db/migration/V1_1112__.sql From d79bf43ad4e20a45d7d1df04edc099129ed6da9e Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Mon, 3 Jun 2024 13:31:38 +0300 Subject: [PATCH 05/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20lupauksen=20migraatio?= =?UTF-8?q?=20uuteen=20tiedostoon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/V1_1113__.sql | 410 ++++++++++++++++++ 1 file changed, 410 insertions(+) create mode 100644 tietokanta/src/main/resources/db/migration/V1_1113__.sql diff --git a/tietokanta/src/main/resources/db/migration/V1_1113__.sql b/tietokanta/src/main/resources/db/migration/V1_1113__.sql new file mode 100644 index 00000000000..cbe8fe41f8a --- /dev/null +++ b/tietokanta/src/main/resources/db/migration/V1_1113__.sql @@ -0,0 +1,410 @@ +--- TODO: Tarkista vielä Espoon ja Vantaan nimet kun saapuvat Samposta ja tee tarvittavat korjaukset +-- - Kun linkitetään Espoon ja Vantaan urakoiden lupausryhmät molempiin urakoihin +-- - Kun linkitetään muut urakat myös + + +-- Lupausten pohjadata hoitokaudelle 2024-2025 +INSERT INTO lupausryhma(otsikko, jarjestys, "urakan-alkuvuosi", luotu, "rivin-tunnistin-selite") +VALUES + ('Kannustavat alihankintasopimukset', 1, 2024, NOW(), 'Yleinen'), + ('Kannustavat alihankintasopimukset', 1, 2024, NOW(), 'Espoo ja Vantaa'), + ('Toiminnan suunnitelmallisuus', 2, 2024, NOW(), 'Yleinen'), + ('Toiminnan suunnitelmallisuus', 2, 2024, NOW(), 'Espoo ja Vantaa'), + ('Laadunvarmistus ja reagointikyky', 3, 2024, NOW(), 'Yleinen'), + ('Laadunvarmistus ja reagointikyky', 3, 2024, NOW(), 'Espoo ja Vantaa'), + ('Turvallisuus ja osaamisen kehittäminen', 4, 2024, NOW(), 'Yleinen'), + ('Turvallisuus ja osaamisen kehittäminen', 4, 2024, NOW(), 'Espoo ja Vantaa'), + ('Viestintä ja tienkäyttäjäasiakkaan palvelu', 5, 2024, NOW(), 'Yleinen'), + ('Viestintä ja tienkäyttäjäasiakkaan palvelu', 5, 2024, NOW(), 'Espoo ja Vantaa'); + +-- Lupausryhmien ja urakoiden linkitykset lupausryhma_urakka taululla + +--- Linkitetään Espoon ja Vantaan urakoiden lupausryhmät molempiin urakoihin +--- TODO: Tarkista vielä Espoon ja Vantaan nimet kun saapuvat Samposta ja tee tarvittavat korjaukset + +DO $$ +DECLARE + tarkistus_lapaisty BOOLEAN; + urakka_id_espoo INTEGER; + urakka_id_vantaa INTEGER; +BEGIN + urakka_id_espoo = (SELECT id FROM urakka WHERE nimi ILIKE '%Espoo%' AND EXTRACT(YEAR FROM urakka.alkupvm) = 2024); + urakka_id_vantaa = (SELECT id FROM urakka WHERE nimi ILIKE '%Vantaa%' AND EXTRACT(YEAR FROM urakka.alkupvm) = 2024); + -- Tarkista löytyykö ympäristöstä + IF urakka_id_espoo IS NULL OR urakka_id_vantaa IS NULL THEN + RAISE NOTICE 'Vantaan ja Espoon urakoita ei löytynyt lupauksia varten. Tämä on ok lokaalisti.'; + tarkistus_lapaisty := FALSE; + ELSE + RAISE NOTICE 'Vantaan ja Espoon urakat linkitetty lupauksiin!'; + tarkistus_lapaisty := TRUE; + END IF; + + IF tarkistus_lapaisty THEN + INSERT INTO lupausryhma_urakka(lupausryhma_id, urakka_id) VALUES +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa); + END IF; +END $$; + + +--- Linkitetään muut urakat myös +INSERT INTO lupausryhma_urakka (lupausryhma_id, urakka_id) +SELECT lupausryhma.id AS "lupausryhma_id", urakka.id AS "urakka_id" +FROM urakka + JOIN lupausryhma ON lupausryhma."urakan-alkuvuosi" = EXTRACT(YEAR FROM urakka.alkupvm) +WHERE lupausryhma."urakan-alkuvuosi" = 2024 +AND lupausryhma."rivin-tunnistin-selite" = 'Yleinen' +AND urakka.nimi NOT LIKE '%Espoo%' -- TODO: Tarkista osuma oikeaan urakkaan +AND urakka.nimi NOT LIKE '%Vantaa%'; -- TODO: Tarkista osuma oikeaan urakkaan + +-- Lupaukset + +INSERT INTO lupaus (jarjestys, "lupausryhma-id", "urakka-id", lupaustyyppi, "pisteet", "kirjaus-kkt", "paatos-kk", "joustovara-kkta", kuvaus, sisalto, "urakan-alkuvuosi") VALUES +-- A. Kannustavat alihankintasopimukset +(1, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, '{10}', 6, 0, + 'Talvihoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa talvihoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), +(1, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 10, '{10}', 6, 0, + 'Talvihoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa talvihoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 10 000 € ja me vähintään 20 000 € +tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), + +(2, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, '{10}', 9, 0, + 'Kesähoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa kesähoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), +(2, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, '{10}', 9, 0, + 'Kesähoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa kesähoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), + +(3, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'kysely', 15, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kyselytutkimus alihankkijoille', + 'Kyselytutkimus alihankkijoille (6 sisäistä pistevaihtoehtoa). Tarjoaja antaa lupauksen tarjoamansa hoitourakan kyselytutkimuksen keskiarvosta. + Kyselytutkimusten vastausprosentin keskiarvon ollessa 0 %, saa tästä lupauksesta 0 pistettä. Jos kyselytutkimuksen vastausprosentin keskiarvo jää välille > 0 % ja ≤ 25 %, saa tästä lupauksesta 2 pistettä riippumatta kyselytutkimuksen tuloksesta.', + 2024), + +(3, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'kysely', 15, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kyselytutkimus alihankkijoille', + 'Kyselytutkimus alihankkijoille (6 sisäistä pistevaihtoehtoa). Tarjoaja antaa lupauksen tarjoamansa hoitourakan kyselytutkimuksen keskiarvosta. + Kyselytutkimusten vastausprosentin keskiarvon ollessa 0 %, saa tästä lupauksesta 0 pistettä. Jos kyselytutkimuksen vastausprosentin keskiarvo jää välille > 0 % ja ≤ 25 %, saa tästä lupauksesta 2 pistettä riippumatta kyselytutkimuksen tuloksesta.', + 2024), + +-- B. Toiminnan suunnitelmallisuus +(4, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 10, null, 0, 1, + 'Kuukausittainen töiden suunnittelu', + 'Suunnittelemme yhdessä tilaajan ja alihankkijoiden kanssa urakan töitä vähintään kerran +kuukaudessa. Töitä voidaan suunnitella esimerkiksi palaverein tai sähköisin menettelyin. +Suunnittelussa ja töiden sisältöjen (laatuvaatimukset, töiden yhteensovittaminen yms.) +läpikäynnissä tulee olla mukana ne alihankkijatahot, jotka tulevat tekemään töitä urakassa +seuraavan kuukauden aikana.', + 2024), + (4, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, null, 0, 1, + 'Kuukausittainen töiden suunnittelu', + 'Suunnittelemme yhdessä tilaajan ja alihankkijoiden kanssa urakan töitä vähintään kerran +kuukaudessa. Töitä voidaan suunnitella esimerkiksi palaverein tai sähköisin menettelyin. +Suunnittelussa ja töiden sisältöjen (laatuvaatimukset, töiden yhteensovittaminen yms.) +läpikäynnissä tulee olla mukana ne alihankkijatahot, jotka tulevat tekemään töitä urakassa +seuraavan kuukauden aikana.', + 2024), + +--- Vain Espoo ja Vantaa + + (5, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'monivalinta', 16, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Budjetissa pysyminen', + '

Lupaustaso 1

+

Urakoitsija suunnitelmallisella toiminnallaan varmistaa rahavarauksen A budjetissa pysymisen +/-10 %.

+

Lupaustaso 2

+

Urakoitsija suunnitelmallisella toiminnallaan varmistaa rahavarauksen A budjetissa pysymisen +/-5 %.

', + 2024), + (6, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'monivalinta', 12, '{10, 11, 12, 1, 2, 3, 4}', 5, 0, + 'Talvihoidon mitoitus- ja reittisuunnitelmat', + '

Lupaustaso 1

+

Laadimme talvihoidon mitoitus-, reitti- ja toiminnanohjaussuunnitelmia eri säätilanteisiin voidaksemme toteuttaa työt aina optimaalisella kalustolla. Näin pyrimme tehokkaasti estämään kunnossapidon toimin mahdollisesti laajatkin liikennehäiriöt urakka-alueella. Suunnitelmia on sekä liukkaudentorjuntaan että lumenpoistoon.

+
    +
  • Auraus- ja liukkaudentorjuntareittien mitoitusperiaatteet eri talvihoitoluokilla: +
      +
    • Ise/Is 35 km
    • +
    • Ib/Ic 60 km
    • +
    • II 70km(tr50km)
    • +
    • III 85km(tr55km)
    • +
    • Ramppipituudet tulee huomioida reittimitoituksessa
    • +
    +
  • +
+
    +
  • Laadimme myös suunnitelman puomiaukkojen, vilkkaiden pysäkkien ja lumitilojen tyhjennysjärjestyksestä ja aikataulusta.
  • +
+

Toimitamme viikkoa ennen sopimuskatselmusta talvihoidon reitti- ja mitoitussuunnitelman (LO 1/2017 perustuva), josta selviää suunnitellut reitit, reittien pituudet, suunniteltu kalusto varusteineen sekä mitoitusnopeus talvihoitoluokittain.

+

Päivitämme ja ylläpidämme talvihoidon suunnitelmaa vuosittain ja aina tarvittaessa, noudatamme mitoitusperiaatteita kaikkina vuosina.

+

Lupaustaso 2

+

Seuraamme talvihoidon toteutuneita toimenpideaikoja tilaajan kanssa ennalta sovituista reiteistä (2-5 kpl) tai talvihoitotoimenpiteistä ja raportoimme tilaajalle toimenpideaikojen toteutumisen kuukausittain. Käymme raportin yhdessä tilaajan kanssa läpi kuukausittain. Laatupuutteita havaitessa käynnistämme viipymättä korjaavat toimenpiteet.

', + 2024), + + +-- C. Laadunvarmistus ja reagointikyky +(5, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'monivalinta', 10, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kunnossapitoilmoitukset', + 'Toimenpiteitä aiheuttaneiden ilmoitusten (urakoitsijaviestien) %-osuus talvihoitoon ja sorateiden +kunnossapitoon liittyvistä ilmoituksista. (6 sisäistä pistevaihtoehtoa).', + 2024), + +(6, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Luovutuksen menettely', + 'Meillä (pääurakoitsijalla) on käytössä itselle luovutuksen menettely määräaikaan sidotuista töistä +/ työkokonaisuuksista, varusteiden ja laitteiden lisäämisestä ja uusimisesta, sorateiden ja siltojen +hoidosta sekä ojituksesta. Alihankkijamme tekevät itselle luovutuksen vastaavista omista +töistään / työkokonaisuuksista, jotka tarkastamme ennen tilaajalle luovuttamista.', + 2024), + + +(7, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Luovutuksen menettely', + 'Meillä (pääurakoitsijalla) on käytössä itselle luovutuksen menettely määräaikaan sidotuista töistä +/ työkokonaisuuksista, varusteiden ja laitteiden lisäämisestä ja uusimisesta, sorateiden ja siltojen +hoidosta sekä ojituksesta. Alihankkijamme tekevät itselle luovutuksen vastaavista omista +töistään / työkokonaisuuksista, jotka tarkastamme ennen tilaajalle luovuttamista.', + 2024), + + +(7, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5}', 6, 0, + 'Talvihoidon pistokokeet', + 'Teemme urakassa muuttuvissa keliolosuhteissa laadunseurantaa myös pistokokeina > 6 kertaa talvessa tilaajan kanssa ennalta sovittuna ajankohtana (esim. toimenpideajassa pysyminen, työn jälki, työmenetelmä, reagointikyky ja liukkaudentorjuntamateriaalien annosmäärät), joista kolme tehdään klo 20–06 välillä ja/tai viikonloppuisin. + Laadimme jokaisesta pistokokeesta erillisen raportin ja luovutamme sen tilaajalle viimeistään seuraavassa työmaakokouksessa.', + 2024), +(8, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5}', 6, 0, + 'Talvihoidon pistokokeet', + 'Teemme urakassa muuttuvissa keliolosuhteissa laadunseurantaa myös pistokokeina > 6 kertaa talvessa tilaajan kanssa ennalta sovittuna ajankohtana (esim. toimenpideajassa pysyminen, työn jälki, työmenetelmä, reagointikyky ja liukkaudentorjuntamateriaalien annosmäärät), joista kolme tehdään klo 20–06 välillä ja/tai viikonloppuisin. + Laadimme jokaisesta pistokokeesta erillisen raportin ja luovutamme sen tilaajalle viimeistään seuraavassa työmaakokouksessa.', + 2024), + +-- D. Turvallisuus ja osaamisen kehittäminen +(8, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 6, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Turvallisuuden teemakokoukset', + 'Pidämme vähintään 80 %:lle alihankkijoiden operatiivisesta henkilöstöstä vuosittain +työlajikohtaiset tai synergisesti yli työlajien nivoutuvat turvallisuuden teemakokoukset. +Kokouksien ohjelmat ja osallistujalistat todetaan viimeistään kokousta seuraavassa +työmaakokouksessa', + 2024), +(9, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Turvallisuuden teemakokoukset', + 'Pidämme vähintään 80 %:lle alihankkijoiden operatiivisesta henkilöstöstä vuosittain +työlajikohtaiset tai synergisesti yli työlajien nivoutuvat turvallisuuden teemakokoukset. +Kokouksien ohjelmat ja osallistujalistat todetaan viimeistään kokousta seuraavassa +työmaakokouksessa', + 2024), + +(9, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Koulutukset', + 'Järjestämme urakassa koulutuksia, joiden aiheita voivat olla esim. menetelmätieto, +laatutietoisuus, raportointi, seurantalaitteiden käyttö ja työturvallisuus. Järjestämäämme +koulutukseen (1 htp / hoitovuosi) osallistuu vähintään 1 alihankkijan henkilö kultakin +sopimussuhteessa olevalta alihankkijalta. Osallistumisvelvollisuus on kirjattu +alihankintasopimuksiimme.', + 2024), +(10, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Koulutukset', + 'Järjestämme urakassa koulutuksia, joiden aiheita voivat olla esim. menetelmätieto, +laatutietoisuus, raportointi, seurantalaitteiden käyttö ja työturvallisuus. Järjestämäämme +koulutukseen (1 htp / hoitovuosi) osallistuu vähintään 1 alihankkijan henkilö kultakin +sopimussuhteessa olevalta alihankkijalta. Osallistumisvelvollisuus on kirjattu +alihankintasopimuksiimme.', + 2024), + +-- E. Viestintä ja tienkäyttäjäasiakkaan palvelu +(10, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen',5, null, 0, 0, + 'Tilanne- ja ennakkotiedotus', + 'Toteutamme tilanne- ja ennakkotiedotusta tiedotusvälineiden tai sosiaalisen median alustojen kautta vähintään kerran viikossa*. Tilanne- ja ennakkotiedotusjulkaisu on kuvallinen ja paikkasidonnainen julkaisu tulevista tai käynnissä olevista urakan töistä. Julkaisuiksi ei lasketa muiden laatimien julkaisujen jakamista. +*Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), +(11, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen',5, null, 0, 0, + 'Tilanne- ja ennakkotiedotus', + 'Toteutamme tilanne- ja ennakkotiedotusta tiedotusvälineiden tai sosiaalisen median alustojen kautta vähintään kerran viikossa*. Tilanne- ja ennakkotiedotusjulkaisu on kuvallinen ja paikkasidonnainen julkaisu tulevista tai käynnissä olevista urakan töistä. Julkaisuiksi ei lasketa muiden laatimien julkaisujen jakamista. +*Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), + +(11, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 12, null, 9, 0, + 'Viestintä sidosryhmien kanssa', + 'Tunnistamme urakka-alueen tärkeimmät sidosryhmät (esim. Vapo, metsäyhtiöt, linja-autoyhtiöt, +koululaiskuljetukset, yms.). Sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä. Vuoropuhelun perusteella kehitämme toimintaamme siten, että +sidosryhmien tarpeet sopimuksen puitteissa tulevat huomioiduiksi mahdollisimman hyvin. +Olemme yhteydessä paikallismedioihin ja sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä.', + 2024), +(12, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, null, 9, 0, + 'Viestintä sidosryhmien kanssa', + 'Tunnistamme urakka-alueen tärkeimmät sidosryhmät (esim. Vapo, metsäyhtiöt, linja-autoyhtiöt, +koululaiskuljetukset, yms.). Sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä. Vuoropuhelun perusteella kehitämme toimintaamme siten, että +sidosryhmien tarpeet sopimuksen puitteissa tulevat huomioiduiksi mahdollisimman hyvin. +Olemme yhteydessä paikallismedioihin ja sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä.', + 2024), + +--- Vain Espoo ja Vantaa + +(13, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 4, null, 0, 0, + 'Palautteet ja tienkäyttäjätyytyväisyys', + 'Teemme analyyseja Harja-ilmoituksista kuukausittain. Saatamme analyysien tulokset henkilöstön, alihankkijoiden ja tilaajan tietoisuuteen. + +Toimitamme alihankkijoille heidän työtään koskevat tienkäyttäjäpalautteet ja urakoitsijaviestit. Analyysien, palautteiden ja omien sekä alihankkijoidemme havaintojen perusteella kehitämme ja teemme tienkäyttäjiä palvelevia toimenpiteitä esim. reititykseen, työmenetelmiin ja alihankinnan ohjaukseen. Keskustelemme kehittämistoimista tilaajan kanssa sekä huomioimme ne viestinnässä. + +Teemme Talven tienkäyttäjätyytyväisyystutkimustuloksista (ml. vapaat vastaukset) analyysin kerran vuodessa. Saatamme tutkimuksen ja analyysin tulokset henkilöstön ja alihankkijoiden tietoisuuteen. Huomioimme havaitut kehitystarpeet toiminnassa ja viestinnässä. Esitämme analyysit, havainnot ja kehitystoimet tilaajalle 2 kk:n kuluessa tulosten saamisesta.', + 2024), + +--- + +(12, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, null, 0, 0, + 'Palautteet ja kehittäminen', + 'Toimitamme tienkäyttäjäpalautteet ja urakoitsijaviestit henkilöstön ja alihankkijoiden +tietoisuuteen viikoittain. Näiden palautteiden ja omien sekä alihankkijoidemme havaintojen +perusteella kehitämme ja teemme tienkäyttäjiä palvelevia toimenpiteitä esim. reititykseen, +työmenetelmiin ja alihankinnan ohjaukseen. Keskustelemme kehittämistoimista tilaajan kanssa +sekä huomioimme ne viestinnässä. + +* Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), + +(13, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 3, null, 9, 0, + 'Tyytyväisyystutkimustulokset', + 'Teemme Talven tienkäyttäjätyytyväisyystutkimustuloksista (ml. vapaat vastaukset) analyysin +kerran vuodessa. Saatamme tutkimuksen ja analyysin tulokset henkilöstön ja alihankkijoiden +tietoisuuteen. Huomioimme havaitut kehitystarpeet toiminnassa ja viestinnässä. Esitämme +analyysit, havainnot ja kehitystoimet tilaajalle 2 kk:n kuluessa tulosten saamisesta.', + 2024); + +-- Lupaus nro. 3 - Vaihtoehdot - kaikki urakat + +INSERT INTO lupaus_vaihtoehto_ryhma("ryhma-otsikko") +VALUES + ('Vastausprosentti'), + ('Kyselytutkimuksen tulos'); + +DO $$ + DECLARE + ryhma_otsikko_id_1 INTEGER; + ryhma_otsikko_id_2 INTEGER; + BEGIN + ryhma_otsikko_id_1 = (SELECT id FROM lupaus_vaihtoehto_ryhma where "ryhma-otsikko" = 'Vastausprosentti'); + ryhma_otsikko_id_2 = (SELECT id FROM lupaus_vaihtoehto_ryhma where "ryhma-otsikko" = 'Kyselytutkimuksen tulos'); + + -- Yleinen + -- Askel 1. josta päätyy 2 valinnasta askeleeseen 2 ja 3 valinnasta Askeleeseen 3 + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0%', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, null, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0 % ja ≤ 25 %', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, 2, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 25 %', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, 3, ryhma_otsikko_id_1); + + -- Askel 2. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + + -- Askel 3. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 3,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 5,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 7,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 11,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 15,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + + -- Espoo ja Vantaa + -- Askel 1. josta päätyy 2 valinnasta askeleeseen 2 ja 3 valinnasta Askeleeseen 3 + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0%', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, null, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0 % ja ≤ 25 %', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, 2, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 25 %', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, 3, ryhma_otsikko_id_1); + + -- Askel 2. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + + -- Askel 3. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 3,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 5,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 7,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 11,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 15,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + + + END +$$ LANGUAGE plpgsql; + +-- Lupaus nro. 5 Kunnossapitoilmoitukset - Vaihtoehdot- kaikki urakat + +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '> 25 % / hoitovuosi', 0,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '10-25 % / hoitovuosi', 2,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '15-20 % / hoitovuosi', 4,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '10-15 % / hoitovuosi', 6,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '5-10 % / hoitovuosi', 8,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '0-5 % / hoitovuosi', 10,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); + +-- Lupaus nro. 5 Budjetissa pysyminen - Vaihtoehdot - Espoon ja Vantaa +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaus ei toteutunut, > +/- 10%', 0,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaustaso 1, < +/- 10%', 12,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaustasot 2 < +/- 5 %', 16,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); + +-- Lupaus nro. 6 Talvihoidon mitoitus- ja reittisuunnitelmat - Vaihtoehdot - Espoon ja Vantaa +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaus ei toteutunut', 0,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaustaso 1', 8,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaustasot 1 ja 2', 12,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); From 5f9667166aa36f0606ec86c383d2549b52896c15 Mon Sep 17 00:00:00 2001 From: Maarit Date: Fri, 5 Jul 2024 10:48:04 +0300 Subject: [PATCH 06/43] Rename V1_1113__.sql to V1_1120__.sql --- .../main/resources/db/migration/{V1_1113__.sql => V1_1120__.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tietokanta/src/main/resources/db/migration/{V1_1113__.sql => V1_1120__.sql} (100%) diff --git a/tietokanta/src/main/resources/db/migration/V1_1113__.sql b/tietokanta/src/main/resources/db/migration/V1_1120__.sql similarity index 100% rename from tietokanta/src/main/resources/db/migration/V1_1113__.sql rename to tietokanta/src/main/resources/db/migration/V1_1120__.sql From fdf48ac828d94a649f580f33d6e3e6e7c0c90b1b Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Fri, 6 Sep 2024 09:27:51 +0300 Subject: [PATCH 07/43] =?UTF-8?q?Nime=C3=A4=20migraatio=20uudelleen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/{V1_1113__.sql => V1_1132__.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tietokanta/src/main/resources/db/migration/{V1_1113__.sql => V1_1132__.sql} (100%) diff --git a/tietokanta/src/main/resources/db/migration/V1_1113__.sql b/tietokanta/src/main/resources/db/migration/V1_1132__.sql similarity index 100% rename from tietokanta/src/main/resources/db/migration/V1_1113__.sql rename to tietokanta/src/main/resources/db/migration/V1_1132__.sql From 31837403b8aa1d84e5ee47fcfdb20262eb10bacc Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Fri, 6 Sep 2024 09:52:37 +0300 Subject: [PATCH 08/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20migraatio=20uuteen=20ti?= =?UTF-8?q?edostoon?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/V1_1132__.sql | 410 ++++++++++++++++++ 1 file changed, 410 insertions(+) create mode 100644 tietokanta/src/main/resources/db/migration/V1_1132__.sql diff --git a/tietokanta/src/main/resources/db/migration/V1_1132__.sql b/tietokanta/src/main/resources/db/migration/V1_1132__.sql new file mode 100644 index 00000000000..3a5e50ea273 --- /dev/null +++ b/tietokanta/src/main/resources/db/migration/V1_1132__.sql @@ -0,0 +1,410 @@ +--- TODO: Tarkista vielä Espoon ja Vantaan nimet kun saapuvat Samposta ja tee tarvittavat korjaukset +-- - Kun linkitetään Espoon ja Vantaan urakoiden lupausryhmät molempiin urakoihin +-- - Kun linkitetään muut urakat myös + + +-- Lupausten pohjadata hoitokaudelle 2024-2025 +INSERT INTO lupausryhma(otsikko, jarjestys, "urakan-alkuvuosi", luotu, "rivin-tunnistin-selite") +VALUES + ('Kannustavat alihankintasopimukset', 1, 2024, NOW(), 'Yleinen'), + ('Kannustavat alihankintasopimukset', 1, 2024, NOW(), 'Espoo ja Vantaa'), + ('Toiminnan suunnitelmallisuus', 2, 2024, NOW(), 'Yleinen'), + ('Toiminnan suunnitelmallisuus', 2, 2024, NOW(), 'Espoo ja Vantaa'), + ('Laadunvarmistus ja reagointikyky', 3, 2024, NOW(), 'Yleinen'), + ('Laadunvarmistus ja reagointikyky', 3, 2024, NOW(), 'Espoo ja Vantaa'), + ('Turvallisuus ja osaamisen kehittäminen', 4, 2024, NOW(), 'Yleinen'), + ('Turvallisuus ja osaamisen kehittäminen', 4, 2024, NOW(), 'Espoo ja Vantaa'), + ('Viestintä ja tienkäyttäjäasiakkaan palvelu', 5, 2024, NOW(), 'Yleinen'), + ('Viestintä ja tienkäyttäjäasiakkaan palvelu', 5, 2024, NOW(), 'Espoo ja Vantaa'); + +-- Lupausryhmien ja urakoiden linkitykset lupausryhma_urakka taululla + +--- Linkitetään Espoon ja Vantaan urakoiden lupausryhmät molempiin urakoihin +--- TODO: Tarkista vielä Espoon ja Vantaan nimet kun saapuvat Samposta ja tee tarvittavat korjaukset + +DO $$ +DECLARE + tarkistus_lapaisty BOOLEAN; + urakka_id_espoo INTEGER; + urakka_id_vantaa INTEGER; +BEGIN + urakka_id_espoo = (SELECT id FROM urakka WHERE nimi ILIKE '%Espoo%' AND EXTRACT(YEAR FROM urakka.alkupvm) = 2024); + urakka_id_vantaa = (SELECT id FROM urakka WHERE nimi ILIKE '%Vantaa%' AND EXTRACT(YEAR FROM urakka.alkupvm) = 2024); + -- Tarkista löytyykö ympäristöstä + IF urakka_id_espoo IS NULL OR urakka_id_vantaa IS NULL THEN + RAISE NOTICE 'Vantaan ja Espoon urakoita ei löytynyt lupauksia varten. Tämä on ok lokaalisti.'; + tarkistus_lapaisty := FALSE; + ELSE + RAISE NOTICE 'Vantaan ja Espoon urakat linkitetty lupauksiin!'; + tarkistus_lapaisty := TRUE; + END IF; + + IF tarkistus_lapaisty THEN + INSERT INTO lupausryhma_urakka(lupausryhma_id, urakka_id) VALUES +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa), +-- Espoo + ((SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_espoo), +-- Vantaa + ((SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), + urakka_id_vantaa); + END IF; +END $$; + + +--- Linkitetään muut urakat myös +INSERT INTO lupausryhma_urakka (lupausryhma_id, urakka_id) +SELECT lupausryhma.id AS "lupausryhma_id", urakka.id AS "urakka_id" +FROM urakka + JOIN lupausryhma ON lupausryhma."urakan-alkuvuosi" = EXTRACT(YEAR FROM urakka.alkupvm) +WHERE lupausryhma."urakan-alkuvuosi" = 2024 +AND lupausryhma."rivin-tunnistin-selite" = 'Yleinen' +AND urakka.nimi NOT LIKE '%Espoo%' -- TODO: Tarkista osuma oikeaan urakkaan +AND urakka.nimi NOT LIKE '%Vantaa%'; -- TODO: Tarkista osuma oikeaan urakkaan + +-- Lupaukset + +INSERT INTO lupaus (jarjestys, "lupausryhma-id", "urakka-id", lupaustyyppi, "pisteet", "kirjaus-kkt", "paatos-kk", "joustovara-kkta", kuvaus, sisalto, "urakan-alkuvuosi") VALUES +-- A. Kannustavat alihankintasopimukset +(1, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, '{10}', 6, 0, + 'Talvihoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa talvihoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), +(1, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 10, '{10}', 6, 0, + 'Talvihoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa talvihoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 10 000 € ja me vähintään 20 000 € +tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), + +(2, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, '{10}', 9, 0, + 'Kesähoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa kesähoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), +(2, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, '{10}', 9, 0, + 'Kesähoidon kannustinjärjestelmä', + 'Kehitämme yhdessä tilaajan kanssa kesähoidon alihankkijoiden kannustinjärjestelmän, joka on +käytössä vähintään kahdessa alihankintasopimuksessamme. Lupaus täyttyy myös +kannustinjärjestelmän kehittämisen ja käyttöönoton jälkeisinä hoitovuosina, mikäli sama +järjestelmä on edelleen käytössä. Tilaaja on varannut vuosittain 5 000 € ja me vähintään 15 000 +€ tämän lupauksen kannustinjärjestelmään. Tilaajan ja meidän rahavarauksemme yhdistetään +ja tätä summaa käytetään samassa suhteessa maksettaessa mahdollisia yksittäisiä kannusteita.', + 2024), + +(3, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'kysely', 15, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kyselytutkimus alihankkijoille', + 'Kyselytutkimus alihankkijoille (6 sisäistä pistevaihtoehtoa). Tarjoaja antaa lupauksen tarjoamansa hoitourakan kyselytutkimuksen keskiarvosta. + Kyselytutkimusten vastausprosentin keskiarvon ollessa 0 %, saa tästä lupauksesta 0 pistettä. Jos kyselytutkimuksen vastausprosentin keskiarvo jää välille > 0 % ja ≤ 25 %, saa tästä lupauksesta 2 pistettä riippumatta kyselytutkimuksen tuloksesta.', + 2024), + +(3, (SELECT id FROM lupausryhma WHERE otsikko = 'Kannustavat alihankintasopimukset' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'kysely', 15, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kyselytutkimus alihankkijoille', + 'Kyselytutkimus alihankkijoille (6 sisäistä pistevaihtoehtoa). Tarjoaja antaa lupauksen tarjoamansa hoitourakan kyselytutkimuksen keskiarvosta. + Kyselytutkimusten vastausprosentin keskiarvon ollessa 0 %, saa tästä lupauksesta 0 pistettä. Jos kyselytutkimuksen vastausprosentin keskiarvo jää välille > 0 % ja ≤ 25 %, saa tästä lupauksesta 2 pistettä riippumatta kyselytutkimuksen tuloksesta.', + 2024), + +-- B. Toiminnan suunnitelmallisuus +(4, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 10, null, 0, 1, + 'Kuukausittainen töiden suunnittelu', + 'Suunnittelemme yhdessä tilaajan ja alihankkijoiden kanssa urakan töitä vähintään kerran +kuukaudessa. Töitä voidaan suunnitella esimerkiksi palaverein tai sähköisin menettelyin. +Suunnittelussa ja töiden sisältöjen (laatuvaatimukset, töiden yhteensovittaminen yms.) +läpikäynnissä tulee olla mukana ne alihankkijatahot, jotka tulevat tekemään töitä urakassa +seuraavan kuukauden aikana.', + 2024), + (4, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, null, 0, 1, + 'Kuukausittainen töiden suunnittelu', + 'Suunnittelemme yhdessä tilaajan ja alihankkijoiden kanssa urakan töitä vähintään kerran +kuukaudessa. Töitä voidaan suunnitella esimerkiksi palaverein tai sähköisin menettelyin. +Suunnittelussa ja töiden sisältöjen (laatuvaatimukset, töiden yhteensovittaminen yms.) +läpikäynnissä tulee olla mukana ne alihankkijatahot, jotka tulevat tekemään töitä urakassa +seuraavan kuukauden aikana.', + 2024), + +--- Vain Espoo ja Vantaa + + (5, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'monivalinta', 16, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Budjetissa pysyminen', + '

Lupaustaso 1

+

Urakoitsija suunnitelmallisella toiminnallaan varmistaa rahavarauksen A budjetissa pysymisen +/-10 %.

+

Lupaustaso 2

+

Urakoitsija suunnitelmallisella toiminnallaan varmistaa rahavarauksen A budjetissa pysymisen +/-5 %.

', + 2024), + (6, (SELECT id FROM lupausryhma WHERE otsikko = 'Toiminnan suunnitelmallisuus' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'monivalinta', 12, '{10, 11, 12, 1, 2, 3, 4}', 5, 0, + 'Talvihoidon mitoitus- ja reittisuunnitelmat', + '

Lupaustaso 1

+

Laadimme talvihoidon mitoitus-, reitti- ja toiminnanohjaussuunnitelmia eri säätilanteisiin voidaksemme toteuttaa työt aina optimaalisella kalustolla. Näin pyrimme tehokkaasti estämään kunnossapidon toimin mahdollisesti laajatkin liikennehäiriöt urakka-alueella. Suunnitelmia on sekä liukkaudentorjuntaan että lumenpoistoon.

+
    +
  • Auraus- ja liukkaudentorjuntareittien mitoitusperiaatteet eri talvihoitoluokilla: +
      +
    • Ise/Is 35 km
    • +
    • Ib/Ic 60 km
    • +
    • II 70km(tr50km)
    • +
    • III 85km(tr55km)
    • +
    • Ramppipituudet tulee huomioida reittimitoituksessa
    • +
    +
  • +
+
    +
  • Laadimme myös suunnitelman puomiaukkojen, vilkkaiden pysäkkien ja lumitilojen tyhjennysjärjestyksestä ja aikataulusta.
  • +
+

Toimitamme viikkoa ennen sopimuskatselmusta talvihoidon reitti- ja mitoitussuunnitelman (LO 1/2017 perustuva), josta selviää suunnitellut reitit, reittien pituudet, suunniteltu kalusto varusteineen sekä mitoitusnopeus talvihoitoluokittain.

+

Päivitämme ja ylläpidämme talvihoidon suunnitelmaa vuosittain ja aina tarvittaessa, noudatamme mitoitusperiaatteita kaikkina vuosina.

+

Lupaustaso 2

+

Seuraamme talvihoidon toteutuneita toimenpideaikoja tilaajan kanssa ennalta sovituista reiteistä (2-5 kpl) tai talvihoitotoimenpiteistä ja raportoimme tilaajalle toimenpideaikojen toteutumisen kuukausittain. Käymme raportin yhdessä tilaajan kanssa läpi kuukausittain. Laatupuutteita havaitessa käynnistämme viipymättä korjaavat toimenpiteet.

', + 2024), + + +-- C. Laadunvarmistus ja reagointikyky +(5, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'monivalinta', 10, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Kunnossapitoilmoitukset', + 'Toimenpiteitä aiheuttaneiden ilmoitusten (urakoitsijaviestien) %-osuus talvihoitoon ja sorateiden +kunnossapitoon liittyvistä ilmoituksista. (6 sisäistä pistevaihtoehtoa).', + 2024), + +(6, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Luovutuksen menettely', + 'Meillä (pääurakoitsijalla) on käytössä itselle luovutuksen menettely määräaikaan sidotuista töistä +/ työkokonaisuuksista, varusteiden ja laitteiden lisäämisestä ja uusimisesta, sorateiden ja siltojen +hoidosta sekä ojituksesta. Alihankkijamme tekevät itselle luovutuksen vastaavista omista +töistään / työkokonaisuuksista, jotka tarkastamme ennen tilaajalle luovuttamista.', + 2024), + + +(7, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Luovutuksen menettely', + 'Meillä (pääurakoitsijalla) on käytössä itselle luovutuksen menettely määräaikaan sidotuista töistä +/ työkokonaisuuksista, varusteiden ja laitteiden lisäämisestä ja uusimisesta, sorateiden ja siltojen +hoidosta sekä ojituksesta. Alihankkijamme tekevät itselle luovutuksen vastaavista omista +töistään / työkokonaisuuksista, jotka tarkastamme ennen tilaajalle luovuttamista.', + 2024), + + +(7, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5}', 6, 0, + 'Talvihoidon pistokokeet', + 'Teemme urakassa muuttuvissa keliolosuhteissa laadunseurantaa myös pistokokeina > 6 kertaa talvessa tilaajan kanssa ennalta sovittuna ajankohtana (esim. toimenpideajassa pysyminen, työn jälki, työmenetelmä, reagointikyky ja liukkaudentorjuntamateriaalien annosmäärät), joista kolme tehdään klo 20–06 välillä ja/tai viikonloppuisin. + Laadimme jokaisesta pistokokeesta erillisen raportin ja luovutamme sen tilaajalle viimeistään seuraavassa työmaakokouksessa.', + 2024), +(8, (SELECT id FROM lupausryhma WHERE otsikko = 'Laadunvarmistus ja reagointikyky' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, '{10, 11, 12, 1, 2, 3, 4, 5}', 6, 0, + 'Talvihoidon pistokokeet', + 'Teemme urakassa muuttuvissa keliolosuhteissa laadunseurantaa myös pistokokeina > 6 kertaa talvessa tilaajan kanssa ennalta sovittuna ajankohtana (esim. toimenpideajassa pysyminen, työn jälki, työmenetelmä, reagointikyky ja liukkaudentorjuntamateriaalien annosmäärät), joista kolme tehdään klo 20–06 välillä ja/tai viikonloppuisin. + Laadimme jokaisesta pistokokeesta erillisen raportin ja luovutamme sen tilaajalle viimeistään seuraavassa työmaakokouksessa.', + 2024), + +-- D. Turvallisuus ja osaamisen kehittäminen +(8, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 6, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Turvallisuuden teemakokoukset', + 'Pidämme vähintään 80 %:lle alihankkijoiden operatiivisesta henkilöstöstä vuosittain +työlajikohtaiset tai synergisesti yli työlajien nivoutuvat turvallisuuden teemakokoukset. +Kokouksien ohjelmat ja osallistujalistat todetaan viimeistään kokousta seuraavassa +työmaakokouksessa', + 2024), +(9, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Turvallisuuden teemakokoukset', + 'Pidämme vähintään 80 %:lle alihankkijoiden operatiivisesta henkilöstöstä vuosittain +työlajikohtaiset tai synergisesti yli työlajien nivoutuvat turvallisuuden teemakokoukset. +Kokouksien ohjelmat ja osallistujalistat todetaan viimeistään kokousta seuraavassa +työmaakokouksessa', + 2024), + +(9, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Koulutukset', + 'Järjestämme urakassa koulutuksia, joiden aiheita voivat olla esim. menetelmätieto, +laatutietoisuus, raportointi, seurantalaitteiden käyttö ja työturvallisuus. Järjestämäämme +koulutukseen (1 htp / hoitovuosi) osallistuu vähintään 1 alihankkijan henkilö kultakin +sopimussuhteessa olevalta alihankkijalta. Osallistumisvelvollisuus on kirjattu +alihankintasopimuksiimme.', + 2024), +(10, (SELECT id FROM lupausryhma WHERE otsikko = 'Turvallisuus ja osaamisen kehittäminen' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 5, + '{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8}', 9, 0, + 'Koulutukset', + 'Järjestämme urakassa koulutuksia, joiden aiheita voivat olla esim. menetelmätieto, +laatutietoisuus, raportointi, seurantalaitteiden käyttö ja työturvallisuus. Järjestämäämme +koulutukseen (1 htp / hoitovuosi) osallistuu vähintään 1 alihankkijan henkilö kultakin +sopimussuhteessa olevalta alihankkijalta. Osallistumisvelvollisuus on kirjattu +alihankintasopimuksiimme.', + 2024), + +-- E. Viestintä ja tienkäyttäjäasiakkaan palvelu +(10, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen',5, null, 0, 0, + 'Tilanne- ja ennakkotiedotus', + 'Toteutamme tilanne- ja ennakkotiedotusta tiedotusvälineiden tai sosiaalisen median alustojen kautta vähintään kerran viikossa*. Tilanne- ja ennakkotiedotusjulkaisu on kuvallinen ja paikkasidonnainen julkaisu tulevista tai käynnissä olevista urakan töistä. Julkaisuiksi ei lasketa muiden laatimien julkaisujen jakamista. +*Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), +(11, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen',5, null, 0, 0, + 'Tilanne- ja ennakkotiedotus', + 'Toteutamme tilanne- ja ennakkotiedotusta tiedotusvälineiden tai sosiaalisen median alustojen kautta vähintään kerran viikossa*. Tilanne- ja ennakkotiedotusjulkaisu on kuvallinen ja paikkasidonnainen julkaisu tulevista tai käynnissä olevista urakan töistä. Julkaisuiksi ei lasketa muiden laatimien julkaisujen jakamista. +*Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), + +(11, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 12, null, 9, 0, + 'Viestintä sidosryhmien kanssa', + 'Tunnistamme urakka-alueen tärkeimmät sidosryhmät (esim. Vapo, metsäyhtiöt, linja-autoyhtiöt, +koululaiskuljetukset, yms.). Sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä. Vuoropuhelun perusteella kehitämme toimintaamme siten, että +sidosryhmien tarpeet sopimuksen puitteissa tulevat huomioiduiksi mahdollisimman hyvin. +Olemme yhteydessä paikallismedioihin ja sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä.', + 2024), +(12, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 6, null, 9, 0, + 'Viestintä sidosryhmien kanssa', + 'Tunnistamme urakka-alueen tärkeimmät sidosryhmät (esim. Vapo, metsäyhtiöt, linja-autoyhtiöt, +koululaiskuljetukset, yms.). Sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä. Vuoropuhelun perusteella kehitämme toimintaamme siten, että +sidosryhmien tarpeet sopimuksen puitteissa tulevat huomioiduiksi mahdollisimman hyvin. +Olemme yhteydessä paikallismedioihin ja sovimme hoitovuosittain heidän kanssaan käytävästä +vuoropuhelusta ja viestinnästä.', + 2024), + +--- Vain Espoo ja Vantaa + +(13, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Espoo ja Vantaa'), null, 'yksittainen', 4, null, 0, 0, + 'Palautteet ja tienkäyttäjätyytyväisyys', + 'Teemme analyyseja Harja-ilmoituksista kuukausittain. Saatamme analyysien tulokset henkilöstön, alihankkijoiden ja tilaajan tietoisuuteen. + +Toimitamme alihankkijoille heidän työtään koskevat tienkäyttäjäpalautteet ja urakoitsijaviestit. Analyysien, palautteiden ja omien sekä alihankkijoidemme havaintojen perusteella kehitämme ja teemme tienkäyttäjiä palvelevia toimenpiteitä esim. reititykseen, työmenetelmiin ja alihankinnan ohjaukseen. Keskustelemme kehittämistoimista tilaajan kanssa sekä huomioimme ne viestinnässä. + +Teemme Talven tienkäyttäjätyytyväisyystutkimustuloksista (ml. vapaat vastaukset) analyysin kerran vuodessa. Saatamme tutkimuksen ja analyysin tulokset henkilöstön ja alihankkijoiden tietoisuuteen. Huomioimme havaitut kehitystarpeet toiminnassa ja viestinnässä. Esitämme analyysit, havainnot ja kehitystoimet tilaajalle 2 kk:n kuluessa tulosten saamisesta.', + 2024), + +--- + +(12, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 8, null, 0, 0, + 'Palautteet ja kehittäminen', + 'Toimitamme tienkäyttäjäpalautteet ja urakoitsijaviestit henkilöstön ja alihankkijoiden +tietoisuuteen viikoittain. Näiden palautteiden ja omien sekä alihankkijoidemme havaintojen +perusteella kehitämme ja teemme tienkäyttäjiä palvelevia toimenpiteitä esim. reititykseen, +työmenetelmiin ja alihankinnan ohjaukseen. Keskustelemme kehittämistoimista tilaajan kanssa +sekä huomioimme ne viestinnässä. + +* Viestintä tulee hoitaa ajallaan vähintään 96 %:sti, jotta lupaus katsotaan toteutuneeksi.', + 2024), + +(13, (SELECT id FROM lupausryhma WHERE otsikko = 'Viestintä ja tienkäyttäjäasiakkaan palvelu' and "urakan-alkuvuosi" = 2024 and "rivin-tunnistin-selite" = 'Yleinen'), null, 'yksittainen', 3, null, 9, 0, + 'Tyytyväisyystutkimustulokset', + 'Teemme Talven tienkäyttäjätyytyväisyystutkimustuloksista (ml. vapaat vastaukset) analyysin +kerran vuodessa. Saatamme tutkimuksen ja analyysin tulokset henkilöstön ja alihankkijoiden +tietoisuuteen. Huomioimme havaitut kehitystarpeet toiminnassa ja viestinnässä. Esitämme +analyysit, havainnot ja kehitystoimet tilaajalle 2 kk:n kuluessa tulosten saamisesta.', + 2024); + +-- Lupaus nro. 3 - Vaihtoehdot - kaikki urakat + +INSERT INTO lupaus_vaihtoehto_ryhma("ryhma-otsikko") +VALUES + ('Vastausprosentti'), + ('Kyselytutkimuksen tulos'); + +DO $$ + DECLARE + ryhma_otsikko_id_1 INTEGER; + ryhma_otsikko_id_2 INTEGER; + BEGIN + ryhma_otsikko_id_1 = (SELECT id FROM lupaus_vaihtoehto_ryhma where "ryhma-otsikko" = 'Vastausprosentti'); + ryhma_otsikko_id_2 = (SELECT id FROM lupaus_vaihtoehto_ryhma where "ryhma-otsikko" = 'Kyselytutkimuksen tulos'); + + -- Yleinen + -- Askel 1. josta päätyy 2 valinnasta askeleeseen 2 ja 3 valinnasta Askeleeseen 3 + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0%', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, null, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0 % ja ≤ 25 %', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, 2, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 25 %', 0,'Kannustavat alihankintasopimukset','Yleinen', 1, 3, ryhma_otsikko_id_1); + + -- Askel 2. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 2,'Kannustavat alihankintasopimukset','Yleinen', 2, null, ryhma_otsikko_id_2); + + -- Askel 3. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 3,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 5,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 7,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 11,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 15,'Kannustavat alihankintasopimukset','Yleinen', 3, null, ryhma_otsikko_id_2); + + -- Espoo ja Vantaa + -- Askel 1. josta päätyy 2 valinnasta askeleeseen 2 ja 3 valinnasta Askeleeseen 3 + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0%', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, null, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '0 % ja ≤ 25 %', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, 2, ryhma_otsikko_id_1); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 25 %', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 1, 3, ryhma_otsikko_id_1); + + -- Askel 2. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 2,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 2, null, ryhma_otsikko_id_2); + + -- Askel 3. + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '<= 4,1', 0,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,1', 3,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,4', 5,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 4,7', 7,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,0', 11,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + PERFORM luo_lupauksen_vaihtoehto(3, 2024, '> 5,3', 15,'Kannustavat alihankintasopimukset','Espoo ja Vantaa', 3, null, ryhma_otsikko_id_2); + + + END +$$ LANGUAGE plpgsql; + +-- Lupaus nro. 5 Kunnossapitoilmoitukset - Vaihtoehdot- kaikki urakat + +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '> 25 % / hoitovuosi', 0,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '10-25 % / hoitovuosi', 2,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '15-20 % / hoitovuosi', 4,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '10-15 % / hoitovuosi', 6,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '5-10 % / hoitovuosi', 8,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, '0-5 % / hoitovuosi', 10,'Laadunvarmistus ja reagointikyky','Yleinen', null, null, null); + +-- Lupaus nro. 5 Budjetissa pysyminen - Vaihtoehdot - Espoon ja Vantaa +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaus ei toteutunut, > +/- 10%', 0,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaustaso 1, < +/- 10%', 12,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(5, 2024, 'Lupaustasot 2 < +/- 5 %', 16,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); + +-- Lupaus nro. 6 Talvihoidon mitoitus- ja reittisuunnitelmat - Vaihtoehdot - Espoon ja Vantaa +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaus ei toteutunut', 0,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaustaso 1', 8,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); +SELECT * FROM luo_lupauksen_vaihtoehto(6, 2024, 'Lupaustasot 1 ja 2', 12,'Toiminnan suunnitelmallisuus','Espoo ja Vantaa', null, null, null); \ No newline at end of file From ef210207f31931b1456d197d7a64c90e22b90b03 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Fri, 6 Sep 2024 15:08:57 +0300 Subject: [PATCH 09/43] =?UTF-8?q?Korjaa=20vaihtoehto=20testi=C3=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../palvelin/palvelut/lupaus_palvelu_test.clj | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/test/clj/harja/palvelin/palvelut/lupaus_palvelu_test.clj b/test/clj/harja/palvelin/palvelut/lupaus_palvelu_test.clj index 5a24b401abb..cf8e4c36de1 100644 --- a/test/clj/harja/palvelin/palvelut/lupaus_palvelu_test.clj +++ b/test/clj/harja/palvelin/palvelut/lupaus_palvelu_test.clj @@ -70,6 +70,9 @@ (defn- etsi-ryhma [ryhmat jarjestys-numero] (first (filter #(= jarjestys-numero (:jarjestys %)) ryhmat))) +(defn etsi-vaihtoehto [vaihtoehdot vaihtoehto-seuraava-ryhma-id] + (first (filter #(= vaihtoehto-seuraava-ryhma-id (:vaihtoehto-seuraava-ryhma-id %)) vaihtoehdot))) + (deftest urakan-lupaustietojen-haku-toimii (let [tiedot {:urakka-id @iin-maanteiden-hoitourakan-2021-2026-id :valittu-hoitokausi [#inst "2021-09-30T21:00:00.000-00:00" @@ -164,11 +167,12 @@ vastaus (hae-urakan-lupaustiedot +kayttaja-jvh+ tiedot) - eka-vaihtoehto (first (:vaihtoehdot (etsi-lupaus vastaus 3)))] - (is (= "> 25 %" (:vaihtoehto eka-vaihtoehto)) "vaihtoehto oikein") - (is (= 1 (:vaihtoehto-askel eka-vaihtoehto)) "askel oikein") - (is (= 3 (:vaihtoehto-seuraava-ryhma-id eka-vaihtoehto)) "seuraava ryhmä oikein") - (is (= "Testiotsikko 1" (:ryhma-otsikko eka-vaihtoehto)) "ryhma-otsikko oikein"))) + vaihtoehdot (:vaihtoehdot (etsi-lupaus vastaus 3)) + vaihtoehto (etsi-vaihtoehto vaihtoehdot 3)] + (is (= "> 25 %" (:vaihtoehto vaihtoehto)) "vaihtoehto oikein") + (is (= 1 (:vaihtoehto-askel vaihtoehto)) "askel oikein") + (is (= 3 (:vaihtoehto-seuraava-ryhma-id vaihtoehto)) "seuraava ryhmä oikein") + (is (= "Testiotsikko 1" (:ryhma-otsikko vaihtoehto)) "ryhma-otsikko oikein"))) (deftest odottaa-kannanottoa (let [hakutiedot {:urakka-id @iin-maanteiden-hoitourakan-2021-2026-id From 3f1ec5486b296bd9de34818b7a2b0c5c6cf2a1e9 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Fri, 6 Sep 2024 15:23:33 +0300 Subject: [PATCH 10/43] =?UTF-8?q?P=C3=A4ivit=C3=A4=20migraation=20numero?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/{V1_1132__.sql => V1_1133__.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tietokanta/src/main/resources/db/migration/{V1_1132__.sql => V1_1133__.sql} (100%) diff --git a/tietokanta/src/main/resources/db/migration/V1_1132__.sql b/tietokanta/src/main/resources/db/migration/V1_1133__.sql similarity index 100% rename from tietokanta/src/main/resources/db/migration/V1_1132__.sql rename to tietokanta/src/main/resources/db/migration/V1_1133__.sql From dd32ba18834e24171e7a3ba6b42ca1d4165af2cd Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 10 Sep 2024 10:06:43 +0300 Subject: [PATCH 11/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20lupausryhmien=20sorttaa?= =?UTF-8?q?minen=20frontissa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/views/urakka/lupaus_nakyma.cljs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cljs/harja/views/urakka/lupaus_nakyma.cljs b/src/cljs/harja/views/urakka/lupaus_nakyma.cljs index 58f8ae42930..ce249634818 100644 --- a/src/cljs/harja/views/urakka/lupaus_nakyma.cljs +++ b/src/cljs/harja/views/urakka/lupaus_nakyma.cljs @@ -376,9 +376,10 @@ [:div.row {:style (merge {} (when (not (empty? (:lupausryhmat app))) {:border-top "1px solid #D6D6D6"}))} - (for [ryhma (:lupausryhmat app)] - ^{:key (str "lupaustyhma" (:jarjestys ryhma))} - [lupausryhma-rivi e! app ryhma (get (:lupaukset app) (:otsikko ryhma))])])) + (let [lupausryhmat (sort-by :jarjestys (:lupausryhmat app))] + (for [ryhma lupausryhmat] + ^{:key (str "lupaustyhma" (:jarjestys ryhma))} + [lupausryhma-rivi e! app ryhma (get (:lupaukset app) (:otsikko ryhma))]))])) [testausvalinnat e! app]])))) (defn- valilehti-mahdollinen? [valilehti {:keys [tyyppi sopimustyyppi id] :as urakka}] From 5da2c986a6661ce3c087b451f847892e681eaf76 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 10 Sep 2024 10:11:13 +0300 Subject: [PATCH 12/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20order=20by=20ehtoja=20l?= =?UTF-8?q?upaus=20kyselyihin=20v=C3=A4=C3=A4rien=20j=C3=A4rjestyksien=20t?= =?UTF-8?q?akia?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clj/harja/kyselyt/lupaus_kyselyt.sql | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/clj/harja/kyselyt/lupaus_kyselyt.sql b/src/clj/harja/kyselyt/lupaus_kyselyt.sql index 2e23753bb98..90902e77720 100644 --- a/src/clj/harja/kyselyt/lupaus_kyselyt.sql +++ b/src/clj/harja/kyselyt/lupaus_kyselyt.sql @@ -49,7 +49,8 @@ SELECT l.id AS "lupaus-id", LEFT JOIN lupaus_vaihtoehto lv ON lv.id = vas."lupaus-vaihtoehto-id" JOIN lupausryhma_urakka lu ON r.id = lu."lupausryhma_id" WHERE lu."urakka_id" = :urakka -GROUP BY l.id, sit.id, r.id; +GROUP BY l.id, sit.id, r.id +ORDER BY l.jarjestys, r.jarjestys; -- name: hae-lupaus-vaihtoehdot SELECT @@ -65,7 +66,8 @@ FROM left JOIN lupaus_vaihtoehto_ryhma lvr on lv."vaihtoehto-ryhma-otsikko-id" = lvr.id WHERE - lv."lupaus-id" = :lupaus-id; + lv."lupaus-id" = :lupaus-id + ORDER BY lv.id; -- name: hae-lupaus-vaihtoehto SELECT id, "lupaus-id", vaihtoehto, pisteet From 45d173b403b16ebb0f7db29bc348c80aac227c57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Wed, 11 Sep 2024 11:03:36 +0300 Subject: [PATCH 13/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20tarvittavat=20toimenkuv?= =?UTF-8?q?at=20tietokantaan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tietokanta/src/main/resources/db/migration/V1_1133__.sql | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 tietokanta/src/main/resources/db/migration/V1_1133__.sql diff --git a/tietokanta/src/main/resources/db/migration/V1_1133__.sql b/tietokanta/src/main/resources/db/migration/V1_1133__.sql new file mode 100644 index 00000000000..fe8cb36f00a --- /dev/null +++ b/tietokanta/src/main/resources/db/migration/V1_1133__.sql @@ -0,0 +1,4 @@ +-- Kustannussuunnitelman johto ja hallintokorvaukset vaativat toimenkuvat '2. työnjohtaja' ja '3. työnjohtaja'. +-- jotta niitä voidaan tallentaa kantaan. +INSERT INTO johto_ja_hallintokorvaus_toimenkuva (toimenkuva) VALUES ('2. työnjohtaja'); +INSERT INTO johto_ja_hallintokorvaus_toimenkuva (toimenkuva) VALUES ('3. työnjohtaja'); From 67ecbb29aa16b11bd9f44935186e5739bc8bb707 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Wed, 11 Sep 2024 11:04:10 +0300 Subject: [PATCH 14/43] Mahdollista 2024 urakoille erilaiset toimenkuvat urakan alkuvuoden perusteella --- .../suunnittelu/mhu_kustannussuunnitelma.cljs | 40 +++++++++++++++++-- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs b/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs index 31866c2d6d4..d047d0dfd3b 100644 --- a/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs +++ b/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs @@ -33,6 +33,12 @@ (bs/vuosikohtaiset-toimenkuvat? (pvm/vuosi alkupvm)) false))) +(defn post-2024? [] + (let [alkupvm (-> @tiedot/yleiset :urakka :alkupvm)] + (if (>= (pvm/vuosi alkupvm) 2024) + true + false))) + ;; Tuck e! (def ^{:dynamic true :doc "Käytännössä modaalin nappeja varten. Eli, jos tuckin process-event:issä käsitellään @@ -331,7 +337,27 @@ {:toimenkuva "hankintavastaava" :kk-v 12 :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 6 :versio 2} {:toimenkuva "harjoittelija" :kk-v 12 - :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 7 :versio 2}]) + :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 7 :versio 2} + ;; 2024 eteenpäin alkavien versio datasta + {:toimenkuva "valmistelukausi ennen urakka-ajan alkua" :kk-v 1 + :maksukausi nil :hoitokaudet #{0} :jarjestys 1 :versio 3} + {:toimenkuva "vastuunalainen työnjohtaja" :kk-v 12 + :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 2 :versio 3} + {:toimenkuva "2. työnjohtaja" :kk-v 12 + :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 3 :versio 3} + {:toimenkuva "3. työnjohtaja" :kk-v 12 + :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 4 :versio 3} + {:toimenkuva "viherhoidosta vastaava henkilö" :kk-v 12 + :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 5 :versio 3} + ;; Hankintavastaava poistetaan 2024 urakoilta. Se on ollut käytössä virallisesti vain 19-20 urakoissa, mutta + ;; sinne on merkattu paljon suunniteltuja kustannuksia, joten se on jätetty mukaan. + ;; Poistetaan se kuitenkin nyt -24 ja myöhemmin alkavilta urakoilta + #_ {:toimenkuva "hankintavastaava" :kk-v 12 + :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 6 :versio 3} + {:toimenkuva "harjoittelija" :kk-v 12 + :maksukausi :molemmat :hoitokaudet (into #{} (range 1 6)) :jarjestys 7 :versio 3} + + ]) (defn pohjadatan-versio [] @@ -343,12 +369,19 @@ (not (post-2022?)) (= 1 (:versio %)) + ;; Järjestys täytyy olla näin, koska post2022 palauttaa kanssa true + (post-2024?) + (= 3 (:versio %)) + (post-2022?) (= 2 (:versio %)) + :else - true))] - (into [] vuosifiltteri johto-ja-hallintokorvaukset-pohjadata))) + true)) + data (into [] vuosifiltteri johto-ja-hallintokorvaukset-pohjadata) + _ (js/console.log "pohjadatan-versio" (pr-str data))] + data)) (defn aakkosta [sana] (get {"kesakausi" "kesäkausi" @@ -2590,6 +2623,7 @@ ^{:key toimenkuva} [:li (str toimenkuva)]))]])) jh-korvaukset (jh-korvaukset-vastauksesta vastaus pohjadata) + _ (js/console.log "jh-korvaukset vastaukset: " (pr-str jh-korvaukset)) ;; -- App-tila -- app (reduce (fn [app jarjestysnumero] (let [nimi (jh-omienrivien-nimi jarjestysnumero) From ea579b4b5263eef01fdfe9380e70448951de5ab2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Wed, 11 Sep 2024 13:12:18 +0300 Subject: [PATCH 15/43] =?UTF-8?q?P=C3=A4ivit=C3=A4=20jo=20mahdollisesti=20?= =?UTF-8?q?sy=C3=B6tetyt=20summat=20oikeille=20toimenkuville?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/V1_1133__.sql | 51 ++++++++++++++++++- 1 file changed, 49 insertions(+), 2 deletions(-) diff --git a/tietokanta/src/main/resources/db/migration/V1_1133__.sql b/tietokanta/src/main/resources/db/migration/V1_1133__.sql index fe8cb36f00a..f7b8f26287f 100644 --- a/tietokanta/src/main/resources/db/migration/V1_1133__.sql +++ b/tietokanta/src/main/resources/db/migration/V1_1133__.sql @@ -1,4 +1,51 @@ -- Kustannussuunnitelman johto ja hallintokorvaukset vaativat toimenkuvat '2. työnjohtaja' ja '3. työnjohtaja'. -- jotta niitä voidaan tallentaa kantaan. -INSERT INTO johto_ja_hallintokorvaus_toimenkuva (toimenkuva) VALUES ('2. työnjohtaja'); -INSERT INTO johto_ja_hallintokorvaus_toimenkuva (toimenkuva) VALUES ('3. työnjohtaja'); +INSERT INTO johto_ja_hallintokorvaus_toimenkuva (toimenkuva) +VALUES ('2. työnjohtaja'); +INSERT INTO johto_ja_hallintokorvaus_toimenkuva (toimenkuva) +VALUES ('3. työnjohtaja'); + +-- Koska on mahdollista, että osa urakoista on jo laittanut suunniteltuja arvoja +-- "päätoiminen apulainen" ja "apulainen/työnjohtaja" toimenkuville, niin siirretään ne. +DO +$$ + DECLARE + toimenkuva_paatoiminen_id INTEGER; + toimenkuva_apulainen_id INTEGER; + toimenkuva_tyonjohtaja2_id INTEGER; + toimenkuva_tyonjohtaja3_id INTEGER; + ur RECORD; + + BEGIN + SELECT id + INTO toimenkuva_paatoiminen_id + FROM johto_ja_hallintokorvaus_toimenkuva + WHERE toimenkuva = 'päätoiminen apulainen'; + SELECT id + INTO toimenkuva_apulainen_id + FROM johto_ja_hallintokorvaus_toimenkuva + WHERE toimenkuva = 'apulainen/työnjohtaja'; + SELECT id + INTO toimenkuva_tyonjohtaja2_id + FROM johto_ja_hallintokorvaus_toimenkuva + WHERE toimenkuva = '2. työnjohtaja'; + SELECT id + INTO toimenkuva_tyonjohtaja3_id + FROM johto_ja_hallintokorvaus_toimenkuva + WHERE toimenkuva = '3. työnjohtaja'; + + -- Haetaan 2024 alkavat MH-urakat ja tehdään muutos vain heille + FOR ur IN SELECT id FROM urakka WHERE EXTRACT(YEAR FROM alkupvm) = 2024 AND tyyppi = 'teiden-hoito' + LOOP + UPDATE johto_ja_hallintokorvaus + SET "toimenkuva-id" = toimenkuva_tyonjohtaja2_id + WHERE "toimenkuva-id" = toimenkuva_paatoiminen_id + AND "urakka-id" = ur.id; + UPDATE johto_ja_hallintokorvaus + SET "toimenkuva-id" = toimenkuva_tyonjohtaja3_id + WHERE "toimenkuva-id" = toimenkuva_apulainen_id + AND "urakka-id" = ur.id; + + END LOOP; + END +$$; From 867f1d01618fb69d121cef4fc4967f82f7f2d779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Thu, 12 Sep 2024 14:03:33 +0300 Subject: [PATCH 16/43] Poista turha logitus --- .../tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs b/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs index d047d0dfd3b..dfd12582427 100644 --- a/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs +++ b/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs @@ -379,8 +379,7 @@ :else true)) - data (into [] vuosifiltteri johto-ja-hallintokorvaukset-pohjadata) - _ (js/console.log "pohjadatan-versio" (pr-str data))] + data (into [] vuosifiltteri johto-ja-hallintokorvaukset-pohjadata)] data)) (defn aakkosta [sana] From d9a5d077ffff2e8889b933ce6244a09f0b960a0d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Thu, 12 Sep 2024 14:07:39 +0300 Subject: [PATCH 17/43] Cypress testit 2024 alkaville urakoille kustannusten seurannan johto ja hallintokorvauksiin --- cypress/e2e/mhu_kustannussuunnitelma-24.cy.js | 165 ++++++++++++++++++ 1 file changed, 165 insertions(+) create mode 100644 cypress/e2e/mhu_kustannussuunnitelma-24.cy.js diff --git a/cypress/e2e/mhu_kustannussuunnitelma-24.cy.js b/cypress/e2e/mhu_kustannussuunnitelma-24.cy.js new file mode 100644 index 00000000000..618ee9ef827 --- /dev/null +++ b/cypress/e2e/mhu_kustannussuunnitelma-24.cy.js @@ -0,0 +1,165 @@ +import {avaaKustannussuunnittelu} from "../support/kustannussuunnitelmaFns.js"; +import * as ks from "../support/kustannussuunnitelmaFns.js"; +import {kuluvaHoitokausiAlkuvuosi} from "../support/apurit"; + +const indeksit = []; + +function alustaSuomussalmenUrakka() { + ks.alustaKanta('POP MHU Suomussalmi 2024-2029'); +} + +describe('Johto- & Hallintokorvaukset, 2024->', () => { + before(function () { + alustaSuomussalmenUrakka(); + avaaKustannussuunnittelu('POP MHU Suomussalmi 2024-2029', 'Pohjois-Pohjanmaa', indeksit); + }) + + describe('Vakiotoimenkuvat', () => { + it('Vakiotoimenkuvat ovat oikein', () => { + cy.intercept('POST', '_/tallenna-budjettitavoite').as('tallenna-budjettitavoite'); + cy.intercept('POST', '_/tallenna-johto-ja-hallintokorvaukset').as('tallenna-jhk') + + // Varmistetaan, että vuonna 2024 alkavilla urakoilla on kaikki niille määritellyt toimenkuvat + cy.get('#toimenkuvat-taulukko').contains('Valmistelukausi ennen urakka-ajan alkua'); + cy.get('#toimenkuvat-taulukko').contains('Vastuunalainen työnjohtaja'); + cy.get('#toimenkuvat-taulukko').contains('2. työnjohtaja'); + cy.get('#toimenkuvat-taulukko').contains('3. työnjohtaja'); + cy.get('#toimenkuvat-taulukko').contains('Viherhoidosta vastaava henkilö'); + cy.get('#toimenkuvat-taulukko').contains('Harjoittelija'); + }) + + it('Vakiotoimenkuvien summia voi syöttää kuukausille erikseen', () => { + cy.get('#toimenkuvat-taulukko') + .contains('2. työnjohtaja') + .next().click() + cy.get('#toimenkuvat-taulukko') + .contains('2. työnjohtaja') + .parent() + .next() + .contains('Suunnittele maksuerät kuukausittain') + .click() + cy.get('#toimenkuvat-taulukko') + .contains('2. työnjohtaja') + .parent() + .next() + .contains('Lokakuu 2024') + .next() + .find('input') + .clear() + .type('100') + .blur() + cy.intercept('POST', '_/tallenna-budjettitavoite') + .as('tallenna-budjettitavoite'); + cy.intercept('POST', '_/tallenna-johto-ja-hallintokorvaukset') + .as('tallenna-jhk') + cy.wait('@tallenna-jhk') + .its('response.statusCode') + .should('equal', 200) + cy.wait('@tallenna-budjettitavoite') + .its('response.statusCode') + .should('equal', 200) + }) + }) + + describe('Omat toimenkuvat', () => { + it('Omien toimenkuvien nimet voi vaihtaa', () => { + cy.intercept('POST', '_/tallenna-toimenkuva').as('tallenna-toimenkuva'); + + cy.get('#toimenkuvat-taulukko') + .contains('Harjoittelija') + .parent() + .next().next() + .find('input') + .first() + .clear() + .type('4. työnjohtaja') + .blur() + cy.get('#toimenkuvat-taulukko') + .contains('Harjoittelija') + .parent() + .next().next() + .next().next() + .find('input') + .first() + .clear() + .type('5. työnjohtaja') + .blur() + + cy.wait('@tallenna-toimenkuva') + .its('response.statusCode').should('equal', 200) + }) + it('Omien toimenkuvien vuosisummat voi syöttää', () => { + cy.intercept('POST', '_/tallenna-toimenkuva').as('tallenna-toimenkuva'); + cy.intercept('POST', '_/tallenna-budjettitavoite').as('tallenna-budjettitavoite'); + cy.intercept('POST', '_/tallenna-johto-ja-hallintokorvaukset').as('tallenna-jhk') + + cy.get('#toimenkuvat-taulukko') + .contains('Harjoittelija') + .parent() + .next().next() + .find('td') + .first() + .next().next() + .find('input') + .clear() + .type('1200') + .blur() + cy.get('#toimenkuvat-taulukko') + .contains('Harjoittelija') + .parent() + .next().next() + .next().next() + .find('td') + .first() + .next().next() + .find('input') + .clear() + .type('1200') + .blur() + + cy.wait('@tallenna-toimenkuva') + .its('response.statusCode').should('equal', 200) + cy.wait('@tallenna-jhk') + .its('response.statusCode').should('equal', 200) + cy.wait('@tallenna-budjettitavoite') + .its('response.statusCode').should('equal', 200) + }) + it('Omien toimenkuvien vuosisummia voi muokata', () => { + cy.intercept('POST', '_/tallenna-toimenkuva').as('tallenna-toimenkuva'); + cy.intercept('POST', '_/tallenna-budjettitavoite').as('tallenna-budjettitavoite'); + cy.intercept('POST', '_/tallenna-johto-ja-hallintokorvaukset').as('tallenna-jhk') + + cy.get('#toimenkuvat-taulukko') + .contains('Harjoittelija') + .parent() + .next().next() + .find('td') + .first() + .next().next() + .find('input') + .clear() + .type('1400') + .blur() + cy.get('#toimenkuvat-taulukko') + .contains('Harjoittelija') + .parent() + .next().next() + .next().next() + .find('td') + .first() + .next().next() + .find('input') + .clear() + .type('1400') + .blur() + + cy.wait('@tallenna-toimenkuva') + .its('response.statusCode').should('equal', 200) + cy.wait('@tallenna-jhk') + .its('response.statusCode').should('equal', 200) + cy.wait('@tallenna-budjettitavoite') + .its('response.statusCode').should('equal', 200) + }) + }) + +}) From ae3d84794702ab50ce3bdb957756c3108be8e83d Mon Sep 17 00:00:00 2001 From: Maarit Laine Date: Fri, 13 Sep 2024 08:21:29 +0300 Subject: [PATCH 18/43] =?UTF-8?q?K=C3=A4sittele=20p=C3=A4=C3=A4llystystyyp?= =?UTF-8?q?pisen=C3=A4=20jos=20tloik=20l=C3=A4hett=C3=A4=C3=A4=20tyypin=20?= =?UTF-8?q?paikkaus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clj/harja/kyselyt/urakat.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/clj/harja/kyselyt/urakat.sql b/src/clj/harja/kyselyt/urakat.sql index 04c78cacec5..771340b973f 100644 --- a/src/clj/harja/kyselyt/urakat.sql +++ b/src/clj/harja/kyselyt/urakat.sql @@ -793,6 +793,10 @@ FROM (SELECT u.id as id, (u.tyyppi IN ('hoito', 'teiden-hoito') AND (u.alkupvm IS NULL OR u.alkupvm + interval '12 hour' <= current_timestamp) AND (u.loppupvm IS NULL OR u.loppupvm + interval '36 hour' >= current_timestamp)) + WHEN (:urakkatyyppi = 'paikkaus') THEN -- T-LOIK käyttää urakkatyyppiä paikkaus. Sampossa ja Harjassa urakkatyyppi on paallystys, sopimustyyppi on mpu eli maanteiden paikkausurakka. + (u.tyyppi = 'paallystys' :: urakkatyyppi + AND (u.alkupvm IS NULL OR u.alkupvm <= current_date) + AND (u.loppupvm IS NULL OR u.loppupvm >= current_date)) ELSE (u.tyyppi = :urakkatyyppi :: urakkatyyppi AND (u.alkupvm IS NULL OR u.alkupvm <= current_date) AND (u.loppupvm IS NULL OR u.loppupvm >= current_date)) From 0eeb6109ced3171fd001753ed59468a864483cf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Mon, 16 Sep 2024 07:46:11 +0300 Subject: [PATCH 19/43] Poista turha logitus --- .../tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs b/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs index dfd12582427..44d6110e273 100644 --- a/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs +++ b/src/cljs/harja/tiedot/urakka/suunnittelu/mhu_kustannussuunnitelma.cljs @@ -2622,7 +2622,7 @@ ^{:key toimenkuva} [:li (str toimenkuva)]))]])) jh-korvaukset (jh-korvaukset-vastauksesta vastaus pohjadata) - _ (js/console.log "jh-korvaukset vastaukset: " (pr-str jh-korvaukset)) + ;; -- App-tila -- app (reduce (fn [app jarjestysnumero] (let [nimi (jh-omienrivien-nimi jarjestysnumero) From 2ce5c3866371ba72fb02e63cdb39c6195fdc6257 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Tue, 17 Sep 2024 07:56:36 +0300 Subject: [PATCH 20/43] =?UTF-8?q?Korjataan=20viel=C3=A4=20teht=C3=A4v?= =?UTF-8?q?=C3=A4ryhm=C3=A4n=20nimi=20kaikkiin=20ymp=C3=A4rist=C3=B6ihin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tietokanta/src/main/resources/db/migration/V1_1133__.sql | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tietokanta/src/main/resources/db/migration/V1_1133__.sql b/tietokanta/src/main/resources/db/migration/V1_1133__.sql index f7b8f26287f..d810ef7762b 100644 --- a/tietokanta/src/main/resources/db/migration/V1_1133__.sql +++ b/tietokanta/src/main/resources/db/migration/V1_1133__.sql @@ -49,3 +49,7 @@ $$ END LOOP; END $$; + +-- Varmistetaan, että tehtäväryhmä on oikean niminen kaikissa ympäristöissä +UPDATE tehtavaryhma set nimi = 'Päällysteiden paikkaus, muut työt (Y8)' +where nimi = 'Päällysteiden paikkaus, muut työt (Y)'; From 141c67dd8ff4be37de5d2d7537dd10ffacd31171 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Tue, 17 Sep 2024 07:57:35 +0300 Subject: [PATCH 21/43] Poista turha import --- cypress/e2e/mhu_kustannussuunnitelma-24.cy.js | 1 - 1 file changed, 1 deletion(-) diff --git a/cypress/e2e/mhu_kustannussuunnitelma-24.cy.js b/cypress/e2e/mhu_kustannussuunnitelma-24.cy.js index 618ee9ef827..93abc5c9360 100644 --- a/cypress/e2e/mhu_kustannussuunnitelma-24.cy.js +++ b/cypress/e2e/mhu_kustannussuunnitelma-24.cy.js @@ -1,6 +1,5 @@ import {avaaKustannussuunnittelu} from "../support/kustannussuunnitelmaFns.js"; import * as ks from "../support/kustannussuunnitelmaFns.js"; -import {kuluvaHoitokausiAlkuvuosi} from "../support/apurit"; const indeksit = []; From aa39d7b43b0e4a14edee5d57b5bb840a625a6eb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Tue, 17 Sep 2024 08:11:21 +0300 Subject: [PATCH 22/43] =?UTF-8?q?P=C3=A4ivit=C3=A4=20teht=C3=A4v=C3=A4ryhm?= =?UTF-8?q?=C3=A4n=20nimi=20testeihin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../harja/palvelin/raportointi/kulut_tehtavaryhmittain_test.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/clj/harja/palvelin/raportointi/kulut_tehtavaryhmittain_test.clj b/test/clj/harja/palvelin/raportointi/kulut_tehtavaryhmittain_test.clj index 683d209b437..9abcdab8d63 100644 --- a/test/clj/harja/palvelin/raportointi/kulut_tehtavaryhmittain_test.clj +++ b/test/clj/harja/palvelin/raportointi/kulut_tehtavaryhmittain_test.clj @@ -47,7 +47,7 @@ (list "Nurmetukset ja muut vihertyöt (N)" 222.22M 0) (list "Kuivatusjärjestelmät (K)" 2222.22M 0) (list "Kaiteet, aidat ja kivetykset (U)" 0 0) - (list "Päällysteiden paikkaus, muut työt (Y)" 0 0) + (list "Päällysteiden paikkaus, muut työt (Y8)" 0 0) (list "Kuumapäällyste (Y1)" 11001.94M 5500.40M) (list "KT-Valu (Y3)" 0 0) (list "Kylmäpäällyste (Y2)" 0 0) From 78ffbb160e174200d44f701b734fda1d171ad366 Mon Sep 17 00:00:00 2001 From: Mari Korkka Date: Mon, 2 Sep 2024 08:04:13 +0300 Subject: [PATCH 23/43] =?UTF-8?q?HARJA-673=20Lis=C3=A4=C3=A4=20n=C3=A4pp?= =?UTF-8?q?=C3=A4imist=C3=B6k=C3=A4ytt=C3=B6=20datepickeriin?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/ui/checkbox.cljs | 3 +- src/cljs/harja/ui/dom.cljs | 10 ++- src/cljs/harja/ui/kentat.cljs | 47 ++++++---- src/cljs/harja/ui/pvm.cljs | 146 ++++++++++++++++++++++++-------- 4 files changed, 153 insertions(+), 53 deletions(-) diff --git a/src/cljs/harja/ui/checkbox.cljs b/src/cljs/harja/ui/checkbox.cljs index 6f75c3ea048..f2291c3f382 100644 --- a/src/cljs/harja/ui/checkbox.cljs +++ b/src/cljs/harja/ui/checkbox.cljs @@ -1,6 +1,7 @@ (ns harja.ui.checkbox (:require [reagent.core :refer [atom]] [harja.loki :refer [log tarkkaile!]] + [harja.ui.dom :as dom] [cljs.core.async :refer [luokka {:valittu "harja-checkbox-valittu" [:div.harja-checkbox-column [:div.harja-checkbox-laatikko {:class (checkbox-tila->luokka tila) :tabIndex "0" - :on-key-down #(when (= 32 (-> % .-keyCode)) + :on-key-down #(when (dom/valilyonti? %) (vaihda-tila %))} [:div.harja-checkbox-laatikko-sisalto (when (= :valittu @tila-atom) diff --git a/src/cljs/harja/ui/dom.cljs b/src/cljs/harja/ui/dom.cljs index 575c2b2c0f1..de18a61d193 100644 --- a/src/cljs/harja/ui/dom.cljs +++ b/src/cljs/harja/ui/dom.cljs @@ -78,7 +78,15 @@ ie-versio (maarita-ie-versio-user-agentista ua)] (and (integer? ie-versio) (<= 10 ie-versio)))) -(defn enter-nappain? [event] (= 13 (.-keyCode event))) +(defn enter-nappain? [event] (= "Enter" (-> event .-key))) +(defn tab+shift-nappaimet? [event] (and (= "Tab" (-> event .-key)) (-> event .-shiftKey))) +(defn tab-nappain-ilman-shiftia? [event] (and (= "Tab" (-> event .-key)) (not (-> event .-shiftKey)))) +(defn esc-nappain? [event] (= "Escape" (-> event .-key))) +(defn nuoli-oikealle? [event] (= "ArrowRight" (-> event .-key))) +(defn nuoli-vasemmalle? [event] (= "ArrowLeft" (-> event .-key))) +(defn nuoli-ylos? [event] (= "ArrowUp" (-> event .-key))) +(defn nuoli-alas? [event] (= "ArrowDown" (-> event .-key))) +(defn valilyonti? [event] (= " " (-> event .-key))) (defonce korkeus (r/atom (-> js/window .-innerHeight))) (defonce leveys (r/atom (-> js/window .-innerWidth))) diff --git a/src/cljs/harja/ui/kentat.cljs b/src/cljs/harja/ui/kentat.cljs index 9086aa842fc..8dfbaea9c5e 100644 --- a/src/cljs/harja/ui/kentat.cljs +++ b/src/cljs/harja/ui/kentat.cljs @@ -3,6 +3,7 @@ (:require [reagent.core :refer [atom] :as r] [reagent.ratom :as ratom] [harja.pvm :as pvm] + [harja.ui.dom :as dom] [harja.ui.pvm :as pvm-valinta] [harja.ui.protokollat :refer [hae]] [harja.ui.komponentti :as komp] @@ -1113,6 +1114,7 @@ (pvm/->pvm nykyinen-teksti) nykyinen-pvm (pvm-tyhjana rivi)) + elementin-id (str (gensym "pvm-input")) input-komponentti [:input {:class (yleiset/luokat (when-not (or kentan-tyylit vayla-tyyli?) "pvm") (cond kentan-tyylit (apply str kentan-tyylit) @@ -1122,12 +1124,14 @@ :value nykyinen-teksti :on-focus #(do (when on-focus (on-focus)) (reset! auki true) %) :on-change #(muuta! data (-> % .-target .-value)) - ;; keycode 9 = Tab. Suljetaan datepicker kun painetaan tabia. - :on-key-down #(when (or (= key-code-tab (-> % .-keyCode)) (= key-code-tab (-> % .-which)) - (= key-code-enter (-> % .-keyCode)) (= key-code-enter (-> % .-which))) - (teksti-paivamaaraksi! validoi data nykyinen-teksti) - (reset! auki false) - true) + ;; Suljetaan datepicker kun painetaan tab + shift tai esc. Enterillä datepickerin saa auki/kiinni. + :on-key-down #(do + (when (or (dom/tab+shift-nappaimet? %) (dom/esc-nappain? %)) + (teksti-paivamaaraksi! validoi data nykyinen-teksti) + (reset! auki false)) + (when (dom/enter-nappain? %) + (teksti-paivamaaraksi! validoi data nykyinen-teksti) + (reset! auki (not @auki)))) :on-blur #(let [arvo (.. % -target -value) pvm (pvm/->pvm arvo)] (when on-blur @@ -1135,7 +1139,8 @@ (if (and pvm (not (validoi pvm))) (do (muuta-data! nil) (reset! teksti "")) - (teksti-paivamaaraksi! validoi data arvo)))}]] + (teksti-paivamaaraksi! validoi data arvo))) + :id elementin-id}]] (swap! vanha-data assoc :data nykyinen-pvm :muokattu-tassa? false) [:span.pvm-kentta {:on-click #(do (reset! auki true) nil) @@ -1151,7 +1156,11 @@ :pvm naytettava-pvm :pakota-suunta pakota-suunta :valittava?-fn (when validoi? - validoi)}])]))}))) + validoi) + :sulje-kalenteri #(do + (some-> js/document (.getElementById elementin-id) .focus) + (reset! auki false)) + :input-id elementin-id}])]))}))) (defmethod nayta-arvo :pvm [{:keys [jos-tyhja]} data] [:span (if-let [p @data] @@ -1262,7 +1271,8 @@ naytettava-pvm (or (pvm/->pvm nykyinen-pvm-teksti) nykyinen-pvm - (pvm-tyhjana rivi))] + (pvm-tyhjana rivi)) + elementin-id (str (gensym "pvm-aika-input"))] [:span.pvm-aika-kentta [:div.inline-block [:input.pvm {:class (when lomake? "form-control margin-bottom-4") @@ -1274,18 +1284,25 @@ :value nykyinen-pvm-teksti :on-focus #(do (when on-focus (on-focus)) (reset! auki true) %) :on-change #(muuta-pvm! (-> % .-target .-value)) - ;; keycode 9 = Tab. Suljetaan datepicker kun painetaan tabia. - :on-key-down #(when (or (= 9 (-> % .-keyCode)) (= 9 (-> % .-which))) - (reset! auki false) - %) - :on-blur #(do (when on-blur (on-blur %)) (koske-pvm!) (aseta! false) %)}] + ;; Suljetaan datepicker kun painetaan tab + shift tai esc. Enterillä datepickerin saa auki/kiinni. + :on-key-down #(do + (when (or (dom/tab+shift-nappaimet? %) (dom/esc-nappain? %)) + (reset! auki false)) + (when (dom/enter-nappain? %) + (reset! auki (not @auki)))) + :on-blur #(do (when on-blur (on-blur %)) (koske-pvm!) (aseta! false) %) + :id elementin-id}] (when @auki [pvm-valinta/pvm-valintakalenteri {:valitse #(do (reset! auki false) (muuta-pvm! (pvm/pvm %)) (koske-pvm!) (aseta! true)) :pvm naytettava-pvm - :pakota-suunta pakota-suunta}])] + :pakota-suunta pakota-suunta + :sulje-kalenteri #(do + (some-> js/document (.getElementById elementin-id) .focus) + (reset! auki false)) + :input-id elementin-id}])] [:div.inline-block [:input.aika-input {:class (str (when lomake? "form-control") (when (and (not (re-matches +validi-aika-regex+ diff --git a/src/cljs/harja/ui/pvm.cljs b/src/cljs/harja/ui/pvm.cljs index 6e1830e2c9d..2f948effcc3 100644 --- a/src/cljs/harja/ui/pvm.cljs +++ b/src/cljs/harja/ui/pvm.cljs @@ -94,10 +94,21 @@ (komp/dom-kuuntelija js/window EventType/SCROLL scroll-kuuntelija) - (fn [{:keys [pvm valitse style valittava?-fn vayla-tyyli?] :as optiot}] + (fn [{:keys [pvm valitse style valittava?-fn vayla-tyyli? sulje-kalenteri input-id] :as optiot}] (let [[vuosi kk] @nayta naytettava-kk (t/date-time vuosi (inc kk) 1) - naytettava-kk-paiva? #(pvm/sama-kuukausi? naytettava-kk %)] + naytettava-kk-paiva? #(pvm/sama-kuukausi? naytettava-kk %) + fokus-paiva (if pvm (t/day pvm) 1) + nayta-edellinen-kk #(swap! nayta + (fn [[vuosi kk]] + (if (= kk 0) + [(dec vuosi) 11] + [vuosi (dec kk)]))) + nayta-seuraava-kk #(swap! nayta + (fn [[vuosi kk]] + (if (= kk 11) + [(inc vuosi) 0] + [vuosi (inc kk)])))] [:table {:class (str tyyli-kalenteri) :style (merge {:display (if @sijainti-atom "table" "none") @@ -115,22 +126,33 @@ [:tr [:td.pvm-edellinen-kuukausi.klikattava {:on-click #(do (.preventDefault %) - (swap! nayta - (fn [[vuosi kk]] - (if (= kk 0) - [(dec vuosi) 11] - [vuosi (dec kk)]))) - nil)} + (nayta-edellinen-kk) + nil) + :tabIndex "0" + :on-key-down #(do + (when (dom/enter-nappain? %) + (.preventDefault %) + (nayta-edellinen-kk)) + (when (dom/tab+shift-nappaimet? %) + (.preventDefault %) + (sulje-kalenteri)) + nil)} (ikonit/livicon-chevron-left)] [:td {:col-span 5} [:span.pvm-kuukausi (nth pvm/+kuukaudet+ kk)] " " [:span.pvm-vuosi vuosi]] [:td.pvm-seuraava-kuukausi.klikattava {:on-click #(do (.preventDefault %) - (swap! nayta - (fn [[vuosi kk]] - (if (= kk 11) - [(inc vuosi) 0] - [vuosi (inc kk)]))) - nil)} + (nayta-seuraava-kk) + nil) + :tabIndex "0" + :id "seuraava-kk" + :on-key-down #(do + (when (dom/enter-nappain? %) + (.preventDefault %) + (nayta-seuraava-kk)) + (when (dom/tab-nappain-ilman-shiftia? %) + (.preventDefault %) + (r/after-render (fn [] (some-> js/document (.getElementById (str "paiva_" fokus-paiva)) .focus)))) + nil)} (ikonit/livicon-chevron-right)]] [:tr {:class tyyli-otsikkorivi} (for [paiva +paivat+] @@ -161,7 +183,38 @@ :on-click #(do (.stopPropagation %) (when valittava? (valitse paiva)) - nil)} + nil) + :tabIndex (if (naytettava-kk-paiva? paiva) + "0") + :id (when (naytettava-kk-paiva? paiva) (str "paiva_" (t/day paiva))) + :on-key-down #(do + (.preventDefault %) + + (cond + (and (dom/enter-nappain? %) valittava?) + (do (valitse paiva) (sulje-kalenteri)) + + (dom/tab+shift-nappaimet? %) + (r/after-render (fn [] (some-> js/document (.getElementById "seuraava-kk") .focus))) + + (dom/tab-nappain-ilman-shiftia? %) + (r/after-render (fn [] (some-> js/document (.getElementById "tanaan") .focus))) + + (dom/nuoli-oikealle? %) + (r/after-render (fn [] (some-> js/document (.getElementById (str "paiva_" (inc (t/day paiva)))) .focus))) + + (dom/nuoli-vasemmalle? %) + (r/after-render (fn [] (some-> js/document (.getElementById (str "paiva_" (dec (t/day paiva)))) .focus))) + + (dom/nuoli-ylos? %) + (r/after-render (fn [] (some-> js/document (.getElementById (str "paiva_" (- (t/day paiva) 7))) .focus))) + + (dom/nuoli-alas? %) + (r/after-render (fn [] (some-> js/document (.getElementById (str "paiva_" (+ (t/day paiva) 7))) .focus))) + + :else nil) + + nil)} (t/day paiva)])])] [:tfoot.pvm-tanaan-text [:tr [:td {:colSpan 7} @@ -169,35 +222,51 @@ (.preventDefault %) (.stopPropagation %) (when (or (not (some? valittava?-fn)) - (valittava?-fn (pvm/nyt))) - (valitse (pvm/nyt))))} + (valittava?-fn (pvm/nyt))) + (valitse (pvm/nyt)))) + :tabIndex "0" + :id "tanaan" + :on-key-down #(do + (.preventDefault %) + (when (and (dom/enter-nappain? %) + (or (not (some? valittava?-fn)) + (valittava?-fn (pvm/nyt)))) + (valitse (pvm/nyt)) + (sulje-kalenteri)) + (when (dom/tab+shift-nappaimet? %) + (r/after-render (fn [] + (some-> js/document (.getElementById (if pvm + (str "paiva_" (t/day pvm)) + (str "paiva_1"))) .focus)))) + (when (dom/tab-nappain-ilman-shiftia? %) + (sulje-kalenteri)) + nil)} "Tänään"]]]]]))))) -(def ^:const -pvm-popupin-sulkevat-nappaimet - "Näppäimet, joille pvm popup suljetaan, kun focus on input-kentässä. Tab, enter ja esc." - #{9 13 27}) - (defn pvm-valintakalenteri-inputilla [_] (let [auki? (r/atom false) suora-syotto-sisalto (r/atom "")] (fn [{:keys [paivamaara valitse luokat valittava?-fn disabled sumeutus-fn placeholder]}] - (let [kiinni #(reset! % false)] + (let [kiinni #(reset! % false) + elementin-id (str (gensym "pvm-pakollinen-input"))] [:div.kalenteri-kontti - [:input {:disabled disabled - :type :text - :class (apply conj #{} (filter #(not (nil? %)) (conj luokat (when @auki? "auki")))) - :value (cond - (seq @suora-syotto-sisalto) @suora-syotto-sisalto - (not (nil? paivamaara)) (pvm/pvm paivamaara) - :else "") + [:input {:disabled disabled + :type :text + :class (apply conj #{} (filter #(not (nil? %)) (conj luokat (when @auki? "auki")))) + :value (cond + (seq @suora-syotto-sisalto) @suora-syotto-sisalto + (not (nil? paivamaara)) (pvm/pvm paivamaara) + :else "") :placeholder placeholder - :on-change #(reset! suora-syotto-sisalto (-> % .-target .-value)) - :on-click #(reset! auki? true) + :on-change #(reset! suora-syotto-sisalto (-> % .-target .-value)) + :on-click #(reset! auki? true) :on-focus #(reset! auki? true) - :on-key-down #(when (pvm-popupin-sulkevat-nappaimet (.-keyCode %)) - (kiinni auki?)) + :on-key-down #(do + (when (or (dom/tab+shift-nappaimet? %) (dom/esc-nappain? %)) + (kiinni auki?)) + (when (dom/enter-nappain? %) + (reset! auki? (not @auki?)))) :on-blur (fn [] (when (not paivamaara) (kiinni auki?)) ; jos ei ole päivämäärää määritelty, niin valintoja ei voi tehdä. droppari jää auki, kunnes koontilaskun kuukausi klikataan. tällä estetään se tilanne. (when sumeutus-fn (sumeutus-fn)) @@ -205,10 +274,15 @@ pvm-popupin-sulkevat-nappaimet (let [pvm-sisalto (pvm/->pvm @suora-syotto-sisalto)] (when (valittava?-fn pvm-sisalto) (valitse (pvm/->pvm @suora-syotto-sisalto)))) - (reset! suora-syotto-sisalto "")))}] + (reset! suora-syotto-sisalto ""))) + :id elementin-id}] (when @auki? [pvm-valintakalenteri {:valitse #(do (kiinni auki?) (valitse %)) :valittava?-fn valittava?-fn - :pvm paivamaara}])])))) + :pvm paivamaara + :sulje-kalenteri #(do + (some-> js/document (.getElementById elementin-id) .focus) + (reset! auki? false)) + :input-id elementin-id}])])))) From 52a915e0c50538f0e1454aa6ef059af2262ae129 Mon Sep 17 00:00:00 2001 From: Mari Korkka Date: Fri, 13 Sep 2024 13:48:52 +0300 Subject: [PATCH 24/43] =?UTF-8?q?HARJA-673=20Korjattu=20kalenterin=20sulke?= =?UTF-8?q?minen=20uuden=20kulun=20luomisessa,=20poistettu=20tabilla=20sii?= =?UTF-8?q?rtyminen=20disabloituun=20p=C3=A4iv=C3=A4=C3=A4n=20ja=20korjatt?= =?UTF-8?q?u=20fokus-p=C3=A4iv=C3=A4=20muissa=20kuin=20valitun=20p=C3=A4iv?= =?UTF-8?q?=C3=A4m=C3=A4=C3=A4r=C3=A4n=20kuukausissa?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/ui/pvm.cljs | 86 +++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 42 deletions(-) diff --git a/src/cljs/harja/ui/pvm.cljs b/src/cljs/harja/ui/pvm.cljs index 2f948effcc3..406bed4b736 100644 --- a/src/cljs/harja/ui/pvm.cljs +++ b/src/cljs/harja/ui/pvm.cljs @@ -98,7 +98,7 @@ (let [[vuosi kk] @nayta naytettava-kk (t/date-time vuosi (inc kk) 1) naytettava-kk-paiva? #(pvm/sama-kuukausi? naytettava-kk %) - fokus-paiva (if pvm (t/day pvm) 1) + fokus-paiva (if (and pvm (naytettava-kk-paiva? pvm)) (t/day pvm) 1) nayta-edellinen-kk #(swap! nayta (fn [[vuosi kk]] (if (= kk 0) @@ -184,9 +184,9 @@ (when valittava? (valitse paiva)) nil) - :tabIndex (if (naytettava-kk-paiva? paiva) + :tabIndex (if (and valittava? (naytettava-kk-paiva? paiva)) "0") - :id (when (naytettava-kk-paiva? paiva) (str "paiva_" (t/day paiva))) + :id (when (and valittava? (naytettava-kk-paiva? paiva)) (str "paiva_" (t/day paiva))) :on-key-down #(do (.preventDefault %) @@ -247,42 +247,44 @@ [_] (let [auki? (r/atom false) suora-syotto-sisalto (r/atom "")] - (fn [{:keys [paivamaara valitse luokat valittava?-fn disabled sumeutus-fn placeholder]}] - (let [kiinni #(reset! % false) - elementin-id (str (gensym "pvm-pakollinen-input"))] - [:div.kalenteri-kontti - [:input {:disabled disabled - :type :text - :class (apply conj #{} (filter #(not (nil? %)) (conj luokat (when @auki? "auki")))) - :value (cond - (seq @suora-syotto-sisalto) @suora-syotto-sisalto - (not (nil? paivamaara)) (pvm/pvm paivamaara) - :else "") - :placeholder placeholder - :on-change #(reset! suora-syotto-sisalto (-> % .-target .-value)) - :on-click #(reset! auki? true) - :on-focus #(reset! auki? true) - :on-key-down #(do - (when (or (dom/tab+shift-nappaimet? %) (dom/esc-nappain? %)) - (kiinni auki?)) - (when (dom/enter-nappain? %) - (reset! auki? (not @auki?)))) - :on-blur (fn [] - (when (not paivamaara) (kiinni auki?)) ; jos ei ole päivämäärää määritelty, niin valintoja ei voi tehdä. droppari jää auki, kunnes koontilaskun kuukausi klikataan. tällä estetään se tilanne. - (when sumeutus-fn (sumeutus-fn)) - (when (seq @suora-syotto-sisalto) - (let [pvm-sisalto (pvm/->pvm @suora-syotto-sisalto)] - (when (valittava?-fn pvm-sisalto) - (valitse (pvm/->pvm @suora-syotto-sisalto)))) - (reset! suora-syotto-sisalto ""))) - :id elementin-id}] - (when @auki? - [pvm-valintakalenteri {:valitse #(do - (kiinni auki?) - (valitse %)) - :valittava?-fn valittava?-fn - :pvm paivamaara - :sulje-kalenteri #(do - (some-> js/document (.getElementById elementin-id) .focus) - (reset! auki? false)) - :input-id elementin-id}])])))) + (komp/luo + (komp/klikattu-ulkopuolelle #(reset! auki? false)) + (fn [{:keys [paivamaara valitse luokat valittava?-fn disabled sumeutus-fn placeholder]}] + (let [kiinni #(reset! % false) + elementin-id (str (gensym "pvm-pakollinen-input"))] + [:div.kalenteri-kontti + [:input {:disabled disabled + :type :text + :class (apply conj #{} (filter #(not (nil? %)) (conj luokat (when @auki? "auki")))) + :value (cond + (seq @suora-syotto-sisalto) @suora-syotto-sisalto + (not (nil? paivamaara)) (pvm/pvm paivamaara) + :else "") + :placeholder placeholder + :on-change #(reset! suora-syotto-sisalto (-> % .-target .-value)) + :on-click #(reset! auki? true) + :on-focus #(reset! auki? true) + :on-key-down #(do + (when (or (dom/tab+shift-nappaimet? %) (dom/esc-nappain? %)) + (kiinni auki?)) + (when (dom/enter-nappain? %) + (reset! auki? (not @auki?)))) + :on-blur (fn [] + (when (not paivamaara) (kiinni auki?)) ; jos ei ole päivämäärää määritelty, niin valintoja ei voi tehdä. droppari jää auki, kunnes koontilaskun kuukausi klikataan. tällä estetään se tilanne. + (when sumeutus-fn (sumeutus-fn)) + (when (seq @suora-syotto-sisalto) + (let [pvm-sisalto (pvm/->pvm @suora-syotto-sisalto)] + (when (valittava?-fn pvm-sisalto) + (valitse (pvm/->pvm @suora-syotto-sisalto)))) + (reset! suora-syotto-sisalto ""))) + :id elementin-id}] + (when @auki? + [pvm-valintakalenteri {:valitse #(do + (kiinni auki?) + (valitse %)) + :valittava?-fn valittava?-fn + :pvm paivamaara + :sulje-kalenteri #(do + (some-> js/document (.getElementById elementin-id) .focus) + (reset! auki? false)) + :input-id elementin-id}])]))))) From a99583caca17ddab9e8ca1048419b3a4a9d81524 Mon Sep 17 00:00:00 2001 From: Mari Korkka Date: Mon, 16 Sep 2024 08:57:47 +0300 Subject: [PATCH 25/43] =?UTF-8?q?HARJA-673=20Korjaa=20murupolussa=20Urakka?= =?UTF-8?q?tyyppi-=20ja=20Urakoitsija-kenttien=20tab-navigoinnin=20j=C3=A4?= =?UTF-8?q?rjestys?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/views/murupolku.cljs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/cljs/harja/views/murupolku.cljs b/src/cljs/harja/views/murupolku.cljs index 9bf402f8f43..a4bcc765ac1 100644 --- a/src/cljs/harja/views/murupolku.cljs +++ b/src/cljs/harja/views/murupolku.cljs @@ -153,9 +153,10 @@ [:div.col-sm-6.murupolku-vasen [koko-maa] [hallintayksikko valinta-auki] [urakka valinta-auki]] [:div.col-sm-6.murupolku-oikea - (when-not urakoitsija? - [urakoitsija]) - [urakkatyyppi]]] + [:div + [urakkatyyppi] + (when-not urakoitsija? + [urakoitsija])]]] [:ol.murupolku [:div.col-sm-12.murupolku-vasen [koko-maa] [hallintayksikko valinta-auki] [urakka valinta-auki]]])]))))) From 7f7eee8b9203ac507ef7824e8dfe2e88505d9de6 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 09:32:14 +0300 Subject: [PATCH 26/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20lupauksien=20hallinnall?= =?UTF-8?q?e=20rooli?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- resources/roolit.xlsx | Bin 38609 -> 34135 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/resources/roolit.xlsx b/resources/roolit.xlsx index 6fa63e9e65ed0ee4efcaa42a9f94a401eb3a9ae9..9218ed995f758925c3372a9fe9a4a32be889f5ae 100644 GIT binary patch delta 23129 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�_5jyI-T>VS8WGlOkp0!3)TRH6e9o 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 a{OOEnVIVhR#+gI?e)=CJpb9Vm delta 27170 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 Date: Tue, 17 Sep 2024 09:33:00 +0300 Subject: [PATCH 27/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20mainiin=20lupauksien-ha?= =?UTF-8?q?llinta=20rajapinta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clj/harja/palvelin/main.clj | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/clj/harja/palvelin/main.clj b/src/clj/harja/palvelin/main.clj index 3d98526619c..f804db3e7ea 100644 --- a/src/clj/harja/palvelin/main.clj +++ b/src/clj/harja/palvelin/main.clj @@ -74,6 +74,7 @@ [harja.palvelin.palvelut.hallinta.urakoiden-lyhytnimet :as urakoidenlyhytnimet-hallinta] [harja.palvelin.palvelut.hallinta.tehtavat :as tehtavat-hallinta] [harja.palvelin.palvelut.hallinta.tarjoushinnat :as tarjoushinnat-hallinta] + [harja.palvelin.palvelut.hallinta.lupaukset :as lupaukset-hallinta] [harja.palvelin.palvelut.hallinta.rahavaraukset :as rahavaraukset-hallinta] [harja.palvelin.palvelut.hallinta.urakkahenkilot :as urakkahenkilot-hallinta] [harja.palvelin.palvelut.selainvirhe :as selainvirhe] @@ -811,6 +812,11 @@ (component/using (tarjoushinnat-hallinta/->TarjoushinnatHallinta) [:http-palvelin :db]) + + :lupaukset-hallinta + (component/using + (lupaukset-hallinta/->LupauksetHallinta) + [:http-palvelin :db]) :rahavaraukset-hallinta (component/using From 5875f38faf5393c4e20584bcf10d90acf26603e7 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 06:37:36 +0000 Subject: [PATCH 28/43] Update dependency lein-doo:lein-doo to v0.1.11 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 015dd0fa667..5d12734f0cc 100644 --- a/project.clj +++ b/project.clj @@ -195,7 +195,7 @@ [lein-ancient "0.6.15"] [lein-codox "0.10.8" :exclusions [org.clojure/clojure]] [lein-auto "0.1.3"] - [lein-doo "0.1.10" :exclusions [org.clojure/clojure]]] + [lein-doo "0.1.11" :exclusions [org.clojure/clojure]]] ;; Näitä cljsbuild tarvitsee testaamista varten doo:n kanssa. :cljsbuild {:builds [{:id "test" From 065b682382516e1baff8b394423544c7cb5516ae Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 09:41:13 +0300 Subject: [PATCH 29/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20lupauksien-hallinnan=20?= =?UTF-8?q?palvelin=20toteutus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clj/harja/kyselyt/lupaus_kyselyt.sql | 61 +++++++++++++++++++ .../palvelin/palvelut/hallinta/lupaukset.clj | 50 +++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 src/clj/harja/palvelin/palvelut/hallinta/lupaukset.clj diff --git a/src/clj/harja/kyselyt/lupaus_kyselyt.sql b/src/clj/harja/kyselyt/lupaus_kyselyt.sql index 90902e77720..1c43cebd988 100644 --- a/src/clj/harja/kyselyt/lupaus_kyselyt.sql +++ b/src/clj/harja/kyselyt/lupaus_kyselyt.sql @@ -222,3 +222,64 @@ SELECT lp.id, lp.pisteet, lp.kuukausi, lp.vuosi, lp."urakka-id", lp.luoja, lp.lu -- name: hae-indeksikorotus-summalle SELECT korotus FROM sanktion_indeksikorotus(:pvm::DATE, :indeksi,:maara::NUMERIC, :urakka-id::INTEGER, :sanktiolaji::sanktiolaji); + + +-- name: hae-puuttuvat-urakka-linkitykset +SELECT u.id, + u.nimi +FROM urakka u +WHERE u.tyyppi = 'teiden-hoito' + AND EXTRACT( + YEAR + FROM u.alkupvm + ) >= 2021 +EXCEPT +SELECT DISTINCT + urakka_id, + u.nimi +FROM lupausryhma_urakka lu + JOIN urakka u ON lu.urakka_id = u.id +WHERE u.tyyppi = 'teiden-hoito'; + +-- name: hae-rivin-tunnistin-selitteet +SELECT DISTINCT + lr."rivin-tunnistin-selite", + lr."urakan-alkuvuosi" +FROM lupausryhma lr +ORDER BY lr."urakan-alkuvuosi"; + +-- name: hae-kategorian-urakat +SELECT + DISTINCT + lu.urakka_id, + u.nimi +FROM + lupausryhma lr +LEFT JOIN lupausryhma_urakka lu ON + lr.id = lu.lupausryhma_id +LEFT JOIN urakka u ON + lu.urakka_id = u.id +WHERE (lr."rivin-tunnistin-selite" = :rivin-tunnistin-selite OR :rivin-tunnistin-selite::VARCHAR IS NULL) + AND lr."urakan-alkuvuosi" = :urakan-alkuvuosi; + +-- name: hae-urakan-lupaukset +-- row-fn: muunna-lupaus +SELECT + r.otsikko, + r.jarjestys AS "lupausryhma-jarjestys", + l.id AS "lupaus-id", + l.kuvaus, + l.pisteet, + l.sisalto, + l.lupaustyyppi, + l."kirjaus-kkt", + l."joustovara-kkta", + l."paatos-kk" +FROM + lupausryhma r +JOIN lupaus l ON + r.id = l."lupausryhma-id" +JOIN lupausryhma_urakka lu ON + r.id = lu."lupausryhma_id" +WHERE + lu."urakka_id" = :urakka-id diff --git a/src/clj/harja/palvelin/palvelut/hallinta/lupaukset.clj b/src/clj/harja/palvelin/palvelut/hallinta/lupaukset.clj new file mode 100644 index 00000000000..e8feeaa60d5 --- /dev/null +++ b/src/clj/harja/palvelin/palvelut/hallinta/lupaukset.clj @@ -0,0 +1,50 @@ +(ns harja.palvelin.palvelut.hallinta.lupaukset + (:require [com.stuartsierra.component :as component] + [harja.kyselyt.lupaus-kyselyt :as lupaus-kyselyt] + [harja.domain.oikeudet :as oikeudet] + [harja.palvelin.komponentit.http-palvelin :refer [julkaise-palvelu poista-palvelut]] + [taoensso.timbre :as log])) + +(defn- hae-lupausten-linkitykset [db kayttaja] + (oikeudet/vaadi-lukuoikeus oikeudet/hallinta-lupaukset kayttaja) + {:puuttuvat-urakat (lupaus-kyselyt/hae-puuttuvat-urakka-linkitykset db)}) + + +(defn- hae-rivin-tunnistin-selitteet [db kayttaja] + (oikeudet/vaadi-lukuoikeus oikeudet/hallinta-lupaukset kayttaja) + {:rivin-tunnistin-selitteet (lupaus-kyselyt/hae-rivin-tunnistin-selitteet db)}) + +(defn- hae-kategorian-urakat [db kayttaja {:keys [kategoria]}] + (oikeudet/vaadi-lukuoikeus oikeudet/hallinta-lupaukset kayttaja) + (log/debug "hae-kategorian-urakat :: kategoria" kategoria) + {:kategorian-urakat (lupaus-kyselyt/hae-kategorian-urakat db {:rivin-tunnistin-selite (:rivin-tunnistin-selite kategoria) + :urakan-alkuvuosi (:urakan-alkuvuosi kategoria)})}) + +(defn- hae-urakan-lupaukset [db kayttaja {:keys [urakka-id]}] + (oikeudet/vaadi-lukuoikeus oikeudet/hallinta-lupaukset kayttaja) + (log/debug "hae-urakan-lupaukset :: urakka-id " urakka-id) + {:urakan-lupaukset (lupaus-kyselyt/hae-urakan-lupaukset db {:urakka-id urakka-id})}) + +(defrecord LupauksetHallinta [] + component/Lifecycle + (start [{:keys [http-palvelin db] :as this}] + (julkaise-palvelu http-palvelin :hae-lupausten-linkitykset + (fn [kayttaja _tiedot] + (hae-lupausten-linkitykset db kayttaja))) + (julkaise-palvelu http-palvelin :hae-rivin-tunnistin-selitteet + (fn [kayttaja _tiedot] + (hae-rivin-tunnistin-selitteet db kayttaja))) + (julkaise-palvelu http-palvelin :hae-kategorian-urakat + (fn [kayttaja tiedot] + (hae-kategorian-urakat db kayttaja tiedot))) + (julkaise-palvelu http-palvelin :hae-urakan-lupaukset + (fn [kayttaja tiedot] + (hae-urakan-lupaukset db kayttaja tiedot))) + this) + (stop [{:keys [http-palvelin] :as this}] + (poista-palvelut http-palvelin + :hae-lupausten-linkitykset + :hae-rivin-tunnistin-selitteet + :hae-kategorian-urakat + :hae-urakan-lupaukset) + this)) \ No newline at end of file From 64d7ec91a768f4d9758b5155af771f0bd7c66f83 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 09:43:05 +0300 Subject: [PATCH 30/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20navigointi=20lupauksien?= =?UTF-8?q?=20hallintaan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/views/hallinta.cljs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/cljs/harja/views/hallinta.cljs b/src/cljs/harja/views/hallinta.cljs index 7a1bd63839f..fe83afb9103 100644 --- a/src/cljs/harja/views/hallinta.cljs +++ b/src/cljs/harja/views/hallinta.cljs @@ -24,6 +24,7 @@ [harja.views.hallinta.urakkatiedot.tehtava-nakyma :as tehtava-nakyma] [harja.views.hallinta.tarjoushinnat :as tarjoushinnat] [harja.views.hallinta.rahavaraukset :as rahavaraukset] + [harja.views.hallinta.urakkatiedot.lupaukset :as lupaukset] [harja.views.hallinta.rahavarausten-tehtavat :as rahavarausten-tehtavat] [harja.views.hallinta.urakkahenkilot :as urakkahenkilot] [harja.tiedot.istunto :as istunto])) @@ -87,8 +88,14 @@ :mhu-tarjoushinnat (when (oikeudet/hallinta-tarjoushinnat) ^{:key "mhu-tarjoushinnat"} - [tarjoushinnat/tarjoushinnat]) - + [tarjoushinnat/tarjoushinnat]) + + "Lupaukset" + :lupaukset + (when (oikeudet/hallinta-lupaukset) + ^{:key "lupaukset"} + [lupaukset/lupaukset]) + "Rahavaraukset" :rahavaraukset (when (oikeudet/hallinta-rahavaraukset) From fef3d90549da8961709026bd0969851b06c5df78 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 09:47:07 +0300 Subject: [PATCH 31/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20lupauksien=20hallinnall?= =?UTF-8?q?e=20frontend=20toteutus?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/tiedot/hallinta/lupaukset.cljs | 110 ++++++++++++++++++ .../hallinta/urakkatiedot/lupaukset.cljs | 109 +++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 src/cljs/harja/tiedot/hallinta/lupaukset.cljs create mode 100644 src/cljs/harja/views/hallinta/urakkatiedot/lupaukset.cljs diff --git a/src/cljs/harja/tiedot/hallinta/lupaukset.cljs b/src/cljs/harja/tiedot/hallinta/lupaukset.cljs new file mode 100644 index 00000000000..4bc9b206ba1 --- /dev/null +++ b/src/cljs/harja/tiedot/hallinta/lupaukset.cljs @@ -0,0 +1,110 @@ +(ns harja.tiedot.hallinta.lupaukset + (:require [cljs.core.async :refer [>! HaeLupaustenLinkityksetOnnistui + :epaonnistui ->HaeLupaustenLinkityksetEpaonnistui + :paasta-virhe-lapi? true}) + app) + + HaeLupaustenLinkityksetOnnistui + (process-event [{:keys [vastaus]} app] + (assoc app :lupausten-linkitykset vastaus)) + + HaeLupaustenLinkityksetEpaonnistui + (process-event [{:keys [vastaus]} app] + (viesti/nayta-toast! "Urakoiden linkityksien haku epäonnistui" :varoitus) + app) + + HaeLupaustenKategoriat + (process-event [_ app] + (tuck-apurit/post! :hae-rivin-tunnistin-selitteet + {} + {:onnistui ->HaeLupaustenKategoriatOnnistui + :epaonnistui ->HaeLupaustenKategoriatEpaonnistui + :paasta-virhe-lapi? true}) + app) + + HaeLupaustenKategoriatOnnistui + (process-event [{:keys [vastaus]} app] + (assoc app :lupausten-kategoriat vastaus)) + + HaeLupaustenKategoriatEpaonnistui + (process-event [{:keys [vastaus]} app] + (viesti/nayta-toast! "Urakoiden kategorioiden haku epäonnistui" :varoitus) + app) + + ValitseKategoria + (process-event [{:keys [kategoria]} app] + (tuck-apurit/post! :hae-kategorian-urakat + {:kategoria kategoria} + {:onnistui ->ValitseKategoriaOnnistui + :epaonnistui ->ValitseKategoriaEpaonnistui + :paasta-virhe-lapi? true}) + (-> app + (assoc :haku-kaynnissa? true) + (assoc :valittu-kategoria kategoria))) + + ValitseKategoriaOnnistui + (process-event [{:keys [vastaus]} app] + (-> app + (assoc :haku-kaynnissa? false) + (assoc :kategorian-urakat vastaus))) + + ValitseKategoriaEpaonnistui + (process-event [{:keys [vastaus]} app] + (viesti/nayta-toast! "Urakoiden haku epäonnistui" :varoitus) + (assoc app :haku-kaynnissa? false)) + + ValitseUrakka + (process-event [{:keys [urakka-id]} app] + (tuck-apurit/post! :hae-urakan-lupaukset + {:urakka-id (:urakka_id urakka-id)} + {:onnistui ->ValitseUrakkaOnnistui + :epaonnistui ->ValitseUrakkaEpaonnistui + :paasta-virhe-lapi? true}) + (-> app + (assoc :haku-kaynnissa? true) + (assoc :valittu-urakka urakka-id))) + + ValitseUrakkaOnnistui + (process-event [{:keys [vastaus]} app] + (-> app + (assoc :haku-kaynnissa? false) + (assoc :urakan-lupaukset vastaus))) + + ValitseUrakkaEpaonnistui + (process-event [{:keys [vastaus]} app] + (viesti/nayta-toast! "Lupausten haku epäonnistui" :varoitus) + (assoc app :haku-kaynnissa? false))) \ No newline at end of file diff --git a/src/cljs/harja/views/hallinta/urakkatiedot/lupaukset.cljs b/src/cljs/harja/views/hallinta/urakkatiedot/lupaukset.cljs new file mode 100644 index 00000000000..fc180a4ef39 --- /dev/null +++ b/src/cljs/harja/views/hallinta/urakkatiedot/lupaukset.cljs @@ -0,0 +1,109 @@ +(ns harja.views.hallinta.urakkatiedot.lupaukset + "Lupauksiin liittyvää hallinnointia esim. linkityksiä urakkaan" + (:require [tuck.core :refer [tuck send-value! send-async!]] + [harja.tyokalut.tuck :as tuck-apurit] + [harja.ui.komponentti :as komp] + [harja.ui.grid :as grid] + [harja.ui.yleiset :refer [ajax-loader-pieni] :as yleiset] + [harja.tiedot.hallinta.lupaukset :as tiedot] + [harja.ui.debug :as debug])) + + +(defn lupaukset* [e! app] + (komp/luo + (komp/sisaan #(do (e! (tiedot/->HaeLupaustenLinkitykset)) + (e! (tiedot/->HaeLupaustenKategoriat)))) + (fn [e! {:keys [lupausten-linkitykset lupausten-kategoriat kategorian-urakat urakan-lupaukset valittu-kategoria valittu-urakka haku-kaynnissa?] :as app}] + (let [puuttuvat-urakat (:puuttuvat-urakat lupausten-linkitykset) + rivin-tunnistin-selitteet (:rivin-tunnistin-selitteet lupausten-kategoriat) + kategorian-urakat (:kategorian-urakat kategorian-urakat) + urakan-lupaukset (:urakan-lupaukset urakan-lupaukset)] + [:div + [:h2 "Lupauksien linkitys"] + [:p "Lupaukset täytyy aina linkittää tiettyyn urakkaan. Tällä sivulla kerrotaan linkityksien tilanne ja on mahdollista tarkastella lupauksille syötettyjä tietoja."] + (if (seq puuttuvat-urakat) + [:div.alert.alert-danger + [:p "Kehittäjän tulee korjata tilanne tekemällä linkki puutteellisille urakoille tai lupaukset eivät toimi näillä urakoilla."] + [:p "Tällä hetkellä linkitykset puuttuvat seuraavissa urakoissa:"] + [:ul + (for [urakka puuttuvat-urakat] + ^{:key (str "urakka" (:id urakka))} + [:li (:nimi urakka)])]] + [:div.alert.alert-success "Lupausten linkityksessä ei ole puutteita."]) + + + [:h2 "Lupauksien tarkistaminen"] + [:p "Voit tarkistaa lupauksien linkitykset ja syötettyjä tietoja valitselmalla ensin kategorian ja sen jälkeen haluamasi urakan."] + + ;; Kategorian valinta + [yleiset/pudotusvalikko + "Lupaus kategoriat" + {:valitse-fn #(e! (tiedot/->ValitseKategoria %)) + :valinta valittu-kategoria + :format-fn #(cond + (and (:rivin-tunnistin-selite %) (:urakan-alkuvuosi %)) (str (:rivin-tunnistin-selite %) " - " (:urakan-alkuvuosi %)) + (:urakan-alkuvuosi %) (:urakan-alkuvuosi %) + (:rivin-tunnistin-selite %) (:rivin-tunnistin-selite %) + :else "Valitse kategoria")} + rivin-tunnistin-selitteet] + + + ;; Urakan valinta + (if haku-kaynnissa? + [:div.ajax-loader-valistys + [ajax-loader-pieni (str "Haetaan tietoja...")]] + (when (seq kategorian-urakat) + [yleiset/pudotusvalikko + "Kategorian urakat" + {:valitse-fn #(e! (tiedot/->ValitseUrakka %)) + :valinta valittu-urakka + :format-fn #(or (:nimi %) "Valitse urakka")} + kategorian-urakat])) + + ;; Lupaukset taulukko + (when (seq urakan-lupaukset) + [grid/grid + {:otsikko "Lupaukset" + :tyhja "Ei lupauksia." + :tunniste :lupaus-id} + [{:otsikko "Lupausryhmän numero" + :nimi :lupausryhma-jarjestys + :tyyppi :string + :leveys 1} + {:otsikko "Lupausryhmän otsikko" + :nimi :otsikko + :tyyppi :string + :leveys 1} + {:otsikko "Kuvaus" + :nimi :kuvaus + :tyyppi :string + :leveys 1} + {:otsikko "Sisalto" + :nimi :sisalto + :tyyppi :string + :leveys 2} + {:otsikko "Pisteet" + :nimi :pisteet + :tyyppi :string + :leveys 1} + {:otsikko "Lupaustyyppi" + :nimi :lupaustyyppi + :tyyppi :string + :leveys 1} + {:otsikko "Kirjauskuukaudet" + :nimi :kirjaus-kkt + :leveys 1 + :fmt str} + {:otsikko "Jousto kuukaudet" + :nimi :joustovara-kkta + :tyyppi :string + :leveys 1} + {:otsikko "Päätöskuukausi" + :nimi :paatos-kk + :tyyppi :string + :leveys 1}] + urakan-lupaukset])])))) + + +(defn lupaukset [] + [tuck tiedot/tila lupaukset*]) \ No newline at end of file From 95a5617fb688e85de9f61b064f4f388614aab53b Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 10:08:08 +0300 Subject: [PATCH 32/43] =?UTF-8?q?Nime=C3=A4=20migraatio=20uudelleen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/db/migration/{V1_1133__.sql => V1_1134__.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename tietokanta/src/main/resources/db/migration/{V1_1133__.sql => V1_1134__.sql} (100%) diff --git a/tietokanta/src/main/resources/db/migration/V1_1133__.sql b/tietokanta/src/main/resources/db/migration/V1_1134__.sql similarity index 100% rename from tietokanta/src/main/resources/db/migration/V1_1133__.sql rename to tietokanta/src/main/resources/db/migration/V1_1134__.sql From b7094e458602946670d8d6cd6e4bafecd37e941b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 08:06:54 +0000 Subject: [PATCH 33/43] Update dependency net.coobird:thumbnailator to v0.4.20 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 5d12734f0cc..5a8d2b81476 100644 --- a/project.clj +++ b/project.clj @@ -122,7 +122,7 @@ [jarohen/chime "0.2.2"] ;; Pikkukuvien (thumbnail) muodostamiseen - [net.coobird/thumbnailator "0.4.8"] + [net.coobird/thumbnailator "0.4.20"] ;; JSON -validointikirjastot [webjure/json-schema "0.7.4"] From 337a6990e15ea79a5e1648932f57da4b67347b51 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 12:27:58 +0300 Subject: [PATCH 34/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20puuttuva=20:lupaukset-h?= =?UTF-8?q?allinta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/clj/harja/palvelin/main_test.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/clj/harja/palvelin/main_test.clj b/test/clj/harja/palvelin/main_test.clj index 9d9303b575e..d2d9fa75f48 100644 --- a/test/clj/harja/palvelin/main_test.clj +++ b/test/clj/harja/palvelin/main_test.clj @@ -162,7 +162,8 @@ :reikapaikkaukset :mpu-kustannukset :rahavaraukset-hallinta - :urakkahenkilot-hallinta}) + :urakkahenkilot-hallinta + :lupaukset-hallinta}) (def ei-statusta #{:metriikka From 4322f418ccf495929b59da19d808980f9b041b81 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 12:47:34 +0300 Subject: [PATCH 35/43] =?UTF-8?q?Lis=C3=A4=C3=A4=20viel=C3=A4=20ei=20statu?= =?UTF-8?q?sta=20osioon=20lupaukset-hallinta?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- test/clj/harja/palvelin/main_test.clj | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/clj/harja/palvelin/main_test.clj b/test/clj/harja/palvelin/main_test.clj index d2d9fa75f48..6c60b5a3ece 100644 --- a/test/clj/harja/palvelin/main_test.clj +++ b/test/clj/harja/palvelin/main_test.clj @@ -241,7 +241,8 @@ :reikapaikkaukset :mpu-kustannukset :rahavaraukset-hallinta - :urakkahenkilot-hallinta}) + :urakkahenkilot-hallinta + :lupaukset-hallinta}) (def hidas-ok-status #{:itmf}) From 46cf81b763f5c4728a17e5341f979c55a47afadd Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 09:49:45 +0000 Subject: [PATCH 36/43] Update com.cognitect:transit --- project.clj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/project.clj b/project.clj index 5a8d2b81476..89b2bb4e3fb 100644 --- a/project.clj +++ b/project.clj @@ -19,8 +19,8 @@ [prismatic/schema "1.1.10"] [org.clojure/core.async "0.3.443"] ;; Transit tietomuoto asiakkaan ja palvelimen väliseen kommunikointiin - [com.cognitect/transit-cljs "0.8.256"] - [com.cognitect/transit-clj "0.8.313"] + [com.cognitect/transit-cljs "0.8.280"] + [com.cognitect/transit-clj "0.8.319"] ;; Pätevä yksinkertainen työkalu esimerkiksi config-tiedostojen mergeämiseen [meta-merge "1.0.0"] From 290c292844473c40bfef8e8645fa2198859b9c7f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 17 Sep 2024 10:59:14 +0000 Subject: [PATCH 37/43] Update dependency cljs-ajax:cljs-ajax to v0.8.4 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 89b2bb4e3fb..9a981c81e8c 100644 --- a/project.clj +++ b/project.clj @@ -94,7 +94,7 @@ ;; Ajax-kirjasto frontille - [cljs-ajax "0.8.0"] + [cljs-ajax "0.8.4"] ;; React-wrapper frontille [reagent "0.9.1"] From 8bac1edf9b1faa66ed1632cdb0780dc852a01c48 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 14:07:45 +0300 Subject: [PATCH 38/43] =?UTF-8?q?Nime=C3=A4=20uudelleen=20lupaukset=5Fpalv?= =?UTF-8?q?elu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/clj/harja/palvelin/main.clj | 2 +- .../palvelut/hallinta/{lupaukset.clj => lupaukset_palvelu.clj} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/clj/harja/palvelin/palvelut/hallinta/{lupaukset.clj => lupaukset_palvelu.clj} (97%) diff --git a/src/clj/harja/palvelin/main.clj b/src/clj/harja/palvelin/main.clj index f804db3e7ea..7eb6b8d91a6 100644 --- a/src/clj/harja/palvelin/main.clj +++ b/src/clj/harja/palvelin/main.clj @@ -74,7 +74,7 @@ [harja.palvelin.palvelut.hallinta.urakoiden-lyhytnimet :as urakoidenlyhytnimet-hallinta] [harja.palvelin.palvelut.hallinta.tehtavat :as tehtavat-hallinta] [harja.palvelin.palvelut.hallinta.tarjoushinnat :as tarjoushinnat-hallinta] - [harja.palvelin.palvelut.hallinta.lupaukset :as lupaukset-hallinta] + [harja.palvelin.palvelut.hallinta.lupaukset-palvelu :as lupaukset-hallinta] [harja.palvelin.palvelut.hallinta.rahavaraukset :as rahavaraukset-hallinta] [harja.palvelin.palvelut.hallinta.urakkahenkilot :as urakkahenkilot-hallinta] [harja.palvelin.palvelut.selainvirhe :as selainvirhe] diff --git a/src/clj/harja/palvelin/palvelut/hallinta/lupaukset.clj b/src/clj/harja/palvelin/palvelut/hallinta/lupaukset_palvelu.clj similarity index 97% rename from src/clj/harja/palvelin/palvelut/hallinta/lupaukset.clj rename to src/clj/harja/palvelin/palvelut/hallinta/lupaukset_palvelu.clj index e8feeaa60d5..c3b3bfce3c1 100644 --- a/src/clj/harja/palvelin/palvelut/hallinta/lupaukset.clj +++ b/src/clj/harja/palvelin/palvelut/hallinta/lupaukset_palvelu.clj @@ -1,4 +1,4 @@ -(ns harja.palvelin.palvelut.hallinta.lupaukset +(ns harja.palvelin.palvelut.hallinta.lupaukset-palvelu (:require [com.stuartsierra.component :as component] [harja.kyselyt.lupaus-kyselyt :as lupaus-kyselyt] [harja.domain.oikeudet :as oikeudet] From 912e432a84a560dcd4563089d0648939f9170a90 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 14:10:28 +0300 Subject: [PATCH 39/43] =?UTF-8?q?Nime=C3=A4=20uudelleen=20lupaukset-nakyma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cljs/harja/views/hallinta.cljs | 2 +- .../urakkatiedot/{lupaukset.cljs => lupaukset_nakyma.cljs} | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) rename src/cljs/harja/views/hallinta/urakkatiedot/{lupaukset.cljs => lupaukset_nakyma.cljs} (97%) diff --git a/src/cljs/harja/views/hallinta.cljs b/src/cljs/harja/views/hallinta.cljs index fe83afb9103..996a58b9f0b 100644 --- a/src/cljs/harja/views/hallinta.cljs +++ b/src/cljs/harja/views/hallinta.cljs @@ -24,7 +24,7 @@ [harja.views.hallinta.urakkatiedot.tehtava-nakyma :as tehtava-nakyma] [harja.views.hallinta.tarjoushinnat :as tarjoushinnat] [harja.views.hallinta.rahavaraukset :as rahavaraukset] - [harja.views.hallinta.urakkatiedot.lupaukset :as lupaukset] + [harja.views.hallinta.urakkatiedot.lupaukset-nakyma :as lupaukset] [harja.views.hallinta.rahavarausten-tehtavat :as rahavarausten-tehtavat] [harja.views.hallinta.urakkahenkilot :as urakkahenkilot] [harja.tiedot.istunto :as istunto])) diff --git a/src/cljs/harja/views/hallinta/urakkatiedot/lupaukset.cljs b/src/cljs/harja/views/hallinta/urakkatiedot/lupaukset_nakyma.cljs similarity index 97% rename from src/cljs/harja/views/hallinta/urakkatiedot/lupaukset.cljs rename to src/cljs/harja/views/hallinta/urakkatiedot/lupaukset_nakyma.cljs index fc180a4ef39..3e9fd510d1c 100644 --- a/src/cljs/harja/views/hallinta/urakkatiedot/lupaukset.cljs +++ b/src/cljs/harja/views/hallinta/urakkatiedot/lupaukset_nakyma.cljs @@ -1,11 +1,11 @@ -(ns harja.views.hallinta.urakkatiedot.lupaukset +(ns harja.views.hallinta.urakkatiedot.lupaukset-nakyma "Lupauksiin liittyvää hallinnointia esim. linkityksiä urakkaan" (:require [tuck.core :refer [tuck send-value! send-async!]] [harja.tyokalut.tuck :as tuck-apurit] [harja.ui.komponentti :as komp] [harja.ui.grid :as grid] [harja.ui.yleiset :refer [ajax-loader-pieni] :as yleiset] - [harja.tiedot.hallinta.lupaukset :as tiedot] + [harja.tiedot.hallinta.lupaukset-tiedot :as tiedot] [harja.ui.debug :as debug])) From 60e35701038584eabdad39daf402154550b92e26 Mon Sep 17 00:00:00 2001 From: Samu Mikkonen Date: Tue, 17 Sep 2024 14:13:13 +0300 Subject: [PATCH 40/43] =?UTF-8?q?Nime=C3=A4=20uudelleen=20lupausten=5Ftied?= =?UTF-8?q?ot?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tiedot/hallinta/{lupaukset.cljs => lupaukset_tiedot.cljs} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/cljs/harja/tiedot/hallinta/{lupaukset.cljs => lupaukset_tiedot.cljs} (98%) diff --git a/src/cljs/harja/tiedot/hallinta/lupaukset.cljs b/src/cljs/harja/tiedot/hallinta/lupaukset_tiedot.cljs similarity index 98% rename from src/cljs/harja/tiedot/hallinta/lupaukset.cljs rename to src/cljs/harja/tiedot/hallinta/lupaukset_tiedot.cljs index 4bc9b206ba1..cbeea06aed9 100644 --- a/src/cljs/harja/tiedot/hallinta/lupaukset.cljs +++ b/src/cljs/harja/tiedot/hallinta/lupaukset_tiedot.cljs @@ -1,4 +1,4 @@ -(ns harja.tiedot.hallinta.lupaukset +(ns harja.tiedot.hallinta.lupaukset-tiedot (:require [cljs.core.async :refer [>! Date: Tue, 17 Sep 2024 13:49:27 +0000 Subject: [PATCH 41/43] Update dependency compojure:compojure to v1.7.1 --- project.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/project.clj b/project.clj index 9a981c81e8c..ed9275baf99 100644 --- a/project.clj +++ b/project.clj @@ -49,7 +49,7 @@ ;; Ja fileuploadin mukana liian vanha commons-io [commons-io/commons-io "2.15.1"] [commons-fileupload/commons-fileupload "1.5"] - [compojure "1.7.0"] + [compojure "1.7.1"] ;; Ring tarvitsee [javax.servlet/javax.servlet-api "3.1.0"] [hiccup "1.0.5"] From e5a6ebcf112430e89ed75d82595392e494fc07c4 Mon Sep 17 00:00:00 2001 From: Toni Dahl Date: Tue, 17 Sep 2024 17:41:16 +0300 Subject: [PATCH 42/43] Poista tarpeettomia riippuvuuksia --- project.clj | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/project.clj b/project.clj index ed9275baf99..cf49e461306 100644 --- a/project.clj +++ b/project.clj @@ -45,13 +45,18 @@ ;; -- HTTP palvelin, reititys ja kyselyiden cahetus [cljs-http "0.1.48"] [http-kit "2.5.3"] + ;; TODO: Compojure 1.7.1 mukana tulee uusi fileupload ja commons-io + ;; Katso täytyykö overridettaa tässä. Poista todo ja alla olevat rivit, jos ei tarvetta. ;; Compojuren mukana tulee liian vanha commons-fileupload ;; Ja fileuploadin mukana liian vanha commons-io - [commons-io/commons-io "2.15.1"] - [commons-fileupload/commons-fileupload "1.5"] + #_[commons-io/commons-io "2.15.1"] + #_[commons-fileupload/commons-fileupload "1.5"] [compojure "1.7.1"] ;; Ring tarvitsee - [javax.servlet/javax.servlet-api "3.1.0"] + ;; TODO: Ring 1.11.0 versiolla ei ole enää tarvetta servlet-apille: + ;; https://github.com/ring-clojure/ring/pull/483 + ;; Tarkasta toiminta. Poista TODO ja alla olevat rivit, jos ei tarvetta. + #_[javax.servlet/javax.servlet-api "3.1.0"] [hiccup "1.0.5"] [org.clojure/core.cache "0.7.2"] From 3f725b836838880d2806e002992e32f3f3c020f7 Mon Sep 17 00:00:00 2001 From: Toni Dahl Date: Tue, 17 Sep 2024 17:54:48 +0300 Subject: [PATCH 43/43] =?UTF-8?q?Poista=20tarpeettomat=20riippuvuudet:=20*?= =?UTF-8?q?=20[commons-io/commons-io=20"2.15.1"]=20->=20Uusi=20versio=20tu?= =?UTF-8?q?lee=20compojure=201.7.1=20->=20ring=201.11.0=20mukana=20*=20[co?= =?UTF-8?q?mmons-fileupload/commons-fileupload=20"1.5"]=20->=20Uusi=20vers?= =?UTF-8?q?io=20tulee=20compojure=201.7.1=20->=20ring=201.11.0=20mukana=20?= =?UTF-8?q?*=20Poistetaan=20[javax.servlet/javax.servlet-api=20"3.1.0"]=20?= =?UTF-8?q?riippuvuus=20kokonaan.=20Ring=201.11.0=20julkaisussa=20ei=20ole?= =?UTF-8?q?=20en=C3=A4=C3=A4=20tarvetta=20servlet-apille.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project.clj | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/project.clj b/project.clj index cf49e461306..2390e3ca11e 100644 --- a/project.clj +++ b/project.clj @@ -45,18 +45,7 @@ ;; -- HTTP palvelin, reititys ja kyselyiden cahetus [cljs-http "0.1.48"] [http-kit "2.5.3"] - ;; TODO: Compojure 1.7.1 mukana tulee uusi fileupload ja commons-io - ;; Katso täytyykö overridettaa tässä. Poista todo ja alla olevat rivit, jos ei tarvetta. - ;; Compojuren mukana tulee liian vanha commons-fileupload - ;; Ja fileuploadin mukana liian vanha commons-io - #_[commons-io/commons-io "2.15.1"] - #_[commons-fileupload/commons-fileupload "1.5"] [compojure "1.7.1"] - ;; Ring tarvitsee - ;; TODO: Ring 1.11.0 versiolla ei ole enää tarvetta servlet-apille: - ;; https://github.com/ring-clojure/ring/pull/483 - ;; Tarkasta toiminta. Poista TODO ja alla olevat rivit, jos ei tarvetta. - #_[javax.servlet/javax.servlet-api "3.1.0"] [hiccup "1.0.5"] [org.clojure/core.cache "0.7.2"]