#15: issue experts workflow now very slick
This commit is contained in:
parent
2d4f7a897d
commit
adcdacc6c1
10 changed files with 172 additions and 59 deletions
|
|
@ -3,6 +3,7 @@
|
|||
(:require [adl-support.core :as support]
|
||||
[adl-support.utils :refer [safe-name]]
|
||||
[clojure.java.io :as io]
|
||||
[clojure.java.jdbc :as jdbc]
|
||||
[clojure.string :as s]
|
||||
[clojure.tools.logging :as log]
|
||||
[clojure.walk :refer [keywordize-keys]]
|
||||
|
|
@ -11,6 +12,7 @@
|
|||
[noir.util.route :as route]
|
||||
[ring.util.http-response :as response]
|
||||
[youyesyet.config :refer [env]]
|
||||
[youyesyet.db.core :refer [*db*]]
|
||||
[youyesyet.db.core :as db]
|
||||
[youyesyet.layout :as layout]
|
||||
[youyesyet.oauth :as oauth]
|
||||
|
|
@ -51,72 +53,122 @@
|
|||
(let [user (:user (:session request))]
|
||||
{:title "Open requests"
|
||||
:user user
|
||||
:records (db/list-open-requests db/*db* {:expert (:id user)})})))
|
||||
:records (db/list-open-requests *db* {:expert (:id user)})})))
|
||||
|
||||
|
||||
(defn get-and-lock-followuprequest!
|
||||
"Return the `followuprequest` record indicated by this `id`, provided that
|
||||
it is unlocked. As a side effect, lock it to this `user`."
|
||||
[id user]
|
||||
(support/do-or-log-error
|
||||
(jdbc/with-db-transaction [*db* *db*]
|
||||
(let [record (db/get-followuprequest *db* {:id id})]
|
||||
(if-not
|
||||
(:locked record)
|
||||
(do
|
||||
(db/update-followuprequest!
|
||||
*db*
|
||||
(assoc
|
||||
record
|
||||
:locked_by (:id user)
|
||||
:locked (jt/to-sql-timestamp (jt/local-date-time))))
|
||||
record))))
|
||||
:error-return nil))
|
||||
|
||||
|
||||
(defn release-followuprequest!
|
||||
"Release the lock held on the `followuprequest` record indicated by this
|
||||
`id` held by this `user`, if present."
|
||||
[id user]
|
||||
(log/debug "release-followuprequest! Attempting to unlock followuprequest " id)
|
||||
(support/do-or-log-error
|
||||
(jdbc/with-db-transaction [*db* *db*]
|
||||
(let [record (db/get-followuprequest *db* {:id id})]
|
||||
(if
|
||||
(= (:locked_by record) (:id user))
|
||||
(do
|
||||
(db/update-followuprequest!
|
||||
*db*
|
||||
(assoc
|
||||
record
|
||||
:locked_by nil
|
||||
:locked nil))
|
||||
true))))
|
||||
:error-return nil))
|
||||
|
||||
|
||||
(defn get-followup-request-page [request]
|
||||
(let
|
||||
[params (support/massage-params request)
|
||||
[user (:user (:session request))
|
||||
params (support/massage-params request)
|
||||
id (:id params)
|
||||
record (db/get-followuprequest db/*db* {:id id})
|
||||
record (get-and-lock-followuprequest! id user)
|
||||
elector (if
|
||||
record
|
||||
(first
|
||||
(db/search-strings-electors
|
||||
db/*db* {:id (:elector_id record)})))
|
||||
*db* {:id (:elector_id record)})))
|
||||
visit (if
|
||||
record
|
||||
(first
|
||||
(db/search-strings-visits
|
||||
db/*db* {:id (:visit_id record)})))]
|
||||
(layout/render
|
||||
"issue-expert/request.html"
|
||||
{:actions (map
|
||||
;; HTML-ise the notes in each action record
|
||||
#(merge % {:notes (md-to-html-string (:notes %))})
|
||||
(db/list-followupactions-by-followuprequest
|
||||
db/*db* {:id id}))
|
||||
:elector elector
|
||||
:issue (let
|
||||
[raw-issue (if
|
||||
record
|
||||
(db/get-issue db/*db* {:id (:issue_id record)}))]
|
||||
(if raw-issue
|
||||
(merge
|
||||
raw-issue
|
||||
{:brief (md-to-html-string (:brief raw-issue))})))
|
||||
:options (db/list-options db/*db* params)
|
||||
:record record
|
||||
:title (str "Request from " (:name elector) " at " (:date visit))
|
||||
:user (:user (:session request))
|
||||
:visit visit})))
|
||||
*db* {:id (:visit_id record)})))
|
||||
actions (db/list-followupactions-by-followuprequest
|
||||
*db* {:id id})]
|
||||
(if record
|
||||
(layout/render
|
||||
"issue-expert/request.html"
|
||||
{:actions (map
|
||||
;; HTML-ise the notes in each action record
|
||||
#(merge % {:notes (md-to-html-string (:notes %))})
|
||||
actions)
|
||||
:elector elector
|
||||
:issue (let
|
||||
[raw-issue (if
|
||||
record
|
||||
(db/get-issue *db* {:id (:issue_id record)}))]
|
||||
(if raw-issue
|
||||
(merge
|
||||
raw-issue
|
||||
{:brief (md-to-html-string (:brief raw-issue))})))
|
||||
:options (db/list-options *db* params)
|
||||
:record record
|
||||
:title (str "Request from " (:name elector) " at " (:date visit))
|
||||
:user (:user (:session request))
|
||||
:visit visit
|
||||
:closed (some :closed actions)})
|
||||
(list-page (assoc request :error "That request is locked")))))
|
||||
|
||||
|
||||
(defn post-followup-action
|
||||
"From this `request`, create a `followupaction` record, and, if an
|
||||
`option_id` is present in the params, an `intention` record; show
|
||||
the request list on success, to the request form on failure."
|
||||
the request list on success, the request form on failure."
|
||||
[request]
|
||||
(support/do-or-log-error
|
||||
(let
|
||||
[params (support/massage-params request)
|
||||
locality (:locality (db/get-locality-for-visit db/*db* {:id (:visit_id params)}))]
|
||||
[user (:user (:session request))
|
||||
params (support/massage-params request)
|
||||
locality (:locality (db/get-locality-for-visit *db* {:id (:visit_id params)}))]
|
||||
(log/debug "post-followup-request-page with request " request)
|
||||
(db/create-followupaction!
|
||||
db/*db*
|
||||
(assoc
|
||||
params
|
||||
:actor (:id (:user (:session request)))
|
||||
:date (jt/to-sql-timestamp (jt/local-date-time))
|
||||
:closed (= (:closed params) "on")))
|
||||
(support/do-or-log-error
|
||||
(jdbc/with-db-transaction [*db* *db*]
|
||||
(db/create-followupaction!
|
||||
*db*
|
||||
(assoc
|
||||
params
|
||||
:actor (:id user)
|
||||
:date (jt/to-sql-timestamp (jt/local-date-time))
|
||||
:closed (= (:closed params) "on")))
|
||||
(release-followuprequest! (:id params) user)))
|
||||
(if-not
|
||||
(zero? (count (:option_id params)))
|
||||
(if
|
||||
(zero? (count (:signature (db/get-elector db/*db* {:id (:elector_id params)}))))
|
||||
(zero? (count (:signature (db/get-elector *db* {:id (:elector_id params)}))))
|
||||
;; the elector has NOT recorded GDPR consent: explicitly bind elector_id to nil
|
||||
(db/create-intention! db/*db* (assoc params :locality locality :elector_id nil))
|
||||
(db/create-intention! *db* (assoc params :locality locality :elector_id nil))
|
||||
;; else the elector HAS recorded GDPR consent
|
||||
(db/create-intention! db/*db* (assoc params :locality locality))))
|
||||
(db/create-intention! *db* (assoc params :locality locality))))
|
||||
(list-page request))
|
||||
:error-return
|
||||
(get-followup-request-page request)))
|
||||
|
|
|
|||
|
|
@ -157,7 +157,7 @@
|
|||
without having recorded the visit, so let's not muck about."
|
||||
[request]
|
||||
(let [params (merge
|
||||
{:actions nil, :issue_detail ""}
|
||||
{:actions nil, :issue_detail nil :locked_by nil :locked nil}
|
||||
(assoc
|
||||
(massage-params request)
|
||||
:visit_id (current-visit-id request)))]
|
||||
|
|
|
|||
|
|
@ -344,7 +344,8 @@
|
|||
{:address_id (-> db :address :id)
|
||||
:elector_id (-> db :elector :id)
|
||||
:issue_id (name (-> db :issue))
|
||||
:method_id "Phone"
|
||||
:issue_detail (-> db :issue-detail)
|
||||
:method_id (-> db :followupmethod)
|
||||
:method_detail (-> db :method_detail)
|
||||
:action :create-request})
|
||||
:send-request))
|
||||
|
|
@ -468,6 +469,12 @@
|
|||
(js/console.log (str "Setting issue to " issue))
|
||||
(assoc (clear-messages db) :issue (keyword issue))))
|
||||
|
||||
(reg-event-db
|
||||
:set-issue-detail
|
||||
(fn [db [_ issue-detail]]
|
||||
(js/console.log (str "Setting issue-detail to " issue-detail))
|
||||
(assoc (clear-messages db) :issue-detail issue-detail)))
|
||||
|
||||
|
||||
(reg-event-db
|
||||
:set-latitude
|
||||
|
|
|
|||
|
|
@ -44,6 +44,9 @@
|
|||
dwelling @(subscribe [:dwelling])
|
||||
method @(subscribe [:followupmethod])]
|
||||
(js/console.log (str "followup/panel; Issue is " issue "; elector is " elector "; method is " method " (" (type method) ")"))
|
||||
(dispatch [:set-followupmethod "Phone"])
|
||||
(dispatch [:set-method-detail nil])
|
||||
(dispatch [:set-issue-detail nil])
|
||||
(cond
|
||||
(nil? dwelling)
|
||||
(ui/error-panel "No dwelling selected")
|
||||
|
|
@ -72,7 +75,8 @@
|
|||
(if (= issue :Other)
|
||||
[:p.widget
|
||||
[:label {:for "issue_detail"} "Issue detail"]
|
||||
[:input {:type "text" :id "issue_detail" :name "issue_detail"}]])
|
||||
[:input {:type "text" :id "issue_detail" :name "issue_detail"
|
||||
:on-change #(dispatch [:set-issue-detail (.-value (.-target %))])}]])
|
||||
[:p.widget
|
||||
[:label {:for "method"} "Method"]
|
||||
[:select {:id "method" :name "method" :defaultValue "Phone"
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue