notebookVB

This commit is contained in:
2026-01-09 07:19:54 +01:00
parent bef50acc9b
commit 8b565f0303
6 changed files with 184 additions and 38 deletions

View File

@@ -8,7 +8,7 @@ from vzpb2b_client import VZPB2BClient
client = VZPB2BClient(
env="production",
pfx_path="mbcert.pfx",
pfx_path="../10 Tests/MBcert.pfx",
pfx_password="Vlado7309208104++",
icz="00000000",
dic="00000000"

View File

@@ -1,5 +1,10 @@
import pymysql
from knihovny.medicus_db import MedicusDB
from jinja2 import Environment, FileSystemLoader
from weasyprint import HTML
from pathlib import Path
from datetime import datetime
import os
# ==========================================
# CONFIGURATION
@@ -17,6 +22,20 @@ MYSQL_CONFIG = {
"autocommit": True
}
# ==========================================
# PATHS
# ==========================================
script_location = Path(__file__).resolve().parent
project_root = script_location.parent
template_dir = project_root / "Templates"
output_dir = script_location / "Output"
output_dir.mkdir(exist_ok=True)
# Font paths
font_regular = (template_dir / "fonts" / "DejaVuSans.ttf").as_uri()
font_bold = (template_dir / "fonts" / "DejaVuSans-Bold.ttf").as_uri()
font_italic = (template_dir / "fonts" / "DejaVuSans-Oblique.ttf").as_uri()
# ==========================================
# INIT CONNECTIONS
# ==========================================
@@ -30,38 +49,27 @@ mysql = pymysql.connect(
)
# ==========================================
# FETCH REGISTERED PATIENTS (MEDICUS)
# FETCH REGISTERED PATIENTS
# ==========================================
print("Fetching registered patients from Medicus...")
patients = medicus.get_active_registered_patients(as_dict=True)
patients_by_rc = {
p["rodcis"]: p
for p in patients
}
patients_by_rc = {p["rodcis"]: p for p in patients}
print(f"Loaded {len(patients_by_rc)} registered patients")
# ==========================================
# FETCH LAST INSURANCE STATES (MYSQL)
# FETCH LAST INSURANCE STATES
# ==========================================
print("Fetching last insurance states from MySQL...")
sql_last_states = """
SELECT
rc,
stav
SELECT rc, stav
FROM (
SELECT
rc,
stav,
ROW_NUMBER() OVER (
PARTITION BY rc
ORDER BY k_datu DESC
) AS rn
SELECT rc, stav,
ROW_NUMBER() OVER (PARTITION BY rc ORDER BY k_datu DESC) AS rn
FROM vzp_stav_pojisteni
) t
WHERE t.rn = 1
WHERE rn = 1
"""
with mysql.cursor() as cur:
@@ -71,7 +79,7 @@ with mysql.cursor() as cur:
print(f"Loaded {len(last_states)} last insurance states")
# ==========================================
# COMPARE & FIND NON-OK STATES
# COMPARE
# ==========================================
suspected = []
@@ -89,26 +97,42 @@ for row in last_states:
"stav": stav
})
# ==========================================
# OUTPUT
# ==========================================
print("\n==========================================")
print("PACIENTI S NEOK STAVEM POJIŠTĚNÍ")
print("==========================================")
if not suspected:
print("✔️ Všichni registrovaní pacienti mají stav 1")
else:
for s in suspected:
print(
f'{s["rc"]} | {s["prijmeni"]} {s["jmeno"]} '
f'| pojišťovna={s["poj"]} | stav={s["stav"]}'
)
print("\nCelkem nalezeno:", len(suspected))
print(f"Nalezeno {len(suspected)} problémových záznamů")
# ==========================================
# CLEANUP
# CLEANUP DB
# ==========================================
medicus.close()
mysql.close()
# ==========================================
# PDF GENERATION (WEASYPRINT)
# ==========================================
env = Environment(
loader=FileSystemLoader(str(template_dir)),
autoescape=True
)
template = env.get_template("vzp_console_report.html")
html_content = template.render(
patients=suspected,
generated_at=datetime.now().strftime("%d. %m. %Y %H:%M"),
font_regular=font_regular,
font_bold=font_bold,
font_italic=font_italic
)
timestamp = datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
pdf_file = output_dir / f"kontrola_pojisteni_{timestamp}.pdf"
print("Generuji PDF přes WeasyPrint...")
HTML(string=html_content, base_url=str(template_dir)).write_pdf(pdf_file)
print("\n✅ PDF REPORT VYTVOŘEN:")
print(pdf_file.resolve())
try:
os.startfile(pdf_file)
except Exception:
pass

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,122 @@
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="UTF-8">
<title>Kontrola stavu pojištění</title>
<style>
@font-face {
font-family: 'DejaVu';
src: url('{{ font_regular }}');
font-weight: normal;
font-style: normal;
}
@font-face {
font-family: 'DejaVu';
src: url('{{ font_bold }}');
font-weight: bold;
font-style: normal;
}
@font-face {
font-family: 'DejaVu';
src: url('{{ font_italic }}');
font-weight: normal;
font-style: italic;
}
@page {
size: A4;
margin: 1.5cm;
@bottom-right {
content: "Strana " counter(page) " z " counter(pages);
font-size: 9pt;
}
}
body {
font-family: 'DejaVu', sans-serif;
font-size: 10pt;
color: #333;
}
h1 {
font-size: 16pt;
border-bottom: 2px solid #2c3e50;
padding-bottom: 5px;
}
.meta {
font-size: 9pt;
margin-bottom: 15px;
color: #666;
}
table {
width: 100%;
border-collapse: collapse;
}
th, td {
border: 1px solid #ccc;
padding: 6px 8px;
}
th {
background-color: #f2f2f2;
}
tr {
page-break-inside: avoid;
}
tr:nth-child(even) {
background-color: #f9f9f9;
}
.status-bad {
color: #d9534f;
font-weight: bold;
}
</style>
</head>
<body>
<h1>Kontrola stavu pojištění (VZP)</h1>
<div class="meta">
Vygenerováno: {{ generated_at }}
</div>
{% if patients %}
<table>
<thead>
<tr>
<th>Rodné číslo</th>
<th>Příjmení a jméno</th>
<th>Pojišťovna</th>
<th>Stav</th>
</tr>
</thead>
<tbody>
{% for p in patients %}
<tr>
<td>{{ p.rc }}</td>
<td><strong>{{ p.prijmeni }}</strong> {{ p.jmeno }}</td>
<td>{{ p.poj }}</td>
<td class="status-bad">{{ p.stav }}</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<p style="color: green; font-weight: bold;">
&#10004; Vše v pořádku žádné neshody nenalezeny.
</p>
{% endif %}
</body>
</html>