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:
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user