aboutsummaryrefslogtreecommitdiff
path: root/src/cashflow/frontend/transactions/recurring.clj
diff options
context:
space:
mode:
authorTim <contact@bytim.eu>2026-02-22 15:25:50 +0100
committerTim <contact@bytim.eu>2026-02-22 15:25:50 +0100
commitf279e20468fb5323c33cbf43346c35ddef7f96e0 (patch)
treec488ee2791296917367f704524fa8e41a0b518ea /src/cashflow/frontend/transactions/recurring.clj
Initial commit
Diffstat (limited to 'src/cashflow/frontend/transactions/recurring.clj')
-rw-r--r--src/cashflow/frontend/transactions/recurring.clj90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/cashflow/frontend/transactions/recurring.clj b/src/cashflow/frontend/transactions/recurring.clj
new file mode 100644
index 0000000..2d85bf8
--- /dev/null
+++ b/src/cashflow/frontend/transactions/recurring.clj
@@ -0,0 +1,90 @@
+(ns cashflow.frontend.transactions.recurring
+ (:require [cashflow.frontend.utils :as cfutils]
+ [cashflow.database :as cdatabase]
+ [ring.util.response :as ruresp]
+ [clojure.string :as cstr]
+ [cashflow.frontend.navigation :as cfnavigation])
+ (:import java.time.LocalDate))
+
+(defn- gen-table []
+ [:div {:class ["scroll" "surface"] :id "transaction-table" :style {:height "30em"}}
+ [:table {:class ["stripes" "border" "large-space"]}
+ [:thead {:class "fixed"}
+ [:tr
+ [:th "Beschreibung"]
+ [:th "von"]
+ [:th "bis"]
+ [:th "Betrag"]
+ [:th "Interval"]
+ [:th]]]
+ [:tbody
+ (for [transaction (cdatabase/list-recurring-transactions)]
+ [:tr
+ [:td (:description transaction)]
+ [:td (cstr/join "." (-> transaction :from (cstr/split #"-") reverse))]
+ [:td (cstr/join "." (-> transaction :to (cstr/split #"-") reverse))]
+ [:td (cfutils/render-amount (:amount transaction))]
+ [:td (:month-interval transaction) " Monate"]
+ [:td [:button {:class ["transparent" "circle"]
+ :hx-delete (str "/transactions/recurring/" (:db/id transaction) "/")
+ :hx-target "#transaction-table"
+ :hx-swap "outerHTML"}
+ [:i "delete"]]]])]]])
+
+(defn- gen [_req]
+ (list [:h1 "cashflow - Umsätze"]
+ (cfnavigation/gen :recurring)
+ (gen-table)
+ [:article {:style {:width :fit-content :margin "3em auto"}}
+ [:form {:class "add-transaction" :hx-post "/transactions/recurring/" :hx-target "#transaction-table" :hx-swap "outerHTML"}
+ [:div {:class ["field" "label" "round" "border"] :style {:width :fit-content}}
+ [:input {:type :text :placeholder " " :name "description"}]
+ [:label "Beschreibung"]]
+ [:div {:class ["field" "label" "round" "border"] :style {:width :fit-content}}
+ [:input {:type :date :placeholder " " :name "from"}]
+ [:label "von"]]
+ [:div {:class ["field" "label" "round" "border"] :style {:width :fit-content}}
+ [:input {:type :date :placeholder " " :name "to"}]
+ [:label "bis"]]
+ [:div {:class ["field" "label" "round" "border"] :style {:width :fit-content}}
+ [:input {:type :number :placeholder " " :step "0.01" :name "amount"}]
+ [:label "Betrag"]]
+ [:div {:class ["field" "label" "round" "border"] :style {:width :fit-content}}
+ [:input {:type :number :placeholder " " :name "month-interval"}]
+ [:label "Interval (monate)"]]
+ [:button {:class ["small-round" "fill"] :style {:margin-top "1em"} :type :submit} "Hinzufügen"]]]))
+
+(defn handle-get [req]
+ (->> req
+ gen
+ (cfutils/render-page "cashflow - wiederkehrende Umsätze")
+ ruresp/response))
+
+(defn- table-response []
+ (-> (gen-table)
+ cfutils/render-component
+ ruresp/response))
+
+(defn handle-post [req]
+ (let [params (:form-params req)
+ description (get params "description")
+ from (get params "from")
+ to (get params "to")
+ amount (-> params (get "amount") Double/parseDouble)
+ month-interval (-> params (get "month-interval") Integer/parseInt bigint)]
+ (cdatabase/create-transaction! {:type :recurring
+ :description description
+ :amount amount
+ :from from
+ :to to
+ :month-interval month-interval})
+ (table-response)))
+
+(defn handle-delete [req]
+ (let [id (-> req
+ (get-in [:path-params :id])
+ Integer/parseInt)
+ transaction (cdatabase/id->transaction id)]
+ (cdatabase/delete-transaction! id)
+ (table-response)))
+