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 6120c8c23..dfc0b53a9 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 @@ -145,10 +145,11 @@ (def SakkopaatosTiedoksiantoHaastemiesOsapuoliSpecificData (schema/conditional toimenpide/osapuoli-has-document? - {:osapuoli OsapuoliSpecificDataOsapuoli - :karajaoikeus-id KarajaoikeusId - :haastemies-email common-schema/Email - :document schema/Bool} + {:osapuoli OsapuoliSpecificDataOsapuoli + :karajaoikeus-id KarajaoikeusId + (schema/optional-key :hallinto-oikeus-id) HallintoOikeusId + :haastemies-email common-schema/Email + :document schema/Bool} :else {:osapuoli OsapuoliSpecificDataOsapuoli 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 d3fe9c8be..32524c9aa 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 @@ -42,6 +42,8 @@ attachments {:decision-order-actual-decision {:type "Kirje" :filename "hallinto-oikeus.pdf"} :penalty-decision-actual-decision {:type "Kirje" + :filename "hallinto-oikeus.pdf"} + :penalty-decision-notice-bailiff {:type "Kirje" :filename "hallinto-oikeus.pdf"}}] (get attachments type-key))) @@ -115,71 +117,72 @@ :email-address (:email osapuoli)})) (defn- available-processing-actions [toimenpide osapuolet] - {:rfi-request {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Vireillepano"}} - :processing-action {:name "Tietopyyntö" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)} - :document (toimenpide-type->document (:type-id toimenpide))} - :rfi-order {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Vireillepano"}} - :processing-action {:name "Kehotuksen antaminen" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)} - :document (toimenpide-type->document (:type-id toimenpide))} - :rfi-warning {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Käsittely"}} - :processing-action {:name "Varoituksen antaminen" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)} - :document (toimenpide-type->document (:type-id toimenpide))} - :decision-order-hearing-letter {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Käsittely"}} - :document (toimenpide-type->document (:type-id toimenpide)) - :processing-action {:name "Kuuleminen uhkasakon asettamisesta" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)}} - :decision-order-actual-decision {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Päätöksenteko"}} - :document (toimenpide-type->document (:type-id toimenpide)) - :attachment (toimenpide-type->attachment (:type-id toimenpide)) - :processing-action {:name "Uhkasakon asettaminen" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)}} - :decision-order-notice-bailiff {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Tiedoksianto ja toimeenpano"}} - :document (toimenpide-type->document (:type-id toimenpide)) - :processing-action {:name "Asiakirjan toimituspyyntö haastemiehelle" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)}} - :penalty-decision-hearing-letter {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Käsittely"}} - :document (toimenpide-type->document (:type-id toimenpide)) - :processing-action {:name "Kuuleminen uhkasakon tuomitsemisesta" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)}} - :penalty-decision-actual-decision {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Päätöksenteko"}} - :document (toimenpide-type->document (:type-id toimenpide)) - :attachment (toimenpide-type->attachment (:type-id toimenpide)) - :processing-action {:name "Uhkasakon tuomitseminen maksettavaksi" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)}} - :penalty-decision-notice-bailiff {:identity {:case {:number (:diaarinumero toimenpide)} - :processing-action {:name-identity "Tiedoksianto ja toimeenpano"}} - :document (toimenpide-type->document (:type-id toimenpide)) - :processing-action {:name "Asiakirjan toimituspyyntö haastemiehelle" - :reception-date (Instant/now) - :contacting-direction "SENT" - :contact (map osapuoli->contact osapuolet)}}}) + {:rfi-request {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Vireillepano"}} + :processing-action {:name "Tietopyyntö" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)} + :document (toimenpide-type->document (:type-id toimenpide))} + :rfi-order {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Vireillepano"}} + :processing-action {:name "Kehotuksen antaminen" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)} + :document (toimenpide-type->document (:type-id toimenpide))} + :rfi-warning {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Käsittely"}} + :processing-action {:name "Varoituksen antaminen" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)} + :document (toimenpide-type->document (:type-id toimenpide))} + :decision-order-hearing-letter {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Käsittely"}} + :document (toimenpide-type->document (:type-id toimenpide)) + :processing-action {:name "Kuuleminen uhkasakon asettamisesta" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)}} + :decision-order-actual-decision {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Päätöksenteko"}} + :document (toimenpide-type->document (:type-id toimenpide)) + :attachment (toimenpide-type->attachment (:type-id toimenpide)) + :processing-action {:name "Uhkasakon asettaminen" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)}} + :decision-order-notice-bailiff {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Tiedoksianto ja toimeenpano"}} + :document (toimenpide-type->document (:type-id toimenpide)) + :processing-action {:name "Asiakirjan toimituspyyntö haastemiehelle" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)}} + :penalty-decision-hearing-letter {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Käsittely"}} + :document (toimenpide-type->document (:type-id toimenpide)) + :processing-action {:name "Kuuleminen uhkasakon tuomitsemisesta" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)}} + :penalty-decision-actual-decision {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Päätöksenteko"}} + :document (toimenpide-type->document (:type-id toimenpide)) + :attachment (toimenpide-type->attachment (:type-id toimenpide)) + :processing-action {:name "Uhkasakon tuomitseminen maksettavaksi" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)}} + :penalty-decision-notice-bailiff {:identity {:case {:number (:diaarinumero toimenpide)} + :processing-action {:name-identity "Tiedoksianto ja toimeenpano"}} + :document (toimenpide-type->document (:type-id toimenpide)) + :attachment (toimenpide-type->attachment (:type-id toimenpide)) + :processing-action {:name "Asiakirjan toimituspyyntö haastemiehelle" + :reception-date (Instant/now) + :contacting-direction "SENT" + :contact (map osapuoli->contact osapuolet)}}}) (defn- resolve-processing-action [toimenpide osapuolet] (let [processing-actions (available-processing-actions toimenpide osapuolet) @@ -265,7 +268,9 @@ (filter osapuoli/omistaja?) (remove-osapuolet-with-no-document toimenpide) (mapv (fn [osapuoli] - (store-hallinto-oikeus-attachment! db aws-s3-client (:id valvonta) toimenpide osapuoli)))))] + (when (type-specific-data/hallinto-oikeus-id-exists-for-osapuoli? toimenpide osapuoli) + (store-hallinto-oikeus-attachment! db aws-s3-client (:id valvonta) toimenpide osapuoli)))) + (remove nil?)))] (asha/log-toimenpide! sender-id request-id diff --git a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide.clj b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide.clj index 199429565..713fca20d 100644 --- a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide.clj +++ b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/toimenpide.clj @@ -75,7 +75,8 @@ (def has-hallinto-oikeus-liite? (partial some-type? #{:decision-order-actual-decision - :penalty-decision-actual-decision})) + :penalty-decision-actual-decision + :penalty-decision-notice-bailiff})) (def asha-toimenpide? (partial some-type? #{:rfi-request 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 6c37787f0..c9923a7bc 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 @@ -31,6 +31,15 @@ (exception/throw-ex-info! {:message (str "Unknown hallinto-oikeus-id: " hallinto-oikeus-id)}))) +(defn hallinto-oikeus-id-exists-for-osapuoli? [toimenpide osapuoli] + (boolean + (find-administrative-court-id-from-osapuoli-specific-data + (-> toimenpide + :type-specific-data + :osapuoli-specific-data) + {:id (:id osapuoli) + :type (osapuoli/osapuoli->osapuoli-type osapuoli)}))) + (defn format-actual-decision-data [db toimenpide osapuoli] (let [recipient-answered? (-> toimenpide :type-specific-data @@ -110,7 +119,7 @@ (str (:sukunimi omistaja) " " (:etunimi omistaja)) (:nimi omistaja))) omistajat)] - {:fine (-> toimenpide :type-specific-data :fine) + {:fine (-> toimenpide :type-specific-data :fine) :omistajat (string/join ", " omistaja-strings)})) (defmethod format-type-specific-data :default [_ toimenpide _] 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 d2622ecce..027860941 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 @@ -1,5 +1,6 @@ (ns solita.etp.valvonta-kaytto.sakkopaatos-tiedoksianto-haastemies-test (:require + [clojure.java.io :as io] [clojure.test :as t] [jsonista.core :as j] [ring.mock.request :as mock] @@ -24,26 +25,24 @@ (let [valvonta-id (valvonta-service/add-valvonta! ts/*db* {:katuosoite "Testitie 5" :postinumero "90100" :ilmoituspaikka-id 0}) - html->pdf-called? (atom false)] - - ;; Add osapuoli to the valvonta - (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 "Omistaja" - :etunimi "Testi" - :vastaanottajan-tarkenne nil - :maa "FI"}) - + html->pdf-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 "Omistaja" + :etunimi "Testi" + :vastaanottajan-tarkenne nil + :maa "FI"})] ;; Mock the current time to ensure that the document has a fixed date (with-bindings {#'time/clock (Clock/fixed (-> (LocalDate/of 2023 6 26) (.atStartOfDay time/timezone) @@ -56,11 +55,13 @@ :deadline-date (str (LocalDate/of 2023 7 22)) :template-id 10 :description "Kuvaus" - :type-specific-data {:osapuoli-specific-data [{:osapuoli {:id 1 - :type "henkilo"} - :karajaoikeus-id 1 - :haastemies-email "haaste@mie.het" - :document true} + :type-specific-data {:osapuoli-specific-data [{:osapuoli {:id 1 + :type "henkilo"} + :karajaoikeus-id 1 + :haastemies-email "haaste@mie.het" + ;; Hallinto-oikeus-id is only present if it has changed for the osapuoli + :hallinto-oikeus-id 1 + :document true} {:osapuoli {:id 2 :type "henkilo"} :document false}]}} @@ -107,16 +108,28 @@ :id 1 :template-id 10 :type-id 18 - :type-specific-data {:osapuoli-specific-data [{:document true - :haastemies-email "haaste@mie.het" - :karajaoikeus-id 1 - :osapuoli {:id 1 - :type "henkilo"}} + :type-specific-data {:osapuoli-specific-data [{:document true + :haastemies-email "haaste@mie.het" + :karajaoikeus-id 1 + :hallinto-oikeus-id 1 + :osapuoli {:id 1 + :type "henkilo"}} {:document false :osapuoli {:id 2 :type "henkilo"}}]} :valvonta-id valvonta-id - :yritykset []})))))) + :yritykset []})))) + + (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 1 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 "Sakkopäätös / Tiedoksianto (Haastemies) toimenpide is created successfully for yritys and document is generated with correct information" ;; Add the valvonta @@ -156,6 +169,8 @@ :type-specific-data {:osapuoli-specific-data [{:osapuoli {:id 1 :type "yritys"} :karajaoikeus-id 1 + ;; hallinto-oikeus has not changed for the osapuoli, + ;; so there's no hallinto-oikeus-id :haastemies-email "haaste@mie.het" :document true}]}} response (ts/handler (-> (mock/request :post (format "/api/private/valvonta/kaytto/%s/toimenpiteet" valvonta-id))