Skip to content

Commit

Permalink
Redo OTM modeling (#5)
Browse files Browse the repository at this point in the history
* Use flat model of internal consignment/trip etc.

* Force OTM spec in store

* Use master data to enhance OTM object output

* Split location into location-eori and location-name

* Feedback @joodie
  • Loading branch information
Remco van 't Veer authored Jun 26, 2024
1 parent 22e4a7e commit 8b6cec5
Show file tree
Hide file tree
Showing 15 changed files with 528 additions and 897 deletions.
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]
(-> 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 master-data-wrapper [req]
(app (assoc req
:master-data
{:carriers carriers
:warehouses warehouses
:warehouse-addresses (constantly warehouse-address)
:eori->name eori->name})))))
Loading

0 comments on commit 8b6cec5

Please sign in to comment.