|
@@ -1,6 +1,6 @@
|
|
|
import io
|
|
import io
|
|
|
|
|
+from dataclasses import dataclass
|
|
|
from datetime import datetime
|
|
from datetime import datetime
|
|
|
-from operator import itemgetter
|
|
|
|
|
from pathlib import Path
|
|
from pathlib import Path
|
|
|
from urllib.parse import unquote, urlencode
|
|
from urllib.parse import unquote, urlencode
|
|
|
|
|
|
|
@@ -77,27 +77,91 @@ def single_quote(text: str):
|
|
|
return "'" + unquote(text) + "'"
|
|
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)
|
|
@router.get("/app/forderungen/liste", response_class=HTMLResponse)
|
|
|
def forderungen_liste(request: Request, db: Session = Depends(get_session), limit: int = 100, page: int = 0):
|
|
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(
|
|
query = templates.TemplateResponse(request, "forderungen/queries/forderungen_liste.sql", context).body.decode(
|
|
|
"utf-8"
|
|
"utf-8"
|
|
|
)
|
|
)
|
|
@@ -106,27 +170,11 @@ def forderungen_liste(request: Request, db: Session = Depends(get_session), limi
|
|
|
q = db.execute(text(query)).fetchall()
|
|
q = db.execute(text(query)).fetchall()
|
|
|
col_names = list(q[0]._asdict().keys())
|
|
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 = {}
|
|
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 = {
|
|
summary = {
|
|
|
"offen": sum([r[col_names.index("offen")] for r in q]),
|
|
"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]
|
|
q_limit = q[page * limit : (page + 1) * limit]
|
|
|
|
|
|
|
|
defaults = {}
|
|
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:
|
|
if len(q_limit) == 0:
|
|
|
return None
|
|
return None
|