From 74928d4f846c2c9aaccd121265765ecb5111025c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Wed, 13 Nov 2024 13:13:06 +0200 Subject: [PATCH 1/5] Muutetaan Hoidonjohtopalkkion toteutuneet kustannukset laskentaa MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Laskutusyhteenvedossa käytettiin budjettitaulua eli kustannusarvioitu_tyo. Nyt muutettu käyttämään toteutuneet_kustannukset taulua, johon kaikki kustannukset siirretään kuukauden vaihteessa. Näin tulevaisuuden kustannuksia ei arvailla, vaan näytetään se, mikä on toteutunut. Lisätty yksikkötesti, jolla varmistetaan laskennan oikeellisuus. --- .../palvelut/laskutusyhteenveto_mhu_test.clj | 84 +++++++++++++++++++ .../migration/R__Laskutusyhteenveto_mhu.sql | 73 ++++++++-------- 2 files changed, 123 insertions(+), 34 deletions(-) diff --git a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj index 050cb628be9..027b1273409 100644 --- a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj +++ b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj @@ -341,6 +341,90 @@ _ (is (= -12M (:sakot_laskutetaan haetut-tiedot-oulu-mhu-korvausinvestointi)))])) +(deftest toteutuneet-hoidonjohto-palkkiot + ;; Hoidonjohdon palkkiot suunnitellaan kustannusarvioitu_tyo tauluun. Ja ne on + ;; päätelty toteutuvaksi aina kuukauden vaihteessa. + ;; Uudistuneessa versiossa ne siirretään kuukauden vaihteessa toteutuneet_kustannukset tauluun. + ;; Varmistetaan testillä, että luvut ovat samat. + (let [alkuaika "2019-10-01" + alkuvuosi 2019 + loppuaika "2020-10-01" + loppuvuosi 2020 + urakka-id @oulun-maanteiden-hoitourakan-2019-2024-id + ;; HAetaan urakan sopimusid + sopimus-id (:id (first (q-map (format "SELECT id FROM sopimus WHERE urakka = %s" urakka-id)))) + + ;; Hoidonjohtopalkkio menee kustannusarvioitu_tyo tauluun tehtävälle Hoidonjohtopalkkio. + ;; HAetaan sen tehtävän id: + hoidonjohtopalkkio-tehtava-id (:id (first (q-map (format "SELECT id FROM tehtava where yksiloiva_tunniste = '%s';" "53647ad8-0632-4dd3-8302-8dfae09908c8")))) + ;; Haetaan hoidonjohtopalkkio tehtävän kustannusarvioidut työt annetulla ajan jaksolla + hoidonjohtopalkkio-kustannusarvioidut-tyot (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM kustannusarvioitu_tyo + WHERE tehtava = %s AND tehtavaryhma IS NULL AND sopimus = %s AND tyyppi = 'laskutettava-tyo' + AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" + hoidonjohtopalkkio-tehtava-id sopimus-id alkuvuosi loppuvuosi)))) + + ;; Haetaan hoidonjohtopalkkiot toteutuneet_kustannukset taulusta samalle ajanjaksolle + hoidonjohtopalkkio-toteutuneet_kustannukset (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM toteutuneet_kustannukset + WHERE tehtava = %s AND tehtavaryhma IS NULL AND urakka_id = %s AND tyyppi = 'laskutettava-tyo' + AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" + hoidonjohtopalkkio-tehtava-id urakka-id alkuvuosi loppuvuosi)))) + _ (is (= hoidonjohtopalkkio-kustannusarvioidut-tyot hoidonjohtopalkkio-toteutuneet_kustannukset)) + + ;; Hoidonjohtopalkkioita voi olla myös kuluissa, joten tarkistetaan niiden määrä + ;; Hoidonjohtopalkkiot määritellään tehtäväryhmälle: Hoidonjohtopalkkio (G) - 0ef0b97e-1390-4d6c-bbc4-b30536be8a68 + hoidonjohtopalkkio-tehtavaryhma-id (:id (first (q-map (str "SELECT id FROM tehtavaryhma + WHERE yksiloiva_tunniste = '0ef0b97e-1390-4d6c-bbc4-b30536be8a68';")))) + + ;; Haetaan hoidonjohtopalkkiot kuluista + hoidonjohtopalkkio-kulut (:summa (first (q-map (format + "SELECT coalesce(kk.summa, 0) AS summa + FROM kulu k + JOIN kulu_kohdistus kk ON kk.kulu = k.id + WHERE kk.poistettu IS NOT TRUE + AND k.urakka = %s + AND k.erapaiva BETWEEN '%s'::DATE AND '%s'::DATE + AND kk.tehtavaryhma = %s;" + urakka-id alkuaika loppuaika hoidonjohtopalkkio-tehtavaryhma-id)))) + + ;; Vanha tapa laskea hoidonjohtopalkkiot on kustannusarvioitu_tyo taulussa + ;; Haetaan ensin toimenpideinstanssi-id -- tpk2.koodi/tuotekoodi 23150 on MHU Hoidonjohto + toimenpideinstanssi-id (:id (first (q-map (format "SELECT + tpi.id AS id + FROM toimenpideinstanssi tpi + JOIN toimenpide tpk3 ON tpk3.id = tpi.toimenpide + JOIN toimenpide tpk2 ON tpk3.emo = tpk2.id, + maksuera m + WHERE tpi.urakka = %s AND m.toimenpideinstanssi = tpi.id + AND tpk2.koodi = '23150' + ORDER BY m.numero ASC" urakka-id)))) + + toimenpidekoodi-id-hu-tyonjohto (:id (first (q-map (format "SELECT id FROM tehtava WHERE yksiloiva_tunniste = 'c9712637-fbec-4fbd-ac13-620b5619c744';")))) + toimenpidekoodi-id-hj-palkkio (:id (first (q-map (format "SELECT id FROM tehtava WHERE yksiloiva_tunniste = '53647ad8-0632-4dd3-8302-8dfae09908c8';")))) + + vanhat-summat (:summa (first (q-map (str + "SELECT SUM(coalesce(kat.summa_indeksikorjattu, kat.summa, 0)) AS summa + FROM kustannusarvioitu_tyo kat + WHERE kat.toimenpideinstanssi = " toimenpideinstanssi-id " + AND (kat.tehtavaryhma = " hoidonjohtopalkkio-tehtavaryhma-id " OR kat.tehtava IN (" toimenpidekoodi-id-hu-tyonjohto ", " toimenpidekoodi-id-hj-palkkio ")) + AND kat.sopimus = " sopimus-id " + AND (SELECT (date_trunc('MONTH', format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN '" alkuaika "'::DATE AND '" loppuaika "'::DATE")))) + _ (is (= hoidonjohtopalkkio-kustannusarvioidut-tyot vanhat-summat)) + + ;; Haetaan laskutusyhteenveto ja varmistetaan, että siellä on samat luvut hoidonjohtopalkkioille + laskutusyhteenveto (lyv-yhteiset/hae-laskutusyhteenvedon-tiedot + (:db jarjestelma) + +kayttaja-jvh+ + {:urakka-id @oulun-maanteiden-hoitourakan-2019-2024-id + :urakkatyyppi "teiden-hoito" + :alkupvm (pvm/->pvm "1.10.2019") + :loppupvm (pvm/->pvm "30.9.2020")}) + ;; Hoidonjohtopalkkio on vaan MHY ylläpidon alla, mutta lasketaan se kaikkien alta, koska se on muualla nolla + ;; Ja jos ei ole, niin silloin on virhetilanne ja se löytyy samalla testillä. + hoindonjohtopalkkio-laskutusyhteenvedossa (apply + (map :hj_palkkio_laskutetaan laskutusyhteenveto)) + _ (is (= (+ hoidonjohtopalkkio-kustannusarvioidut-tyot hoidonjohtopalkkio-kulut) + (+ hoidonjohtopalkkio-toteutuneet_kustannukset hoidonjohtopalkkio-kulut) + hoindonjohtopalkkio-laskutusyhteenvedossa))])) + (deftest laskutusyhteenvedon-sementointi (testing "laskutusyhteenvedon-sementoiti" (let [_ (when (= (empty? @oulun-mhu-urakka-2020-03)) diff --git a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql index 347362d65d9..2f4430c0316 100644 --- a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql +++ b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql @@ -241,8 +241,9 @@ CREATE TYPE HJPALKKIO_RIVI AS hj_palkkio_laskutetaan NUMERIC ); +DROP FUNCTION IF EXISTS hj_palkkio(DATE, DATE, DATE, TEXT, INTEGER, INTEGER, INTEGER); CREATE OR REPLACE FUNCTION hj_palkkio(hk_alkupvm DATE, aikavali_alkupvm DATE, aikavali_loppupvm DATE, - toimenpide_koodi TEXT, t_instanssi INTEGER, urakka_id INTEGER, sopimus_id INTEGER) + toimenpide_koodi TEXT, t_instanssi INTEGER, urakka_id_ INTEGER, sopimus_id INTEGER) RETURNS SETOF HJPALKKIO_RIVI AS $$ DECLARE @@ -274,24 +275,26 @@ BEGIN RAISE NOTICE 'HJ-Palkkio lasketaan mukaan, koska toimenpideinstanssi on hoidon johto. %', t_instanssi; -- Ennen tarkasteltavaa aikaväliä laskutetut hoidonjohdon palkkiot - (päätellään tpi:stä ja toimenpidekoodista) - -- Käydään läpi tiedot taulusta: kustannusarvioitu_tyo + -- Käydään läpi tiedot taulusta: toteutuneet_kustannukset - oli ennen kustannusarvioitu_tyo taulussa, mutta muutettu. -- HJ-Palkkio - laskutettu - FOR laskutettu_rivi IN SELECT coalesce(kat.summa_indeksikorjattu, kat.summa, 0) AS summa - FROM kustannusarvioitu_tyo kat - WHERE kat.toimenpideinstanssi = t_instanssi - AND (kat.tehtavaryhma = tehtavaryhma_id OR kat.tehtava IN (toimenpidekoodi_id_hu_tyonjohto, toimenpidekoodi_id_hj_palkkio)) - AND kat.sopimus = sopimus_id - AND (SELECT (date_trunc('MONTH', - format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN hk_alkupvm AND aikavali_loppupvm - UNION ALL - SELECT coalesce(lk.summa, 0) AS summa - FROM kulu l - JOIN kulu_kohdistus lk ON lk.kulu = l.id - WHERE lk.toimenpideinstanssi = t_instanssi - AND lk.poistettu IS NOT TRUE - AND l.urakka = urakka_id - AND l.erapaiva BETWEEN hk_alkupvm AND aikavali_loppupvm - AND lk.tehtavaryhma = tehtavaryhma_id + FOR laskutettu_rivi IN SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa + FROM toteutuneet_kustannukset tk + WHERE tk.toimenpideinstanssi = t_instanssi + AND (tk.tehtavaryhma = tehtavaryhma_id OR + tk.tehtava IN (toimenpidekoodi_id_hu_tyonjohto, toimenpidekoodi_id_hj_palkkio)) + AND tk.urakka_id = urakka_id_ + AND (SELECT (DATE_TRUNC('MONTH', + FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) BETWEEN hk_alkupvm AND aikavali_loppupvm + + UNION ALL + SELECT COALESCE(lk.summa, 0) AS summa + FROM kulu l + JOIN kulu_kohdistus lk ON lk.kulu = l.id + WHERE lk.toimenpideinstanssi = t_instanssi + AND lk.poistettu IS NOT TRUE + AND l.urakka = urakka_id_ + AND l.erapaiva BETWEEN hk_alkupvm AND aikavali_loppupvm + AND lk.tehtavaryhma = tehtavaryhma_id LOOP RAISE NOTICE 'HJ-palkkio laskutettu :: summa: %', laskutettu_rivi.summa; @@ -301,22 +304,24 @@ BEGIN -- Tarkasteltavalla aikavälillä laskutetut tai laskutettavat hoidonjohdon kustannukset -- Käydään läpi tiedot taulusta: kustannusarvioitu_tyo -- hj_palkkio - laskutetaan - FOR hj_palkkio_laskutetaan_rivi IN SELECT coalesce(kat.summa_indeksikorjattu, kat.summa, 0) AS summa - FROM kustannusarvioitu_tyo kat - WHERE kat.toimenpideinstanssi = t_instanssi - AND (kat.tehtavaryhma = tehtavaryhma_id OR kat.tehtava IN (toimenpidekoodi_id_hu_tyonjohto, toimenpidekoodi_id_hj_palkkio)) - AND kat.sopimus = sopimus_id - AND (SELECT (date_trunc('MONTH', - format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN aikavali_alkupvm AND aikavali_loppupvm - UNION ALL - SELECT coalesce(lk.summa, 0) AS summa - FROM kulu l - JOIN kulu_kohdistus lk ON lk.kulu = l.id - WHERE lk.toimenpideinstanssi = t_instanssi - AND lk.poistettu IS NOT TRUE - AND l.urakka = urakka_id - AND l.erapaiva BETWEEN aikavali_alkupvm AND aikavali_loppupvm - AND lk.tehtavaryhma = tehtavaryhma_id + FOR hj_palkkio_laskutetaan_rivi IN SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa + FROM toteutuneet_kustannukset tk + WHERE tk.toimenpideinstanssi = t_instanssi + AND (tk.tehtavaryhma = tehtavaryhma_id OR tk.tehtava IN + (toimenpidekoodi_id_hu_tyonjohto, + toimenpidekoodi_id_hj_palkkio)) + AND tk.urakka_id = urakka_id_ + AND (SELECT (DATE_TRUNC('MONTH', + FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) BETWEEN aikavali_alkupvm AND aikavali_loppupvm + UNION ALL + SELECT COALESCE(lk.summa, 0) AS summa + FROM kulu l + JOIN kulu_kohdistus lk ON lk.kulu = l.id + WHERE lk.toimenpideinstanssi = t_instanssi + AND lk.poistettu IS NOT TRUE + AND l.urakka = urakka_id_ + AND l.erapaiva BETWEEN aikavali_alkupvm AND aikavali_loppupvm + AND lk.tehtavaryhma = tehtavaryhma_id LOOP RAISE NOTICE 'HJ-palkkio laskutetaan :: summa: %', hj_palkkio_laskutetaan_rivi.summa; From 35a7fec072ab4efd663108a3d6e06c34d02a22bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Wed, 13 Nov 2024 14:22:35 +0200 Subject: [PATCH 2/5] Haetaan erilliskustannukset laskutusyhteenvetoon toteutuneista kustannuksista MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Ja varmistetaan yksikkötestillä, että luvut täsmää --- .../palvelut/laskutusyhteenveto_mhu_test.clj | 71 ++++++++++++++++++ .../migration/R__Laskutusyhteenveto_mhu.sql | 75 ++++++++++--------- 2 files changed, 109 insertions(+), 37 deletions(-) diff --git a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj index 027b1273409..f5249639fbb 100644 --- a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj +++ b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj @@ -425,6 +425,77 @@ (+ hoidonjohtopalkkio-toteutuneet_kustannukset hoidonjohtopalkkio-kulut) hoindonjohtopalkkio-laskutusyhteenvedossa))])) +(deftest toteutuneet-erilliskustannukset + ;; Erilliskustannukset suunnitellaan kustannusarvioitu_tyo tauluun. Ja ne on + ;; päätelty toteutuvaksi aina kuukauden vaihteessa. + ;; Uudistuneessa versiossa ne siirretään kuukauden vaihteessa toteutuneet_kustannukset tauluun. + ;; Varmistetaan testillä, että luvut ovat samat. + (let [alkuaika "2019-10-01" + alkuvuosi 2019 + loppuaika "2020-10-01" + loppuvuosi 2020 + urakka-id @oulun-maanteiden-hoitourakan-2019-2024-id + ;; HAetaan urakan sopimusid + sopimus-id (:id (first (q-map (format "SELECT id FROM sopimus WHERE urakka = %s" urakka-id)))) + + ;; Erilliskustannukset menee kustannusarvioitu_tyo tauluun tehtäväryhmälle Erilliskustannus (W) / '37d3752c-9951-47ad-a463-c1704cf22f4c' + ;; Haetaan sen tehtäväryhmän id: + erilliskustannus-tehtavaryhma-id (hae-tehtavaryhman-id-tunnisteella "37d3752c-9951-47ad-a463-c1704cf22f4c") ;(:id (first (q-map (format "SELECT id FROM tehtavaryhma where yksiloiva_tunniste = '%s';" "37d3752c-9951-47ad-a463-c1704cf22f4c")))) + ;; Haetaan hoidonjohtopalkkio tehtävän kustannusarvioidut työt annetulla ajan jaksolla + erilliskustannus-kustannusarvioidut-tyot + (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM kustannusarvioitu_tyo + WHERE tehtavaryhma = %s AND sopimus = %s AND tyyppi = 'laskutettava-tyo' + AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" + erilliskustannus-tehtavaryhma-id sopimus-id alkuvuosi loppuvuosi)))) + + ;; Haetaan hoidonjohtopalkkiot toteutuneet_kustannukset taulusta samalle ajanjaksolle + erilliskustannus-toteutuneet_kustannukset + (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM toteutuneet_kustannukset + WHERE tehtavaryhma = %s AND urakka_id = %s AND tyyppi = 'laskutettava-tyo' + AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" + erilliskustannus-tehtavaryhma-id urakka-id alkuvuosi loppuvuosi)))) + + _ (is (= erilliskustannus-kustannusarvioidut-tyot erilliskustannus-toteutuneet_kustannukset)) + + ;; Erilliskustannus voi olla myös kuluissa, joten tarkistetaan niiden määrä + ;; Haetaan Erilliskustannukset kuluista + erilliskustannus-kulut (:summa (first (q-map (format + "SELECT coalesce(kk.summa, 0) AS summa + FROM kulu k + JOIN kulu_kohdistus kk ON kk.kulu = k.id + WHERE kk.poistettu IS NOT TRUE + AND k.urakka = %s + AND k.erapaiva BETWEEN '%s'::DATE AND '%s'::DATE + AND kk.tehtavaryhma = %s;" + urakka-id alkuaika loppuaika erilliskustannus-tehtavaryhma-id)))) + + ;; Vanha tapa laskea erilliskustannukset on kustannusarvioitu_tyo taulussa + ;; Haetaan ensin toimenpideinstanssi-id -- tpk2.koodi/tuotekoodi 23151 on MHU Hoidonjohto + toimenpideinstanssi-id (hae-toimenpideinstanssi-id urakka-id "23151") + vanhat-summat (:summa (first (q-map (str + "SELECT SUM(coalesce(kat.summa_indeksikorjattu, kat.summa, 0)) AS summa + FROM kustannusarvioitu_tyo kat + WHERE kat.toimenpideinstanssi = " toimenpideinstanssi-id " + AND kat.tehtavaryhma = " erilliskustannus-tehtavaryhma-id " + AND kat.sopimus = " sopimus-id " + AND (SELECT (date_trunc('MONTH', format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN '" alkuaika "'::DATE AND '" loppuaika "'::DATE")))) + _ (is (= erilliskustannus-kustannusarvioidut-tyot vanhat-summat)) + + ;; Haetaan laskutusyhteenveto ja varmistetaan, että siellä on samat luvut Erilliskustannuksille + laskutusyhteenveto (lyv-yhteiset/hae-laskutusyhteenvedon-tiedot + (:db jarjestelma) + +kayttaja-jvh+ + {:urakka-id @oulun-maanteiden-hoitourakan-2019-2024-id + :urakkatyyppi "teiden-hoito" + :alkupvm (pvm/->pvm "1.10.2019") + :loppupvm (pvm/->pvm "30.9.2020")}) + ;; Erilliskustannukset ovat vaan MHY ylläpidon alla, mutta lasketaan se kaikkien alta, koska se on muualla nolla + ;; Ja jos ei ole, niin silloin on virhetilanne ja se löytyy samalla testillä. + erilliskustannus-laskutusyhteenvedossa (apply + (map :hj_erillishankinnat_laskutettu laskutusyhteenveto)) + _ (is (= (+ erilliskustannus-kustannusarvioidut-tyot erilliskustannus-kulut) + (+ erilliskustannus-toteutuneet_kustannukset erilliskustannus-kulut) + erilliskustannus-laskutusyhteenvedossa))])) + (deftest laskutusyhteenvedon-sementointi (testing "laskutusyhteenvedon-sementoiti" (let [_ (when (= (empty? @oulun-mhu-urakka-2020-03)) diff --git a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql index 2f4430c0316..4362dce375c 100644 --- a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql +++ b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql @@ -142,9 +142,10 @@ CREATE TYPE HJERILLISHANKINNAT_RIVI AS hj_erillishankinnat_laskutettu NUMERIC, hj_erillishankinnat_laskutetaan NUMERIC ); +DROP FUNCTION IF EXISTS hj_erillishankinnat(DATE, DATE, DATE, TEXT, INTEGER, INTEGER, INTEGER); CREATE OR REPLACE FUNCTION hj_erillishankinnat(hk_alkupvm DATE, aikavali_alkupvm DATE, aikavali_loppupvm DATE, - toimenpide_koodi TEXT, t_instanssi INTEGER, urakka_id INTEGER, - sopimus_id INTEGER) RETURNS SETOF HJERILLISHANKINNAT_RIVI AS + toimenpide_koodi TEXT, t_instanssi INTEGER, urakka_id_ INTEGER) + RETURNS SETOF HJERILLISHANKINNAT_RIVI AS $$ DECLARE @@ -156,8 +157,8 @@ DECLARE tehtavaryhma_id INTEGER; BEGIN - -- Haetaan hoidon johdon erillishankinnat - tehtavaryhma_id := (SELECT id FROM tehtavaryhma WHERE nimi = 'Erillishankinnat (W)'); + -- Haetaan hoidon johdon erillishankinnat: 'Erillishankinnat (W)' + tehtavaryhma_id := (SELECT id FROM tehtavaryhma WHERE yksiloiva_tunniste = '37d3752c-9951-47ad-a463-c1704cf22f4c'); RAISE NOTICE 'hj_erillishankinnat: toimenpidekoodi % -- tehtavaryhma_i: % ' , toimenpide_koodi, tehtavaryhma_id; hj_erillishankinnat_laskutettu := 0.0; @@ -170,22 +171,22 @@ BEGIN -- Ennen tarkasteltavaa aikaväliä laskutetut hoidonjohdon erillishankinnat - (päätellään tpi:stä ja toimenpidekoodista ) -- Käydään läpi tiedot tauluista: kustannusarvioitu_tyo ja kulu_kohdistus -- Laskutettu - FOR laskutettu_rivi IN SELECT coalesce(kat.summa_indeksikorjattu, kat.summa, 0) AS summa -- Ota indeksikorjattu summa, jos se on - FROM kustannusarvioitu_tyo kat - WHERE kat.toimenpideinstanssi = t_instanssi - AND kat.tehtavaryhma = tehtavaryhma_id - AND kat.sopimus = sopimus_id - AND (SELECT (date_trunc('MONTH', - format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN hk_alkupvm AND aikavali_loppupvm - UNION ALL - SELECT coalesce(lk.summa, 0) AS summa - FROM kulu l - JOIN kulu_kohdistus lk ON lk.kulu = l.id - WHERE lk.toimenpideinstanssi = t_instanssi - AND lk.poistettu IS NOT TRUE - AND l.urakka = urakka_id - AND l.erapaiva BETWEEN hk_alkupvm AND aikavali_loppupvm - AND lk.tehtavaryhma = tehtavaryhma_id + FOR laskutettu_rivi IN SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa -- Ota indeksikorjattu summa, jos se on + FROM toteutuneet_kustannukset tk + WHERE tk.toimenpideinstanssi = t_instanssi + AND tk.tehtavaryhma = tehtavaryhma_id + AND tk.urakka_id = urakka_id_ + AND (SELECT (DATE_TRUNC('MONTH', + FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) BETWEEN hk_alkupvm AND aikavali_loppupvm + UNION ALL + SELECT COALESCE(lk.summa, 0) AS summa + FROM kulu l + JOIN kulu_kohdistus lk ON lk.kulu = l.id + WHERE lk.toimenpideinstanssi = t_instanssi + AND lk.poistettu IS NOT TRUE + AND l.urakka = urakka_id_ + AND l.erapaiva BETWEEN hk_alkupvm AND aikavali_loppupvm + AND lk.tehtavaryhma = tehtavaryhma_id LOOP RAISE NOTICE 'Erillishankinnat laskutettu :: summa: %', laskutettu_rivi.summa; @@ -195,22 +196,22 @@ BEGIN -- Tarkasteltavalla aikavälillä laskutettavat erillishankinnat -- Käydään läpi tiedot tauluista: kustannusarvioitu_tyo ja kulu_kohdistus -- Laskutetaan - FOR laskutetaan_rivi IN SELECT coalesce(kat.summa_indeksikorjattu, kat.summa, 0) AS summa - FROM kustannusarvioitu_tyo kat - WHERE kat.toimenpideinstanssi = t_instanssi - AND kat.sopimus = sopimus_id - AND kat.tehtavaryhma = tehtavaryhma_id - AND (SELECT (date_trunc('MONTH', - format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN aikavali_alkupvm AND aikavali_loppupvm - UNION ALL - SELECT coalesce(lk.summa, 0) AS summa - FROM kulu l - JOIN kulu_kohdistus lk ON lk.kulu = l.id - WHERE lk.toimenpideinstanssi = t_instanssi - AND lk.poistettu IS NOT TRUE - AND l.urakka = urakka_id - AND l.erapaiva BETWEEN aikavali_alkupvm AND aikavali_loppupvm - AND lk.tehtavaryhma = tehtavaryhma_id + FOR laskutetaan_rivi IN SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa + FROM toteutuneet_kustannukset tk + WHERE tk.toimenpideinstanssi = t_instanssi + AND tk.urakka_id = urakka_id_ + AND tk.tehtavaryhma = tehtavaryhma_id + AND (SELECT (DATE_TRUNC('MONTH', + FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) BETWEEN aikavali_alkupvm AND aikavali_loppupvm + UNION ALL + SELECT COALESCE(lk.summa, 0) AS summa + FROM kulu l + JOIN kulu_kohdistus lk ON lk.kulu = l.id + WHERE lk.toimenpideinstanssi = t_instanssi + AND lk.poistettu IS NOT TRUE + AND l.urakka = urakka_id_ + AND l.erapaiva BETWEEN aikavali_alkupvm AND aikavali_loppupvm + AND lk.tehtavaryhma = tehtavaryhma_id LOOP RAISE NOTICE 'Erillishankinnat laskutetaan :: summa: %', laskutetaan_rivi.summa; hj_erillishankinnat_laskutetaan := @@ -1006,7 +1007,7 @@ BEGIN -- HOIDONJOHTO -- erillishankinnat hj_erillishankinnat_rivi := (SELECT hj_erillishankinnat(hk_alkupvm, aikavali_alkupvm, aikavali_loppupvm, t.tuotekoodi, - t.tpi, ur, sopimus_id)); + t.tpi, ur)); hj_erillishankinnat_laskutettu := hj_erillishankinnat_rivi.hj_erillishankinnat_laskutettu; hj_erillishankinnat_laskutetaan := hj_erillishankinnat_rivi.hj_erillishankinnat_laskutetaan; From 504033e4e614120befa3cf0f192fc8fb272012fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Wed, 13 Nov 2024 14:22:44 +0200 Subject: [PATCH 3/5] Refaktoroidaan koodia --- .../palvelut/laskutusyhteenveto_mhu_test.clj | 31 +++++++------------ test/clj/harja/testi.clj | 6 ++++ 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj index f5249639fbb..f1431e42895 100644 --- a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj +++ b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj @@ -356,24 +356,25 @@ ;; Hoidonjohtopalkkio menee kustannusarvioitu_tyo tauluun tehtävälle Hoidonjohtopalkkio. ;; HAetaan sen tehtävän id: - hoidonjohtopalkkio-tehtava-id (:id (first (q-map (format "SELECT id FROM tehtava where yksiloiva_tunniste = '%s';" "53647ad8-0632-4dd3-8302-8dfae09908c8")))) + hoidonjohtopalkkio-tehtava-id (hae-tehtavan-id-tunnisteella "53647ad8-0632-4dd3-8302-8dfae09908c8") ;; Haetaan hoidonjohtopalkkio tehtävän kustannusarvioidut työt annetulla ajan jaksolla - hoidonjohtopalkkio-kustannusarvioidut-tyot (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM kustannusarvioitu_tyo - WHERE tehtava = %s AND tehtavaryhma IS NULL AND sopimus = %s AND tyyppi = 'laskutettava-tyo' - AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" + hoidonjohtopalkkio-kustannusarvioidut-tyot + (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM kustannusarvioitu_tyo + WHERE tehtava = %s AND tehtavaryhma IS NULL AND sopimus = %s AND tyyppi = 'laskutettava-tyo' + AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" hoidonjohtopalkkio-tehtava-id sopimus-id alkuvuosi loppuvuosi)))) ;; Haetaan hoidonjohtopalkkiot toteutuneet_kustannukset taulusta samalle ajanjaksolle - hoidonjohtopalkkio-toteutuneet_kustannukset (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM toteutuneet_kustannukset - WHERE tehtava = %s AND tehtavaryhma IS NULL AND urakka_id = %s AND tyyppi = 'laskutettava-tyo' - AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" + hoidonjohtopalkkio-toteutuneet_kustannukset + (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM toteutuneet_kustannukset + WHERE tehtava = %s AND tehtavaryhma IS NULL AND urakka_id = %s AND tyyppi = 'laskutettava-tyo' + AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" hoidonjohtopalkkio-tehtava-id urakka-id alkuvuosi loppuvuosi)))) _ (is (= hoidonjohtopalkkio-kustannusarvioidut-tyot hoidonjohtopalkkio-toteutuneet_kustannukset)) ;; Hoidonjohtopalkkioita voi olla myös kuluissa, joten tarkistetaan niiden määrä ;; Hoidonjohtopalkkiot määritellään tehtäväryhmälle: Hoidonjohtopalkkio (G) - 0ef0b97e-1390-4d6c-bbc4-b30536be8a68 - hoidonjohtopalkkio-tehtavaryhma-id (:id (first (q-map (str "SELECT id FROM tehtavaryhma - WHERE yksiloiva_tunniste = '0ef0b97e-1390-4d6c-bbc4-b30536be8a68';")))) + hoidonjohtopalkkio-tehtavaryhma-id (hae-tehtavaryhman-id-tunnisteella "0ef0b97e-1390-4d6c-bbc4-b30536be8a68") ;; Haetaan hoidonjohtopalkkiot kuluista hoidonjohtopalkkio-kulut (:summa (first (q-map (format @@ -387,16 +388,8 @@ urakka-id alkuaika loppuaika hoidonjohtopalkkio-tehtavaryhma-id)))) ;; Vanha tapa laskea hoidonjohtopalkkiot on kustannusarvioitu_tyo taulussa - ;; Haetaan ensin toimenpideinstanssi-id -- tpk2.koodi/tuotekoodi 23150 on MHU Hoidonjohto - toimenpideinstanssi-id (:id (first (q-map (format "SELECT - tpi.id AS id - FROM toimenpideinstanssi tpi - JOIN toimenpide tpk3 ON tpk3.id = tpi.toimenpide - JOIN toimenpide tpk2 ON tpk3.emo = tpk2.id, - maksuera m - WHERE tpi.urakka = %s AND m.toimenpideinstanssi = tpi.id - AND tpk2.koodi = '23150' - ORDER BY m.numero ASC" urakka-id)))) + ;; Haetaan ensin toimenpideinstanssi-id -- tpk2.koodi/tuotekoodi 23151 on MHU Hoidonjohto + toimenpideinstanssi-id (hae-toimenpideinstanssi-id urakka-id "23151") toimenpidekoodi-id-hu-tyonjohto (:id (first (q-map (format "SELECT id FROM tehtava WHERE yksiloiva_tunniste = 'c9712637-fbec-4fbd-ac13-620b5619c744';")))) toimenpidekoodi-id-hj-palkkio (:id (first (q-map (format "SELECT id FROM tehtava WHERE yksiloiva_tunniste = '53647ad8-0632-4dd3-8302-8dfae09908c8';")))) diff --git a/test/clj/harja/testi.clj b/test/clj/harja/testi.clj index fc523ed777c..3faf6cb96bc 100644 --- a/test/clj/harja/testi.clj +++ b/test/clj/harja/testi.clj @@ -905,9 +905,15 @@ (defn hae-tehtavan-id-nimella [nimi] (ffirst (q (str "SELECT id from tehtava where nimi = '" nimi "';")))) +(defn hae-tehtavan-id-tunnisteella [tunniste] + (ffirst (q (str "SELECT id from tehtava where yksiloiva_tunniste = '" tunniste "';")))) + (defn hae-tehtavaryhman-id [nimi] (ffirst (q (str "SELECT id from tehtavaryhma where nimi = '" nimi "';")))) +(defn hae-tehtavaryhman-id-tunnisteella [tunniste] + (ffirst (q (str "SELECT id from tehtavaryhma where yksiloiva_tunniste = '" tunniste "';")))) + (defn hae-rahavaraus-nimella [nimi] (ffirst (q-map (format "SELECT id, nimi from rahavaraus where nimi = '%s';" nimi)))) From 6f8692cc9b03746ab327f7e913e6808674d8446e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Thu, 14 Nov 2024 07:34:06 +0200 Subject: [PATCH 4/5] Laskutusyhteenvetoon johto- ja hallinto korvaukset haetaan nyt toteutuneet_kustannukset taulusta --- .../palvelut/laskutusyhteenveto_mhu_test.clj | 102 ++++++++++++- .../migration/R__Laskutusyhteenveto_mhu.sql | 141 +++++++++--------- .../R__Laskutusyhteenveto_tyomaakokous.sql | 2 +- 3 files changed, 170 insertions(+), 75 deletions(-) diff --git a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj index f1431e42895..8ebc0717bad 100644 --- a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj +++ b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj @@ -1,5 +1,6 @@ (ns harja.palvelin.palvelut.laskutusyhteenveto-mhu-test (:require [clojure.test :refer :all] + [harja.kyselyt.urakat :as urakat-q] [taoensso.timbre :as log] [harja.palvelin.komponentit.tietokanta :as tietokanta] [harja.palvelin.raportointi.raportit.laskutusyhteenveto-tuotekohtainen :as laskutusyhteenveto] @@ -11,7 +12,10 @@ [harja.kyselyt.konversio :as konv] [harja.kyselyt.sanktiot :as sanktiot] [harja.kyselyt.laskutusyhteenveto :as laskutusyhteenveto-kyselyt] + [harja.kyselyt.urakat :as urakat-q] [harja.pvm :as pvm] + [harja.domain.kulut :as domain-kulut] + [harja.palvelin.palvelut.kulut.kulut :as kulu-palvelu] [harja.testi :as testi])) @@ -21,7 +25,10 @@ (component/start (component/system-map :db (tietokanta/luo-tietokanta testitietokanta) - :http-palvelin (testi-http-palvelin))))) + :http-palvelin (testi-http-palvelin) + :kulut (component/using + (kulu-palvelu/->Kulut) + [:http-palvelin :db]))))) (testit) (alter-var-root #'jarjestelma component/stop)) @@ -357,7 +364,7 @@ ;; Hoidonjohtopalkkio menee kustannusarvioitu_tyo tauluun tehtävälle Hoidonjohtopalkkio. ;; HAetaan sen tehtävän id: hoidonjohtopalkkio-tehtava-id (hae-tehtavan-id-tunnisteella "53647ad8-0632-4dd3-8302-8dfae09908c8") - ;; Haetaan hoidonjohtopalkkio tehtävän kustannusarvioidut työt annetulla ajan jaksolla + ;; Haetaan hoidonjohtopalkkio tehtävän kustannusarvioidut työt annetulla ajanjaksolla hoidonjohtopalkkio-kustannusarvioidut-tyot (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM kustannusarvioitu_tyo WHERE tehtava = %s AND tehtavaryhma IS NULL AND sopimus = %s AND tyyppi = 'laskutettava-tyo' @@ -434,7 +441,7 @@ ;; Erilliskustannukset menee kustannusarvioitu_tyo tauluun tehtäväryhmälle Erilliskustannus (W) / '37d3752c-9951-47ad-a463-c1704cf22f4c' ;; Haetaan sen tehtäväryhmän id: erilliskustannus-tehtavaryhma-id (hae-tehtavaryhman-id-tunnisteella "37d3752c-9951-47ad-a463-c1704cf22f4c") ;(:id (first (q-map (format "SELECT id FROM tehtavaryhma where yksiloiva_tunniste = '%s';" "37d3752c-9951-47ad-a463-c1704cf22f4c")))) - ;; Haetaan hoidonjohtopalkkio tehtävän kustannusarvioidut työt annetulla ajan jaksolla + ;; Haetaan hoidonjohtopalkkio tehtävän kustannusarvioidut työt annetulla ajanjaksolla erilliskustannus-kustannusarvioidut-tyot (:summa (first (q-map (format "SELECT SUM(summa_indeksikorjattu) as summa FROM kustannusarvioitu_tyo WHERE tehtavaryhma = %s AND sopimus = %s AND tyyppi = 'laskutettava-tyo' @@ -489,6 +496,95 @@ (+ erilliskustannus-toteutuneet_kustannukset erilliskustannus-kulut) erilliskustannus-laskutusyhteenvedossa))])) +(defn jh-korvaus-kulu [urakka-id erapaiva summa toimenpideinstanssi-id tehtavaryhma-id urakan-alkupvm] + {:id nil + :urakka urakka-id + :viite "12345" + :erapaiva erapaiva + :kokonaissumma summa + :tyyppi "laskutettava" + :kohdistukset [{:kohdistus-id nil + :rivi 1 + :summa summa + :toimenpideinstanssi toimenpideinstanssi-id + :tehtavaryhma tehtavaryhma-id + :tehtava nil + :tavoitehintainen :true + :tyyppi "hankintakulu"}] + :koontilaskun-kuukausi (domain-kulut/pvm->koontilaskun-kuukausi erapaiva urakan-alkupvm)}) + +(deftest toteutuneet-johto-ja-hallintokorvaukset + ;; JH-korvaukset suunnitellaan johto_ja_hallintokorvaus tauluun. Ja ne on + ;; päätelty toteutuvaksi aina kuukauden vaihteessa. + ;; Uudistuneessa versiossa ne siirretään kuukauden vaihteessa toteutuneet_kustannukset tauluun. + ;; Varmistetaan testillä, että luvut ovat samat. + (let [alkuaika-iso "2022-10-01" + alkuaika (pvm/->pvm "1.10.2022") + alkuvuosi 2022 + loppuaika "2023-10-01" + loppuvuosi 2023 + urakka-id @oulun-maanteiden-hoitourakan-2019-2024-id + urakan-tiedot (first (urakat-q/hae-urakka (:db jarjestelma) {:id urakka-id})) + toimenpideinstanssi-id (hae-toimenpideinstanssi-id urakka-id "23151") + jh-tehtavaryhma-id (hae-tehtavaryhman-id-tunnisteella "a6614475-1950-4a61-82c6-fda0fd19bb54") + jh-kulu-summa 345M + + ;; JH-korvaukset suunnitellaan johto_ja_hallintokorvaus -tauluun + ;; Haetaan JH-korvaukset johto_ja_hallintokorvaus annetulla ajanjaksolla + jh-korvaus-suunniteltu + (:summa (first (q-map (format "SELECT coalesce( + SUM(CASE + WHEN jhk.tuntipalkka_indeksikorjattu IS NOT NULL + THEN coalesce((jhk.tunnit * jhk.tuntipalkka_indeksikorjattu * jhk.\"osa-kuukaudesta\"), 0) + ELSE coalesce((jhk.tunnit * jhk.tuntipalkka * jhk.\"osa-kuukaudesta\"), 0) + END),0) as summa + FROM johto_ja_hallintokorvaus jhk + WHERE jhk.\"urakka-id\" = %s + AND ((jhk.vuosi = %s AND jhk.kuukausi in (10,11,12)) OR jhk.vuosi = %s AND jhk.kuukausi in (1,2,3,4,5,6,7,8,9));" + urakka-id alkuvuosi loppuvuosi)))) + + ;; Haetaan hoidonjohtopalkkiot toteutuneet_kustannukset taulusta samalle ajanjaksolle + jh-korvaus-toteutuneet_kustannukset + (:summa (first (q-map (format "SELECT coalesce(SUM(summa_indeksikorjattu), 0) as summa FROM toteutuneet_kustannukset + WHERE tehtavaryhma = %s AND urakka_id = %s AND tyyppi = 'laskutettava-tyo' + AND ((vuosi = %s AND kuukausi in (10,11,12)) OR vuosi = %s AND kuukausi in (1,2,3,4,5,6,7,8,9));" + jh-tehtavaryhma-id urakka-id alkuvuosi loppuvuosi)))) + _ (is (= jh-korvaus-suunniteltu jh-korvaus-toteutuneet_kustannukset)) + + ;; JH-korvaukset voi olla myös kuluissa, joten tarkistetaan niiden määrä + ;; Lisätään uusi kulu, jotta sellainen voidaan hakea + jh-kulu (jh-korvaus-kulu urakka-id alkuaika jh-kulu-summa toimenpideinstanssi-id jh-tehtavaryhma-id (:alkupvm urakan-tiedot)) + kulu_vastaus (kutsu-http-palvelua :tallenna-kulu +kayttaja-jvh+ + {:urakka-id urakka-id + :kulu-kohdistuksineen jh-kulu}) + + ;; Haetaan JH-korvaukset kuluista + jh-korvaus-kulut (:summa (first (q-map (format + "SELECT coalesce(SUM(kk.summa), 0) AS summa + FROM kulu k + JOIN kulu_kohdistus kk ON kk.kulu = k.id + WHERE kk.poistettu IS NOT TRUE + AND k.urakka = %s + AND k.erapaiva BETWEEN '%s'::DATE AND '%s'::DATE + AND kk.tehtavaryhma = %s;" + urakka-id alkuaika-iso loppuaika jh-tehtavaryhma-id)))) + _ (is (= jh-korvaus-kulut jh-kulu-summa)) + + ;; Haetaan laskutusyhteenveto ja varmistetaan, että siellä on samat luvut jh-korvauksille + laskutusyhteenveto (lyv-yhteiset/hae-laskutusyhteenvedon-tiedot + (:db jarjestelma) + +kayttaja-jvh+ + {:urakka-id @oulun-maanteiden-hoitourakan-2019-2024-id + :urakkatyyppi "teiden-hoito" + :alkupvm alkuaika + :loppupvm (pvm/->pvm "30.9.2023")}) + ;; JH-korvaukset ovat vaan MHY ylläpidon alla, mutta lasketaan se kaikkien alta, koska se on muualla nolla + ;; Ja jos ei ole, niin silloin on virhetilanne ja se löytyy samalla testillä. + jh-korvaus-laskutusyhteenvedossa (apply + (map :johto_ja_hallinto_laskutettu laskutusyhteenveto)) + _ (is (= (+ jh-korvaus-suunniteltu jh-korvaus-kulut) + (+ jh-korvaus-toteutuneet_kustannukset jh-korvaus-kulut) + jh-korvaus-laskutusyhteenvedossa))])) + (deftest laskutusyhteenvedon-sementointi (testing "laskutusyhteenvedon-sementoiti" (let [_ (when (= (empty? @oulun-mhu-urakka-2020-03)) diff --git a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql index 4362dce375c..6184acc626b 100644 --- a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql +++ b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_mhu.sql @@ -169,7 +169,7 @@ BEGIN RAISE NOTICE 'hj_erillishankinnat lasketaan mukaan, koska toimenpideinstanssi on hoidon johto. %', t_instanssi; -- Ennen tarkasteltavaa aikaväliä laskutetut hoidonjohdon erillishankinnat - (päätellään tpi:stä ja toimenpidekoodista ) - -- Käydään läpi tiedot tauluista: kustannusarvioitu_tyo ja kulu_kohdistus + -- Käydään läpi tiedot tauluista: toteutuneet_kustannukset ja kulu_kohdistus -- Laskutettu FOR laskutettu_rivi IN SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa -- Ota indeksikorjattu summa, jos se on FROM toteutuneet_kustannukset tk @@ -194,7 +194,7 @@ BEGIN END LOOP; -- Tarkasteltavalla aikavälillä laskutettavat erillishankinnat - -- Käydään läpi tiedot tauluista: kustannusarvioitu_tyo ja kulu_kohdistus + -- Käydään läpi tiedot tauluista: toteutuneet_kustannukset ja kulu_kohdistus -- Laskutetaan FOR laskutetaan_rivi IN SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa FROM toteutuneet_kustannukset tk @@ -303,7 +303,7 @@ BEGIN END LOOP; -- Tarkasteltavalla aikavälillä laskutetut tai laskutettavat hoidonjohdon kustannukset - -- Käydään läpi tiedot taulusta: kustannusarvioitu_tyo + -- Käydään läpi tiedot taulusta: toteutuneet_kustannukset -- hj_palkkio - laskutetaan FOR hj_palkkio_laskutetaan_rivi IN SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa FROM toteutuneet_kustannukset tk @@ -353,8 +353,9 @@ CREATE TYPE HOIDONJOHTO_RIVI AS johto_ja_hallinto_laskutetaan NUMERIC ); +DROP FUNCTION IF EXISTS hoidon_johto_yhteenveto(DATE, DATE, DATE, TEXT, INTEGER, INTEGER, INTEGER); CREATE OR REPLACE FUNCTION hoidon_johto_yhteenveto(hk_alkupvm DATE, aikavali_alkupvm DATE, aikavali_loppupvm DATE, - toimenpide_koodi TEXT, t_instanssi INTEGER, urakka_id INTEGER, + toimenpide_koodi TEXT, t_instanssi INTEGER, urakka_id_ INTEGER, sopimus_id INTEGER) RETURNS SETOF HOIDONJOHTO_RIVI AS $$ DECLARE @@ -369,10 +370,10 @@ DECLARE BEGIN - -- Haetaan hoidon johdon yhteenvetoja tauluista: johto_ja_hallintokorvaus, kulu_kohdistus sekä kustannusarvioitu_tyo. - -- kustannusarvioitu_tyo haetaan pelkästään tehtävällä, koska tehtäväryhmät viittaavat aina Tavoitehinnan ulkopuolisiin rahavarauksiin + -- Haetaan hoidon johdon yhteenvetoja tauluista: johto_ja_hallintokorvaus, kulu_kohdistus sekä toteutuneet_kustannukset. + -- toteutuneet_kustannukset haetaan pelkästään tehtävällä, koska tehtäväryhmät viittaavat aina Tavoitehinnan ulkopuolisiin rahavarauksiin tehtavaryhma_id := (SELECT id FROM tehtavaryhma WHERE nimi = 'Johto- ja hallintokorvaus (J)'); - -- kustannusarvioitu_tyo taulusta haetaan toimenpidekoodin perusteella - Toimistotarvike- ja ICT-kulut, tiedotus, opastus, kokousten järjestäminen jne. + -- toteutuneet_kustannukset taulusta haetaan toimenpidekoodin perusteella - Toimistotarvike- ja ICT-kulut, tiedotus, opastus, kokousten järjestäminen jne. toimistotarvike_koodi := (SELECT id FROM tehtava WHERE yksiloiva_tunniste = '8376d9c4-3daf-4815-973d-cd95ca3bb388'); @@ -387,39 +388,38 @@ BEGIN -- Ennen tarkasteltavaa aikaväliä ja aikavälillä laskutetut hoidonjohdon kustannukset -- Käytetään taulua: johto_ja_hallintokorvaus - -- johto_ja_hallintokorvaus - laskutettu - FOR laskutettu IN - SELECT CASE - WHEN jhk.tuntipalkka_indeksikorjattu IS NOT NULL - THEN coalesce((jhk.tunnit * jhk.tuntipalkka_indeksikorjattu * jhk."osa-kuukaudesta"), 0) - ELSE coalesce((jhk.tunnit * jhk.tuntipalkka * jhk."osa-kuukaudesta"), 0) - END - AS summa - FROM johto_ja_hallintokorvaus jhk - WHERE "urakka-id" = urakka_id - AND (SELECT (date_trunc('MONTH', - format('%s-%s-%s', jhk.vuosi, jhk.kuukausi, 1)::DATE))) BETWEEN hk_alkupvm::DATE AND aikavali_loppupvm::DATE - - UNION ALL - - SELECT coalesce(lk.summa, 0) AS summa - FROM kulu l - JOIN kulu_kohdistus lk ON lk.kulu = l.id - WHERE lk.toimenpideinstanssi = t_instanssi - AND lk.poistettu IS NOT TRUE - AND l.urakka = urakka_id - AND l.erapaiva BETWEEN hk_alkupvm AND aikavali_loppupvm - AND lk.tehtavaryhma = tehtavaryhma_id - - UNION ALL - SELECT coalesce(kt.summa_indeksikorjattu, kt.summa, 0) AS summa - FROM kustannusarvioitu_tyo kt - WHERE kt.toimenpideinstanssi = t_instanssi - AND kt.sopimus = sopimus_id - AND kt.tehtava = toimistotarvike_koodi -- Kustannussuunnitelmassa "Muut kulut" on toimistotarvikekuluja - AND (SELECT (date_trunc('MONTH', format('%s-%s-%s', kt.vuosi, kt.kuukausi, 1)::DATE))) - BETWEEN hk_alkupvm AND aikavali_loppupvm + FOR laskutettu IN + -- johto_ja_hallintokorvaus - Toteutuneet_kustannukset + SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa + FROM toteutuneet_kustannukset tk + WHERE tk.urakka_id = urakka_id_ + AND tk.tehtavaryhma = tehtavaryhma_id + AND (SELECT (DATE_TRUNC('MONTH', + FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) BETWEEN hk_alkupvm::DATE AND aikavali_loppupvm::DATE + + UNION ALL + + -- johto_ja_hallintokorvaus - lisätyt kulut + SELECT COALESCE(lk.summa, 0) AS summa + FROM kulu l + JOIN kulu_kohdistus lk ON lk.kulu = l.id + WHERE lk.toimenpideinstanssi = t_instanssi + AND lk.poistettu IS NOT TRUE + AND l.urakka = urakka_id_ + AND l.erapaiva BETWEEN hk_alkupvm AND aikavali_loppupvm + AND lk.tehtavaryhma = tehtavaryhma_id + + UNION ALL + + -- Toimistotarvikkeet - toteutuneet_kustannukset + SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa + FROM toteutuneet_kustannukset tk + WHERE tk.toimenpideinstanssi = t_instanssi + AND tk.urakka_id = urakka_id_ + AND tk.tehtava = toimistotarvike_koodi -- Kustannussuunnitelmassa "Muut kulut" on toimistotarvikekuluja + AND (SELECT (DATE_TRUNC('MONTH', FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) + BETWEEN hk_alkupvm AND aikavali_loppupvm LOOP johto_ja_hallinto_laskutettu := johto_ja_hallinto_laskutettu + COALESCE(laskutettu.summa, 0.0); @@ -433,38 +433,37 @@ BEGIN -- johto_ja_hallintokorvaus - laskutetaan FOR laskutetaan IN - SELECT CASE - WHEN jhk.tuntipalkka_indeksikorjattu IS NOT NULL - THEN coalesce((jhk.tunnit * jhk.tuntipalkka_indeksikorjattu * jhk."osa-kuukaudesta"), 0) - ELSE coalesce((jhk.tunnit * jhk.tuntipalkka * jhk."osa-kuukaudesta"), 0) - END - AS summa - FROM johto_ja_hallintokorvaus jhk - WHERE "urakka-id" = urakka_id - AND (SELECT (date_trunc('MONTH', format('%s-%s-%s', jhk.vuosi, jhk.kuukausi, 1)::DATE))) - BETWEEN aikavali_alkupvm AND aikavali_loppupvm - - UNION ALL - - SELECT coalesce(lk.summa, 0) AS summa - FROM kulu l - JOIN kulu_kohdistus lk ON lk.kulu = l.id - WHERE lk.toimenpideinstanssi = t_instanssi - AND lk.poistettu = FALSE - AND l.urakka = urakka_id - AND l.erapaiva BETWEEN aikavali_alkupvm AND aikavali_loppupvm - AND lk.tehtavaryhma = tehtavaryhma_id - - UNION ALL - - SELECT coalesce(kt.summa_indeksikorjattu, kt.summa, 0) AS summa - FROM kustannusarvioitu_tyo kt - WHERE kt.toimenpideinstanssi = t_instanssi - AND kt.sopimus = sopimus_id - AND kt.tehtava = toimistotarvike_koodi - AND (SELECT (date_trunc('MONTH', - format('%s-%s-%s', kt.vuosi, kt.kuukausi, 1)::DATE))) - BETWEEN aikavali_alkupvm AND aikavali_loppupvm + -- johto_ja_hallintokorvaus - Toteutuneet_kustannukset + SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa + FROM toteutuneet_kustannukset tk + WHERE tk.urakka_id = urakka_id_ + AND tk.tehtavaryhma = tehtavaryhma_id + AND (SELECT (DATE_TRUNC('MONTH', FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) + BETWEEN aikavali_alkupvm AND aikavali_loppupvm + + UNION ALL + + -- Toimistotarvikkeet - Lisätyt kulut + SELECT COALESCE(lk.summa, 0) AS summa + FROM kulu l + JOIN kulu_kohdistus lk ON lk.kulu = l.id + WHERE lk.toimenpideinstanssi = t_instanssi + AND lk.poistettu = FALSE + AND l.urakka = urakka_id_ + AND l.erapaiva BETWEEN aikavali_alkupvm AND aikavali_loppupvm + AND lk.tehtavaryhma = tehtavaryhma_id + + UNION ALL + + -- Toimistotarvikkeet - toteutuneet_kustannukset + SELECT COALESCE(tk.summa_indeksikorjattu, tk.summa, 0) AS summa + FROM toteutuneet_kustannukset tk + WHERE tk.toimenpideinstanssi = t_instanssi + AND tk.urakka_id = urakka_id_ + AND tk.tehtava = toimistotarvike_koodi + AND (SELECT (DATE_TRUNC('MONTH', + FORMAT('%s-%s-%s', tk.vuosi, tk.kuukausi, 1)::DATE))) + BETWEEN aikavali_alkupvm AND aikavali_loppupvm LOOP -- Kuukauden laskutettava määrä päivittyy laskutettavaan summaan ja lähetettävään maksuerään vasta kuukauden viimeisenä päivänä. diff --git a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_tyomaakokous.sql b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_tyomaakokous.sql index 2453e1cbb23..a1c3430bb97 100644 --- a/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_tyomaakokous.sql +++ b/tietokanta/src/main/resources/db/migration/R__Laskutusyhteenveto_tyomaakokous.sql @@ -855,7 +855,7 @@ BEGIN -- HOIDONJOHTO -- erillishankinnat erillishankinnat_rivi := (SELECT hj_erillishankinnat(hk_alkupvm, aikavali_alkupvm, aikavali_loppupvm, '23150'::TEXT, - hoidonjohto_tpi_id::INTEGER, ur::INTEGER, sopimus_id::INTEGER)); + hoidonjohto_tpi_id::INTEGER, ur::INTEGER)); erillishankinnat_hoitokausi_yht := 0.0; erillishankinnat_val_aika_yht := 0.0; From 2666094d589a49f4bf56c2f828b90c43f91fccd3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20V=C3=A4h=C3=A4kangas?= Date: Thu, 14 Nov 2024 08:12:32 +0200 Subject: [PATCH 5/5] =?UTF-8?q?Nime=C3=A4=20muuttujia=20tarkemmin=20kuvast?= =?UTF-8?q?amaan,=20ett=C3=A4=20mit=C3=A4=20ne=20on?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../palvelut/laskutusyhteenveto_mhu_test.clj | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj index 8ebc0717bad..ab0ec9fd954 100644 --- a/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj +++ b/test/clj/harja/palvelin/palvelut/laskutusyhteenveto_mhu_test.clj @@ -394,21 +394,21 @@ AND kk.tehtavaryhma = %s;" urakka-id alkuaika loppuaika hoidonjohtopalkkio-tehtavaryhma-id)))) - ;; Vanha tapa laskea hoidonjohtopalkkiot on kustannusarvioitu_tyo taulussa + ;; Suunnitellut hoidonjohtopalkkiot on kustannusarvioitu_tyo taulussa ;; Haetaan ensin toimenpideinstanssi-id -- tpk2.koodi/tuotekoodi 23151 on MHU Hoidonjohto toimenpideinstanssi-id (hae-toimenpideinstanssi-id urakka-id "23151") toimenpidekoodi-id-hu-tyonjohto (:id (first (q-map (format "SELECT id FROM tehtava WHERE yksiloiva_tunniste = 'c9712637-fbec-4fbd-ac13-620b5619c744';")))) toimenpidekoodi-id-hj-palkkio (:id (first (q-map (format "SELECT id FROM tehtava WHERE yksiloiva_tunniste = '53647ad8-0632-4dd3-8302-8dfae09908c8';")))) - vanhat-summat (:summa (first (q-map (str + suunnitellut-summat (:summa (first (q-map (str "SELECT SUM(coalesce(kat.summa_indeksikorjattu, kat.summa, 0)) AS summa FROM kustannusarvioitu_tyo kat WHERE kat.toimenpideinstanssi = " toimenpideinstanssi-id " AND (kat.tehtavaryhma = " hoidonjohtopalkkio-tehtavaryhma-id " OR kat.tehtava IN (" toimenpidekoodi-id-hu-tyonjohto ", " toimenpidekoodi-id-hj-palkkio ")) AND kat.sopimus = " sopimus-id " AND (SELECT (date_trunc('MONTH', format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN '" alkuaika "'::DATE AND '" loppuaika "'::DATE")))) - _ (is (= hoidonjohtopalkkio-kustannusarvioidut-tyot vanhat-summat)) + _ (is (= hoidonjohtopalkkio-kustannusarvioidut-tyot suunnitellut-summat)) ;; Haetaan laskutusyhteenveto ja varmistetaan, että siellä on samat luvut hoidonjohtopalkkioille laskutusyhteenveto (lyv-yhteiset/hae-laskutusyhteenvedon-tiedot @@ -469,17 +469,17 @@ AND kk.tehtavaryhma = %s;" urakka-id alkuaika loppuaika erilliskustannus-tehtavaryhma-id)))) - ;; Vanha tapa laskea erilliskustannukset on kustannusarvioitu_tyo taulussa + ;; Suunnitellut erilliskustannukset on kustannusarvioitu_tyo taulussa ;; Haetaan ensin toimenpideinstanssi-id -- tpk2.koodi/tuotekoodi 23151 on MHU Hoidonjohto toimenpideinstanssi-id (hae-toimenpideinstanssi-id urakka-id "23151") - vanhat-summat (:summa (first (q-map (str + suunnitellut-summat (:summa (first (q-map (str "SELECT SUM(coalesce(kat.summa_indeksikorjattu, kat.summa, 0)) AS summa FROM kustannusarvioitu_tyo kat WHERE kat.toimenpideinstanssi = " toimenpideinstanssi-id " AND kat.tehtavaryhma = " erilliskustannus-tehtavaryhma-id " AND kat.sopimus = " sopimus-id " AND (SELECT (date_trunc('MONTH', format('%s-%s-%s', kat.vuosi, kat.kuukausi, 1)::DATE))) BETWEEN '" alkuaika "'::DATE AND '" loppuaika "'::DATE")))) - _ (is (= erilliskustannus-kustannusarvioidut-tyot vanhat-summat)) + _ (is (= erilliskustannus-kustannusarvioidut-tyot suunnitellut-summat)) ;; Haetaan laskutusyhteenveto ja varmistetaan, että siellä on samat luvut Erilliskustannuksille laskutusyhteenveto (lyv-yhteiset/hae-laskutusyhteenvedon-tiedot