Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Redo OTM modeling #5

Merged
merged 5 commits into from
Jun 26, 2024
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 6 additions & 7 deletions src/dil_demo/erp.clj
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,17 @@
[dil-demo.ishare.client :as ishare-client]
[dil-demo.ishare.policies :as policies]
[dil-demo.store :as store]
[dil-demo.otm :as otm]
[clojure.tools.logging :as log]
[dil-demo.web-utils :as web-utils]))

(defn- map->delegation-evidence
[client-id effect {:keys [ref load-date] :as m}]
{:pre [client-id effect ref load-date]}
[client-id effect {:keys [ref load] :as obj}]
{:pre [client-id effect ref load]}
(policies/->delegation-evidence
{:issuer client-id
:subject (policies/outsource-pickup-access-subject m)
:subject (policies/outsource-pickup-access-subject obj)
:target (policies/->delegation-target ref)
:date load-date
:date (:date load)
:effect effect}))

(defn- ->ishare-ar-policy-request [{:ishare/keys [client-id]
Expand Down Expand Up @@ -59,7 +58,7 @@

[result log]
;; kinda hackish way to delete a policy from a iSHARE AR
(ishare-ar-create-policy! client-data "Deny" (otm/consignment->map old-consignment))]
(ishare-ar-create-policy! client-data "Deny" old-consignment)]
(cond-> (update-in res [:flash :explanation] (fnil conj [])
["Verwijderen policy" {:ishare-log log}])
(not result) (assoc-in [:flash :error] "Verwijderen AR policy mislukt")))
Expand All @@ -77,7 +76,7 @@
(first))]
(if trip
(let [[result log]
(ishare-ar-create-policy! client-data "Permit" (otm/trip->map trip))]
(ishare-ar-create-policy! client-data "Permit" trip)]
(cond-> (update-in res [:flash :explanation] (fnil conj [])
["Toevoegen policy" {:ishare-log log}])
(not result) (assoc-in [:flash :error] "Aanmaken AR policy mislukt")))
Expand Down
157 changes: 76 additions & 81 deletions src/dil_demo/erp/web.clj
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
(:import (java.time LocalDateTime)
(java.util Date UUID)))

(defn list-consignments [consignments {:keys [carriers warehouses]}]
(defn list-consignments [consignments {:keys [eori->name]}]
[:main
[:section.actions
[:a.button.primary {:href "consignment-new"} "Nieuwe order aanmaken"]]
Expand All @@ -25,16 +25,15 @@
[:article.empty
[:p "Nog geen klantorders geregistreerd.."]])

(for [{:keys [id ref load-date load-location unload-location goods carrier-eori status]}
(map otm/consignment->map consignments)]
(for [{:keys [id ref goods load unload carrier status]} consignments]
[:article
[:header
[:div.status (otm/status-titles status)]
[:div.ref-date ref " / " load-date]
[:div.from-to (warehouses load-location) " → " unload-location]]
[:div.ref-date ref " / " (:date load)]
[:div.from-to (-> load :location-eori eori->name) " → " (:location-name unload)]]

[:div.goods goods]
[:div.carrier (carriers carrier-eori)]
[:div.carrier (-> carrier :eori eori->name)]

[:footer.actions
(when (= otm/status-draft status)
Expand All @@ -48,8 +47,7 @@
(w/delete-button (str "consignment-" id))]])])

(defn edit-consignment [consignment {:keys [carriers warehouses]}]
(let [{:keys [status ref load-date load-location load-remarks unload-location unload-date unload-remarks goods carrier-eori]}
(otm/consignment->map consignment)
(let [{:keys [status ref load unload goods carrier]} consignment

;; add empty option
carriers (into {nil nil} carriers)]
Expand All @@ -64,28 +62,28 @@
:label "Klantorder nr.", :type "number",
:required true})]
[:section
(w/field {:name "load-date", :type "date",
:label "Ophaaldatum", :value load-date})
(w/field {:name "load-location", :value load-location, ;; EORIs?!
:label "Ophaaladres", :type "select",
:list warehouses, :required true})
(w/field {:name "load-remarks", :value load-remarks,
:label "Opmerkingen", :type "textarea"})]
(w/field {:name "load[date]", :type "date",
:label "Ophaaldatum", :value (:date load)})
(w/field {:name "load[location-eori]", :value (:location-eori load), ;; EORIs?!
:label "Ophaaladres", :type "select",
:list warehouses, :required true})
(w/field {:name "load[remarks]", :value (:remarks load),
:label "Opmerkingen", :type "textarea"})]
[:section
(w/field {:name "unload-date", :value unload-date,
(w/field {:name "unload[date]", :value (:date unload),
:label "Afleverdatum", :type "date"})
(w/field {:name "unload-location", :value unload-location,
(w/field {:name "unload[location-name]", :value (:location-name unload),
:label "Afleveradres", :type "text",
:list (keys d/locations), :required true})
(w/field {:name "unload-remarks", :value unload-remarks,
:label "Opmerkingen", :type "textarea"})]
(w/field {:name "unload[remarks]", :value (:remarks unload),
:label "Opmerkingen", :type "textarea"})]
[:section
(w/field {:name "goods", :value goods,
:label "Goederen", :type "text",
:list d/goods, :required true})
(w/field {:name "carrier-eori", :value carrier-eori,
:label "Vervoerder", :type "select",
:list carriers, :required true})]
(w/field {:name "carrier[eori]", :value (:eori carrier),
:label "Vervoerder", :type "select",
:list carriers, :required true})]
[:section.actions
[:button {:type "submit"} "Opslaan"]
[:a.button {:href "."} "Annuleren"]]]))
Expand All @@ -97,9 +95,8 @@
[:a.button {:href "."} "Terug naar overzicht"]]]
(w/explanation explanation)])

(defn publish-consignment [consignment {:keys [carriers warehouses warehouse-addresses]}]
(let [{:keys [status ref load-date load-location load-remarks unload-date unload-location unload-remarks goods carrier-eori]}
(otm/consignment->map consignment)]
(defn publish-consignment [consignment {:keys [eori->name warehouse-addresses]}]
(let [{:keys [status ref load unload goods carrier]} consignment]
[:form {:method "POST"}
(w/anti-forgery-input)

Expand All @@ -114,28 +111,28 @@
[:dd ref]]
[:div
[:dt "Ophaaldatum"]
[:dd load-date]]
[:dd (:date load)]]
[:div
[:dt "Afleverdatum"]
[:dd unload-date]]
[:dd (:date unload)]]
[:div
[:dt "Vervoerder"]
[:dd (carriers carrier-eori)]]]]
[:dd (-> carrier :eori eori->name)]]]]
[:section.trip
[:fieldset.load-location
[:legend "Ophaaladres"]
[:h3 (warehouses load-location)]
(when-let [address (warehouse-addresses load-location)]
[:h3 (-> load :location-eori eori->name)]
(when-let [address (-> load :location-eori warehouse-addresses)]
[:pre address])
(when-not (string/blank? load-remarks)
[:blockquote.remarks load-remarks])]
(when-not (string/blank? (:remarks load))
[:blockquote.remarks (:remarks load)])]
[:fieldset.unload-location
[:legend "Afleveradres"]
[:h3 unload-location]
(when-let [address (d/locations unload-location)]
[:h3 (:location-name unload)]
(when-let [address (-> unload :location-name d/locations)]
[:pre address])
(when-not (string/blank? unload-remarks)
[:blockquote.remarks unload-remarks])]]
(when-not (string/blank? (:remarks unload))
[:blockquote.remarks (:remarks unload)])]]
[:section.goods
[:fieldset
[:legend "Goederen"]
Expand All @@ -147,19 +144,18 @@
[:a.button {:href "."} "Annuleren"]]]))

(defn published-consignment [consignment
{:keys [carriers warehouses]}
{:keys [eori->name]}
{:keys [explanation]}]
(let [{:keys [load-location carrier-eori]} (otm/consignment->map consignment)]
[:div
[:section
[:p "Transportopdracht verstuurd naar locatie "
[:q (warehouses load-location)]
" en vervoerder "
[:q (carriers carrier-eori)]
"."]
[:div.actions
[:a.button {:href "."} "Terug naar overzicht"]]]
(w/explanation explanation)]))
[:div
[:section
[:p "Transportopdracht verstuurd naar locatie "
[:q (-> consignment :load :location-eori eori->name)]
" en vervoerder "
[:q (-> consignment :carrier :eori eori->name)]
"."]
[:div.actions
[:a.button {:href "."} "Terug naar overzicht"]]]
(w/explanation explanation)])



Expand All @@ -181,25 +177,25 @@
(defn next-consignment-ref [store user-number]
(let [refs (->> store
(get-consignments)
(map otm/consignment-ref)
(map :ref)
(map parse-long))]
(str (inc (apply max (min-ref user-number) refs)))))



(defn make-handler [{:keys [eori id site-name]}]
{:pre [(keyword? id) site-name]}
(let [slug (name id)
render (fn render [title main flash & {:keys [slug-postfix]}]
(w/render-body (str slug slug-postfix)
main
:flash flash
:title title
:site-name site-name))
params->consignment (fn params->consignment [params]
(-> params
(assoc :owner-eori eori)
(otm/map->consignment)))]
(let [slug (name id)
render (fn render [title main flash & {:keys [slug-postfix]}]
(w/render-body (str slug slug-postfix)
main
:flash flash
:title title
:site-name site-name))
params-> (fn params-> [params]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Kan je ergens afdwingen dat deze altijd aangeroepen wordt? Kan dit als middleware?
Als deze select-keys een goed idee is, moet dit dan niet ook bij tms.web en wms.web?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In de andere namespaces worden nooit de params zomaar als object geaccepteerd vandaar dat het in die andere namespaces niet nodig is. Voor middleware vind ik het veel te speciek en kan het in de weg zitten als er andere schermen bij komen die geen crud operaties doen maar ander soortige formulieren hebben.

(-> params
(select-keys [:id :status :ref :load :unload :goods :carrier])
(assoc-in [:owner :eori] eori)))]
(routes
(GET "/" {:keys [flash master-data ::store/store]}
(render "Orders"
Expand All @@ -209,43 +205,42 @@
(GET "/consignment-new" {:keys [flash master-data ::store/store user-number]}
(render "Order aanmaken"
(edit-consignment
(otm/map->consignment {:ref (next-consignment-ref store user-number)
:load-date (w/format-date (Date.))
:unload-date (w/format-date (Date.))
:status otm/status-draft})
{:ref (next-consignment-ref store user-number)
:load {:date (w/format-date (Date.))}
:unload {:date (w/format-date (Date.))}
:status otm/status-draft}
master-data)
flash))

(POST "/consignment-new" {:keys [params]}
(let [consignment (-> params
(assoc :id (str (UUID/randomUUID))
:status otm/status-draft)
(params->consignment))]
(params->)
(assoc :id (str (UUID/randomUUID))))]
(-> "."
(redirect :see-other)
(assoc :flash {:success (str "Order " (otm/consignment-ref consignment) " aangemaakt")})
(assoc :flash {:success (str "Order " (:ref consignment) " aangemaakt")})
(assoc ::store/commands [[:put! :consignments consignment]]))))

(GET "/consignment-:id" {:keys [flash master-data ::store/store]
{:keys [id]} :params}
(when-let [consignment (get-consignment store id)]
(render (str "Order " (otm/consignment-ref consignment) " aanpassen")
(render (str "Order " (:ref consignment) " aanpassen")
(edit-consignment consignment master-data)
flash)))

(POST "/consignment-:id" {:keys [params]}
(let [consignment (params->consignment params)]
(let [consignment (params-> params)]
(-> "."
(redirect :see-other)
(assoc :flash {:success (str "Order " (otm/consignment-ref consignment) " aangepast")})
(assoc :flash {:success (str "Order " (:ref consignment) " aangepast")})
(assoc ::store/commands [[:put! :consignments consignment]]))))

(DELETE "/consignment-:id" {:keys [::store/store]
{:keys [id]} :params}
(when-let [consignment (get-consignment store id)]
(-> "deleted"
(redirect :see-other)
(assoc :flash {:success (str "Order " (otm/consignment-ref consignment) " verwijderd")})
(assoc :flash {:success (str "Order " (:ref consignment) " verwijderd")})
(assoc ::store/commands [[:delete! :consignments id]]))))

(GET "/deleted" {:keys [flash]}
Expand All @@ -256,38 +251,38 @@
(GET "/publish-:id" {:keys [flash master-data ::store/store]
{:keys [id]} :params}
(when-let [consignment (get-consignment store id)]
(render (str "Order " (otm/consignment-ref consignment) " naar locatie en vervoerder sturen")
(render (str "Order " (:ref consignment) " naar locatie en vervoerder sturen")
(publish-consignment consignment master-data)
flash)))

(POST "/publish-:id" {:keys [::store/store]
(POST "/publish-:id" {:keys [master-data ::store/store]
{:keys [id]} :params}
(when-let [consignment (get-consignment store id)]
(let [consignment (otm/consignment-status! consignment otm/status-requested)
(let [consignment (assoc consignment :status otm/status-requested)
transport-order (otm/consignment->transport-order consignment)
trip (otm/consignment->trip consignment)]
(-> (str "published-" id)
(redirect :see-other)
(assoc :flash {:success (str "Order " (otm/consignment-ref consignment) " verstuurd")
(assoc :flash {:success (str "Order " (:ref consignment) " verstuurd")
:explanation [["Stuur OTM Transportopdracht naar WMS van DC"
{:otm-object transport-order}]
{:otm-object (otm/->transport-order transport-order master-data)}]
["Stuur OTM Trip naar TMS van Vervoerder"
{:otm-object trip}]]})
{:otm-object (otm/->trip trip master-data)}]]})
(assoc ::store/commands [[:put! :consignments consignment]
[:publish! ;; to warehouse WMS
:transport-orders
(otm/consignment-warehouse-eori consignment)
(-> consignment :load :location-eori)
transport-order]
[:publish! ;; to carrier TMS
:trips
(otm/consignment-carrier-eori consignment)
(-> consignment :carrier :eori)
trip]])))))

(GET "/published-:id" {:keys [flash master-data ::store/store]
{:keys [id]} :params}
(when-let [consignment (get-consignment store id)]
(render (str "Order "
(otm/consignment-ref consignment)
(:ref consignment)
" verstuurd")
(published-consignment consignment master-data flash)
flash))))))
14 changes: 8 additions & 6 deletions src/dil_demo/ishare/policies.clj
Original file line number Diff line number Diff line change
Expand Up @@ -163,13 +163,15 @@
(defn outsource-pickup-access-subject
"Returns an \"accessSubject\" to denote a pickup is outsourced to some
party."
[{:keys [carrier-eori ref]}]
{:pre [carrier-eori ref]}
(str carrier-eori "#ref=" ref))
[{:keys [ref carrier carriers]}]
(let [carrier-eori (or (:eori carrier) (-> carriers last :eori))]
(assert (and ref carrier-eori))
(str carrier-eori "#ref=" ref)))

(defn pickup-access-subject
"Returns an \"accessSubject\" to denote a pickup will be done by a
driver / vehicle."
[{:keys [carrier-eori driver-id-digits license-plate]}]
{:pre [driver-id-digits license-plate]}
(str carrier-eori "#driver-id-digits=" driver-id-digits "&license-plate=" license-plate))
[{:keys [carrier carriers driver-id-digits license-plate]}]
(let [carrier-eori (or (:eori carrier) (-> carriers last :eori))]
(assert (and carrier-eori driver-id-digits license-plate))
(str carrier-eori "#driver-id-digits=" driver-id-digits "&license-plate=" license-plate)))
21 changes: 21 additions & 0 deletions src/dil_demo/master_data.clj
Original file line number Diff line number Diff line change
Expand Up @@ -38,3 +38,24 @@

(def warehouse-address
"Kerkstraat 1\n1234 AZ Nergenshuizen\nNederland")

(defn wrap [app config]
(let [eori->name (->> (concat owners carriers warehouses)
(map #(vector (get-in config [% :eori])
(get-in config [% :site-name])))
(into {}))
carriers (->> carriers
(map #(vector (get-in config [% :eori])
(get-in config [% :site-name])))
(into {}))
warehouses (->> warehouses
(map #(vector (get-in config [% :eori])
(get-in config [% :site-name])))
(into {}))]
(fn carriers-wrapper [req]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

master-data-wrapper

(app (assoc req
:master-data
{:carriers carriers
:warehouses warehouses
:warehouse-addresses (constantly warehouse-address)
:eori->name eori->name})))))
Loading