diff --git a/etp-backend/src/main/clj/solita/etp/api/valvonta_kaytto_toimenpiteet.clj b/etp-backend/src/main/clj/solita/etp/api/valvonta_kaytto_toimenpiteet.clj index 29a97eb51..34475a74c 100644 --- a/etp-backend/src/main/clj/solita/etp/api/valvonta_kaytto_toimenpiteet.clj +++ b/etp-backend/src/main/clj/solita/etp/api/valvonta_kaytto_toimenpiteet.clj @@ -16,13 +16,13 @@ {:get {:summary "Hae käytönvalvonnan toimenpiteet." :parameters {:path {:id common-schema/Key}} :responses {200 {:body [kaytto-schema/Toimenpide]}} - :access rooli-service/paakayttaja? + :access rooli-service/paakayttaja? :handler (fn [{{{:keys [id]} :path} :parameters :keys [db]}] (api-response/get-response (valvonta-service/find-toimenpiteet db id) (api-response/msg-404 "kaytonvalvonta" id)))} :post {:summary "Lisää käytönvalvonnan toimenpide." - :access rooli-service/paakayttaja? + :access rooli-service/paakayttaja? :parameters {:path {:id common-schema/Key} :body kaytto-schema/ToimenpideAdd} :responses {201 {:body common-schema/Id} @@ -31,7 +31,7 @@ :parameters :keys [db aws-s3-client whoami uri]}] (api-response/with-exceptions #(api-response/created uri - (valvonta-service/add-toimenpide! db aws-s3-client whoami id body)) + (valvonta-service/add-toimenpide! db aws-s3-client whoami id body)) [{:constraint :toimenpide-vk-valvonta-id-fkey :response 404}]))}}] ["/henkilot/:henkilo-id/preview" @@ -69,49 +69,82 @@ ["/:toimenpide-id" ["" {:conflicting true - :put {:summary "Muuta toimenpiteen tietoja." - :access rooli-service/paakayttaja? - :parameters {:path {:id common-schema/Key - :toimenpide-id common-schema/Key} - :body kaytto-schema/ToimenpideUpdate} - :responses {200 {:body nil} - 404 {:body schema/Str}} - :handler (fn [{{{:keys [id toimenpide-id]} :path :keys [body]} - :parameters :keys [db]}] - (api-response/ok|not-found - (valvonta-service/update-toimenpide! - db toimenpide-id body) - (toimenpide-404-msg id toimenpide-id)))}}] - - ["/henkilot/:henkilo-id/document/:filename" - {:get {:summary "Henkilö-osapuolen toimenpiteen esikatselu tai lataus" - :parameters {:path {:id common-schema/Key - :toimenpide-id common-schema/Key - :henkilo-id common-schema/Key - :filename schema/Str}} - :access rooli-service/paakayttaja? - :responses {200 {:body nil} - 404 {:body schema/Str}} - :handler (fn [{{{:keys [id toimenpide-id henkilo-id filename]} :path} - :parameters :keys [db aws-s3-client]}] - (api-response/pdf-response - (valvonta-service/find-toimenpide-henkilo-document - db aws-s3-client id toimenpide-id henkilo-id) - filename - (api-response/msg-404 "henkilo" id toimenpide-id henkilo-id)))}}] - ["/yritykset/:yritys-id/document/:filename" - {:get {:summary "Yritys-osapuolen toimenpiteen esikatselu tai lataus" - :parameters {:path {:id common-schema/Key - :toimenpide-id common-schema/Key - :yritys-id common-schema/Key - :filename schema/Str}} - :access rooli-service/paakayttaja? - :responses {200 {:body nil} - 404 {:body schema/Str}} - :handler (fn [{{{:keys [id toimenpide-id yritys-id filename]} :path} - :parameters :keys [db aws-s3-client]}] - (api-response/pdf-response - (valvonta-service/find-toimenpide-yritys-document - db aws-s3-client id toimenpide-id yritys-id) - filename - (api-response/msg-404 "yritys "id toimenpide-id yritys-id)))}}]]]) + :put {:summary "Muuta toimenpiteen tietoja." + :access rooli-service/paakayttaja? + :parameters {:path {:id common-schema/Key + :toimenpide-id common-schema/Key} + :body kaytto-schema/ToimenpideUpdate} + :responses {200 {:body nil} + 404 {:body schema/Str}} + :handler (fn [{{{:keys [id toimenpide-id]} :path :keys [body]} + :parameters :keys [db]}] + (api-response/ok|not-found + (valvonta-service/update-toimenpide! + db toimenpide-id body) + (toimenpide-404-msg id toimenpide-id)))}}] + ["/henkilot" + ["/:henkilo-id" + ["/document/:filename" + {:get {:summary "Henkilö-osapuolen toimenpiteen dokumentin lataus" + :parameters {:path {:id common-schema/Key + :toimenpide-id common-schema/Key + :henkilo-id common-schema/Key + :filename schema/Str}} + :access rooli-service/paakayttaja? + :responses {200 {:body nil} + 404 {:body schema/Str}} + :handler (fn [{{{:keys [id toimenpide-id henkilo-id filename]} :path} + :parameters :keys [db aws-s3-client]}] + (api-response/pdf-response + (valvonta-service/find-toimenpide-henkilo-document + db aws-s3-client id toimenpide-id henkilo-id) + filename + (api-response/msg-404 "henkilo" id toimenpide-id henkilo-id)))}}] + ["/attachment" + ["/hallinto-oikeus.pdf" + {:get {:summary "Henkilö-osapuolen toimenpiteeseen liittyvän hallinto-oikeus-liitteen lataus" + :parameters {:path {:id common-schema/Key + :toimenpide-id common-schema/Key + :henkilo-id common-schema/Key}} + :access rooli-service/paakayttaja? + :responses {200 {:body nil} + 404 {:body schema/Str}} + :handler (fn [{{{:keys [id toimenpide-id henkilo-id]} :path} + :parameters :keys [db aws-s3-client]}] + (api-response/pdf-response + (valvonta-service/find-henkilo-hallinto-oikeus-attachment db aws-s3-client id toimenpide-id henkilo-id) + "hallinto-oikeus.pdf" + (api-response/msg-404 "henkilo" id toimenpide-id henkilo-id)))}}]]]] + ["/yritykset" + ["/:yritys-id" + ["/document/:filename" + {:get {:summary "Yritys-osapuolen toimenpiteen esikatselu tai lataus" + :parameters {:path {:id common-schema/Key + :toimenpide-id common-schema/Key + :yritys-id common-schema/Key + :filename schema/Str}} + :access rooli-service/paakayttaja? + :responses {200 {:body nil} + 404 {:body schema/Str}} + :handler (fn [{{{:keys [id toimenpide-id yritys-id filename]} :path} + :parameters :keys [db aws-s3-client]}] + (api-response/pdf-response + (valvonta-service/find-toimenpide-yritys-document + db aws-s3-client id toimenpide-id yritys-id) + filename + (api-response/msg-404 "yritys " id toimenpide-id yritys-id)))}}] + ["/attachment" + ["/hallinto-oikeus.pdf" + {:get {:summary "Yritys-osapuolen toimenpiteeseen liittyvän hallinto-oikeus-liitteen lataus" + :parameters {:path {:id common-schema/Key + :toimenpide-id common-schema/Key + :yritys-id common-schema/Key}} + :access rooli-service/paakayttaja? + :responses {200 {:body nil} + 404 {:body schema/Str}} + :handler (fn [{{{:keys [id toimenpide-id yritys-id]} :path} + :parameters :keys [db aws-s3-client]}] + (api-response/pdf-response + (valvonta-service/find-yritys-hallinto-oikeus-attachment db aws-s3-client id toimenpide-id yritys-id) + "hallinto-oikeus.pdf" + (api-response/msg-404 "yritys " id toimenpide-id yritys-id)))}}]]]]]]) diff --git a/etp-backend/src/main/clj/solita/etp/service/asha.clj b/etp-backend/src/main/clj/solita/etp/service/asha.clj index 852314088..0eaede0b8 100644 --- a/etp-backend/src/main/clj/solita/etp/service/asha.clj +++ b/etp-backend/src/main/clj/solita/etp/service/asha.clj @@ -9,6 +9,7 @@ [solita.etp.config :as config] [clojure.string :as str]) (:import (java.nio.charset StandardCharsets) + (java.time Instant) (java.util Base64))) (def toplevel-processing-actions @@ -218,48 +219,68 @@ (fn [name-identity] (reduce toplevel-processing-action-max (cons name-identity (keys states)))))) -(defn log-toimenpide! [sender-id request-id case-number processing-action & [documents]] - (let [processing-action-states (resolve-case-processing-action-state sender-id - request-id - case-number) - require-vireillepano (= {"Vireillepano" "NEW"} processing-action-states) - processing-action (-> processing-action - ;; Possibly redirect the processing action to Vireillepano - (with-vireillepano require-vireillepano) - ;; Prevent going backwards in the process - (with-latest-processing-action processing-action-states))] - (move-processing-action! - sender-id - request-id - case-number - processing-action-states - (-> processing-action :identity :processing-action :name-identity)) - (take-processing-action! - sender-id - request-id - case-number - (-> processing-action :identity :processing-action :name-identity)) - - (execute-operation! {:request-id request-id - :sender-id sender-id - :identity (:identity processing-action) - :processing-action (:processing-action processing-action)}) - - (doseq [document documents] - (add-documents-to-processing-action! - sender-id - request-id - case-number - (-> processing-action :processing-action :name) - [{:content (bytes->base64 document) - :type (-> processing-action :document :type) - :name (-> processing-action :document :filename)}])) - (take-processing-action! sender-id request-id case-number (-> processing-action :processing-action :name)) - (mark-processing-action-as-ready! - sender-id - request-id - case-number - (-> processing-action :processing-action :name)))) +(defn log-toimenpide! + ([sender-id request-id case-number processing-action] + (log-toimenpide! sender-id request-id case-number processing-action [] [])) + ([sender-id request-id case-number processing-action documents] + (log-toimenpide! sender-id request-id case-number processing-action documents [])) + ([sender-id request-id case-number processing-action documents attachments] + (let [processing-action-states (resolve-case-processing-action-state sender-id + request-id + case-number) + require-vireillepano (= {"Vireillepano" "NEW"} processing-action-states) + processing-action (-> processing-action + ;; Possibly redirect the processing action to Vireillepano + (with-vireillepano require-vireillepano) + ;; Prevent going backwards in the process + (with-latest-processing-action processing-action-states))] + (move-processing-action! + sender-id + request-id + case-number + processing-action-states + (-> processing-action :identity :processing-action :name-identity)) + (take-processing-action! + sender-id + request-id + case-number + (-> processing-action :identity :processing-action :name-identity)) + + (execute-operation! {:request-id request-id + :sender-id sender-id + :identity (:identity processing-action) + :processing-action (:processing-action processing-action)}) + + (doseq [document documents] + (add-documents-to-processing-action! + sender-id + request-id + case-number + (-> processing-action :processing-action :name) + [{:content (bytes->base64 document) + :type (-> processing-action :document :type) + :name (-> processing-action :document :filename)}])) + + (doseq [attachment attachments] + (when (nil? (-> processing-action :attachment)) + (throw (Exception. + (format "Received attachment for processing action %s but it has no attachments defined" + (-> processing-action :processing-action :name))))) + (add-documents-to-processing-action! + sender-id + request-id + case-number + (-> processing-action :processing-action :name) + [{:content (bytes->base64 attachment) + :type (-> processing-action :attachment :type) + :name (-> processing-action :attachment :filename)}])) + + (take-processing-action! sender-id request-id case-number (-> processing-action :processing-action :name)) + (mark-processing-action-as-ready! + sender-id + request-id + case-number + (-> processing-action :processing-action :name))))) (defn close-case! [sender-id request-id case-number description] (let [latest-prosessing-action (resolve-latest-case-processing-action-state sender-id request-id case-number)] @@ -271,7 +292,7 @@ {:identity {:case {:number case-number} :processing-action {:name-identity latest-prosessing-action}} :processing-action {:name "Asian sulkeminen" - :reception-date (java.time.Instant/now) + :reception-date (Instant/now) :description description}})) (proceed-operation! sender-id request-id case-number latest-prosessing-action "Sulje asia"))) diff --git a/etp-backend/src/main/clj/solita/etp/service/file.clj b/etp-backend/src/main/clj/solita/etp/service/file.clj index 816f0870c..1e2f33a66 100644 --- a/etp-backend/src/main/clj/solita/etp/service/file.clj +++ b/etp-backend/src/main/clj/solita/etp/service/file.clj @@ -1,9 +1,10 @@ (ns solita.etp.service.file (:require [clojure.java.io :as io] [solita.common.aws :as aws]) - (:import (java.io FileInputStream))) + (:import (clojure.lang ExceptionInfo) + (java.io File FileInputStream))) -(defn file->byte-array [file] +(defn file->byte-array [^File file] (-> file FileInputStream. .readAllBytes)) (defn upsert-file-from-bytes [aws-s3-client key bytes] @@ -23,7 +24,7 @@ (try (aws/get-object-head aws-s3-client key) true - (catch clojure.lang.ExceptionInfo e + (catch ExceptionInfo e (let [{:keys [type]} (ex-data e)] (if (= type :resource-not-found) false diff --git a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto.clj b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto.clj index 4201f2f0e..1a030919a 100644 --- a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto.clj +++ b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto.clj @@ -342,6 +342,12 @@ (defn find-toimenpide-yritys-document [db aws-s3-client valvonta-id toimenpide-id yritys-id] (store/find-document aws-s3-client valvonta-id toimenpide-id (find-yritys db yritys-id))) +(defn find-henkilo-hallinto-oikeus-attachment [db aws-s3-client valvonta-id toimenpide-id henkilo-id] + (store/find-hallinto-oikeus-attachment aws-s3-client valvonta-id toimenpide-id (find-henkilo db henkilo-id))) + +(defn find-yritys-hallinto-oikeus-attachment [db aws-s3-client valvonta-id toimenpide-id yritys-id] + (store/find-hallinto-oikeus-attachment aws-s3-client valvonta-id toimenpide-id (find-yritys db yritys-id))) + (defn find-notes [db id] (valvonta-kaytto-db/select-valvonta-notes db {:valvonta-id id})) 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 12b9cc8af..3d3af31b0 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 @@ -37,6 +37,14 @@ :filename "haastemies-tiedoksianto.pdf"}}] (get documents type-key))) +(defn toimenpide-type->attachment [type-id] + (let [type-key (toimenpide/type-key type-id) + attachments {:decision-order-actual-decision {:type "Kirje" + :filename "hallinto-oikeus.pdf"} + :penalty-decision-actual-decision {:type "Kirje" + :filename "hallinto-oikeus.pdf"}}] + (get attachments type-key))) + (defn find-kaytto-valvonta-documents [db valvonta-id] (->> (valvonta-kaytto-db/select-valvonta-documents db {:valvonta-id valvonta-id}) (map (fn [toimenpide] @@ -134,6 +142,7 @@ :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 "Käskypäätös" :reception-date (Instant/now) :contacting-direction "SENT" @@ -169,6 +178,7 @@ :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 "Sakkopäätös" :reception-date (Instant/now) :contacting-direction "SENT" @@ -214,12 +224,6 @@ (:ilmoitustunnus valvonta)]) :attach {:contact (map osapuoli->contact osapuolet)}})) -(defn add-hallinto-oikeus-attachment - "Adds hallinto-oikeus specific attachment to the end of the given pdf" - [db pdf hallinto-oikeus-id] - (pdf/merge-pdf [(io/input-stream pdf) - (hao-attachment/attachment-for-hallinto-oikeus-id db hallinto-oikeus-id)])) - (defn generate-pdf-document [db whoami valvonta toimenpide ilmoituspaikat osapuoli osapuolet roolit] (let [template-id (:template-id toimenpide) @@ -228,15 +232,9 @@ tiedoksi (if (template/send-tiedoksi? template) (filter osapuoli/tiedoksi? osapuolet) []) template-data (template-data db whoami valvonta toimenpide osapuoli documents ilmoituspaikat - tiedoksi roolit) - generated-pdf (pdf/generate-pdf->bytes {:template (:content template) - :data template-data})] - (if (toimenpide/kaskypaatos-varsinainen-paatos? toimenpide) - (add-hallinto-oikeus-attachment db generated-pdf (-> toimenpide - :type-specific-data - :osapuoli-specific-data - (type-specific-data/find-administrative-court-id-from-osapuoli-specific-data (:id osapuoli)))) - generated-pdf))) + tiedoksi roolit)] + (pdf/generate-pdf->bytes {:template (:content template) + :data template-data}))) (defn remove-osapuolet-with-no-document "If toimenpidetype of the toimenpide is such that the document might not be created for some, @@ -257,6 +255,15 @@ (filter #(contains? osapuolet-with-document (:id %)) osapuolet)) osapuolet)) +(defn store-hallinto-oikeus-attachment! [db aws-s3-client valvonta-id toimenpide osapuoli] + (let [hallinto-oikeus-id (-> toimenpide + :type-specific-data + :osapuoli-specific-data + (type-specific-data/find-administrative-court-id-from-osapuoli-specific-data (:id osapuoli))) + 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)) + (defn log-toimenpide! [db aws-s3-client whoami valvonta toimenpide osapuolet ilmoituspaikat roolit] (let [request-id (request-id (:id valvonta) (:id toimenpide)) sender-id (:email whoami) @@ -269,14 +276,21 @@ (map (fn [osapuoli] (let [document (generate-pdf-document db whoami valvonta toimenpide ilmoituspaikat osapuoli osapuolet roolit)] - (store/store-document aws-s3-client (:id valvonta) (:id toimenpide) osapuoli document) - document)))))] + (store/store-document! aws-s3-client (:id valvonta) (:id toimenpide) osapuoli document) + document))))) + attachments (when (toimenpide/has-hallinto-oikeus-liite? toimenpide) + (->> osapuolet + (filter osapuoli/omistaja?) + (remove-osapuolet-with-no-document toimenpide) + (mapv (fn [osapuoli] + (store-hallinto-oikeus-attachment! db aws-s3-client (:id valvonta) toimenpide osapuoli)))))] (asha/log-toimenpide! sender-id request-id case-number processing-action - documents))) + documents + attachments))) (defn close-case! [whoami valvonta-id toimenpide] (asha/close-case! diff --git a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/hallinto_oikeus_attachment.clj b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/hallinto_oikeus_attachment.clj index 4c2d320fc..8c9102b4a 100644 --- a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/hallinto_oikeus_attachment.clj +++ b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/hallinto_oikeus_attachment.clj @@ -11,5 +11,8 @@ (hallinto-oikeus-db/find-attachment-name-by-hallinto-oikeus-id db) first :attachment-name)] - (io/input-stream (io/resource (str attachment-directory-path attachment-name))) + (-> (str attachment-directory-path attachment-name) + io/resource + io/input-stream + .readAllBytes) (throw (Exception. (str "Attachment not found for hallinto-oikeus-id: " hallinto-oikeus-id))))) diff --git a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/store.clj b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/store.clj index e3b6e0169..52d724c68 100644 --- a/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/store.clj +++ b/etp-backend/src/main/clj/solita/etp/service/valvonta_kaytto/store.clj @@ -3,22 +3,39 @@ [solita.etp.service.valvonta-kaytto.osapuoli :as osapuoli] [clojure.java.io :as io])) -(def file-key-prefix "valvonta/kaytto") +(def document-file-key-prefix "valvonta/kaytto") +(def hallinto-oikeus-attachment-file-key-prefix "valvonta/kaytto/hallinto-oikeus-attachment") (defn- file-path [file-key-prefix valvonta-id toimenpide-id osapuoli] (cond (osapuoli/henkilo? osapuoli) (str file-key-prefix "/" valvonta-id "/" toimenpide-id "/henkilo/" (:id osapuoli)) (osapuoli/yritys? osapuoli) (str file-key-prefix "/" valvonta-id "/" toimenpide-id "/yritys/" (:id osapuoli)))) -(defn store-document [aws-s3-client valvonta-id toimenpide-id osapuoli document] +(defn store-document! + "Store the main document of the käytönvalvonta toimenpide to the object storage" + [aws-s3-client valvonta-id toimenpide-id osapuoli document] (file-service/upsert-file-from-bytes aws-s3-client - (file-path file-key-prefix valvonta-id toimenpide-id osapuoli) + (file-path document-file-key-prefix valvonta-id toimenpide-id osapuoli) document)) -(defn find-document [aws-s3-client valvonta-id toimenpide-id osapuoli] - (file-service/find-file aws-s3-client (file-path file-key-prefix valvonta-id toimenpide-id osapuoli))) +(defn find-document + "Retrieve the main document of the käytönvalvonta toimenpide from the object storage" + [aws-s3-client valvonta-id toimenpide-id osapuoli] + (file-service/find-file aws-s3-client (file-path document-file-key-prefix valvonta-id toimenpide-id osapuoli))) (defn info-letter [] (-> "pdf/Saate_rakennuksen_omistaja_su_ru.pdf" io/resource io/input-stream)) +(defn ^:dynamic store-hallinto-oikeus-attachment! + "Store the hallinto-oikeus attachment of the käytönvalvonta toimenpide to the object storage" + [aws-s3-client valvonta-id toimenpide-id osapuoli document] + (file-service/upsert-file-from-bytes + aws-s3-client + (file-path hallinto-oikeus-attachment-file-key-prefix valvonta-id toimenpide-id osapuoli) + document)) + +(defn find-hallinto-oikeus-attachment + "Retrieve the hallinto-oikeus attachment of the käytönvalvonta toimenpide from the object storage" + [aws-s3-client valvonta-id toimenpide-id osapuoli] + (file-service/find-file aws-s3-client (file-path hallinto-oikeus-attachment-file-key-prefix valvonta-id toimenpide-id osapuoli))) 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 c854ebe06..8ceb6b04b 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 @@ -73,6 +73,10 @@ :penalty-decision-notice-bailiff :penalty-decision-waiting-for-deadline})) +(def has-hallinto-oikeus-liite? + (partial some-type? #{:decision-order-actual-decision + :penalty-decision-actual-decision})) + (def asha-toimenpide? (partial some-type? #{:rfi-request :rfi-order diff --git a/etp-backend/src/test/clj/solita/etp/service/asha_test.clj b/etp-backend/src/test/clj/solita/etp/service/asha_test.clj index f5eb48372..59b965087 100644 --- a/etp-backend/src/test/clj/solita/etp/service/asha_test.clj +++ b/etp-backend/src/test/clj/solita/etp/service/asha_test.clj @@ -3,6 +3,7 @@ [clojure.string :as str] [clojure.test :as t] [solita.etp.service.asha :as asha-service] + [solita.etp.service.valvonta-kaytto.hallinto-oikeus-attachment :as hao] [solita.etp.test-system :as ts] [clostache.parser :refer [render-resource]]) (:import (java.nio.charset StandardCharsets) @@ -207,10 +208,10 @@ :request-received take-processing-action-called} (render-resource "asha/logtoimenpide/create-processing-action-operation-template.xml" - (merge render-context {:processing-action used-processing-action - :processing-action-operation-name processing-action-operation-name - :description description - :reception-date now})) + (merge render-context {:processing-action used-processing-action + :processing-action-operation-name processing-action-operation-name + :description description + :reception-date now})) {:response-status 200 :request-received create-processing-action-operation} @@ -232,7 +233,31 @@ (t/is (= 1 @take-processing-action-called)) (t/is (= 1 @create-processing-action-operation)) (t/is (= 1 @take-processing-action-for-operation)) - (t/is (= 1 @mark-processing-action-operation-ready))))) + (t/is (= 1 @mark-processing-action-operation-ready)))) + + (t/testing "Exception is thrown when log-toimenpide is called with attachments but the toimenpidetype doesn't have attachments defined" + (let [request-id "request-id" + case-number 100 + sender-id "solita" + original-processing-action "Käsittely" + processing-action-operation-name "Kehotus" + description "Kuvaus" + now (Instant/now)] + (t/is (thrown-with-msg? + Exception + #"Received attachment for processing action Kehotus but it has no attachments defined" + (asha-service/log-toimenpide! sender-id + request-id + case-number + {:identity {:case {:number case-number} + :processing-action {:name-identity original-processing-action}} + :processing-action {:name processing-action-operation-name + :reception-date now + :description description}} + ;; Using hallinto-oikeus attachment as a document and an attachment + ;; here to just have some file + [(hao/attachment-for-hallinto-oikeus-id ts/*db* 3)] + (hao/attachment-for-hallinto-oikeus-id ts/*db* 4))))))) (t/deftest move-processing-action-test (binding [asha-service/post! (handle-requests {})] ;; There should be no requests - fail all @@ -254,10 +279,10 @@ [asha-service/post! (handle-requests {(render-resource "asha/moveaction/move-template.xml" {:sender-id sender-id - :request-id request-id - :case-number case-number - :processing-action "Vireillepano" - :proceed-decision "Siirry käsittelyyn"}) + :request-id request-id + :case-number case-number + :processing-action "Vireillepano" + :proceed-decision "Siirry käsittelyyn"}) {:response-body "Irrelevant" :response-status 200 :request-received move-called}})] @@ -266,10 +291,10 @@ (t/testing "Move from Päätöksenteko to Käsittely" (let [move-called (atom 0)] (binding [asha-service/post! (handle-requests {(render-resource "asha/moveaction/move-template.xml" {:sender-id sender-id - :request-id request-id - :case-number case-number - :processing-action "Käsittely" - :proceed-decision "Siirry päätöksentekoon"}) + :request-id request-id + :case-number case-number + :processing-action "Käsittely" + :proceed-decision "Siirry päätöksentekoon"}) {:response-body "Irrelevant" :response-status 200 :request-received move-called}})] diff --git a/etp-backend/src/test/clj/solita/etp/service/file_test.clj b/etp-backend/src/test/clj/solita/etp/service/file_test.clj index 2326f5e86..b89f6887e 100644 --- a/etp-backend/src/test/clj/solita/etp/service/file_test.clj +++ b/etp-backend/src/test/clj/solita/etp/service/file_test.clj @@ -2,7 +2,9 @@ (:require [clojure.java.io :as io] [clojure.test :as t] [solita.etp.test-system :as ts] - [solita.etp.service.file :as service])) + [solita.etp.service.file :as service]) + (:import (clojure.lang ExceptionInfo) + (java.io InputStream))) (t/use-fixtures :each ts/fixture) @@ -36,10 +38,10 @@ (-> file-info-3 :path io/input-stream)) (doseq [file-info [file-info-1 file-info-2 file-info-3] :let [content (service/find-file ts/*aws-s3-client* (:id file-info))]] - (t/is (true? (instance? java.io.InputStream content))) + (t/is (true? (instance? InputStream content))) (t/is (= (into [] (:bytes file-info)) (into [] (.readAllBytes content))))) - (t/is (thrown-with-msg? clojure.lang.ExceptionInfo + (t/is (thrown-with-msg? ExceptionInfo #"The specified key does not exist." (service/find-file ts/*aws-s3-client* "nonexisting")))) @@ -52,6 +54,6 @@ id (-> file-info-2 :path io/input-stream)) (let [content (service/find-file ts/*aws-s3-client* id)] - (t/is (true? (instance? java.io.InputStream content))) + (t/is (true? (instance? InputStream content))) (t/is (= (into [] (:bytes file-info-2)) (into [] (.readAllBytes content))))))) diff --git a/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/hallinto_oikeus_attachment_test.clj b/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/hallinto_oikeus_attachment_test.clj new file mode 100644 index 000000000..2e927b086 --- /dev/null +++ b/etp-backend/src/test/clj/solita/etp/service/valvonta_kaytto/hallinto_oikeus_attachment_test.clj @@ -0,0 +1,12 @@ +(ns solita.etp.service.valvonta-kaytto.hallinto-oikeus-attachment-test + (:require [clojure.test :as t]) + (:require [solita.etp.service.valvonta-kaytto.hallinto-oikeus-attachment :refer [attachment-for-hallinto-oikeus-id]] + [solita.etp.test-system :as ts])) + +(t/use-fixtures :each ts/fixture) + +(t/deftest attachment-for-hallinto-oikeus-id-test + (t/testing "Unknown hallinto-oikeus-id results in exception" + (t/is (thrown-with-msg? Exception + #"Attachment not found for hallinto-oikeus-id: 666" + (attachment-for-hallinto-oikeus-id ts/*db* 666))))) 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 64b523529..9601c162a 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 @@ -1,5 +1,6 @@ (ns solita.etp.valvonta-kaytto.kaskypaatos-varsinainen-paatos-test (:require + [clojure.java.io :as io] [clojure.java.jdbc :as jdbc] [clojure.test :as t] [jsonista.core :as j] @@ -9,6 +10,7 @@ [solita.etp.schema.valvonta-kaytto :as valvonta-schema] [solita.etp.service.pdf :as pdf] [solita.etp.service.valvonta-kaytto :as valvonta-service] + [solita.etp.service.valvonta-kaytto.store :as file-store] [solita.etp.test-data.generators :as generators] [solita.etp.test-data.kayttaja :as test-kayttajat] [solita.etp.test-system :as ts]) @@ -16,6 +18,8 @@ (t/use-fixtures :each ts/fixture) +(def original-store-hallinto-oikeus-attachment file-store/store-hallinto-oikeus-attachment!) + (t/deftest kaskypaatos-varsinainen-paatos-test ;; Add the main user for the following tests (test-kayttajat/insert-virtu-paakayttaja! @@ -39,6 +43,7 @@ (.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* @@ -85,7 +90,11 @@ time/timezone) #'pdf/html->pdf (partial html->pdf-with-assertion "documents/kaskypaatos-varsinainen-paatos-yksityishenkilo.html" - html->pdf-called?)} + 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 @@ -107,7 +116,38 @@ (test-kayttajat/with-virtu-user) (mock/header "Accept" "application/json")))] (t/is (true? @html->pdf-called?)) - (t/is (= (:status response) 201)))))) + (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")))))) (t/testing "Käskypäätös / varsinainen päätös toimenpide is created successfully for yritys and document is generated with correct information" ;; Add the valvonta and previous toimenpides @@ -125,6 +165,7 @@ (.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-yritys! ts/*db* @@ -169,7 +210,11 @@ time/timezone) #'pdf/html->pdf (partial html->pdf-with-assertion "documents/kaskypaatos-varsinainen-paatos-yritys.html" - html->pdf-called?)} + 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 @@ -187,6 +232,7 @@ (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 "Toimenpide is returned through the api" @@ -234,8 +280,38 @@ :document true :recipient-answered false}] :department-head-title-sv "Kungen" - :fine 857,}, - :template-id 6})))))))) + :fine 857}, + :template-id 6})))) + + (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/yritykset/%s/document/kaskypaatos.pdf" valvonta-id 8 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/yritykset/%s/document/kaskypaatos.pdf" valvonta-id 8 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/yritykset/%s/attachment/hallinto-oikeus.pdf" valvonta-id 8 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_ITA-SUOMEN_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/yritykset/%s/attachment/hallinto-oikeus.pdf" valvonta-id 8 osapuoli-id)) + (mock/header "Accept" "application/pdf")))] + (t/is (= (:status response) 403)) + (t/is (= (:body response) "Forbidden")))))))) (t/testing "Käskypäätös / varsinainen päätös toimenpide is created successfully when there are multiple osapuolis but one lives abroad and will not receive the document because of being outside court jurisdiction" ;; Add the valvonta and previous toimenpides 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 05cd205a6..0dc339683 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 @@ -1,5 +1,6 @@ (ns solita.etp.valvonta-kaytto.sakkopaatos-varsinainen-paatos-test (:require + [clojure.java.io :as io] [clojure.java.jdbc :as jdbc] [clojure.test :as t] [jsonista.core :as j] @@ -8,12 +9,15 @@ [solita.etp.document-assertion :refer [html->pdf-with-assertion]] [solita.etp.service.pdf :as pdf] [solita.etp.service.valvonta-kaytto :as valvonta-service] + [solita.etp.service.valvonta-kaytto.store :as file-store] [solita.etp.test-data.kayttaja :as test-kayttajat] [solita.etp.test-system :as ts]) (:import (java.time Clock LocalDate ZoneId))) (t/use-fixtures :each ts/fixture) +(def original-store-hallinto-oikeus-attachment file-store/store-hallinto-oikeus-attachment!) + (t/deftest sakkopaatos-varsinainen-paatos-test ;; Add the main user for the following tests (test-kayttajat/insert-virtu-paakayttaja! @@ -43,6 +47,7 @@ (.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* @@ -123,7 +128,11 @@ time/timezone) #'pdf/html->pdf (partial html->pdf-with-assertion "documents/sakkopaatos-varsinainen-paatos-yksityishenkilo.html" - html->pdf-called?)} + 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 15 :deadline-date (str (LocalDate/of 2023 12 10)) :template-id 9 @@ -145,6 +154,7 @@ (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 "Toimenpide is returned through the api" @@ -199,7 +209,25 @@ :answer-commentary-fi "En tiennyt, että todistus tarvitaan :("}] :department-head-title-sv "Apulaisjohtaja på svenska" :fine 8572} - :template-id 9})))))))) + :template-id 9})))) + + (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 6 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 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 6 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_POHJOIS-SUOMEN_HAO.pdf"))) + (slurp (:body response))))))))))) (t/testing "Sakkopäätös / varsinainen päätös toimenpide is created successfully for yritys and document is generated with correct information" ;; Add the valvonta and previous toimenpides