浏览代码

Filter-Definition in dataclass

gc-server3 4 周之前
父节点
当前提交
8b6dca0dda
共有 3 个文件被更改,包括 94 次插入44 次删除
  1. 89 42
      app/routes.py
  2. 4 1
      templates/forderungen/liste_filter.html
  3. 1 1
      templates/forderungen/queries/forderungen_liste.sql

+ 89 - 42
app/routes.py

@@ -1,6 +1,6 @@
 import io
+from dataclasses import dataclass
 from datetime import datetime
-from operator import itemgetter
 from pathlib import Path
 from urllib.parse import unquote, urlencode
 
@@ -77,27 +77,91 @@ def single_quote(text: str):
     return "'" + unquote(text) + "'"
 
 
+@dataclass
+class FilterConfig:
+    name: str
+    text: str
+    filter_type: str
+    width: str
+    key_column: str
+    value_column: str
+    visible: bool = True
+    default_value: str = ""
+    options: list[dict[str, str]] | None = None
+    current_value: str | None = None
+
+
+forderung_filter_config = [
+    FilterConfig("Hauptbetrieb", "Hauptbetrieb", "select", "2", "Client_DB", "Hauptbetrieb_Name"),
+    FilterConfig("Standort", "Standort", "select", "3", "Standort_ID", "Standort_Name"),
+    FilterConfig("Bereich", "Bereich", "select", "3", "Bereich", "Bereich"),
+    FilterConfig("Verursacher", "Verursacher", "select", "4", "Verursacher", "Verursacher"),
+    FilterConfig("Rechnungsnummer", "Rechnungsnummer", "text", "3", "Document_No", "Document_No"),
+    FilterConfig(
+        "RechnungsdatumVon",
+        "Rechnungsdatum von",
+        "date",
+        "2",
+        "Invoice_Date",
+        "Invoice_Date",
+        default_value="2000-01-01T00:00:00",
+    ),
+    FilterConfig(
+        "RechnungsdatumBis",
+        "Rechnungsdatum bis",
+        "date",
+        "2",
+        "Invoice_Date",
+        "Invoice_Date",
+        default_value="2027-01-01T00:00:00",
+    ),
+    FilterConfig("Kunde", "Kunde", "select", "5", "Kunde", "Kunde"),
+    FilterConfig(
+        "WiedervorlageVon",
+        "Wiedervorlage von",
+        "date",
+        "2",
+        "Wiedervorlage",
+        "Wiedervorlage",
+        default_value="2000-01-01T00:00:00",
+    ),
+    FilterConfig(
+        "WiedervorlageBis",
+        "Wiedervorlage bis",
+        "date",
+        "2",
+        "Wiedervorlage",
+        "Wiedervorlage",
+        default_value="2027-01-01T00:00:00",
+    ),
+    FilterConfig("Fahrzeug", "Fahrzeug", "select", "4", "VIN", "VIN"),
+    FilterConfig("Staffel", "Staffel", "select", "2", "Staffel", "Staffel"),
+    FilterConfig("Mahnstufe", "Mahnstufe", "select", "2", "Mahnstufe", "Mahnstufe"),
+    FilterConfig("BenutzerSelect", "Benutzer", "hidden", "2", "", "", visible=False, default_value="winter"),
+]
+
+filter_type_option = {
+    "text": "text",
+    "select": "selectedOptionValue",
+    "date": "selectedDate",
+    "hidden": "selectedOptionValue",
+}
+
+
 @router.get("/app/forderungen/liste", response_class=HTMLResponse)
 def forderungen_liste(request: Request, db: Session = Depends(get_session), limit: int = 100, page: int = 0):
-    params = {k: v for k, v in request.query_params.items() if v != ""}
-    if len(params) < len(request.query_params):
-        return RedirectResponse(url="/app/forderungen/liste?" + urlencode(params))
-    context = {
-        "Hauptbetrieb": {"selectedOptionValue": single_quote(params.get("Hauptbetrieb", ""))},
-        "Standort": {"selectedOptionValue": single_quote(params.get("Standort", ""))},
-        "Bereich": {"selectedOptionValue": single_quote(params.get("Bereich", ""))},
-        "Verursacher": {"selectedOptionValue": single_quote(params.get("Verursacher", ""))},
-        "Rechnungsnummer": {"text": single_quote(params.get("Rechnungsnummer", ""))},
-        "RechnungsdatumVon": {"selectedDate": single_quote(params.get("RechnungsdatumVon", "2000-01-01T00:00:00"))},
-        "RechnungsdatumBis": {"selectedDate": single_quote(params.get("RechnungsdatumBis", "2027-01-01T00:00:00"))},
-        "Kunde": {"selectedOptionValue": single_quote(params.get("Kunde", ""))},
-        "WiedervorlageVon": {"selectedDate": single_quote(params.get("WiedervorlageVon", "2000-01-01T00:00:00"))},
-        "WiedervorlageBis": {"selectedDate": single_quote(params.get("WiedervorlageBis", "2027-01-01T00:00:00"))},
-        "Fahrzeug": {"selectedOptionValue": single_quote(params.get("Fahrzeug", ""))},
-        "Staffel": {"selectedOptionValue": single_quote(params.get("Staffel", ""))},
-        "Mahnstufe": {"selectedOptionValue": single_quote(params.get("Mahnstufe", ""))},
-        "BenutzerSelect": {"selectedOptionValue": "winter"},
+    params = {
+        f.name: request.query_params[f.name]
+        for f in forderung_filter_config
+        if request.query_params.get(f.name, "") != ""
     }
+    if page == 0 and len(params) < len(request.query_params):
+        return RedirectResponse(url="/app/forderungen/liste?" + urlencode(params))
+
+    context = {}
+    for f in forderung_filter_config:
+        context[f.name] = {filter_type_option[f.filter_type]: single_quote(params.get(f.name, f.default_value))}
+
     query = templates.TemplateResponse(request, "forderungen/queries/forderungen_liste.sql", context).body.decode(
         "utf-8"
     )
@@ -106,27 +170,11 @@ def forderungen_liste(request: Request, db: Session = Depends(get_session), limi
     q = db.execute(text(query)).fetchall()
     col_names = list(q[0]._asdict().keys())
 
-    config = {
-        # "RechnungsdatumVon": (),
-        # "RechnungsdatumBis": {"selectedDate": "'2027-01-01T00:00:00'"},
-        "Hauptbetrieb": ("Client_DB", "Hauptbetrieb_Name"),
-        "Standort": ("Standort_ID", "Standort_Name"),
-        # "Rechnungsnummer": {"text": "''"},
-        "Kunde": ("Kunde", "Kunde"),
-        "Bereich": ("Bereich", "Bereich"),
-        "Verursacher": ("Verursacher", "Verursacher"),
-        "Fahrzeug": ("VIN", "VIN"),
-        "Staffel": ("Staffel", "Staffel"),
-        "Mahnstufe": ("Mahnstufe", "Mahnstufe"),
-        # "WiedervorlageVon": {"selectedDate": "'2000-01-01T00:00:00'"},
-        # "WiedervorlageBis": {"selectedDate": "'2027-01-01T00:00:00'"},
-        # "BenutzerSelect": {"selectedOptionValue": "winter"},
-    }
-
     filters = {}
-
-    for filter_name, (key, value) in config.items():
-        filters[filter_name] = {row[col_names.index(key)]: row[col_names.index(value)] for row in q}
+    for f in forderung_filter_config:
+        if f.key_column == "":
+            continue
+        filters[f.name] = {row[col_names.index(f.key_column)]: row[col_names.index(f.value_column)] for row in q}
 
     summary = {
         "offen": sum([r[col_names.index("offen")] for r in q]),
@@ -136,9 +184,8 @@ def forderungen_liste(request: Request, db: Session = Depends(get_session), limi
     q_limit = q[page * limit : (page + 1) * limit]
 
     defaults = {}
-    for filter_name in config.keys():
-        defaults[filter_name] = unquote(request.query_params.get(filter_name, ""))
-    # print(filters["Standort"])
+    for f in forderung_filter_config:
+        defaults[f.name] = unquote(request.query_params.get(f.name, f.default_value))
 
     if len(q_limit) == 0:
         return None

+ 4 - 1
templates/forderungen/liste_filter.html

@@ -5,6 +5,9 @@
       hx-push-url="true" 
       hx-swap="innerHTML" 
       hx-target="body">
+
+  
+    
   <div class="col-md-2">
     <label for="Hauptbetrieb" class="form-label">Hauptbetrieb</label>
     <select id="Hauptbetrieb" name="Hauptbetrieb" class="form-select">
@@ -61,7 +64,7 @@
 
   <div class="col-md-3">
     <label for="Rechnungsnummer" class="form-label">Rechnungsnummer</label>
-    <input type="email" class="form-control" id="Rechnungsnummer" name="Rechnungsnummer">
+    <input type="text" class="form-control" id="Rechnungsnummer" name="Rechnungsnummer" value="{{ defaults.Rechnungsnummer }}">
   </div>
   <div class="col-md-2">
     <label for="RechnungsdatumVon" class="form-label">Rechnungsdatum von</label>

+ 1 - 1
templates/forderungen/queries/forderungen_liste.sql

@@ -32,7 +32,7 @@ SELECT [T1].[Client_DB]
      , iif([T1].[Kunde] like 'k%', 'kunde@xyz.de', '') as Kunde_Email
 
 FROM [dbo].[Forderungen] T1
-INNER JOIN [dbo].[Benutzer_Rechte] T2 ON (T2.Benutzer_ID = '{{ BenutzerSelect.selectedOptionValue }}' OR T2.Benutzer_ID = '')
+INNER JOIN [dbo].[Benutzer_Rechte] T2 ON (T2.Benutzer_ID = {{ BenutzerSelect.selectedOptionValue }} OR T2.Benutzer_ID = '')
 AND T1.Hauptbetrieb_ID = T2.Hauptbetrieb_ID AND T1.Standort_ID = T2.Standort_ID AND (T2.Rolle = 'Buchhaltung' OR T2.Benutzer_ID = T1.Verursacher_Benutzer_ID)
 LEFT JOIN [dbo].[Forderungen_Kommentar_letzte] T3 ON T1.Client_DB = T3.Client_DB AND T1.Document_No = T3.Document_No
 WHERE 1 = 1