|
|
@@ -2,6 +2,7 @@ import io
|
|
|
import re
|
|
|
from datetime import datetime, timedelta
|
|
|
from pathlib import Path
|
|
|
+from typing import Annotated
|
|
|
from urllib.parse import unquote, urlencode
|
|
|
|
|
|
import pandas as pd
|
|
|
@@ -17,13 +18,13 @@ from fastapi.responses import (
|
|
|
from sqlalchemy import text
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
|
|
+from app.file_storage import get_file, get_files
|
|
|
from app.query_filter import filter_type_option, import_filter_config
|
|
|
|
|
|
from .db import get_session
|
|
|
from .jinja_templates import templates
|
|
|
from .ldap import ldap_authenticate
|
|
|
-from .models import Bemerkung, Forderung
|
|
|
-from .schemas import BemerkungIn
|
|
|
+from .models import Forderung
|
|
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@@ -54,17 +55,11 @@ def login_post(username: str = Form(...), password: str = Form(...)):
|
|
|
return response
|
|
|
|
|
|
|
|
|
-@router.get("/forderungen", response_class=HTMLResponse)
|
|
|
-def forderungsliste(request: Request, db: Session = Depends(get_session), limit: int = 100):
|
|
|
- q = db.query(Forderung).order_by(Forderung.faelligkeit.asc()).limit(limit).all()
|
|
|
- return templates.TemplateResponse(request, "base/list.html", {"request": request, "forderungen": q})
|
|
|
-
|
|
|
-
|
|
|
def single_quote(text: str):
|
|
|
return "'" + unquote(text) + "'"
|
|
|
|
|
|
|
|
|
-forderung_filter_config = import_filter_config()
|
|
|
+forderung_filter_config = import_filter_config("forderungen\\liste\\config\\liste_filter.csv")
|
|
|
|
|
|
|
|
|
@router.get("/app/forderungen/liste", response_class=HTMLResponse)
|
|
|
@@ -100,7 +95,15 @@ def forderungen_liste(request: Request, db: Session = Depends(get_session), limi
|
|
|
for f in forderung_filter_config:
|
|
|
if f.key_column not in col_names:
|
|
|
continue
|
|
|
- filters[f.name] = {row[col_names.index(f.key_column)]: row[col_names.index(f.value_column)] for row in q}
|
|
|
+ filter_temp = [
|
|
|
+ (
|
|
|
+ row[col_names.index(f.sort_column)],
|
|
|
+ row[col_names.index(f.key_column)],
|
|
|
+ row[col_names.index(f.value_column)],
|
|
|
+ )
|
|
|
+ for row in q
|
|
|
+ ]
|
|
|
+ filters[f.name] = {item[1]: item[2] for item in sorted(list(set(filter_temp)))}
|
|
|
f.options = filters[f.name]
|
|
|
|
|
|
summary = {
|
|
|
@@ -137,16 +140,16 @@ def forderungen_liste(request: Request, db: Session = Depends(get_session), limi
|
|
|
)
|
|
|
|
|
|
|
|
|
-@router.get("/app/forderungen/details/{client_db}_{document_no}", response_class=HTMLResponse)
|
|
|
-def forderungen_details(
|
|
|
- request: Request, client_db: str, document_no: str, db: Session = Depends(get_session), limit: int = 100
|
|
|
-):
|
|
|
+@router.get("/app/forderungen/details/{primary_key}", response_class=HTMLResponse)
|
|
|
+def forderungen_details(request: Request, primary_key: str, db: Session = Depends(get_session), limit: int = 100):
|
|
|
+
|
|
|
+ pkey = convert_primary_key("forderungen", primary_key)
|
|
|
context = {
|
|
|
"appsmith": {
|
|
|
"URL": {
|
|
|
"queryParams": {
|
|
|
- "Client_DB": "'" + client_db + "'",
|
|
|
- "Document_No": "'" + document_no + "'",
|
|
|
+ "Client_DB": "'" + pkey["Client_DB"] + "'",
|
|
|
+ "Document_No": "'" + pkey["Beleg_Nr"] + "'",
|
|
|
}
|
|
|
}
|
|
|
},
|
|
|
@@ -174,39 +177,52 @@ def forderungen_details(
|
|
|
"betrag": "120,00",
|
|
|
"faelligkeit": "23.12.1983",
|
|
|
}
|
|
|
- fileserver = "C:\\Projekte\\Reisacher-Fileserver"
|
|
|
- files = [f.relative_to(fileserver) for f in Path(f"{fileserver}\\{client_db}\\{document_no}").glob("*")]
|
|
|
- template_context["files"] = files
|
|
|
- template_context["add7days"] = datetime.now() + timedelta(days=7)
|
|
|
+ template_context["files"] = get_files(pkey)
|
|
|
+ template_context["add7days"] = (datetime.now() + timedelta(days=7)).strftime("%Y-%m-%d")
|
|
|
|
|
|
return templates.TemplateResponse(request, "forderungen/details/details.html", template_context)
|
|
|
|
|
|
|
|
|
-@router.post("/app/forderungen/details/{client_db}_{document_no}", response_class=HTMLResponse)
|
|
|
+@router.post("/app/forderungen/details/{primary_key}", response_class=HTMLResponse)
|
|
|
async def post_forderungen_details(
|
|
|
- request: Request, client_db: str, document_no: str, db: Session = Depends(get_session)
|
|
|
+ request: Request,
|
|
|
+ primary_key: str,
|
|
|
+ source: Annotated[str, Form()],
|
|
|
+ db: Session = Depends(get_session),
|
|
|
):
|
|
|
- data = {
|
|
|
- "Client_DB": client_db,
|
|
|
- "Beleg_Nr": document_no,
|
|
|
- "Bearbeitet": "J",
|
|
|
- "Versicherung": "N",
|
|
|
- "Rechtsanwalt": "N",
|
|
|
- "Reklamation": "N",
|
|
|
- "Mahnen_aussetzen": "N",
|
|
|
- "Selbstbeteiligung": "",
|
|
|
- "Selbstbeteiligung_Betrag": "0.0",
|
|
|
- "Mwst": "",
|
|
|
- "Mwst_Betrag": "0.0",
|
|
|
- "Wiedervorlage": "",
|
|
|
- "Vers_Adresse_ID": "",
|
|
|
- "Versicherung_Typ": "",
|
|
|
- "Reklamation_Begruendung": "",
|
|
|
- "Rechtsanwalt_Begruendung": "",
|
|
|
- "Rechtsanwalt_Aktenzeichen": "",
|
|
|
- "Rechtsanwalt_Stand": "",
|
|
|
- "Mahnen_Begruendung": "",
|
|
|
- }
|
|
|
+ pkey = convert_primary_key("forderungen", primary_key)
|
|
|
+
|
|
|
+ if source == "comments":
|
|
|
+ data = {
|
|
|
+ "Client_DB": "",
|
|
|
+ "Beleg_Nr": "",
|
|
|
+ "Timestamp": datetime.now().strftime("%Y-%m-%dT%H:%M:%S"),
|
|
|
+ "Benutzer_ID": "winter",
|
|
|
+ "Kommentar": "",
|
|
|
+ }
|
|
|
+ else:
|
|
|
+ data = {
|
|
|
+ "Client_DB": "",
|
|
|
+ "Beleg_Nr": "",
|
|
|
+ "Bearbeitet": "J",
|
|
|
+ "Versicherung": "N",
|
|
|
+ "Rechtsanwalt": "N",
|
|
|
+ "Reklamation": "N",
|
|
|
+ "Mahnen_aussetzen": "N",
|
|
|
+ "Selbstbeteiligung": "",
|
|
|
+ "Selbstbeteiligung_Betrag": "0.0",
|
|
|
+ "Mwst": "",
|
|
|
+ "Mwst_Betrag": "0.0",
|
|
|
+ "Wiedervorlage": "",
|
|
|
+ "Vers_Adresse_ID": "",
|
|
|
+ "Versicherung_Typ": "",
|
|
|
+ "Reklamation_Begruendung": "",
|
|
|
+ "Rechtsanwalt_Begruendung": "",
|
|
|
+ "Rechtsanwalt_Aktenzeichen": "",
|
|
|
+ "Rechtsanwalt_Stand": "",
|
|
|
+ "Mahnen_Begruendung": "",
|
|
|
+ }
|
|
|
+ data.update(pkey)
|
|
|
|
|
|
async with request.form() as form:
|
|
|
for k, v in form.items():
|
|
|
@@ -216,8 +232,9 @@ async def post_forderungen_details(
|
|
|
if re.match(r"\d+,?\d*", v):
|
|
|
v = v.replace(",", ".")
|
|
|
data[k] = v
|
|
|
+
|
|
|
query = templates.TemplateResponse(
|
|
|
- request, "forderungen/details/queries/post/update_details.sql", context={"data": data}
|
|
|
+ request, f"forderungen/details/queries/post/post_{source}.sql", context={"data": data}
|
|
|
).body.decode("utf-8")
|
|
|
print(query)
|
|
|
for subquery in query.split(";"):
|
|
|
@@ -226,18 +243,19 @@ async def post_forderungen_details(
|
|
|
db.commit()
|
|
|
|
|
|
|
|
|
+def convert_primary_key(area: str, primary_key: str) -> dict[str, str]:
|
|
|
+ if area == "forderungen":
|
|
|
+ pkey = ["Client_DB", "Beleg_Nr"]
|
|
|
+ pkey_values = primary_key.split("_")
|
|
|
+ return dict(zip(pkey, pkey_values))
|
|
|
+
|
|
|
+
|
|
|
@router.get("/app/forderungen/dashboard", response_class=HTMLResponse)
|
|
|
def forderungen_dashboard(request: Request, db: Session = Depends(get_session)):
|
|
|
context = {"summary": False}
|
|
|
return templates.TemplateResponse(request, "forderungen/dashboard/dashboard.html", context)
|
|
|
|
|
|
|
|
|
-@router.get("/chat", response_class=HTMLResponse)
|
|
|
-def chat(request: Request):
|
|
|
- # q = db.query(Forderung).order_by(Forderung.faelligkeit.asc()).limit(limit).all()
|
|
|
- return templates.TemplateResponse(request, "base/chat.html")
|
|
|
-
|
|
|
-
|
|
|
@router.get("/export/csv")
|
|
|
def export_csv(db: Session = Depends(get_session)):
|
|
|
q = db.query(Forderung).all()
|
|
|
@@ -289,25 +307,6 @@ def export_xlsx(db: Session = Depends(get_session)):
|
|
|
)
|
|
|
|
|
|
|
|
|
-@router.get("/detail/{id}", response_class=HTMLResponse)
|
|
|
-def detail(request: Request, id: int, db: Session = Depends(get_session)):
|
|
|
- f = db.query(Forderung).filter(Forderung.id == id).first()
|
|
|
- if not f:
|
|
|
- raise HTTPException(status_code=404)
|
|
|
- return templates.TemplateResponse(request, "base/detail.html", {"request": request, "forderung": f})
|
|
|
-
|
|
|
-
|
|
|
-@router.post("/detail/{id}/bemerkung")
|
|
|
-def save_bemerkung(id: int, data: BemerkungIn, request: Request, db: Session = Depends(get_session)):
|
|
|
- user = request.cookies.get("user") or "anonymous"
|
|
|
- b = Bemerkung(
|
|
|
- forderung_id=id, benutzer=user, bemerkung=data.bemerkung, wiedervorlage_datum=data.wiedervorlage_datum
|
|
|
- )
|
|
|
- db.add(b)
|
|
|
- db.commit()
|
|
|
- return RedirectResponse(url=f"/detail/{id}", status_code=302)
|
|
|
-
|
|
|
-
|
|
|
@router.get("/detail/{id}/export/docx")
|
|
|
def export_docx(id: int, db: Session = Depends(get_session)):
|
|
|
f = db.query(Forderung).filter(Forderung.id == id).first()
|
|
|
@@ -370,8 +369,6 @@ def export_docx2(request: Request, client_db: str, document_no: str, db: Session
|
|
|
|
|
|
|
|
|
@router.get("/files/")
|
|
|
-def get_files(request: Request):
|
|
|
- name = request.query_params.get("name")
|
|
|
- filename = Path(f"C:\\Projekte\\Reisacher-Fileserver\\{unquote(name)}")
|
|
|
-
|
|
|
+def get_files2(request: Request):
|
|
|
+ filename = get_file(request.query_params.get("name"))
|
|
|
return FileResponse(filename, media_type="application/octet-stream", filename=filename.name)
|