diff --git a/etp-backend/src/main/clj/solita/etp/schema/valvonta_kaytto.clj b/etp-backend/src/main/clj/solita/etp/schema/valvonta_kaytto.clj index 768bdb141..a516c7c40 100644 --- a/etp-backend/src/main/clj/solita/etp/schema/valvonta_kaytto.clj +++ b/etp-backend/src/main/clj/solita/etp/schema/valvonta_kaytto.clj @@ -48,11 +48,20 @@ (def KarajaoikeusId (apply schema/enum (range 0 20))) +(def henkilo "henkilo") +(def yritys "yritys") + +(def OsapuoliType (schema/enum henkilo yritys)) + +(def OsapuoliSpecificDataOsapuoli + {:id common-schema/Key + :type OsapuoliType}) + (def KaskypaatosVarsinainenPaatosOsapuoliSpecificData (schema/conditional ;; Osapuoli has a document and has answered to kuulemiskirje, so all fields are required (every-pred toimenpide/osapuoli-has-document? toimenpide/recipient-answered?) - {:osapuoli-id common-schema/Key + {:osapuoli OsapuoliSpecificDataOsapuoli :hallinto-oikeus-id HallintoOikeusId :document schema/Bool :recipient-answered schema/Bool @@ -63,15 +72,15 @@ ;; Osapuoli has document but has not answered to kuulemiskirje, so answer and statement are not allowed toimenpide/osapuoli-has-document? - {:osapuoli-id common-schema/Key + {:osapuoli OsapuoliSpecificDataOsapuoli :hallinto-oikeus-id HallintoOikeusId :document schema/Bool :recipient-answered schema/Bool} ;; Osapuoli has no document so no other fields are allowed :else - {:osapuoli-id common-schema/Key - :document schema/Bool})) + {:osapuoli OsapuoliSpecificDataOsapuoli + :document schema/Bool})) (def KaskypaatosVarsinainenPaatosData {:fine common-schema/NonNegative :osapuoli-specific-data [KaskypaatosVarsinainenPaatosOsapuoliSpecificData] @@ -82,14 +91,14 @@ (def KaskypaatosTiedoksiantoHaastemiesOsapuoliSpecificData (schema/conditional toimenpide/osapuoli-has-document? - {:osapuoli-id common-schema/Key + {:osapuoli OsapuoliSpecificDataOsapuoli :karajaoikeus-id KarajaoikeusId :haastemies-email common-schema/Email :document schema/Bool} :else - {:osapuoli-id common-schema/Key - :document schema/Bool})) + {:osapuoli OsapuoliSpecificDataOsapuoli + :document schema/Bool})) (def KaskypaatosTiedoksiantoHaastemiesData {:osapuoli-specific-data [KaskypaatosTiedoksiantoHaastemiesOsapuoliSpecificData]}) @@ -101,19 +110,19 @@ ;; Osapuoli has a document so all fields are required to have values ;; answer-commentary fields are optional but if present, values are required toimenpide/osapuoli-has-document? - {:osapuoli-id common-schema/Key - :hallinto-oikeus-id HallintoOikeusId - :document schema/Bool - :recipient-answered schema/Bool + {:osapuoli OsapuoliSpecificDataOsapuoli + :hallinto-oikeus-id HallintoOikeusId + :document schema/Bool + :recipient-answered schema/Bool (schema/optional-key :answer-commentary-fi) schema/Str (schema/optional-key :answer-commentary-sv) schema/Str - :statement-fi schema/Str - :statement-sv schema/Str} + :statement-fi schema/Str + :statement-sv schema/Str} ;; Osapuoli has no document so no other fields are allowed :else - {:osapuoli-id common-schema/Key - :document schema/Bool})) + {:osapuoli OsapuoliSpecificDataOsapuoli + :document schema/Bool})) (def SakkopaatosVarsinainenPaatosData {:fine common-schema/NonNegative :osapuoli-specific-data [SakkopaatosVarsinainenPaatosOsapuoliSpecificData] @@ -124,14 +133,14 @@ (def SakkopaatosTiedoksiantoHaastemiesOsapuoliSpecificData (schema/conditional toimenpide/osapuoli-has-document? - {:osapuoli-id common-schema/Key + {:osapuoli OsapuoliSpecificDataOsapuoli :karajaoikeus-id KarajaoikeusId :haastemies-email common-schema/Email :document schema/Bool} :else - {:osapuoli-id common-schema/Key - :document schema/Bool})) + {:osapuoli OsapuoliSpecificDataOsapuoli + :document schema/Bool})) (def SakkopaatosTiedoksiantoHaastemiesData {:osapuoli-specific-data [SakkopaatosTiedoksiantoHaastemiesOsapuoliSpecificData]}) diff --git a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/asha.clj b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/asha.clj index 3d3af31b0..0d5323ff3 100644 --- a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/asha.clj +++ b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/asha.clj @@ -1,8 +1,8 @@ (ns solita.etp.service.valvonta-kaytto.asha - (:require [clojure.java.io :as io] - [clojure.string :as string] + (:require [clojure.string :as string] [solita.common.time :as time] [solita.etp.service.asha :as asha] + [solita.etp.schema.valvonta-kaytto :as vk-schema] [solita.etp.service.valvonta-kaytto.hallinto-oikeus-attachment :as hao-attachment] [solita.etp.service.valvonta-kaytto.previous-toimenpide-data :as previous-toimenpide] [solita.etp.service.valvonta-kaytto.toimenpide :as toimenpide] @@ -90,7 +90,11 @@ :tietopyynto {:tietopyynto-pvm (time/format-date (:rfi-request dokumentit)) :tietopyynto-kehotus-pvm (time/format-date (:rfi-order dokumentit))} :tiedoksi (map (partial tiedoksi-saaja roolit) tiedoksi) - :tyyppikohtaiset-tiedot (type-specific-data/format-type-specific-data db toimenpide (:id osapuoli)) + :tyyppikohtaiset-tiedot (type-specific-data/format-type-specific-data + db + toimenpide + {:id (:id osapuoli) + :type (osapuoli/osapuoli->osapuoli-type osapuoli)}) :aiemmat-toimenpiteet (previous-toimenpide/formatted-previous-toimenpide-data db toimenpide (:id valvonta))}) (defn- request-id [valvonta-id toimenpide-id] @@ -250,16 +254,21 @@ :type-specific-data :osapuoli-specific-data (filter toimenpide/osapuoli-has-document?) - (map :osapuoli-id) - set)] - (filter #(contains? osapuolet-with-document (:id %)) osapuolet)) + (map :osapuoli)) + henkilo-osapuolet-with-documents (map :id (filter #(= (:type %) vk-schema/henkilo) osapuolet-with-document)) + yritys-osapuolet-with-documents (map :id (filter #(= (:type %) vk-schema/yritys) osapuolet-with-document))] + (concat + (filter #(contains? (set henkilo-osapuolet-with-documents) (:id %)) (filter osapuoli/henkilo? osapuolet)) + (filter #(contains? (set yritys-osapuolet-with-documents) (:id %)) (filter osapuoli/yritys? osapuolet)))) osapuolet)) (defn store-hallinto-oikeus-attachment! [db aws-s3-client valvonta-id toimenpide osapuoli] - (let [hallinto-oikeus-id (-> toimenpide + (let [osapuoli-type (osapuoli/osapuoli->osapuoli-type osapuoli) + hallinto-oikeus-id (-> toimenpide :type-specific-data :osapuoli-specific-data - (type-specific-data/find-administrative-court-id-from-osapuoli-specific-data (:id osapuoli))) + (type-specific-data/find-administrative-court-id-from-osapuoli-specific-data {:id (:id osapuoli) + :type osapuoli-type})) attachment (hao-attachment/attachment-for-hallinto-oikeus-id db hallinto-oikeus-id)] (store/store-hallinto-oikeus-attachment! aws-s3-client valvonta-id (:id toimenpide) osapuoli attachment) attachment)) diff --git a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/osapuoli.clj b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/osapuoli.clj index 5621fdefa..b448f95a6 100644 --- a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/osapuoli.clj +++ b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/osapuoli.clj @@ -1,4 +1,5 @@ -(ns solita.etp.service.valvonta-kaytto.osapuoli) +(ns solita.etp.service.valvonta-kaytto.osapuoli + (:require [solita.etp.schema.valvonta-kaytto :as vk-schema])) (def omistaja? #(= (:rooli-id %) 0)) (def tiedoksi? (complement omistaja?)) @@ -14,4 +15,11 @@ (def yritys? #(contains? % :nimi)) (defn ilmoituspaikka-other? [valvonta] - (= (:ilmoituspaikka-id valvonta) 2)) \ No newline at end of file + (= (:ilmoituspaikka-id valvonta) 2)) + +(defn osapuoli->osapuoli-type + "Given osapuoli map, returns whether the osapuoli is henkilo or yritys" + [osapuoli] + (if (henkilo? osapuoli) + vk-schema/henkilo + vk-schema/yritys)) diff --git a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data.clj b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data.clj index cc66b7041..0ef72295e 100644 --- a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data.clj +++ b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data.clj @@ -7,11 +7,12 @@ (db/require-queries 'karajaoikeus) (defmulti format-type-specific-data - (fn [_db toimenpide _osapuoli-id] (-> toimenpide :type-id toimenpide/type-key))) + (fn [_db toimenpide _osapuoli] (-> toimenpide :type-id toimenpide/type-key))) -(defn- find-value-from-osapuoli-specific-data [key osapuoli-specific-data osapuoli-id] +(defn- find-value-from-osapuoli-specific-data [key osapuoli-specific-data osapuoli] (->> osapuoli-specific-data - (filter #(= (:osapuoli-id %) osapuoli-id)) + (filter #(= (:osapuoli %) + osapuoli)) first key)) @@ -27,22 +28,22 @@ (exception/throw-ex-info! {:message (str "Unknown hallinto-oikeus-id: " hallinto-oikeus-id)}))) -(defn format-actual-decision-data [db toimenpide osapuoli-id] +(defn format-actual-decision-data [db toimenpide osapuoli] (let [recipient-answered? (-> toimenpide :type-specific-data :osapuoli-specific-data - (find-recipient-answered-from-osapuoli-specific-data osapuoli-id)) + (find-recipient-answered-from-osapuoli-specific-data osapuoli)) hallinto-oikeus-strings (hallinto-oikeus-id->formatted-strings db (-> toimenpide :type-specific-data :osapuoli-specific-data - (find-administrative-court-id-from-osapuoli-specific-data osapuoli-id)))] + (find-administrative-court-id-from-osapuoli-specific-data osapuoli)))] {:recipient-answered recipient-answered? :vastaus-fi (let [answer-commentary (-> toimenpide :type-specific-data :osapuoli-specific-data - ((partial find-value-from-osapuoli-specific-data :answer-commentary-fi) osapuoli-id)) + ((partial find-value-from-osapuoli-specific-data :answer-commentary-fi) osapuoli)) recipient-answered-string (if recipient-answered? "Asianosainen antoi vastineen kuulemiskirjeeseen. " "Asianosainen ei vastannut kuulemiskirjeeseen. ")] @@ -50,7 +51,7 @@ :vastaus-sv (let [answer-commentary (-> toimenpide :type-specific-data :osapuoli-specific-data - ((partial find-value-from-osapuoli-specific-data :answer-commentary-sv) osapuoli-id)) + ((partial find-value-from-osapuoli-specific-data :answer-commentary-sv) osapuoli)) recipient-answered-string (if recipient-answered? "gav ett bemötande till brevet om hörande. " "svarade inte på brevet om hörande. ")] @@ -61,40 +62,41 @@ :statement-fi (-> toimenpide :type-specific-data :osapuoli-specific-data - ((partial find-value-from-osapuoli-specific-data :statement-fi) osapuoli-id)) + ((partial find-value-from-osapuoli-specific-data :statement-fi) osapuoli)) :statement-sv (-> toimenpide :type-specific-data :osapuoli-specific-data - ((partial find-value-from-osapuoli-specific-data :statement-sv) osapuoli-id)) + ((partial find-value-from-osapuoli-specific-data :statement-sv) osapuoli)) :department-head-name (-> toimenpide :type-specific-data :department-head-name) :department-head-title-fi (-> toimenpide :type-specific-data :department-head-title-fi) :department-head-title-sv (-> toimenpide :type-specific-data :department-head-title-sv)})) -(defmethod format-type-specific-data :decision-order-actual-decision [db toimenpide osapuoli-id] - (format-actual-decision-data db toimenpide osapuoli-id)) +(defmethod format-type-specific-data :decision-order-actual-decision [db toimenpide osapuoli] + (format-actual-decision-data db toimenpide osapuoli)) -(defmethod format-type-specific-data :penalty-decision-actual-decision [db toimenpide osapuoli-id] - (format-actual-decision-data db toimenpide osapuoli-id)) +(defmethod format-type-specific-data :penalty-decision-actual-decision [db toimenpide osapuoli] + (format-actual-decision-data db toimenpide osapuoli)) (defn- karajaoikeus-id->name [db id] (first (karajaoikeus-db/find-karajaoikeus-name-by-id db {:karajaoikeus-id id}))) -(defn- format-notice-bailiff [db toimenpide osapuoli-id] - (let [osapuoli (->> toimenpide - :type-specific-data - :osapuoli-specific-data - (filter #(= (:osapuoli-id %) osapuoli-id)) - first) - karajaoikeus-id (:karajaoikeus-id osapuoli) - haastemies-email (:haastemies-email osapuoli)] +(defn- format-notice-bailiff [db toimenpide osapuoli] + (let [karajaoikeus-id (-> toimenpide + :type-specific-data + :osapuoli-specific-data + ((partial find-value-from-osapuoli-specific-data :karajaoikeus-id) osapuoli)) + haastemies-email (-> toimenpide + :type-specific-data + :osapuoli-specific-data + ((partial find-value-from-osapuoli-specific-data :haastemies-email) osapuoli))] {:karajaoikeus (karajaoikeus-id->name db karajaoikeus-id) :haastemies-email haastemies-email})) -(defmethod format-type-specific-data :decision-order-notice-bailiff [db toimenpide osapuoli-id] - (format-notice-bailiff db toimenpide osapuoli-id)) +(defmethod format-type-specific-data :decision-order-notice-bailiff [db toimenpide osapuoli] + (format-notice-bailiff db toimenpide osapuoli)) -(defmethod format-type-specific-data :penalty-decision-notice-bailiff [db toimenpide osapuoli-id] - (format-notice-bailiff db toimenpide osapuoli-id)) +(defmethod format-type-specific-data :penalty-decision-notice-bailiff [db toimenpide osapuoli] + (format-notice-bailiff db toimenpide osapuoli)) (defmethod format-type-specific-data :default [_ toimenpide _] (:type-specific-data toimenpide)) diff --git a/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/asha_test.clj b/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/asha_test.clj index b2e4eec9c..a23b303a9 100644 --- a/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/asha_test.clj +++ b/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/asha_test.clj @@ -6,7 +6,7 @@ (t/use-fixtures :each ts/fixture) (t/deftest remove-osapuolet-with-no-document-if-varsinainen-paatos-test - (t/testing "Two osapuolis, one hallinto-oikeus, only the osapuoli with the hallinto-oikeus should be returned" + (t/testing "Two osapuolis, only the osapuoli with document set to true should be returned" (let [osapuolet [{:toimitustapa-description nil :toimitustapa-id 0 :email nil @@ -51,11 +51,12 @@ {:department-head-title-fi "Apulaisjohtaja" :department-head-name "Yli Päällikkö" :osapuoli-specific-data [{:hallinto-oikeus-id 1 - :osapuoli-id 2 + :osapuoli {:id 2 + :type "henkilo"} :document true} - {:hallinto-oikeus-id nil - :osapuoli-id 3 - :document false}] + {:osapuoli {:id 3 + :type "henkilo"} + :document false}] :recipient-answered true :statement-sv "Han vet inte. Vi förlotar." :statement-fi "Tämän kerran annetaan anteeksi kun hän ei tiennyt." @@ -82,24 +83,141 @@ :vastaanottajan-tarkenne nil :maa "FI"}])))) - (t/testing "Two osapuolis and two hallinto-oikeus selections, both osapuolet are returned" + (t/testing "Henkilo-osapuoli and yritysosapuoli with the same id" + (let [osapuolet [{:toimitustapa-description nil, + :toimitustapa-id 0, + :email nil, + :rooli-id 0, + :jakeluosoite "Testikatu 12", + :valvonta-id 1, + :postitoimipaikka "Helsinki", + :puhelin nil, + :sukunimi "Talonomistaja", + :postinumero "00100", + :id 1, + :henkilotunnus "000000-0000", + :rooli-description "", + :etunimi "Testi", + :vastaanottajan-tarkenne nil, + :maa "FI"} + {:toimitustapa-description nil, + :toimitustapa-id 0, + :email nil, + :rooli-id 0, + :jakeluosoite "Testikatu 12", + :valvonta-id 1, + :postitoimipaikka "Helsinki", + :ytunnus nil, + :puhelin nil, + :nimi "Yritysomistaja", + :postinumero "00100", + :id 1, + :rooli-description "Omistaja", + :vastaanottajan-tarkenne "Lisäselite C/O", + :maa "FI"}]] + (t/testing "only the henkilo-osapuoli has a document so it should be returned" + (t/is (= (asha/remove-osapuolet-with-no-document + {:type-id 8 + :type-specific-data {:osapuoli-specific-data [{:hallinto-oikeus-id 1 + :osapuoli {:id 1 + :type "henkilo"} + :document true} + {:hallinto-oikeus-id 3 + :osapuoli {:id 1 + :type "yritys"} + :document false}]}} + osapuolet) + [{:toimitustapa-description nil, + :toimitustapa-id 0, + :email nil, + :rooli-id 0, + :jakeluosoite "Testikatu 12", + :valvonta-id 1, + :postitoimipaikka "Helsinki", + :puhelin nil, + :sukunimi "Talonomistaja", + :postinumero "00100", + :id 1, + :henkilotunnus "000000-0000", + :rooli-description "", + :etunimi "Testi", + :vastaanottajan-tarkenne nil, + :maa "FI"}]))) + + (t/testing "only the yritys-osapuoli has a document so it should be returned" + (t/is (= (asha/remove-osapuolet-with-no-document + {:type-id 8 + :type-specific-data {:osapuoli-specific-data [{:hallinto-oikeus-id 1 + :osapuoli {:id 1 + :type "henkilo"} + :document false} + {:hallinto-oikeus-id 3 + :osapuoli {:id 1 + :type "yritys"} + :document true}]}} + osapuolet) + [{:toimitustapa-description nil, + :toimitustapa-id 0, + :email nil, + :rooli-id 0, + :jakeluosoite "Testikatu 12", + :valvonta-id 1, + :postitoimipaikka "Helsinki", + :ytunnus nil, + :puhelin nil, + :nimi "Yritysomistaja", + :postinumero "00100", + :id 1, + :rooli-description "Omistaja", + :vastaanottajan-tarkenne "Lisäselite C/O", + :maa "FI"}]))) + + (t/testing "both have a document so both should be returned" + (t/is (= (asha/remove-osapuolet-with-no-document + {:type-id 8 + :type-specific-data {:osapuoli-specific-data [{:hallinto-oikeus-id 1 + :osapuoli {:id 1 + :type "henkilo"} + :document true} + {:hallinto-oikeus-id 3 + :osapuoli {:id 1 + :type "yritys"} + :document true}]}} + osapuolet) + osapuolet))))) + + (t/testing "Two osapuolis and two documents, both osapuolet are returned" (t/is (= (asha/remove-osapuolet-with-no-document {:type-id 8 :type-specific-data {:osapuoli-specific-data [{:hallinto-oikeus-id 1 - :osapuoli-id 2 + :osapuoli {:id 2 + :type "henkilo"} :document true} {:hallinto-oikeus-id 3 - :osapuoli-id 3 + :osapuoli {:id 3 + :type "yritys"} :document true}]}} - [{:id 2} - {:id 3}]) - [{:id 2} - {:id 3}]))) + [{:id 2 + :etunimi "Testi" + :sukunimi "Testerson"} + {:id 3 + :nimi "Testiyritys"}]) + [{:id 2 + :etunimi "Testi" + :sukunimi "Testerson"} + {:id 3 + :nimi "Testiyritys"}]))) (t/testing "Two osapuolis and toimenpide is not varsinainen päätös, so both should be returned" (t/is (= (asha/remove-osapuolet-with-no-document {:type-id 7} - [{:id 2} - {:id 3}]) - [{:id 2} - {:id 3}])))) + [{:id 2 + :etunimi "Testi" + :sukunimi "Testerson"} + {:id 3 + :nimi "Testiyritys"}]) + [{:id 2 + :etunimi "Testi" + :sukunimi "Testerson"} + {:id 3 + :nimi "Testiyritys"}])))) diff --git a/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data_test.clj b/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data_test.clj index 7b0f25e02..ae47f09a3 100644 --- a/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data_test.clj +++ b/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/toimenpide_type_specific_data_test.clj @@ -12,7 +12,8 @@ ts/*db* {:type-id 8 :type-specific-data {:fine 129 - :osapuoli-specific-data [{:osapuoli-id 1 + :osapuoli-specific-data [{:osapuoli {:id 1 + :type "henkilo"} :hallinto-oikeus-id 0 :document true :recipient-answered true @@ -23,7 +24,8 @@ :department-head-name "Jorma Jormanen" :department-head-title-fi "Hallinto-oikeuden presidentti" :department-head-title-sv "Hallinto-oikeuden kuningas"}} - 1) + {:id 1 + :type "henkilo"}) {:fine 129 :vastaus-fi "Asianosainen antoi vastineen kuulemiskirjeeseen. Voi anteeksi, en tiennyt." :oikeus-fi "Helsingin hallinto-oikeudelta" @@ -92,11 +94,15 @@ (t/deftest find-court-id-from-osapuoli-specific-data-test (t/testing "Correct court id is found for the osapuoli" (t/is (= (type-specific-data/find-administrative-court-id-from-osapuoli-specific-data - [{:osapuoli-id 1 + [{:osapuoli {:id 1 + :type "henkilo"} :hallinto-oikeus-id 0} - {:osapuoli-id 3 + {:osapuoli {:id 3 + :type "henkilo"} :hallinto-oikeus-id 5} - {:osapuoli-id 643 + {:osapuoli {:id 643 + :type "yritys"} :hallinto-oikeus-id 2}] - 3) + {:id 3 + :type "henkilo"}) 5)))) diff --git a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_tiedoksianto_haastemies_test.clj b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_tiedoksianto_haastemies_test.clj index a37755efc..cd85c9b59 100644 --- a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_tiedoksianto_haastemies_test.clj +++ b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_tiedoksianto_haastemies_test.clj @@ -56,12 +56,14 @@ :deadline-date (str (LocalDate/of 2023 7 22)) :template-id 8 :description "Kuvaus" - :type-specific-data {:osapuoli-specific-data [{:osapuoli-id 1 + :type-specific-data {:osapuoli-specific-data [{:osapuoli {:id 1 + :type "henkilo"} :karajaoikeus-id 1 :haastemies-email "haaste@mie.het" :document true} - {:osapuoli-id 2 - :document false}]}} + {:osapuoli {:id 2 + :type "yritys"} + :document false}]}} response (ts/handler (-> (mock/request :post (format "/api/private/valvonta/kaytto/%s/toimenpiteet" valvonta-id)) (mock/json-body new-toimenpide) (test-kayttajat/with-virtu-user) @@ -108,9 +110,11 @@ :type-specific-data {:osapuoli-specific-data [{:document true :haastemies-email "haaste@mie.het" :karajaoikeus-id 1 - :osapuoli-id 1} - {:document false - :osapuoli-id 2}]} + :osapuoli {:id 1 + :type "henkilo"}} + {:document false + :osapuoli {:id 2 + :type "yritys"}}]} :valvonta-id valvonta-id :yritykset []})))))) @@ -149,7 +153,8 @@ :deadline-date (str (LocalDate/of 2023 7 22)) :template-id 8 :description "Kuvaus" - :type-specific-data {:osapuoli-specific-data [{:osapuoli-id 1 + :type-specific-data {:osapuoli-specific-data [{:osapuoli {:id 1 + :type "yritys"} :karajaoikeus-id 1 :haastemies-email "haaste@mie.het" :document true}]}} @@ -184,7 +189,8 @@ :type-specific-data {:osapuoli-specific-data [{:document true :haastemies-email "haaste@mie.het" :karajaoikeus-id 1 - :osapuoli-id 1}]} + :osapuoli {:id 1 + :type "yritys"}}]} :valvonta-id valvonta-id :yritykset [{:toimitustapa-description nil, :toimitustapa-id 0, diff --git a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_varsinainen_paatos_test.clj b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_varsinainen_paatos_test.clj index 9601c162a..09e925571 100644 --- a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_varsinainen_paatos_test.clj +++ b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/kaskypaatos_varsinainen_paatos_test.clj @@ -100,7 +100,8 @@ :template-id 6 :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "henkilo"} :hallinto-oikeus-id 1 :document true :recipient-answered true @@ -220,7 +221,8 @@ :template-id 6 :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "yritys"} :hallinto-oikeus-id 2 :document true :recipient-answered false}] @@ -276,7 +278,8 @@ :department-head-name "Jane Doe", :osapuoli-specific-data [{:hallinto-oikeus-id 2 - :osapuoli-id 1 + :osapuoli {:id 1 + :type "yritys"} :document true :recipient-answered false}] :department-head-title-sv "Kungen" @@ -399,7 +402,8 @@ :template-id 6 :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "henkilo"} :hallinto-oikeus-id 1 :document true :recipient-answered true @@ -407,8 +411,9 @@ :answer-commentary-sv "Jag visste inte att ett intyg behövs :(" :statement-fi "Tämän kerran annetaan anteeksi, kun hän ei tiennyt." :statement-sv "Han vet inte. Vi förlotar."} - {:osapuoli-id osapuoli-id-2 - :document false}] + {:osapuoli {:id osapuoli-id-2 + :type "henkilo"} + :document false}] :department-head-title-fi "Apulaisjohtaja" :department-head-title-sv "Apulaisjohtaja på svenska" :department-head-name "Yli Päällikkö"}} @@ -447,7 +452,8 @@ :template-id 6 :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "henkilo"} :hallinto-oikeus-id 3 :document true :recipient-answered false}] @@ -484,7 +490,8 @@ :template-id 6 :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "yritys"} :hallinto-oikeus-id 5 :document true :recipient-answered true @@ -554,3 +561,156 @@ (t/is (= response-body {:department-head-name "Testi Testinen" :department-head-title-fi "Ylitarkastaja" :department-head-title-sv "Ylitarkastaja på svenska"}))))))) + +(t/deftest two-osapuolet-one-id-test + ;; Add the main user for the following tests + (test-kayttajat/insert-virtu-paakayttaja! + {:etunimi "Asian" + :sukunimi "Tuntija" + :email "testi@ara.fi" + :puhelin "0504363675457"}) + (t/testing "Käskypäätös / varsinainen päätös toimenpide is created successfully for yksityishenkilö even though yritysosapuoli with same id exists" + ;; Add the valvonta and previous toimenpides + ;; so that käskypäätös / kuulemiskirje toimenpide can be created + (let [valvonta-id (valvonta-service/add-valvonta! ts/*db* {:katuosoite "Testitie 5" + :postinumero "90100" + :ilmoituspaikka-id 0}) + kehotus-timestamp (-> (LocalDate/of 2023 6 12) + (.atStartOfDay (ZoneId/systemDefault)) + .toInstant) + varoitus-timestamp (-> (LocalDate/of 2023 7 13) + (.atStartOfDay (ZoneId/systemDefault)) + .toInstant) + kuulemiskirje-timestamp (-> (LocalDate/of 2023 7 13) + (.atStartOfDay (ZoneId/systemDefault)) + .toInstant) + html->pdf-called? (atom false) + store-hallinto-oikeus-attachment-called? (atom false) + ;; Add osapuoli to the valvonta + osapuoli-id (valvonta-service/add-henkilo! + ts/*db* + valvonta-id + {:toimitustapa-description nil + :toimitustapa-id 0 + :email nil + :rooli-id 0 + :jakeluosoite "Testikatu 12" + :postitoimipaikka "Helsinki" + :puhelin nil + :sukunimi "Talonomistaja" + :postinumero "00100" + :henkilotunnus "000000-0000" + :rooli-description "" + :etunimi "Testi" + :vastaanottajan-tarkenne nil + :maa "FI"}) + + ;; Add yritysosapuoli to ensure that different types of osapuolis with the same id + ;; do not affect each other + yritysosapuoli-id (valvonta-service/add-yritys! + ts/*db* + valvonta-id + {:nimi "Yritysomistaja" + :toimitustapa-description nil + :toimitustapa-id 0 + :email nil + :rooli-id 0 + :jakeluosoite "Testikatu 12" + :vastaanottajan-tarkenne "Lisäselite C/O" + :postitoimipaikka "Helsinki" + :puhelin nil + :postinumero "00100" + :rooli-description "Omistaja" + :maa "FI"})] + + (t/is (= osapuoli-id yritysosapuoli-id)) + ;; Add kehotus-toimenpide to the valvonta + (jdbc/insert! ts/*db* :vk_toimenpide {:valvonta_id valvonta-id + :type_id 2 + :create_time kehotus-timestamp + :publish_time kehotus-timestamp + :deadline_date (LocalDate/of 2023 7 12)}) + ;; Add varoitus-toimenpide to the valvonta + (jdbc/insert! ts/*db* :vk_toimenpide {:valvonta_id valvonta-id + :type_id 3 + :create_time varoitus-timestamp + :publish_time varoitus-timestamp + :deadline_date (LocalDate/of 2023 8 13)}) + + ;; Add käskypäätös / kuulemiskirje toimenpide to the valvonta + (jdbc/insert! ts/*db* :vk_toimenpide {:valvonta_id valvonta-id + :type_id 7 + :create_time kuulemiskirje-timestamp + :publish_time kuulemiskirje-timestamp + :deadline_date (LocalDate/of 2023 8 27) + :type_specific_data {:fine 9000} + :diaarinumero "ARA-05.03.01-2023-159"}) + ;; Mock the current time to ensure that the document has a fixed date + (with-bindings {#'time/clock (Clock/fixed (-> (LocalDate/of 2023 8 28) + (.atStartOfDay time/timezone) + .toInstant) + time/timezone) + #'pdf/html->pdf (partial html->pdf-with-assertion + "documents/kaskypaatos-varsinainen-paatos-yksityishenkilo.html" + html->pdf-called?) + #'file-store/store-hallinto-oikeus-attachment! + (fn [aws-s3-client valvonta-id toimenpide-id osapuoli document] + (reset! store-hallinto-oikeus-attachment-called? true) + (original-store-hallinto-oikeus-attachment aws-s3-client valvonta-id toimenpide-id osapuoli document))} + (let [new-toimenpide {:type-id 8 + :deadline-date (str (LocalDate/of 2023 10 4)) + :template-id 6 + :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" + :type-specific-data {:fine 857 + :osapuoli-specific-data [{:osapuoli {:id yritysosapuoli-id + :type "yritys"} + :document false} + {:osapuoli {:id osapuoli-id + :type "henkilo"} + :hallinto-oikeus-id 1 + :document true + :recipient-answered true + :answer-commentary-fi "En tiennyt, että todistus tarvitaan :(" + :answer-commentary-sv "Jag visste inte att ett intyg behövs :(" + :statement-fi "Tämän kerran annetaan anteeksi, kun hän ei tiennyt." + :statement-sv "Han vet inte. Vi förlotar."}] + :department-head-title-fi "Apulaisjohtaja" + :department-head-title-sv "Apulaisjohtaja på svenska" + :department-head-name "Yli Päällikkö"}} + response (ts/handler (-> (mock/request :post (format "/api/private/valvonta/kaytto/%s/toimenpiteet" valvonta-id)) + (mock/json-body new-toimenpide) + (test-kayttajat/with-virtu-user) + (mock/header "Accept" "application/json")))] + (t/is (true? @html->pdf-called?)) + (t/is (true? @store-hallinto-oikeus-attachment-called?)) + (t/is (= (:status response) 201)))) + + (t/testing "Created document can be downloaded through the api" + (let [response (ts/handler (-> (mock/request :get (format "/api/private/valvonta/kaytto/%s/toimenpiteet/%s/henkilot/%s/document/kaskypaatos.pdf" valvonta-id 4 osapuoli-id)) + (test-kayttajat/with-virtu-user) + (mock/header "Accept" "application/pdf")))] + (t/is (= (-> response :headers (get "Content-Type")) "application/pdf")) + (t/is (= (:status response) 200)))) + + (t/testing "Created document is not available without authentication" + (let [response (ts/handler (-> (mock/request :get (format "/api/private/valvonta/kaytto/%s/toimenpiteet/%s/henkilot/%s/document/kaskypaatos.pdf" valvonta-id 4 osapuoli-id)) + (mock/header "Accept" "application/pdf")))] + (t/is (= (:status response) 403)) + (t/is (= (:body response) "Forbidden")))) + + (t/testing "hallinto-oikeus-liite can be downloaded through the api" + (let [response (ts/handler (-> (mock/request :get (format "/api/private/valvonta/kaytto/%s/toimenpiteet/%s/henkilot/%s/attachment/hallinto-oikeus.pdf" valvonta-id 4 osapuoli-id)) + (test-kayttajat/with-virtu-user) + (mock/header "Accept" "application/pdf")))] + (t/is (= (-> response :headers (get "Content-Type")) "application/pdf")) + (t/is (= (:status response) 200)) + + (t/testing "hallinto-oikeus-liite is the correct one" + (t/is (= (slurp (io/input-stream (io/resource "pdf/hallinto-oikeudet/Valitusosoitus_30_pv_HAMEENLINNAN_HAO.pdf"))) + (slurp (:body response))))))) + + (t/testing "hallinto-oikeus-liite is not available without authentication" + (let [response (ts/handler (-> (mock/request :get (format "/api/private/valvonta/kaytto/%s/toimenpiteet/%s/henkilot/%s/attachment/hallinto-oikeus.pdf" valvonta-id 4 osapuoli-id)) + (mock/header "Accept" "application/pdf")))] + (t/is (= (:status response) 403)) + (t/is (= (:body response) "Forbidden"))))))) \ No newline at end of file diff --git a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_kuulemiskirje_test.clj b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_kuulemiskirje_test.clj index c44c754ba..921ba6e33 100644 --- a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_kuulemiskirje_test.clj +++ b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_kuulemiskirje_test.clj @@ -122,7 +122,8 @@ :answer-commentary-sv "Jag visste inte att ett intyg behövs :(" :statement-fi "Tämän kerran annetaan anteeksi, kun hän ei tiennyt." :statement-sv "Han vet inte. Vi förlotar." - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "henkilo"} :hallinto-oikeus-id 1 :document true}] :department-head-title-fi "Apulaisjohtaja" diff --git a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_tiedoksianto_haastemies_test.clj b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_tiedoksianto_haastemies_test.clj index d9beb1023..d2622ecce 100644 --- a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_tiedoksianto_haastemies_test.clj +++ b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_tiedoksianto_haastemies_test.clj @@ -9,8 +9,7 @@ [solita.etp.service.valvonta-kaytto :as valvonta-service] [solita.etp.test-data.kayttaja :as test-kayttajat] [solita.etp.test-system :as ts]) - (:import (java.time Clock LocalDate)) - ) + (:import (java.time Clock LocalDate))) (t/use-fixtures :each ts/fixture) @@ -57,12 +56,14 @@ :deadline-date (str (LocalDate/of 2023 7 22)) :template-id 10 :description "Kuvaus" - :type-specific-data {:osapuoli-specific-data [{:osapuoli-id 1 + :type-specific-data {:osapuoli-specific-data [{:osapuoli {:id 1 + :type "henkilo"} :karajaoikeus-id 1 :haastemies-email "haaste@mie.het" :document true} - {:osapuoli-id 2 - :document false}]}} + {:osapuoli {:id 2 + :type "henkilo"} + :document false}]}} response (ts/handler (-> (mock/request :post (format "/api/private/valvonta/kaytto/%s/toimenpiteet" valvonta-id)) (mock/json-body new-toimenpide) (test-kayttajat/with-virtu-user) @@ -109,9 +110,11 @@ :type-specific-data {:osapuoli-specific-data [{:document true :haastemies-email "haaste@mie.het" :karajaoikeus-id 1 - :osapuoli-id 1} - {:document false - :osapuoli-id 2}]} + :osapuoli {:id 1 + :type "henkilo"}} + {:document false + :osapuoli {:id 2 + :type "henkilo"}}]} :valvonta-id valvonta-id :yritykset []})))))) @@ -150,7 +153,8 @@ :deadline-date (str (LocalDate/of 2023 7 22)) :template-id 10 :description "Kuvaus" - :type-specific-data {:osapuoli-specific-data [{:osapuoli-id 1 + :type-specific-data {:osapuoli-specific-data [{:osapuoli {:id 1 + :type "yritys"} :karajaoikeus-id 1 :haastemies-email "haaste@mie.het" :document true}]}} @@ -185,7 +189,8 @@ :type-specific-data {:osapuoli-specific-data [{:document true :haastemies-email "haaste@mie.het" :karajaoikeus-id 1 - :osapuoli-id 1}]} + :osapuoli {:id 1 + :type "yritys"}}]} :valvonta-id valvonta-id :yritykset [{:toimitustapa-description nil, :toimitustapa-id 0, diff --git a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_varsinainen_paatos_test.clj b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_varsinainen_paatos_test.clj index 0dc339683..c43b77bf3 100644 --- a/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_varsinainen_paatos_test.clj +++ b/etp-backend/src/test/clj/solita/etp/valvonta_kaytto/sakkopaatos_varsinainen_paatos_test.clj @@ -98,7 +98,8 @@ :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :diaarinumero "ARA-05.03.01-2023-159" :type_specific_data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "henkilo"} :hallinto-oikeus-id 1 :document true :recipient-answered true @@ -138,7 +139,8 @@ :template-id 9 :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :type-specific-data {:fine 8572 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "henkilo"} :hallinto-oikeus-id 3 :document true :recipient-answered true @@ -199,7 +201,8 @@ :department-head-name "Yli Päällikkö" :osapuoli-specific-data [{:hallinto-oikeus-id 3 - :osapuoli-id 1 + :osapuoli {:id 1 + :type "henkilo"} :recipient-answered true :document true :statement-sv "Han vet inte. Vi förlotar." @@ -298,7 +301,8 @@ :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :diaarinumero "ARA-05.03.01-2023-159" :type_specific_data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "yritys"} :hallinto-oikeus-id 1 :document true :recipient-answered true @@ -334,7 +338,8 @@ :template-id 9 :description "Tehdään varsinainen päätös, omistaja ei vastannut kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "yritys"} :hallinto-oikeus-id 4 :statement-fi "ARAn päätökseen ei ole haettu muutosta, eli päätös on lainvoimainen. Maksuun tuomittavan uhkasakon määrä on sama kuin mitä se on ollut ARAn päätöksessä. ARAn näkemyksen mukaan uhkasakko tuomitaan maksuun täysimääräisenä, koska Asianosainen ei ole noudattanut päävelvoitetta lainkaan, eikä ole myöskään esittänyt noudattamatta jättämiselle pätevää syytä." :statement-sv "Placeholder" @@ -395,7 +400,8 @@ :department-head-name "Jane Doe", :osapuoli-specific-data [{:hallinto-oikeus-id 4, - :osapuoli-id 1, + :osapuoli {:id 1, + :type "yritys"}, :recipient-answered false, :document true, :statement-sv "Placeholder", @@ -434,7 +440,8 @@ :template-id 9 :description "Tehdään varsinainen päätös, omistaja ei vastannut kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "henkilo"} :hallinto-oikeus-id 3 :document true :recipient-answered false @@ -475,7 +482,8 @@ :template-id 9 :description "Tehdään varsinainen päätös, omistaja vastasi kuulemiskirjeeseen" :type-specific-data {:fine 857 - :osapuoli-specific-data [{:osapuoli-id osapuoli-id + :osapuoli-specific-data [{:osapuoli {:id osapuoli-id + :type "yritys"} :hallinto-oikeus-id 5 :document true :recipient-answered true