ソースを参照

Kommentare speichern

Co-authored-by: Copilot <copilot@github.com>
gc-server3 1 週間 前
コミット
91eb5dc6f1

+ 22 - 0
app/file_storage.py

@@ -0,0 +1,22 @@
+import os
+from pathlib import Path
+from urllib.parse import unquote
+
+from dotenv import load_dotenv
+
+load_dotenv()
+
+
+def get_files(primary_key: dict[str, str]):
+    fileserver = os.environ.get("LOCAL_STORAGE")
+    files = [
+        f.relative_to(fileserver)
+        for f in Path(f"{fileserver}\\{primary_key['Client_DB']}\\{primary_key['Beleg_Nr']}").glob("*")
+    ]
+    return files
+
+
+def get_file(name: str):
+    fileserver = os.environ.get("LOCAL_STORAGE")
+    filename = Path(f"{fileserver}\\{unquote(name)}")
+    return filename

+ 70 - 73
app/routes.py

@@ -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)

+ 11 - 9
templates/base/chat_container.html

@@ -415,15 +415,17 @@
     </div>
     <div class="input-area">
         <div class="toolbar">
-            
-            <button class="btn btn-primary">
-                <i class="icon icon-lg cil-paperclip"></i>
-            </button>
-            <input type="text" class="message-input" id="comment" name="comment" placeholder="Kommentieren ..." autofocus="autofocus"></textarea>
-            <button class="btn btn-primary">
-                <i class="icon icon-lg cil-chevron-right"></i>
-            </button>
-
+            <form>
+                <button class="btn btn-primary">
+                    <i class="icon icon-lg cil-paperclip"></i>
+                </button>
+                <input type="hidden" name="source" value="comments" />
+                <input type="text" class="message-input" id="comment" name="Kommentar" placeholder="Kommentieren ..."
+                    autofocus="autofocus" />
+                <button class="btn btn-primary" hx-post="" hx-trigger="click" hx-swap="none" hx-push-url="false">
+                    <i class="icon icon-lg cil-chevron-right"></i>
+                </button>
+            </form>
 
 
 

+ 0 - 2
templates/forderungen/details/queries/post/insert_kommentar.sql

@@ -1,2 +0,0 @@
-INSERT INTO [dbo].[Forderungen_Kommentar] ([Client_DB], [Beleg_Nr], [Timestamp], [Benutzer_ID], [Kommentar])
-VALUES ('{{data.Client_DB}}', '{{data.Beleg_Nr}}', getdate(), '{{data.Benutzer_ID}}', '{{data.Kommentar}}')

+ 2 - 0
templates/forderungen/details/queries/post/post_comments.sql

@@ -0,0 +1,2 @@
+INSERT INTO [dbo].[Forderungen_Kommentar] ([Client_DB], [Beleg_Nr], [Timestamp], [Benutzer_ID], [Kommentar])
+VALUES ('{{data.Client_DB}}', '{{data.Beleg_Nr}}', '{{data.Timestamp}}', '{{data.Benutzer_ID}}', '{{data.Kommentar}}')

+ 0 - 0
templates/forderungen/details/queries/post/update_details.sql → templates/forderungen/details/queries/post/post_details.sql