Report_AgendaPozadavky: fix deduplication, UTF-8 output, export path

- Fix deduplication: deduplicate only by Request_ID (not Patient+Title combo)
- Reservations without Request_ID are kept as-is
- Add UTF-8 stdout fix for Windows console (emoji support)
- Change export dir to u:\Dropbox\!!!Days\Downloads Z230
- Rename response variable r → response to avoid collision with loop variable

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-13 13:17:26 +02:00
parent fe698a4232
commit f2b3ebe0b4
@@ -9,6 +9,15 @@ Full Medevio Report:
- Vaccine sheets (from merged data) - Vaccine sheets (from merged data)
""" """
import sys
try:
sys.stdout.reconfigure(encoding="utf-8")
sys.stderr.reconfigure(encoding="utf-8")
except AttributeError:
import io
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
sys.stderr = io.TextIOWrapper(sys.stderr.buffer, encoding="utf-8")
import re import re
import json import json
import pymysql import pymysql
@@ -38,7 +47,7 @@ DB_CONFIG = {
"cursorclass": pymysql.cursors.DictCursor, "cursorclass": pymysql.cursors.DictCursor,
} }
EXPORT_DIR = Path(r"u:\Dropbox\Ordinace\Reporty") EXPORT_DIR = Path(r"u:\Dropbox\!!!Days\Downloads Z230")
EXPORT_DIR.mkdir(exist_ok=True, parents=True) EXPORT_DIR.mkdir(exist_ok=True, parents=True)
# Delete previous reports # Delete previous reports
@@ -143,9 +152,9 @@ payload = {
}""", }""",
} }
r = requests.post(GRAPHQL_URL, headers=headers, data=json.dumps(payload)) response = requests.post(GRAPHQL_URL, headers=headers, data=json.dumps(payload))
r.raise_for_status() response.raise_for_status()
resp = r.json() resp = response.json()
if "errors" in resp or "data" not in resp: if "errors" in resp or "data" not in resp:
print("❌ API response:") print("❌ API response:")
print(json.dumps(resp, indent=2, ensure_ascii=False)) print(json.dumps(resp, indent=2, ensure_ascii=False))
@@ -245,12 +254,15 @@ df_agenda["Source"] = "Agenda"
df_open["Source"] = "Open" df_open["Source"] = "Open"
df_merged = pd.concat([df_agenda, df_open], ignore_index=True).fillna("") df_merged = pd.concat([df_agenda, df_open], ignore_index=True).fillna("")
# "Agenda" < "Open" alphabetically → Agenda rows come first after sort
df_merged = df_merged.sort_values(["Source"], ascending=[True]) df_merged = df_merged.sort_values(["Source"], ascending=[True])
# drop duplicates — prefer Agenda if same Request_ID or same (Patient+Title) # Deduplicate by Request_ID only where non-empty (Agenda preferred over Open)
df_merged = df_merged.drop_duplicates( # Rows without Request_ID (pure reservations) are always kept as-is
subset=["Request_ID", "Patient", "Title"], keep="first" mask_has_id = df_merged["Request_ID"] != ""
) df_with_id = df_merged[mask_has_id].drop_duplicates(subset=["Request_ID"], keep="first")
df_no_id = df_merged[~mask_has_id]
df_merged = pd.concat([df_with_id, df_no_id], ignore_index=True)
df_merged = df_merged.drop(columns=["Source"], errors="ignore") df_merged = df_merged.drop(columns=["Source"], errors="ignore")
df_merged = df_merged.sort_values(["Date", "Time"], na_position="last").reset_index( df_merged = df_merged.sort_values(["Date", "Time"], na_position="last").reset_index(