From 66aaa75987ff37589c93863481d63ba703a45e29 Mon Sep 17 00:00:00 2001 From: jlaamanen Date: Fri, 16 Jun 2023 16:36:13 +0300 Subject: [PATCH 1/2] Added summary row for SAP reports --- .../0048_sap-loosen-constraints.sql | 4 + ...49_sap-project-company-code-and-status.sql | 3 + backend/db_migrations/0050_company-codes.sql | 584 ++++++++++++++++++ .../components/sap/blanketContractReport.ts | 24 +- backend/src/components/sap/dataImport.ts | 8 +- .../components/sap/environmentCodeReport.ts | 28 +- backend/src/components/sap/transform.ts | 2 + backend/src/router/sap.ts | 24 +- docker/sap-mock/mock-server.clj | 5 +- frontend/src/components/DataTable.tsx | 43 +- .../src/components/forms/CurrencyInput.tsx | 11 + .../SapReports/BlanketContractReport.tsx | 15 +- .../SapReports/EnvironmentalCodeReport.tsx | 26 +- shared/src/language/fi.json | 3 + shared/src/schema/sapProject.ts | 4 + shared/src/schema/sapReport.ts | 3 +- 16 files changed, 736 insertions(+), 51 deletions(-) create mode 100644 backend/db_migrations/0048_sap-loosen-constraints.sql create mode 100644 backend/db_migrations/0049_sap-project-company-code-and-status.sql create mode 100644 backend/db_migrations/0050_company-codes.sql diff --git a/backend/db_migrations/0048_sap-loosen-constraints.sql b/backend/db_migrations/0048_sap-loosen-constraints.sql new file mode 100644 index 00000000..43ef47e5 --- /dev/null +++ b/backend/db_migrations/0048_sap-loosen-constraints.sql @@ -0,0 +1,4 @@ +ALTER TABLE sap_network ALTER COLUMN network_name DROP NOT NULL; +ALTER TABLE sap_activity ALTER COLUMN profit_center DROP NOT NULL; +ALTER TABLE sap_project ALTER COLUMN short_description DROP NOT NULL; +ALTER TABLE sap_wbs ALTER COLUMN short_description DROP NOT NULL; diff --git a/backend/db_migrations/0049_sap-project-company-code-and-status.sql b/backend/db_migrations/0049_sap-project-company-code-and-status.sql new file mode 100644 index 00000000..1093cbd2 --- /dev/null +++ b/backend/db_migrations/0049_sap-project-company-code-and-status.sql @@ -0,0 +1,3 @@ +ALTER TABLE sap_project +ADD COLUMN company_code TEXT, +ADD COLUMN system_status TEXT; diff --git a/backend/db_migrations/0050_company-codes.sql b/backend/db_migrations/0050_company-codes.sql new file mode 100644 index 00000000..ac7e2c70 --- /dev/null +++ b/backend/db_migrations/0050_company-codes.sql @@ -0,0 +1,584 @@ +INSERT INTO app.code (id, text_fi, text_en) VALUES +( + ('Kumppani', '1110'), + 'Kaupunkiympäristön palvelualue', + 'Kaupunkiympäristön palvelualue' +), +( + ('Kumppani', '1130'), + 'Konsernihallinto ja yhteiset erät', + 'Konsernihallinto ja yhteiset erät' +), +( + ('Kumppani', '1180'), + 'Yhdistely- ja eliminointikirjaukset', + 'Yhdistely- ja eliminointikirjaukset' +), +(('Kumppani', '1190'), 'Rahastot', 'Rahastot'), +( + ('Kumppani', '1310'), + 'Kasvatus- ja opetuspalvelut', + 'Kasvatus- ja opetuspalvelut' +), +(('Kumppani', '1340'), 'Toisen asteen koulutus', 'Toisen asteen koulutus'), +( + ('Kumppani', '1350'), + 'Kiinteistöt, tilat ja asuntopolitiikka', + 'Kiinteistöt, tilat ja asuntopolitiikka' +), +( + ('Kumppani', '1370'), + 'Kulttuuri- ja vapaa-aikapalvelut', + 'Kulttuuri- ja vapaa-aikapalvelut' +), +( + ('Kumppani', '1540'), + 'Työllisyydenhoidon palveluyksikkö', + 'Työllisyydenhoidon palveluyksikkö' +), +( + ('Kumppani', '1820'), + 'Tampereen Kaupunkiliikenne liikelaitos', + 'Tampereen Kaupunkiliikenne liikelaitos' +), +( + ('Kumppani', '1830'), + 'Tampereen Vesi liikelaitos', + 'Tampereen Vesi liikelaitos' +), +(('Kumppani', '2010'), 'Ekokumppanit Oy', 'Ekokumppanit Oy'), +( + ('Kumppani', '2030'), + 'Itämeri-Instituutti säätiö', + 'Itämeri-Instituutti säätiö' +), +( + ('Kumppani', '2031'), + 'Tampereen Musiikkiopiston Säätiö', + 'Tampereen Musiikkiopiston Säätiö' +), +( + ('Kumppani', '2032'), + 'Tampereen Konservatoriotalon Säätiö', + 'Tampereen Konservatoriotalon Säätiö' +), +(('Kumppani', '2040'), 'Pirkanmaan Jätehuolto Oy', 'Pirkanmaan Jätehuolto Oy'), +(('Kumppani', '2070'), 'Pirkan Putkikeräys Oy', 'Pirkan Putkikeräys Oy'), +( + ('Kumppani', '2071'), + 'Ranta-Tampellan Putkikeräys Oy', + 'Ranta-Tampellan Putkikeräys Oy' +), +( + ('Kumppani', '2050'), + 'Työväen Teatterin talosäätiö', + 'Työväen Teatterin talosäätiö' +), +(('Kumppani', '2060'), 'Tavase Oy', 'Tavase Oy'), +(('Kumppani', '2090'), 'Tampereen Sarka Oy', 'Tampereen Sarka Oy'), +(('Kumppani', '2110'), 'Runoilijantie Oy', 'Runoilijantie Oy'), +(('Kumppani', '2120'), 'Tampereen Infra Oy', 'Tampereen Infra Oy'), +( + ('Kumppani', '2140'), + 'Tampereen Työvalmennussäätiö Syke', + 'Tampereen Työvalmennussäätiö Syke' +), +(('Kumppani', '2150'), 'Tampereen Särkänniemi Oy', 'Tampereen Särkänniemi Oy'), +(('Kumppani', '2160'), 'FunZones Oy', 'FunZones Oy'), +(('Kumppani', '2180'), 'Tampere-talo Oy', 'Tampere-talo Oy'), +(('Kumppani', '2190'), 'Pirkanmaan Voimia Oy', 'Pirkanmaan Voimia Oy'), +(('Kumppani', '2210'), 'Tampereen Sähkölaitos Oy', 'Tampereen Sähkölaitos Oy'), +(('Kumppani', '2220'), 'Tampereen Sähköverkko Oy', 'Tampereen Sähköverkko Oy'), +(('Kumppani', '2230'), 'Tampereen Vera Oy', 'Tampereen Vera Oy'), +(('Kumppani', '2270'), 'Tammervoima Oy', 'Tammervoima Oy'), +(('Kumppani', '2310'), 'Finnpark Oy', 'Finnpark Oy'), +(('Kumppani', '2311'), 'Finnpark Pysäköinti Oy', 'Finnpark Pysäköinti Oy'), +( + ('Kumppani', '2312'), + 'Finnpark Kiinteistö Management Oy', + 'Finnpark Kiinteistö Management Oy' +), +( + ('Kumppani', '2313'), + 'Kiinteistö Oy Frenckellin Pysäköinti', + 'Kiinteistö Oy Frenckellin Pysäköinti' +), +( + ('Kumppani', '2314'), + 'Kiinteistö Oy Tampereen Asemakeskus', + 'Kiinteistö Oy Tampereen Asemakeskus' +), +( + ('Kumppani', '2315'), + 'Kiinteistö Oy Hämeenpuisto', + 'Kiinteistö Oy Hämeenpuisto' +), +( + ('Kumppani', '2316'), + 'Kiinteistö Oy Tampereen Pysäköintimylly', + 'Kiinteistö Oy Tampereen Pysäköintimylly' +), +( + ('Kumppani', '2317'), + 'Kiinteistö Oy Hämpin Parkki', + 'Kiinteistö Oy Hämpin Parkki' +), +( + ('Kumppani', '2318'), + 'Kiinteistö Oy Kuninkaankulma', + 'Kiinteistö Oy Kuninkaankulma' +), +(('Kumppani', '2330'), 'Tullin Parkki Oy', 'Tullin Parkki Oy'), +( + ('Kumppani', '2340'), + 'Kiinteistö Oy Pysäköintiveturi', + 'Kiinteistö Oy Pysäköintiveturi' +), +( + ('Kumppani', '2350'), + 'Kiinteistö Oy Pellavan Parkki', + 'Kiinteistö Oy Pellavan Parkki' +), +( + ('Kumppani', '2355'), + 'Kiinteistö Oy Kuntokadun Parkki', + 'Kiinteistö Oy Kuntokadun Parkki' +), +(('Kumppani', '2360'), 'Hiedanrannan Kehitys Oy', 'Hiedanrannan Kehitys Oy'), +( + ('Kumppani', '2380'), + 'KKOy Tampereen Virastotalo', + 'KKOy Tampereen Virastotalo' +), +(('Kumppani', '2430'), 'Tampereen Raitiotie Oy', 'Tampereen Raitiotie Oy'), +( + ('Kumppani', '2450'), + 'Tampereen Seudun Keskuspuhdistamo Oy', + 'Tampereen Seudun Keskuspuhdistamo Oy' +), +( + ('Kumppani', '2460'), + 'Tampereen Messu- ja Urheilukeskus Oy', + 'Tampereen Messu- ja Urheilukeskus Oy' +), +( + ('Kumppani', '2470'), + 'Tullinkulman Työterveys Oy', + 'Tullinkulman Työterveys Oy' +), +(('Kumppani', '2390'), 'Ratinan Terveys Oy', 'Ratinan Terveys Oy'), +( + ('Kumppani', '2490'), 'Tampereen Tilapalvelut Oy', 'Tampereen Tilapalvelut Oy' +), +( + ('Kumppani', '2510'), + 'Haukiluoman Liikerakennus Oy', + 'Haukiluoman Liikerakennus Oy' +), +( + ('Kumppani', '2520'), + 'Helapuiston Lähipalvelukeskus Oy', + 'Helapuiston Lähipalvelukeskus Oy' +), +( + ('Kumppani', '2560'), + 'Lukonmäen Palvelukeskus Kiinteistö Oy', + 'Lukonmäen Palvelukeskus Kiinteistö Oy' +), +( + ('Kumppani', '2570'), + 'Länsi-Tesoman Liikekeskus Kiinteistö Oy', + 'Länsi-Tesoman Liikekeskus Kiinteistö Oy' +), +( + ('Kumppani', '2580'), + 'Maijalanpuiston Lähipalvelukeskus Oy', + 'Maijalanpuiston Lähipalvelukeskus Oy' +), +( + ('Kumppani', '2620'), + 'Pelipuiston Lähipalvelukeskus Oy', + 'Pelipuiston Lähipalvelukeskus Oy' +), +( + ('Kumppani', '2630'), + 'Pirkan opiskelija-asunnot Oy', + 'Pirkan opiskelija-asunnot Oy' +), +( + ('Kumppani', '2635'), + 'Kiinteistö Oy Tieteenkadun Parkki', + 'Kiinteistö Oy Tieteenkadun Parkki' +), +( + ('Kumppani', '2680'), + 'Kiinteistö Oy Tupakkikiven Parkki', + 'Kiinteistö Oy Tupakkikiven Parkki' +), +( + ('Kumppani', '2685'), + 'Kiinteistö Oy Kalevan Stara', + 'Kiinteistö Oy Kalevan Stara' +), +( + ('Kumppani', '2650'), + 'Tampereen Palvelukiinteistöt Oy', + 'Tampereen Palvelukiinteistöt Oy' +), +(('Kumppani', '2660'), 'Vilusen Rinne Oy', 'Vilusen Rinne Oy'), +( + ('Kumppani', '2661'), + 'Vilusen Rinne Vuokra-asunnot Oy', + 'Vilusen Rinne Vuokra-asunnot Oy' +), +( + ('Kumppani', '2662'), 'Annalan Vuokra-asunnot Oy', 'Annalan Vuokra-asunnot Oy' +), +( + ('Kumppani', '2690'), + 'Tampereen kaupunkiseudun elinkeino- ja kehitysyhtiö Business Tampere Oy', + 'Tampereen kaupunkiseudun elinkeino- ja kehitysyhtiö Business Tampere Oy' +), +(('Kumppani', '2410'), 'Visit Tampere Oy', 'Visit Tampere Oy'), +( + ('Kumppani', '2710'), 'Tampereen kotilinnasäätiö', 'Tampereen kotilinnasäätiö' +), +(('Kumppani', '2720'), 'Vellamonkodit Oy', 'Vellamonkodit Oy'), +( + ('Kumppani', '2730'), + 'Tampereen Tammelankodit As Oy', + 'Tampereen Tammelankodit As Oy' +), +(('Kumppani', '2750'), 'Pispan Tupahaka As Oy', 'Pispan Tupahaka As Oy'), +(('Kumppani', '2740'), 'Keinupuistokeskus Oy', 'Keinupuistokeskus Oy'), +( + ('Kumppani', '2810'), + 'Tampereen Vuokra-asunnot Oy', + 'Tampereen Vuokra-asunnot Oy' +), +( + ('Kumppani', '2910'), + 'Tampereen Vuokratalosäätiö', + 'Tampereen Vuokratalosäätiö' +), +(('Kumppani', '2930'), 'Myllyn Pysäköinti Oy', 'Myllyn Pysäköinti Oy'), +( + ('Kumppani', '2990'), + 'Asunto Oy Tampereen Atalan Metsätonttu', + 'Asunto Oy Tampereen Atalan Metsätonttu' +), +(('Kumppani', '2950'), 'TREDU-Kiinteistöt Oy', 'TREDU-Kiinteistöt Oy'), +(('Kumppani', '2970'), 'Tammenlehväsäätiö', 'Tammenlehväsäätiö'), +(('Kumppani', '2980'), 'Tammenlehväkeskus Oy', 'Tammenlehväkeskus Oy'), +(('Kumppani', '3100'), 'Suomen Hopealinja Oy', 'Suomen Hopealinja Oy'), +(('Kumppani', '6030'), 'Pirkanmaan Liitto', 'Pirkanmaan Liitto'), +( + ('Kumppani', '6060'), + 'Tampereen kaupunkiseudun kuntayhtymä', + 'Tampereen kaupunkiseudun kuntayhtymä' +), +(('Kumppani', '2480'), 'Tuomi Logistiikka Oy', 'Tuomi Logistiikka Oy'), +( + ('Kumppani', '3010'), + 'Atalan Liikekeskus Kiinteistö Oy', + 'Atalan Liikekeskus Kiinteistö Oy' +), +(('Kumppani', '3020'), 'Ateljeetalo Oy', 'Ateljeetalo Oy'), +( + ('Kumppani', '3080'), + 'Hervannan Kanjoni Asunto Oy', + 'Hervannan Kanjoni Asunto Oy' +), +(('Kumppani', '3120'), 'YH-kodit Oy', 'YH-kodit Oy'), +( + ('Kumppani', '3170'), + 'Kiinteistö Oy Kosken Parkki', + 'Kiinteistö Oy Kosken Parkki' +), +(('Kumppani', '3220'), 'Tuotekehitys Oy TamLink', 'Tuotekehitys Oy TamLink'), +(('Kumppani', '3230'), 'Jotospirtti Oy', 'Jotospirtti Oy'), +(('Kumppani', '3270'), 'Virontörmän Lämpö Oy', 'Virontörmän Lämpö Oy'), +( + ('Kumppani', '3280'), + 'Lännen Kiinteistöpalvelu Oy', + 'Lännen Kiinteistöpalvelu Oy' +), +( + ('Kumppani', '3290'), + 'Kiinteistö Oy Tumpin Parkki', + 'Kiinteistö Oy Tumpin Parkki' +), +( + ('Kumppani', '3310'), 'Mummunkujan Pysäköinti Oy', 'Mummunkujan Pysäköinti Oy' +), +(('Kumppani', '3330'), 'Monetra Oy', 'Monetra Oy'), +(('Kumppani', '3350'), 'Monetra Pirkanmaa Oy', 'Monetra Pirkanmaa Oy'), +( + ('Kumppani', '3360'), + 'Tampereen Monitoimiareena Koy', + 'Tampereen Monitoimiareena Koy' +), +(('Kumppani', '3370'), 'Hakametsän Kehitys Oy', 'Hakametsän Kehitys Oy'), +(('Kumppani', '3380'), 'Lättähatun Pysäköinti Oy', 'Lättähatun Pysäköinti Oy'), +(('Kumppani', '6500'), 'Muut kunnat', 'Muut kunnat'), +(('Kumppani', '6501'), 'Akaa', 'Akaa'), +(('Kumppani', '6502'), 'Hämeenkyrö', 'Hämeenkyrö'), +(('Kumppani', '6503'), 'Ikaalinen', 'Ikaalinen'), +(('Kumppani', '6504'), 'Juupajoki', 'Juupajoki'), +(('Kumppani', '6505'), 'Kangasala', 'Kangasala'), +(('Kumppani', '6506'), 'Kihniö', 'Kihniö'), +(('Kumppani', '6507'), 'Kuhmalahti', 'Kuhmalahti'), +(('Kumppani', '6508'), 'Kylmäkoski', 'Kylmäkoski'), +(('Kumppani', '6509'), 'Lempäälä', 'Lempäälä'), +(('Kumppani', '6510'), 'Mänttä-Vilppula', 'Mänttä-Vilppula'), +(('Kumppani', '6511'), 'Nokia', 'Nokia'), +(('Kumppani', '6512'), 'Orivesi', 'Orivesi'), +(('Kumppani', '6513'), 'Parkano', 'Parkano'), +(('Kumppani', '6514'), 'Pirkkala', 'Pirkkala'), +(('Kumppani', '6515'), 'Punkalaidun', 'Punkalaidun'), +(('Kumppani', '6516'), 'Pälkäne', 'Pälkäne'), +(('Kumppani', '6517'), 'Ruovesi', 'Ruovesi'), +(('Kumppani', '6518'), 'Sastamala', 'Sastamala'), +(('Kumppani', '6519'), 'Urjala', 'Urjala'), +(('Kumppani', '6520'), 'Valkeakoski', 'Valkeakoski'), +(('Kumppani', '6521'), 'Vesilahti', 'Vesilahti'), +(('Kumppani', '6522'), 'Virrat', 'Virrat'), +(('Kumppani', '6523'), 'Ylöjärvi', 'Ylöjärvi'), +(('Kumppani', '6600'), 'Muut kuntayhtymät', 'Muut kuntayhtymät'), +(('Kumppani', '5000'), 'Valtio', 'Valtio'), +(('Kumppani', '5500'), 'Euroopan Unioni', 'Euroopan Unioni'), +(('Kumppani', '4100'), 'Keva', 'Keva'), +( + ('Kumppani', '4200'), + 'Muut sosiaaliturvarahastot (ml. Kela)', + 'Muut sosiaaliturvarahastot (ml. Kela)' +), +( + ('Kumppani', '4310'), 'Kotimaiset talletuspankit', 'Kotimaiset talletuspankit' +), +(('Kumppani', '4320'), 'Kuntarahoitus Oyj', 'Kuntarahoitus Oyj'), +( + ('Kumppani', '4330'), + 'Muut kotimaiset rahoitus- ja vakuutuslaitokset', + 'Muut kotimaiset rahoitus- ja vakuutuslaitokset' +), +( + ('Kumppani', '4340'), + 'Ulkomaiset rahoitus- ja vakuutuslaitokset', + 'Ulkomaiset rahoitus- ja vakuutuslaitokset' +), +( + ('Kumppani', '4410'), + 'Muut kotimaiset lainanantajat', + 'Muut kotimaiset lainanantajat' +), +( + ('Kumppani', '4420'), + 'Muut ulkomaiset lainanantajat', + 'Muut ulkomaiset lainanantajat' +), +( + ('Kumppani', '5600'), + 'EU:n ulkopuoliset valtiot ja kansainväl. järjestöt', + 'EU:n ulkopuoliset valtiot ja kansainväl. järjestöt' +), +(('Kumppani', '5800'), 'Kotitaloudet', 'Kotitaloudet'), +( + ('Kumppani', '5810'), + 'Kotitalouksia palvelevat voittoa tavoittelemattomat yhteisöt', + 'Kotitalouksia palvelevat voittoa tavoittelemattomat yhteisöt' +), +(('Kumppani', '5900'), 'Yritys', 'Yritys'), +(('Kumppani', '6700'), 'Muu paikallishallinto', 'Muu paikallishallinto'), +( + ('Kumppani', '6710'), + 'Ahvenanmaan maakuntahallinto', + 'Ahvenanmaan maakuntahallinto' +), +( + ('Kumppani', '6720'), + 'Pirkanmaan hyvinvointialue', + 'Pirkanmaan hyvinvointialue' +), +(('Kumppani', '6730'), 'Muut hyvinvointialueet', 'Muut hyvinvointialueet'), +(('Kumppani', '6740'), 'Hyvinvointiyhtymät', 'Hyvinvointiyhtymät'), +( + ('Kumppani', '6750'), + 'Muut hyvinvointialuehallinnon yksiköt', + 'Muut hyvinvointialuehallinnon yksiköt' +), +( + ('Kumppani', '8001'), + 'R. Winterin rahasto kaupungin kaunistamista varten', + 'R. Winterin rahasto kaupungin kaunistamista varten' +), +( + ('Kumppani', '8003'), + 'Kotitalouden Eila Vehkalahden muistorahasto', + 'Kotitalouden Eila Vehkalahden muistorahasto' +), +( + ('Kumppani', '8004'), + 'Tampereen koululaisten opiskelu- ja harrastusrahasto', + 'Tampereen koululaisten opiskelu- ja harrastusrahasto' +), +( + ('Kumppani', '8005'), + 'Tamp. ammattikoulun opintojen edistämisrahasto', + 'Tamp. ammattikoulun opintojen edistämisrahasto' +), +( + ('Kumppani', '8006'), + 'Karl Thunebergin perikunnan lahjoitusrahasto', + 'Karl Thunebergin perikunnan lahjoitusrahasto' +), +( + ('Kumppani', '8007'), + 'Ella ja Rurik Pihkalan rahasto/Sorilan koulu', + 'Ella ja Rurik Pihkalan rahasto/Sorilan koulu' +), +( + ('Kumppani', '8008'), + 'Tamp. lyseon lukion opintorahasto', + 'Tamp. lyseon lukion opintorahasto' +), +( + ('Kumppani', '8010'), + 'Klassillisen koulun stipendirahasto', + 'Klassillisen koulun stipendirahasto' +), +( + ('Kumppani', '8015'), + 'Aki Rantasen muistorahasto', + 'Aki Rantasen muistorahasto' +), +( + ('Kumppani', '8016'), + 'Lyyli Wartiaisen stipendirahasto', + 'Lyyli Wartiaisen stipendirahasto' +), +( + ('Kumppani', '8020'), + 'Tampereen klassillisen lukion stipendirahasto', + 'Tampereen klassillisen lukion stipendirahasto' +), +( + ('Kumppani', '8021'), + 'Rehtori Jouni Paarlahden rahasto/klassill. lukio', + 'Rehtori Jouni Paarlahden rahasto/klassill. lukio' +), +( + ('Kumppani', '8026'), + 'Sammon lukion opintoavustusrahasto', + 'Sammon lukion opintoavustusrahasto' +), +( + ('Kumppani', '8027'), + 'Tammerkosken lukion opintoavustusrahasto', + 'Tammerkosken lukion opintoavustusrahasto' +), +( + ('Kumppani', '8028'), + 'Pyynikin koulun opintoavustusrahasto', + 'Pyynikin koulun opintoavustusrahasto' +), +( + ('Kumppani', '8029'), + 'Vehmaisten koulun stipendirahasto', + 'Vehmaisten koulun stipendirahasto' +), +( + ('Kumppani', '8030'), + 'Talousneuvos Jorma Niemisen rahasto', + 'Talousneuvos Jorma Niemisen rahasto' +), +( + ('Kumppani', '8031'), + 'Op. Edith Siivolan muistorahasto/Pispan koulu', + 'Op. Edith Siivolan muistorahasto/Pispan koulu' +), +( + ('Kumppani', '8032'), + 'Anni ja Aarne Lahtisen muistorahasto/Pispan koulu', + 'Anni ja Aarne Lahtisen muistorahasto/Pispan koulu' +), +( + ('Kumppani', '8037'), + 'Rehtori Lauri Viljanmaan stipendirahasto', + 'Rehtori Lauri Viljanmaan stipendirahasto' +), +( + ('Kumppani', '8038'), + 'Rehtori Martti Tyrkön stipendirahasto', + 'Rehtori Martti Tyrkön stipendirahasto' +), +( + ('Kumppani', '8039'), + 'Lehtori Maria Murron stipendirahasto', + 'Lehtori Maria Murron stipendirahasto' +), +( + ('Kumppani', '8040'), + 'Kurun norm.metsäoppilaitoksen stipendirahasto', + 'Kurun norm.metsäoppilaitoksen stipendirahasto' +), +( + ('Kumppani', '8055'), + 'Ammatillisen toisen asteen kaupallisen koulutuksen stipendirahasto', + 'Ammatillisen toisen asteen kaupallisen koulutuksen stipendirahasto' +), +( + ('Kumppani', '8061'), + 'Sigrid Blomin palvelijatarkotirahasto', + 'Sigrid Blomin palvelijatarkotirahasto' +), +( + ('Kumppani', '8062'), + 'Tampereen kaupungin lahjoitus- ja tukirahasto', + 'Tampereen kaupungin lahjoitus- ja tukirahasto' +), +( + ('Kumppani', '8064'), + 'Tampereen kaupungin palokunnan stipendi- ja virkistysrahasto', + 'Tampereen kaupungin palokunnan stipendi- ja virkistysrahasto' +), +( + ('Kumppani', '8065'), + 'Asessori Evert Tähkäpään rahasto', + 'Asessori Evert Tähkäpään rahasto' +), +( + ('Kumppani', '8066'), + 'Aini ja Niilo Orasmaan rahasto', + 'Aini ja Niilo Orasmaan rahasto' +), +( + ('Kumppani', '8067'), + 'Tampereen Kivimuseon tukirahasto', + 'Tampereen Kivimuseon tukirahasto' +), +( + ('Kumppani', '8110'), + 'Perintö korttelikerhoja varten', + 'Perintö korttelikerhoja varten' +), +( + ('Kumppani', '8120'), + 'Perintö As. Oy Tammerkontu', + 'Perintö As. Oy Tammerkontu' +), +( + ('Kumppani', '8130'), + 'Lahjoitus Taidemuseon käyttöön', + 'Lahjoitus Taidemuseon käyttöön' +), +( + ('Kumppani', '8500'), + 'Ei-rahastoidut lahjoitukset', + 'Ei-rahastoidut lahjoitukset' +), +( + ('Kumppani', '8999'), + 'Lahjoitusrahastoteon tukirahasto', + 'Lahjoitusrahastoteon tukirahasto' +); diff --git a/backend/src/components/sap/blanketContractReport.ts b/backend/src/components/sap/blanketContractReport.ts index 8431541e..01dc7b88 100644 --- a/backend/src/components/sap/blanketContractReport.ts +++ b/backend/src/components/sap/blanketContractReport.ts @@ -11,8 +11,9 @@ function blanketContractReportFragment(query?: Partial { return { wbsId: wbs.POSID, diff --git a/backend/src/router/sap.ts b/backend/src/router/sap.ts index 03ec838a..8f3dca23 100644 --- a/backend/src/router/sap.ts +++ b/backend/src/router/sap.ts @@ -2,12 +2,12 @@ import { z } from 'zod'; import { getBlanketContractReport, - getBlanketContractReportRowCount, + getBlanketContractReportSummary, } from '@backend/components/sap/blanketContractReport'; import { getSapActuals, getSapProject, sapProjectExists } from '@backend/components/sap/dataImport'; import { getEnvironmentCodeReport, - getEnvironmentCodeReportRowCount, + getEnvironmentCodeReportSummary, } from '@backend/components/sap/environmentCodeReport'; import { getLastSyncedAt } from '@backend/components/sap/syncQueue'; import { getPool, sql } from '@backend/db'; @@ -180,10 +180,16 @@ export const createSapRouter = (t: TRPC) => return await getEnvironmentCodeReport(input); }), - getEnvironmentCodeReportRowCount: t.procedure + getEnvironmentCodeReportSummary: t.procedure .input(environmentCodeReportFilterSchema) .query(async ({ input }) => { - return await getEnvironmentCodeReportRowCount(input); + const summary = await getEnvironmentCodeReportSummary(input); + return { + rowCount: summary.rowCount, + sums: { + totalActuals: summary.totalActualsSum, + }, + }; }), getBlanketContractReport: t.procedure @@ -192,9 +198,15 @@ export const createSapRouter = (t: TRPC) => return await getBlanketContractReport(input); }), - getBlanketContractReportRowCount: t.procedure + getBlanketContractReportSummary: t.procedure .input(blanketContractReportFilterSchema) .query(async ({ input }) => { - return await getBlanketContractReportRowCount(input); + const summary = await getBlanketContractReportSummary(input); + return { + rowCount: summary.rowCount, + sums: { + totalActuals: summary.totalActualsSum, + }, + }; }), }); diff --git a/docker/sap-mock/mock-server.clj b/docker/sap-mock/mock-server.clj index 464f17f1..3c76b5cb 100755 --- a/docker/sap-mock/mock-server.clj +++ b/docker/sap-mock/mock-server.clj @@ -166,7 +166,7 @@ project-updater (generate-random-name) project-manager (generate-random-name) applicant (generate-random-name) - company-code (generate-random-id 9999 4) + company-code plant planned-start-date (generate-random-date project-creation-date 30) planned-finish-date (generate-random-date (.plusDays planned-start-date (rand-int (* 5 365))) 30) project-description (generate-project-description area)] @@ -187,6 +187,7 @@ [:PLFAZ planned-start-date] [:PLSEZ planned-finish-date] [:WERKS plant] + [:STTXT "VAPA"] [:WBS (random-wbs (assoc config :start-date planned-start-date :finish-date planned-finish-date) @@ -323,6 +324,7 @@ [:PLFAZ (:PLFAZ project-data)] [:PLSEZ (:PLSEZ project-data)] [:WERKS (:WERKS project-data)] + [:STTXT (:STTXT project-data)] [:WBS (generate-wbs-elements WBS)]]]) (defn generate-actuals-data [actuals] @@ -378,6 +380,7 @@ [:PLFAZ "0000-00-00"] [:PLSEZ "0000-00-00"] [:WERKS] + [:STTXT] [:WBS]]]) ;; diff --git a/frontend/src/components/DataTable.tsx b/frontend/src/components/DataTable.tsx index f482715e..6c02ba45 100644 --- a/frontend/src/components/DataTable.tsx +++ b/frontend/src/components/DataTable.tsx @@ -13,7 +13,7 @@ import { Typography, css, } from '@mui/material'; -import { useEffect, useMemo, useState } from 'react'; +import { ReactNode, useEffect, useMemo, useState } from 'react'; import { useTranslations } from '@frontend/stores/lang'; @@ -22,10 +22,15 @@ interface Sort { direction: 'asc' | 'desc'; } +interface Summary { + rowCount: number; + sums?: { [column in keyof TRow]?: number }; +} + type ColumnSettings = { [key in keyof TRow]: { title: string; - format?: (value: TRow[key]) => string; + format?: (value: TRow[key], row?: TRow) => ReactNode; width?: number; align?: TableCellProps['align']; }; @@ -40,9 +45,9 @@ interface DataQueryParams { interface Props> { getRows: (params: TQueryParams) => Promise; - getRowCount: ( + getSummary: ( params: TQueryParams['filters'] extends object ? Pick : never - ) => Promise; + ) => Promise>; columns: ColumnSettings; filters?: TQueryParams['filters'] extends object ? TQueryParams['filters'] : never; rowsPerPageOptions?: number[]; @@ -51,7 +56,7 @@ interface Props> export function DataTable>({ getRows, - getRowCount, + getSummary, columns, filters, rowsPerPageOptions = [10, 20, 30, 500], @@ -62,7 +67,7 @@ export function DataTable(null); - const [totalRowCount, setTotalRowCount] = useState(0); + const [summary, setSummary] = useState | null>(null); const [sort, setSort] = useState | undefined>(undefined); const tr = useTranslations(); @@ -78,7 +83,7 @@ export function DataTable { // TODO Some weird TS issues regarding optionality of the filters, though the Props typings are working correctly (which matters the most)... - getRowCount({ filters } as any).then(setTotalRowCount); + getSummary({ filters } as any).then(setSummary); }, [filters]); useEffect(() => { @@ -190,7 +195,7 @@ export function DataTable {columnKeys.map((key) => { const formattedValue = - columns[key].format?.(row[key]) ?? row[key]?.toString() ?? ''; + columns[key].format?.(row[key], row) ?? row[key]?.toString() ?? ''; return ( {formattedValue} @@ -217,13 +222,33 @@ export function DataTable + {summary?.sums && ( + + {columnKeys.map((key) => { + const value = summary.sums?.[key] as TRow[keyof TRow]; + const formattedValue = + value == null ? '' : columns[key].format?.(value) ?? value?.toString() ?? ''; + return ( + + {formattedValue} + + ); + })} + + )} setPage(page)} diff --git a/frontend/src/components/forms/CurrencyInput.tsx b/frontend/src/components/forms/CurrencyInput.tsx index a8e83259..d279565b 100644 --- a/frontend/src/components/forms/CurrencyInput.tsx +++ b/frontend/src/components/forms/CurrencyInput.tsx @@ -43,6 +43,17 @@ export function numericValueToText(value: number | null): string { return `${whole}.${decimals.length === 1 ? '0' : ''}${decimals}`; } +export function formatCurrency(value: number | null, currencySymbol = '€') { + const textValue = numericValueToText(value); + return textValue.length === 0 ? ( + '' + ) : ( + <> + {textValue} {currencySymbol} + + ); +} + export function CurrencyInput(props: Props) { const { editing, TextFieldProps } = props; const [textValue, setTextValue] = useState(''); diff --git a/frontend/src/views/SapReports/BlanketContractReport.tsx b/frontend/src/views/SapReports/BlanketContractReport.tsx index c67f6db6..399801c5 100644 --- a/frontend/src/views/SapReports/BlanketContractReport.tsx +++ b/frontend/src/views/SapReports/BlanketContractReport.tsx @@ -2,7 +2,7 @@ import dayjs from 'dayjs'; import { trpc } from '@frontend/client'; import { DataTable } from '@frontend/components/DataTable'; -import { numericValueToText } from '@frontend/components/forms/CurrencyInput'; +import { formatCurrency, numericValueToText } from '@frontend/components/forms/CurrencyInput'; import { useTranslations } from '@frontend/stores/lang'; import { BlanketContractReportFilters } from './BlanketContractReportFilters'; @@ -16,11 +16,14 @@ export function BlanketContractReport() { diff --git a/shared/src/language/fi.json b/shared/src/language/fi.json index 57007e51..5021aa42 100644 --- a/shared/src/language/fi.json +++ b/shared/src/language/fi.json @@ -329,7 +329,9 @@ "sapReports.environmentCodes.totalActuals": "Toteut. kust.", "sapReports.environmentCodes.reasonForEnvironmentalInvestment": "Ymp.suoj. inv. syy", "sapReports.environmentCodes.companyCode": "Kumppanikoodi", + "sapReports.environmentCodes.companyCodeText": "Kumppani", "sapReports.blanketContracts": "Puitesopimukset", + "sapReports.blanketContracts.projectId": "Projektin tunnus", "sapReports.blanketContracts.networkId": "Verkon tunnus", "sapReports.blanketContracts.networkName": "Verkon nimi", "sapReports.blanketContracts.projectManagerName": "Projektin vastuuhenkilö", @@ -341,6 +343,7 @@ "sapReports.blanketContracts.totalActuals": "Toteut. kust.", "sapReports.updatedAt": "Tiedot päivitetty", "sapReports.downloadReport": "Lataa raportti", + "sapReports.externalCompany": "Kohdistamaton", "dataTable.error": "Tietojen haussa tapahtui virhe. Yritä myöhemmin uudestaan.", "dataTable.noData": "Ei hakutuloksia.", "email.subject": "Aihe", diff --git a/shared/src/schema/sapProject.ts b/shared/src/schema/sapProject.ts index 4478499e..b86b792e 100644 --- a/shared/src/schema/sapProject.ts +++ b/shared/src/schema/sapProject.ts @@ -77,9 +77,11 @@ export const incomingSapProjectSchema = z.object({ AENAM: z.string().nullish(), VERNA: z.string().nullish(), ASTNA: z.string().nullish(), + VBUKR: z.string(), PLFAZ: isoDateString.nullish(), PLSEZ: isoDateString.nullish(), WERKS: z.string().nullish(), + STTXT: z.string(), WBS: z.array(incomingWBSSchema), }); @@ -160,9 +162,11 @@ export const sapProjectSchema = z.object({ updatedBy: z.string().nullish(), projectManagerName: z.string().nullish(), applicantName: z.string().nullish(), + companyCode: z.string(), plannedStartDate: isoDateString.nullish(), plannedEndDate: isoDateString.nullish(), plant: z.string().nullish(), + systemStatus: z.string(), wbs: z.array(sapWBSSchema), }); diff --git a/shared/src/schema/sapReport.ts b/shared/src/schema/sapReport.ts index aabbf9f9..8558c464 100644 --- a/shared/src/schema/sapReport.ts +++ b/shared/src/schema/sapReport.ts @@ -7,6 +7,7 @@ export const environmentCodeReportSchema = z.object({ wbsName: z.string(), reasonForEnvironmentalInvestment: z.string(), companyCode: z.string(), + companyCodeTextFi: z.string(), totalActuals: z.number(), }); @@ -28,6 +29,7 @@ export const environmentCodeReportQuerySchema = environmentCodeReportFilterSchem export type EnvironmentCodeReportQuery = z.infer; export const blanketContractReportSchema = z.object({ + projectId: z.string(), networkId: z.string(), networkName: z.string(), projectManagerName: z.string(), @@ -36,7 +38,6 @@ export const blanketContractReportSchema = z.object({ decisionDateText: z.string(), blanketOrderId: z.string(), contractPriceInCurrencySubunit: z.number(), - networkCreatedAt: z.date(), totalActuals: z.number(), }); From a4b1506df1eecf2d69ee4415615c4815f4a32f0f Mon Sep 17 00:00:00 2001 From: jlaamanen Date: Sat, 17 Jun 2023 15:51:07 +0300 Subject: [PATCH 2/2] Fixed unit tests --- e2e/test/api/sap.test.ts | 136 ++++++++++++++++++++------------------- 1 file changed, 69 insertions(+), 67 deletions(-) diff --git a/e2e/test/api/sap.test.ts b/e2e/test/api/sap.test.ts index 754aa8ec..18c2f9a5 100644 --- a/e2e/test/api/sap.test.ts +++ b/e2e/test/api/sap.test.ts @@ -34,8 +34,8 @@ test.describe('Project endpoints', () => { wbsId: 'A1111_110000', network: [ { - networkId: '000090661291', - activities: [{ activityNumber: '8196' }], + networkId: '000051429870', + activities: [{ activityNumber: '9116' }], }, ], }, @@ -51,76 +51,78 @@ test.describe('Project endpoints', () => { expect(res).toStrictEqual({ sapProjectId: 'A1111_22000', sapProjectInternalId: '64419995', - shortDescription: 'Keskusta, investointihanke', + shortDescription: 'Keskusta, kehitys', createdAt: '2020-03-26', createdBy: 'MATTINIE', - updatedAt: '2020-05-21', + updatedAt: '2020-05-20', updatedBy: 'MATTINIE', projectManagerName: 'Nieminen Matti', applicantName: 'Nieminen Matti', - plannedStartDate: '2020-03-27', - plannedEndDate: '2024-05-17', + plannedStartDate: '2020-04-03', + plannedEndDate: '2021-11-27', plant: '1111', + companyCode: '1111', + systemStatus: 'VAPA', wbs: [ { wbsId: 'A1111_220000', - wbsInternalId: '08611711', + wbsInternalId: '03114907', sapProjectInternalId: '64419995', - shortDescription: 'Keskusta, investointihanke, kohde 1', - createdAt: '2020-03-31', + shortDescription: 'Keskusta, kehitys, kohde 1', + createdAt: '2020-04-16', createdBy: 'MATTIMÄK', - updatedAt: '2020-04-10', - updatedBy: 'MATTINIE', - applicantName: 'Nieminen Matti', - requestingCostCenter: '00280254', - responsibleCostCenter: '00280254', + updatedAt: '2020-04-17', + updatedBy: 'LIISAMÄK', + applicantName: 'Mäkinen Liisa', + requestingCostCenter: '00448864', + responsibleCostCenter: '00448864', projectType: 'Y4', priority: 'U', plant: '1111', blanketOrderId: '1234/01.01.01/2020', consultCompany: 'Yritys Oy', contractPriceInCurrencySubunit: 123123, - decisionDateText: '31.3.2020', - decisionMaker: 'Nieminen', - technicallyCompletedAt: '2021-06-26', + decisionDateText: '16.4.2020', + decisionMaker: 'Mäkinen', + technicallyCompletedAt: '2021-06-28', reasonForInvestment: '30', reasonForEnvironmentalInvestment: '414', hierarchyLevel: 2, network: [ { - networkId: '000070221268', - networkName: 'Keskusta, investointihanke', - wbsInternalId: '08611711', + networkId: '000074482960', + networkName: 'Keskusta, kehitys', + wbsInternalId: '03114907', sapProjectInternalId: '64419995', - createdAt: '2020-04-22', + createdAt: '2020-03-28', createdBy: 'LIISANIE', - actualStartDate: '2023-07-21', + actualStartDate: '2021-02-09', actualFinishDate: null, - companyCode: '1793', + companyCode: '1111', plant: '1111', - technicalCompletionDate: '2023-12-03', - profitCenter: '0007671241', + technicalCompletionDate: '2021-09-22', + profitCenter: '0007088013', activities: [ { plant: '1111', - networkId: '000070221268', + networkId: '000074482960', orderCounter: '00000001', - profitCenter: '0007671241', - routingNumber: '0167901282', - wbsInternalId: '08611711', - activityNumber: '0913', - shortDescription: 'Lisätyö', + profitCenter: '0007088013', + routingNumber: '0157671127', + wbsInternalId: '03114907', + activityNumber: '9497', + shortDescription: 'Kunnossapito', sapProjectInternalId: '64419995', }, { plant: '1111', - networkId: '000070221268', + networkId: '000074482960', orderCounter: '00000002', - profitCenter: '0007671241', - routingNumber: '0167901282', - wbsInternalId: '08611711', - activityNumber: '8111', - shortDescription: 'Ylläpito', + profitCenter: '0007088013', + routingNumber: '0157671127', + wbsInternalId: '03114907', + activityNumber: '8348', + shortDescription: 'Muu', sapProjectInternalId: '64419995', }, ], @@ -129,63 +131,63 @@ test.describe('Project endpoints', () => { }, { wbsId: 'A1111_220001', - wbsInternalId: '04009572', + wbsInternalId: '04783006', sapProjectInternalId: '64419995', - shortDescription: 'Keskusta, investointihanke, kohde 2', - createdAt: '2020-03-31', + shortDescription: 'Keskusta, kehitys, kohde 2', + createdAt: '2020-04-16', createdBy: 'MATTIMÄK', - updatedAt: '2020-04-10', + updatedAt: '2020-04-23', updatedBy: 'LIISANIE', - applicantName: 'Nieminen Matti', - requestingCostCenter: '00280254', - responsibleCostCenter: '00280254', + applicantName: 'Mäkinen Liisa', + requestingCostCenter: '00448864', + responsibleCostCenter: '00448864', projectType: 'Y4', priority: 'U', plant: '1111', blanketOrderId: '1234/01.01.01/2020', consultCompany: 'Yritys Oy', contractPriceInCurrencySubunit: 123123, - decisionDateText: '31.3.2020', - decisionMaker: 'Nieminen', - technicallyCompletedAt: '2021-06-26', + decisionDateText: '16.4.2020', + decisionMaker: 'Mäkinen', + technicallyCompletedAt: '2021-06-28', reasonForInvestment: '30', reasonForEnvironmentalInvestment: '414', hierarchyLevel: 2, network: [ { - networkId: '000059222049', - networkName: 'Keskusta, investointihanke', - wbsInternalId: '04009572', + networkId: '000082604998', + networkName: 'Keskusta, kehitys', + wbsInternalId: '04783006', sapProjectInternalId: '64419995', - createdAt: '2020-04-20', - createdBy: 'LIISANIE', - actualStartDate: '2020-05-20', + createdAt: '2020-03-27', + createdBy: 'LIISAMÄK', + actualStartDate: '2021-07-12', actualFinishDate: null, - companyCode: '1793', + companyCode: '1111', plant: '1111', - technicalCompletionDate: '2020-11-27', - profitCenter: '0003577575', + technicalCompletionDate: '2021-10-02', + profitCenter: '0006496410', activities: [ { plant: '1111', - networkId: '000059222049', + networkId: '000082604998', orderCounter: '00000001', - profitCenter: '0003577575', - routingNumber: '0657145509', - wbsInternalId: '04009572', - activityNumber: '0681', + profitCenter: '0006496410', + routingNumber: '0233577453', + wbsInternalId: '04783006', + activityNumber: '8105', shortDescription: 'Rakentaminen', sapProjectInternalId: '64419995', }, { plant: '1111', - networkId: '000059222049', + networkId: '000082604998', orderCounter: '00000002', - profitCenter: '0003577575', - routingNumber: '0657145509', - wbsInternalId: '04009572', - activityNumber: '9760', - shortDescription: 'Muu', + profitCenter: '0006496410', + routingNumber: '0233577453', + wbsInternalId: '04783006', + activityNumber: '1464', + shortDescription: 'Ylläpito', sapProjectInternalId: '64419995', }, ],