diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..276a476
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+Medicus
\ No newline at end of file
diff --git a/.idea/Medicus1.iml b/.idea/Medicus1.iml
new file mode 100644
index 0000000..d72f122
--- /dev/null
+++ b/.idea/Medicus1.iml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/2025-06-17 Files and Folders.py b/2025-06-17 Files and Folders.py
new file mode 100644
index 0000000..783bce1
--- /dev/null
+++ b/2025-06-17 Files and Folders.py
@@ -0,0 +1,168 @@
+import os
+import mysql.connector
+from mysql.connector import Error
+from datetime import datetime
+
+
+class FileSystemToMySQL:
+ def __init__(self, host, port,user, password, database):
+ self.host = host
+ self.port=port
+ self.user = user
+ self.password = password
+ self.database = database
+ self.connection = None
+
+ def connect(self):
+ try:
+ self.connection = mysql.connector.connect(
+ host=self.host,
+ port=self.port,
+ user=self.user,
+ password=self.password,
+ database=self.database
+ )
+ if self.connection.is_connected():
+ print("Connected to MySQL database")
+ self._initialize_database()
+ except Error as e:
+ print(f"Error connecting to MySQL: {e}")
+
+ def _initialize_database(self):
+ cursor = self.connection.cursor()
+
+ # Create tables if they don't exist
+ cursor.execute("""
+ CREATE TABLE IF NOT EXISTS folders (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ path VARCHAR(767) NOT NULL,
+ name VARCHAR(255) NOT NULL,
+ parent_id INT NULL,
+ created_at DATETIME NOT NULL,
+ updated_at DATETIME NOT NULL,
+ FOREIGN KEY (parent_id) REFERENCES folders(id) ON DELETE CASCADE,
+ UNIQUE (path)
+ )
+ """)
+
+ cursor.execute("""
+ CREATE TABLE IF NOT EXISTS files (
+ id INT AUTO_INCREMENT PRIMARY KEY,
+ folder_id INT NOT NULL,
+ name VARCHAR(255) NOT NULL,
+ size INT NOT NULL,
+ created_at DATETIME NOT NULL,
+ updated_at DATETIME NOT NULL,
+ FOREIGN KEY (folder_id) REFERENCES folders(id) ON DELETE CASCADE,
+ UNIQUE (folder_id, name)
+ )
+ """)
+
+ self.connection.commit()
+ cursor.close()
+
+ def _get_folder_id(self, folder_path):
+ cursor = self.connection.cursor()
+ cursor.execute("SELECT id FROM folders WHERE path = %s", (folder_path,))
+ result = cursor.fetchone()
+ cursor.close()
+ return result[0] if result else None
+
+ def _insert_folder(self, folder_path, parent_id=None):
+ folder_name = os.path.basename(folder_path)
+ now = datetime.now()
+
+ cursor = self.connection.cursor()
+ cursor.execute("""
+ INSERT INTO folders (path, name, parent_id, created_at, updated_at)
+ VALUES (%s, %s, %s, %s, %s)
+ ON DUPLICATE KEY UPDATE updated_at = %s
+ """, (folder_path, folder_name, parent_id, now, now, now))
+
+ folder_id = cursor.lastrowid
+ if folder_id == 0: # If it was an update
+ folder_id = self._get_folder_id(folder_path)
+
+ self.connection.commit()
+ cursor.close()
+ return folder_id
+
+ def store_file(self, file_path, folder_path):
+ try:
+ # First ensure the folder exists
+ folder_id = self._insert_folder(folder_path)
+
+ # Read file content
+ with open(file_path, 'rb') as file:
+ file_content = file.read()
+
+ file_name = os.path.basename(file_path)
+ file_size = os.path.getsize(file_path)
+ now = datetime.now()
+
+ cursor = self.connection.cursor()
+ cursor.execute("""
+ INSERT INTO files (folder_id, name, size, created_at, updated_at)
+ VALUES (%s, %s, %s, %s, %s)
+ ON DUPLICATE KEY UPDATE
+ size = VALUES(size),
+ updated_at = VALUES(updated_at)
+ """, (folder_id, file_name, file_size, now, now))
+
+ self.connection.commit()
+ cursor.close()
+ print(f"Stored/updated file: {file_name} in folder: {folder_path}")
+ except Error as e:
+ print(f"Error storing file {file_path}: {e}")
+
+ def store_directory(self, directory_path, parent_folder_path=None):
+ try:
+ # Ensure the parent folder exists
+ parent_id = None
+ if parent_folder_path:
+ parent_id = self._insert_folder(parent_folder_path)
+
+ # Store the current directory
+ dir_id = self._insert_folder(directory_path, parent_id)
+
+ # Store all files in the directory
+ for item in os.listdir(directory_path):
+ full_path = os.path.join(directory_path, item)
+ if os.path.isfile(full_path):
+ self.store_file(full_path, directory_path)
+ elif os.path.isdir(full_path):
+ self.store_directory(full_path, directory_path)
+
+ print(f"Stored directory: {directory_path}")
+ except Error as e:
+ print(f"Error storing directory {directory_path}: {e}")
+
+ def close(self):
+ if self.connection and self.connection.is_connected():
+ self.connection.close()
+ print("MySQL connection closed")
+
+
+# Example usage
+if __name__ == "__main__":
+ # Database configuration
+ db_config = {
+ 'host': '192.168.1.76',
+ 'port': '3307',
+ 'user': 'root',
+ 'password': 'Vlado9674+',
+ 'database': 'file_storage_db'
+ }
+
+ # Initialize the file system storage
+ fs_storage = FileSystemToMySQL(**db_config)
+ fs_storage.connect()
+
+ # Store a single file
+ # fs_storage.store_file('/path/to/your/file.txt', '/path/to/your')
+
+ # Store an entire directory
+ fs_storage.store_directory(r'u:\Dropbox\!!!Days\Downloads Z230')
+
+ # Close the connection
+ fs_storage.close()
\ No newline at end of file
diff --git a/AMBSUKL214235369G_31DEC2024.pfx b/AMBSUKL214235369G_31DEC2024.pfx
new file mode 100644
index 0000000..1a4a2f5
Binary files /dev/null and b/AMBSUKL214235369G_31DEC2024.pfx differ
diff --git a/Access.py b/Access.py
new file mode 100644
index 0000000..49daa7d
--- /dev/null
+++ b/Access.py
@@ -0,0 +1,48 @@
+import os
+import pyodbc
+import random
+import string
+
+# Path to your Access database
+db_path = r"u:\Dropbox\!!!Days\Downloads Z230\Access\Banka.accdb"
+# Connection string
+conn_str = (
+ r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
+ rf"DBQ={db_path};"
+)
+# Connect to database
+conn = pyodbc.connect(conn_str)
+
+# Create cursor
+cursor = conn.cursor()
+
+cursor.execute("delete from transactions")
+conn.commit()
+exit(0)
+
+length = 10 # desired length
+chars = string.ascii_letters + string.digits # A-Z, a-z, 0-9
+
+# Example query
+# cursor.execute("SELECT * FROM contacts")
+print("Start")
+for n in range(10000):
+ random_str = ''.join(random.choices(chars, k=length))
+ cursor.execute("insert into contacts (company) values (?)",(random_str))
+print("stop")
+conn.commit()
+print("committed")
+
+exit(0)
+
+# Example query
+cursor.execute("SELECT * FROM contacts")
+rows = cursor.fetchall()
+
+for row in rows:
+ print(row)
+
+
+# Close connection
+cursor.close()
+conn.close()
diff --git a/DatovaSchranka.py b/DatovaSchranka.py
new file mode 100644
index 0000000..3a47821
--- /dev/null
+++ b/DatovaSchranka.py
@@ -0,0 +1,105 @@
+# Přihlašovací údaje
+username = 'eupo5s'
+password = 'Michalka25+'
+schrankaid='bk7e6j2'
+
+from zeep import Client
+from zeep.wsse.username import UsernameToken
+import time
+import os
+import base64
+
+# Přihlašovací údaje
+USERNAME = 'eupo5s'
+PASSWORD = 'Michalka25+'
+WSDL_URL = 'https://..../ds.wsdl' # upravit dle prostředí
+
+# Inicializace klienta
+client = Client(wsdl=WSDL_URL, wsse=UsernameToken(USERNAME, PASSWORD))
+
+# Kontrola přihlášení
+try:
+ owner_info = client.service.GetOwnerInfoFromLogin()
+except Exception as e:
+ print(f"Chyba přihlášení: {e}")
+ exit(1)
+
+# Zobrazení základních údajů o přihlášeném účtu
+print("Přihlášen jako:", owner_info.dbID, owner_info.firmName)
+
+# Vytvoření adresáře pro testovací soubory
+out_dir = os.path.abspath('test_isds_py')
+os.makedirs(out_dir, exist_ok=True)
+
+# Vytvoření a odeslání testovacích zpráv
+filenames = []
+for i, text in enumerate(["První testovací soubor", "Druhý testovací soubor"], 1):
+ fn = os.path.join(out_dir, f"TESTISDS_{i}.txt")
+ with open(fn, 'w', encoding='utf-8') as f:
+ f.write(text)
+ filenames.append(fn)
+
+# Nahraj přílohy
+files_struct = []
+for fn in filenames:
+ with open(fn, "rb") as f:
+ data = base64.b64encode(f.read()).decode('ascii')
+ files_struct.append({
+ 'dmFileDescr': os.path.basename(fn),
+ 'dmMimeType': 'text/plain',
+ 'dmEncodedContent': data,
+ })
+
+# Vytvoření a odeslání zprávy (parametry uprav podle vlastního scénáře!)
+msg_id = client.service.CreateMessage(
+ senderDBID=None,
+ subject="Testovaci zasilka z Pythonu",
+ isUrgent=False,
+ senderOrgUnitCode=None,
+ # níže: příjemce
+ dbIDRecipient="231",
+ recipientFirmName="Nase org jednotka",
+ recipientOrgUnitNum=-1,
+ recipientOrgUnitName="ncj. 589",
+ receiverPersonCode=None,
+ toHands="K rukam p.Novaka",
+ deepAttachments=files_struct
+)
+
+print("MessageID:", msg_id)
+
+# Chvíle čekání
+time.sleep(5)
+
+# Stažení přijatých zpráv v intervalu
+records = client.service.GetListOfReceivedMessages(
+ startTime="2009-11-01T00:00:00",
+ endTime="2010-10-01T00:00:00",
+ recNo=0,
+ maxRec=100,
+ recordType=1023,
+ customFilter=None
+)
+
+for rec in records.dmRecord:
+ print(f"ID zasilky: {rec.dmID}, odesilatel: {rec.dmSender}")
+ received_id = rec.dmID
+ break
+
+# Stažení jedné zprávy
+msg = client.service.MessageDownload(received_id)
+print("Stažená zpráva:", msg.dmDm.dmID)
+
+# Uložení souborů
+for file in msg.dmDm.dmFiles.dmFile:
+ content = base64.b64decode(file.dmEncodedContent)
+ path = os.path.join(out_dir, file.dmFileDescr)
+ with open(path, 'wb') as f:
+ f.write(content)
+ print("Uloženo:", path)
+
+# Označení jako stáhnuto
+client.service.MarkMessageAsDownloaded(received_id)
+print("Označeno jako přečtené")
+
+# Můžeme pokračovat implementací dalších funkcí: GetDeliveryInfo, SignedMessageDownloadToFile, GetListOfSentMessages, FindDataBox, CheckDataBox…
diff --git a/Davka001.py b/Davka001.py
new file mode 100644
index 0000000..336585f
--- /dev/null
+++ b/Davka001.py
@@ -0,0 +1,276 @@
+import os
+from collections import namedtuple
+
+hlav = namedtuple("Hlavicka", ["typ", "char", "dtyp", "dico",
+ "dpob", "drok", "dmes", "dcid", "dpoc", "dbody",
+ "dfin", "ddpp", "dvdr1", "dvdr2", "ddtyp"])
+av=namedtuple("Aveta",["typ","hcid","hstr","hpoc","hpor","hcpo","htpp","hico","hvar","hodb","hrod","hzdg","hkon","hicz",
+ "hcdz","hrez","hccel","hcbod","dtyp"])
+vv=namedtuple("Vveta",["typ","vdat","vkod","vpoc","vodb","vdia","vbod","vtyp"])
+zv=namedtuple("Zveta",["typ","hcid","hstr","hpoc","hpor","hico","hvar","hodb","hrod","hzdg","hrez","hccel","htyp"])
+lv=namedtuple("Lveta",["typ","ldat","ltpr","lzvl","lkod","lmno","lfin","lvdg","ltyp"])
+def lveta(retezec):
+ TYP= retezec[0:1]
+ LDAT= retezec[1:9]
+ LTPR= retezec[9:10]
+ LZVL= retezec[10:11]
+ LKOD= retezec[11:18]
+ LMNO=retezec[18:29]
+ LFIN= retezec[29:39]
+ LVDG= retezec[39:44]
+ VTYP= retezec[44:45]
+ print(TYP, LDAT, LTPR, LZVL,LKOD,LMNO,LFIN,LVDG,VTYP)
+ Lveta = lv(TYP, LDAT, LTPR, LZVL,LKOD,LMNO,LFIN,LVDG,VTYP)
+ print(Lveta)
+
+def vveta(retezec):
+ TYP= retezec[0:1]
+ VDAT= retezec[1:9]
+ VKOD= retezec[9:14]
+ VPOC= retezec[14:15]
+ VODB=retezec[15:18]
+ VDIA= retezec[18:23]
+ VBOD= retezec[23:30]
+ VTYP= retezec[30:31]
+ print(TYP, VDAT, VKOD, VPOC,VODB,VDIA,VBOD,VTYP)
+ Vveta = vv(TYP, VDAT, VKOD, VPOC,VODB,VDIA,VBOD,VTYP)
+ print(Vveta)
+
+def zveta(retezec):
+ TYP= retezec[0:1]
+ HCID= retezec[1:8]
+ HSTR= retezec[8:9]
+ HPOC= retezec[9:10]
+ HPOR= retezec[10:13]
+ HICO= retezec[13:21]
+ HVAR= retezec[21:27]
+ HODB= retezec[27:30]
+ HROD= retezec[30:40]
+ HZDG= retezec[40:45]
+ HREZ= retezec[45:55]
+ HCCEL= retezec[55:66]
+ DTYP= retezec[66:67]
+ print(TYP, HCID, HSTR, HPOC,HPOR,HICO,HVAR,HODB,HROD,HZDG,HREZ,HCCEL,DTYP )
+ Zveta = zv(TYP, HCID, HSTR, HPOC,HPOR,HICO,HVAR,HODB,HROD,HZDG,HREZ,HCCEL,DTYP )
+ print(Zveta)
+
+def prvniradek(retezec):
+ TYP = retezec[0:1] # Typ věty „D“ – úvodní věta dávky
+ CHAR = retezec[1:2] # Charakter dávky (viz dále ) – určuje stav předkládaných dokladů v dávce
+ DTYP = retezec[2:4] # typ dávky, číselný kód
+ DICO = retezec[4:12] # IPZ
+ DPOB = retezec[12:16] # kod oblastního pracoviště pojišťovny
+ DROK = retezec[16:20] # rok
+ DMES = retezec[20:22] # měsíc
+ DCID = retezec[22:28] # Číslo dávky – jednoznačné číslo dávky v rámci PZS a roku
+ DPOC = retezec[28:31] # počet dokladů v dávce, slouží k ověření kompletnosti
+ DBODY = retezec[31:42] # nepovinné, počet bodů
+ DFIN = float(retezec[42:60]) # nepovinné, celková částka za doklady
+ DDPP = retezec[60:61] # druh pojistného plnění
+ DVDR1 = retezec[61:74]
+ DVDR2 = retezec[74:87]
+ DDTYP = retezec[87:88]
+ print(TYP, CHAR, DTYP, DICO, DPOB, DROK, DMES, DCID, DPOC, DBODY, DFIN, DDPP, DVDR1,DVDR2,DDTYP)
+ hlavicka=hlav(TYP, CHAR, DTYP, DICO, DPOB, DROK, DMES, DCID, DPOC, DBODY, DFIN, DDPP, DVDR1,DVDR2,DDTYP)
+ print(hlavicka.dvdr1)
+
+def aveta(retezec):
+ TYP= retezec[0:1]
+ HCID= retezec[1:8]
+ HSTR= retezec[8:9]
+ HPOC= retezec[9:10]
+ HPOR= retezec[10:13]
+ HCPO= retezec[13:16]
+ HTPP= retezec[16:17]
+ HICO= retezec[17:25]
+ HVAR= retezec[25:31]
+ HODB= retezec[31:34]
+ HROD= retezec[34:44]
+ HZDG= retezec[44:49]
+ HKON= retezec[49:50]
+ HICZ= retezec[50:58]
+ HCDZ= retezec[58:65]
+ HREZ= retezec[65:75]
+ HCCEL= retezec[75:85]
+ HCBOD= retezec[85:92]
+ DTYP= retezec[92:93]
+ print(TYP, HCID, HSTR, HPOC,HPOR,HCPO,HTPP,HICO,HVAR,HODB,HROD,HZDG,HKON,HICZ,HCDZ,HREZ,HCCEL,HCBOD,DTYP )
+ Aveta = av(TYP, HCID, HSTR, HPOC,HPOR,HCPO,HTPP,HICO,HVAR,HODB,HROD,HZDG,HKON,HICZ,HCDZ,HREZ,HCCEL,HCBOD,DTYP)
+ print(Aveta)
+
+
+
+konec=0
+# with open(r"u:\Dropbox\!!!Days\Downloads Z230\Dávky\DataKDavka (6).111","r",encoding='cp852') as f:
+# for importradku in f.readlines():
+# if importradku[0]=="D":
+# print(importradku)
+# prvniradek(importradku)
+# if importradku[0]=="A":
+# konec=0
+# print(importradku)
+# aveta(importradku)
+# if importradku[0] == "V":
+# print(importradku)
+# vveta(importradku)
+# if importradku[0]=="Z":
+# print(importradku)
+# zveta(importradku)
+# if importradku[0] == "L":
+# konec = 1
+# print(importradku)
+# lveta(importradku)
+# if konec==2:
+# exit(0)
+
+
+#010 Projdi vsechny davky
+
+root_davky_dir=r"u:\Dropbox\!!!Days\Downloads Z230\Dávky\Data"
+#010.0 os.walk
+# for root, folders, files in os.walk(root_davky_dir):
+# for file in files:
+# print(file)
+
+#010.1 pathlib
+from pathlib import Path
+
+# # all txt files in current dir
+# for p in Path(".").glob("*.txt"):
+# print(p)
+
+from dataclasses import dataclass
+from decimal import Decimal, InvalidOperation
+import re
+
+# ---- header spec (0-based) ----
+# name, type, length, start, description (optional)
+HEADER_SPEC = [
+ ("TYP", "C", 1, 0, "Typ věty (má být 'D')"),
+ ("CHAR", "C", 1, 1, "Charakter dávky (např. 'P')"),
+ ("DTYP", "C", 2, 2, "Typ dávky (např. '98')"),
+ ("DICO", "C", 8, 4, "IČZ PZS"),
+ ("DPOB", "C", 4, 12, "Územní pracoviště"),
+ ("DROK", "N", 4, 16, "Rok uzavření dokladů"),
+ ("DMES", "N", 2, 20, "Měsíc uzavření dokladů"),
+ ("DCID", "N", 6, 22, "Číslo dávky"),
+ ("DPOC", "N", 3, 28, "Počet dokladů"),
+ ("DBODY", "N", 11, 31, "Počet bodů v dávce (volitelné)"),
+ ("DFIN", "$", 18, 42, "Celkem Kč (18.2, volitelné)"),
+ ("DDPP", "C", 1, 60, "Druh pojistného vztahu"),
+ ("DVDR1", "C", 13, 61, "Verze DR 1"),
+ ("DVDR2", "C", 13, 74, "Verze DR 2"),
+ ("DDTYP", "C", 1, 87, "Doplněk typu věty"),
+]
+
+def _slice0(s: str, start: int, length: int) -> str:
+ """0-based safe slice."""
+ if s is None: return ""
+ return s[start:start+length] if start < len(s) else ""
+
+def _parse_char(s: str):
+ s = (s or "").strip()
+ return s or None
+
+def _parse_int(s: str):
+ if s is None: return None
+ digits = re.sub(r"\D", "", s)
+ return int(digits) if digits else None
+
+def _parse_money(s: str):
+ """Parse money field '18.2': spaces allowed, comma or dot; returns Decimal or None."""
+ if s is None: return None
+ s = s.replace("\u00A0", " ").strip().replace(" ", "").replace(",", ".")
+ if not s: return None
+ try:
+ # keep precision with Decimal
+ val = Decimal(s)
+ # optional: round to 2 decimal places
+ return val.quantize(Decimal("0.01"))
+ except (InvalidOperation, ValueError):
+ return None
+
+def parse_davka_header_line(line: str, strict=True) -> dict:
+ """
+ Parse header (first line) of a dávka according to HEADER_SPEC (0-based).
+ Returns dict with typed values. Raises if not a 'DP98' header (strict=True).
+ """
+ if not line:
+ raise ValueError("Empty header line.")
+ if strict and not line.startswith("DP98"):
+ raise ValueError(f"Invalid header prefix {line[:4]!r}; expected 'DP98'.")
+
+ out = {"raw": line}
+ # field parsing per spec
+ for name, typ, length, start, *_ in HEADER_SPEC:
+ raw_val = _slice0(line, start, length)
+ if typ == "C":
+ out[name] = _parse_char(raw_val)
+ elif typ == "N":
+ out[name] = _parse_int(raw_val)
+ elif typ == "$":
+ out[name] = _parse_money(raw_val)
+ else:
+ out[name] = raw_val # fallback
+
+ # basic validations (soft)
+ if strict:
+ if out.get("TYP") != "D":
+ raise ValueError(f"TYP must be 'D', got {out.get('TYP')!r}")
+ if out.get("DTYP") != "98":
+ raise ValueError(f"DTYP must be '98', got {out.get('DTYP')!r}")
+
+ # Optional month sanity check (accepts '01'..'12' and '00')
+ m = out.get("DMES")
+ if m is not None and m not in range(0, 13): # 0..12
+ # keep value but you could raise or log here
+ pass
+
+ return out
+
+
+
+
+
+# recursive
+exts=("111","201","205","207","209","211")
+keep={}
+for soubor in Path(root_davky_dir).rglob("KDAVKA.*"):
+ if not soubor.is_file():
+ print(f"{soubor} neni platny soubor")
+ continue
+ if soubor.suffix.lstrip(".") not in exts:
+ print(f"{soubor} nema platnou koncovku")
+ continue
+ try:
+ with soubor.open("r",encoding="cp1250",errors="strict",newline="") as f:
+ if f.read(4)=="DP98": #takovy soubor chceme brat v potaz
+ keep[str(soubor)]={"File":soubor}
+ except:
+ continue
+print(keep)
+
+
+#020 Read headers of davky in keep
+for soubor in keep: #
+
+
+# def get_kdavka(root_dir, exts=("111","201","205","207","209","211")):
+# root = Path(root_dir)
+# wanted = {e.upper() for e in exts}
+# keep = []
+# for p in root.rglob("KDAVKA.*"):
+# if not p.is_file():
+# continue
+# if p.suffix.lstrip(".").upper() not in wanted:
+# continue
+# try:
+# with p.open("r", encoding="cp1250", errors="strict", newline="") as f:
+# if f.read(4) == "DP98": # read just 4 chars, cp1250 is single-byte
+# keep.append(p)
+# except UnicodeDecodeError:
+# # bad file — skip
+# continue
+# keep.sort()
+# print(f"{len(keep)} davky (DP98) found under {root}")
+# return keep
\ No newline at end of file
diff --git a/FIO1.py b/FIO1.py
new file mode 100644
index 0000000..8743bc5
--- /dev/null
+++ b/FIO1.py
@@ -0,0 +1,85 @@
+import json
+from datetime import datetime
+import os
+import pyodbc
+import random
+import string
+
+# Path to your Access database
+db_path = r"u:\Dropbox\!!!Days\Downloads Z230\Access\Banka.accdb"
+# Connection string
+conn_str = (
+ r"DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};"
+ rf"DBQ={db_path};"
+)
+# Connect to database
+conn = pyodbc.connect(conn_str)
+
+# Create cursor
+cursor = conn.cursor()
+
+cursor.execute("delete from transactions")
+conn.commit()
+
+
+
+# Load from file, načtení bankovních pohybů
+with open(r"u:\Dropbox\!!!Days\Downloads Z230\Fio\pohyby.json", "r", encoding="utf-8") as f:
+ transactions = json.load(f)
+# print(transactions["accountStatement"]["transactionList"])
+# Process
+for tx in transactions["accountStatement"]["transactionList"]["transaction"]:
+ #ID pohybu
+ idpohybu=str(tx["column22"]["value"])
+ datum=tx["column0"]["value"]
+
+ #Datum transakce
+ datum = datetime.strptime(datum, "%Y-%m-%d%z")
+ datum = datum.date()
+
+ #Částka
+ objem = int(tx["column1"]["value"])
+
+ #Měna
+ mena = tx["column14"]["value"]
+
+ #Název protiúčtu
+ nazevprotiuctu=tx["column10"]["value"]
+
+ #Typ transakce
+ typ = tx["column8"]["value"]
+
+ #Konstantní symbol
+ if tx["column4"] is not None:
+ kss=tx["column4"]["value"]
+ else:
+ kss=""
+
+ # Provedl
+ if tx["column9"] is not None:
+ provedl = tx["column9"]["value"]
+ else:
+ provedl = ""
+
+ # ID pokynu
+ if tx["column17"] is not None:
+ idpokynu = str(tx["column17"]["value"])
+ else:
+ idpokynu = ""
+
+
+ # print (idpohybu,datum,objem,mena,nazevprotiuctu,typ,kss,provedl,idpokynu)
+ # if idpohybu=="3016989040":
+ # # Uložení do Accessu, jestli ještě neexistuje")
+ # cursor.execute("insert into transactions (idpohybu, datum) values (?,?)", (idpohybu, datum))
+ # conn.commit()
+ # print("committed")
+
+ print (idpohybu,datum,objem,mena,nazevprotiuctu,typ,kss,provedl,idpokynu)
+ print(type(idpohybu))
+ # Uložení do Accessu, jestli ještě neexistuje")
+ cursor.execute("insert into transactions (idpohybu, datum,objem,mena,nazevprotiuctu,ks,typ,provedl,idpokynu) values (?,?,?,?,?,?,?,?,?)",
+ (idpohybu, datum,objem, mena, nazevprotiuctu,kss,typ,provedl,idpokynu))
+ # cursor.execute("insert into transactions (idpohybu) values (?)", (idpohybu))
+ conn.commit()
+ print("committed")
\ No newline at end of file
diff --git a/Kontakty01.py b/Kontakty01.py
new file mode 100644
index 0000000..eda429b
--- /dev/null
+++ b/Kontakty01.py
@@ -0,0 +1,78 @@
+import firebirdsql,re
+
+def get_connection():
+ return firebirdsql.connect(
+ host="192.168.1.4",
+ port=3050,
+ database=r"z:\medicus 3\data\medicus.fdb", # path must be valid on the server
+ user="SYSDBA",
+ password="masterkey",
+ charset="WIN1250",
+ )
+def get_registrovani(cur): #vrati list rodnych cisel registrovanych pacientu "registrovani"
+ cur.execute("""
+ select rodcis from registr join kar
+ on registr.idpac=kar.idpac where
+ kar.vyrazen!='A' and
+ kar.rodcis is not null and
+ idicp!=0 and
+ datum_zruseni is null
+ """)
+ registrovani=[]
+ for radek in cur.fetchall():
+ registrovani.append(radek[0])
+ return registrovani
+
+def je_registrovany(con,rodcis):
+ cur=conn.cursor()
+ cur.execute("""
+ select 1 from registr join kar
+ on registr.idpac=kar.idpac where
+ kar.vyrazen!='A' and
+ kar.rodcis is not null and
+ idicp!=0 and
+ datum_zruseni is null
+ and rodcis=%s
+ limit 1
+ """)
+ cur.execute(sql, (rodcis,))
+ return cur.fetchone() is not None
+
+def strip_cz_prefix(num: str) -> str:
+ # remove spaces and non-digits first
+ n = re.sub(r"\D", "", num)
+
+ # strip +420, 00420 or 420 at start
+ if n.startswith("00420"):
+ return n[5:]
+ elif n.startswith("420"):
+ return n[3:]
+ else:
+ return n
+
+def is_cz_mobile(num: str) -> bool:
+ nmbr=strip_cz_prefix(num)
+ MOBILE_PREFIXES = ("60", "72", "73", "77", "79")
+ # now check length and prefix
+ return len(nmbr) == 9 and nmbr[:2] in MOBILE_PREFIXES
+
+def get_mobile(rodcis,conn):
+ sql = f"""
+ SELECT kar.prijmeni, kar.rodcis,
+ karkontakt.poradi, karkontakt.kontakt
+ FROM karkontakt join kar on kar.idpac=karkontakt.idpac
+ where kar.rodcis={rodcis}
+ """
+ cur=conn.cursor()
+ mobil={}
+
+
+
+conn = get_connection()
+cur = conn.cursor()
+
+
+
+
+# print(get_mobile("340415112",conn))
+print(is_cz_mobile("283893084"))
\ No newline at end of file
diff --git a/PDF - doplnění jména.py b/PDF - doplnění jména.py
new file mode 100644
index 0000000..4476684
--- /dev/null
+++ b/PDF - doplnění jména.py
@@ -0,0 +1,58 @@
+import os,re,fdb,time
+import logging
+logging.basicConfig(level=logging.DEBUG)
+
+
+def set_single_page_view (filepdfin):
+ from pikepdf import Pdf, Dictionary, Name
+ import os
+ from pathlib import Path
+ pdf=Pdf.open(filepdfin,allow_overwriting_input=True)
+ # file_only_path=os.path.dirname(filepdfin)
+ # file_without_ext = Path(filepdfin).stem
+ pdf.Root.PageLayout=Name('/SinglePage')
+ pdf.Root.PageMode=Name('/UseNone')
+ pdf.save()
+
+
+# Connect to the Firebird database
+conn = fdb.connect(
+ dsn=r'localhost:u:\medicus 3\data\medicus.fdb', # Database path
+ user='SYSDBA', # Username
+ password="masterkey", # Password,
+ charset="win1250")
+# cur = conn.cursor()
+
+cesta=r"u:\dropbox\ordinace\Dokumentace_ke_zpracování"
+
+for file in os.listdir(cesta):
+ if file.upper().endswith((".PDF")) and os.path.isfile(os.path.join(cesta,file)):
+ pattern=r"(\d{9,10}) ((?:(?:19|20)\d\d)-(0[1-9]|1[0-2])-(0[1-9]|[12][0-9]|3[01])) (\[.*)"
+ nalezeno=re.search(pattern,file)
+ if nalezeno:
+ print(nalezeno.groups())
+ x=nalezeno.groups()
+ rodcis=nalezeno.group(1)
+ datum=nalezeno.group(2)
+ konec=nalezeno.group(5)
+ print(datum)
+ print(konec)
+ print(rodcis,type(rodcis))
+ cur = conn.cursor()
+ cur.execute("select prijmeni, jmeno from kar where rodcis=?",(rodcis,))
+ x = cur.fetchone()
+ if x:
+ if len(x[0].split(" "))==1:
+ prijmeni=x[0]
+ else:
+ prijmeni=x[0].split(" ")[0]
+ if len(x[1].split(" "))==1:
+ jmeno=x[1]
+ else:
+ prijmeni=x[1].split(" ")[0]
+ konecsouboru=file.split(rodcis)[1]
+ novejmeno=rodcis+" "+datum+" "+prijmeni.strip()+", "+jmeno.strip()+" "+konec
+ print(novejmeno)
+ os.rename(os.path.join(cesta,file),os.path.join(cesta,novejmeno))
+ cur.close()
+
diff --git a/PDFmanipulation (2).py b/PDFmanipulation (2).py
new file mode 100644
index 0000000..b852add
--- /dev/null
+++ b/PDFmanipulation (2).py
@@ -0,0 +1,22 @@
+import os,re
+
+
+def set_single_page_view (filepdfin):
+ from pikepdf import Pdf, Dictionary, Name
+ import os
+ from pathlib import Path
+ pdf=Pdf.open(filepdfin,allow_overwriting_input=True)
+ # file_only_path=os.path.dirname(filepdfin)
+ # file_without_ext = Path(filepdfin).stem
+ pdf.Root.PageLayout=Name('/SinglePage')
+ pdf.Root.PageMode=Name('/UseNone')
+ pdf.save()
+
+
+# set_single_page_view(r"u:\Dropbox\!!!Days\Downloads Z230\Dokumentace\a.pdf")
+
+cesta=r"u:\dropbox\ordinace\Dokumentace_ke_zpracování"
+
+for file in os.listdir(cesta):
+ if file.upper().endswith((".PDF")) and os.path.isfile(os.path.join(cesta,file)):
+ set_single_page_view(os.path.join(cesta,file))
diff --git a/Pojistovna.py b/Pojistovna.py
new file mode 100644
index 0000000..4a64545
--- /dev/null
+++ b/Pojistovna.py
@@ -0,0 +1,10 @@
+# client certificate (no private key)
+certorig=r"u:\Dropbox\!!!Days\Downloads Z230\cert\MB komerční full do 2026-01-22.pfx"
+certpem=r"u:\Dropbox\!!!Days\Downloads Z230\cert\client.pem"
+
+openssl pkcs12 -in certorig -clcerts -nokeys -out certpem
+
+
+
+
+
diff --git a/Reporty01.py b/Reporty01.py
new file mode 100644
index 0000000..a9de34f
--- /dev/null
+++ b/Reporty01.py
@@ -0,0 +1,361 @@
+import os
+import fdb
+import csv,time,pandas as pd
+import openpyxl
+
+
+PathToSaveCSV=r"U:\Dropbox\Ordinace\Test"
+timestr = time.strftime("%Y-%m-%d %H-%M-%S ")
+CSVname="Pacienti.xlsx"
+# PathToSaveCSV=r"//tower/tempspeed"
+
+con = fdb.connect(
+ host='localhost', database=r'm:\MEDICUS\data\medicus.FDB',
+ user='sysdba', password='masterkey',charset='WIN1250')
+
+# Create a Cursor object that operates in the context of Connection con:
+cur = con.cursor()
+
+# import openpyxl module
+import openpyxl
+import xlwings as xw
+wb = openpyxl.Workbook()
+sheet = wb.active
+# wb.save("sample.xlsx")
+
+
+#Načtení očkování registrovaných pacientů
+cur.execute("select rodcis,prijmeni,jmeno,ockzaz.datum,kodmz,ockzaz.poznamka,latka,nazev,expire from registr join kar on registr.idpac=kar.idpac join ockzaz on registr.idpac=ockzaz.idpac where datum_zruseni is null and kar.vyrazen!='A' and kar.rodcis is not null and idicp!=0 order by ockzaz.datum desc")
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.title="Očkování"
+sheet.append(["Rodne cislo","Prijmeni","Jmeno","Datum ockovani","Kod MZ","Sarze","Latka","Nazev","Expirace"])
+#nacteno jsou ockovani
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+
+
+
+#Načtení registrovaných pacientů
+cur.execute("select rodcis,prijmeni,jmeno,datum_registrace,registr.idpac,poj from registr join kar on registr.idpac=kar.idpac where kar.vyrazen!='A' and kar.rodcis is not null and idicp!=0 and datum_zruseni is null")
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+wb.create_sheet('Registrovani',0)
+sheet=wb['Registrovani']
+
+sheet.append(["Rodne cislo","Prijmeni","Jmeno","Datum registrace","ID pacienta","Pojistovna"])
+#nacteno jsou registrovani
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+
+#Načtení receptů
+cur.execute("""select
+kar.rodcis,
+TRIM(kar.prijmeni) ||' '|| substring(kar.jmeno from 1 for 1) ||'.' as jmeno,
+recept.datum,
+TRIM(recept.lek) ||' '|| trim(recept.dop) as lek,
+recept.expori AS Poc,
+CASE
+ WHEN recept.opakovani is null THEN 1
+ ELSE recept.opakovani
+ END AS OP,
+recept.uhrada,
+recept.dsig,
+recept.NOTIFIKACE_KONTAKT as notifikace,
+recept_epodani.erp,
+recept_epodani.vystavitel_jmeno,
+recept.atc,
+recept.CENAPOJ,
+recept.cenapac
+from recept LEFT Join RECEPT_EPODANI on recept.id_epodani=recept_epodani.id
+LEFT join kar on recept.idpac=kar.idpac
+order by datum desc,erp desc"""
+)
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+wb.create_sheet('Recepty',0)
+sheet=wb['Recepty']
+
+sheet.title="Recepty"
+sheet.append(["Rodné číslo","Jméno","Datum vystavení","Název leku","Poč.","Op.","Úhr.","Da signa","Notifikace","eRECEPT","Vystavil","ATC","Cena pojišťovna","Cena pacient"])
+#nacteno jsou ockovani
+for row in nacteno:
+ try:
+ sheet.append(row)
+ except:
+ continue
+
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Načtení vykony vsech
+cur.execute("select dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,dokladd.pocvyk,dokladd.ddgn,dokladd.body,vykony.naz "
+ "from kar join dokladd on kar.rodcis=dokladd.rodcis join vykony on dokladd.kod=vykony.kod where (datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null) order by dokladd.datose desc,dokladd.rodcis")
+
+wb.create_sheet('Vykony',0)
+sheet=wb['Vykony']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum vykonu","Kod","Pocet","Dg.","Body","Nazev"])
+#nacteno jsou ockovani
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Načtení neschopenek
+
+import datetime
+def pocet_dni(zacnes,konnes,pracne):
+ dnes=datetime.date.today()
+ if pracne=='A':
+ return (dnes-zacnes).days
+ if pracne=='N' and zacnes is not None and konnes is not None and zacnes<=konnes:
+ return (konnes-zacnes).days
+ else:
+ return "NA"
+
+cur.execute("select nes.idpac, "
+ "kar.rodcis, "
+ "TRIM(prijmeni) ||', '|| TRIM(jmeno), "
+ "nes.datnes, "
+ "nes.ecn, "
+ "nes.zacnes, "
+ "nes.pracne, "
+ "nes.konnes, "
+ "nes.diagno, "
+ "nes.kondia, "
+ "nes.updated "
+ "from nes "
+ "left join kar on nes.idpac=kar.idpac where nes.datnes<=current_date "
+ "order by datnes desc")
+
+
+tmpnacteno_vse=[]
+nacteno_vse=cur.fetchall()
+
+cur.execute("select nes.idpac, "
+ "kar.rodcis, "
+ "TRIM(prijmeni) ||', '|| TRIM(jmeno), "
+ "nes.datnes, "
+ "nes.ecn, "
+ "nes.zacnes, "
+ "nes.pracne, "
+ "nes.konnes, "
+ "nes.diagno, "
+ "nes.kondia, "
+ "nes.updated "
+ "from nes "
+ "left join kar on nes.idpac=kar.idpac where nes.datnes<=current_date and pracne='A'"
+ "order by datnes desc")
+
+tmpnacteno_aktivni=[]
+nacteno_aktivni=cur.fetchall()
+
+for row in nacteno_vse:
+ tmpnacteno_vse.append((row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7],pocet_dni(row[5],row[7],row[6]),row[8],row[9],row[10]))
+
+for row in nacteno_aktivni:
+ (tmpnacteno_aktivni.append((row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7],pocet_dni(row[5],row[7],row[6]),row[8],row[9],row[10])))
+
+wb.create_sheet('Neschopenky všechny',0)
+sheet=wb["Neschopenky všechny"]
+sheet.append(["ID pac","Rodne cislo","Jmeno","Datum neschopenky","Číslo neschopenky","Zacatek","Aktivní?","Konec","Pocet dni","Diagnoza zacatel","Diagnoza konec","Aktualizovano"])
+for row in tmpnacteno_vse:
+ sheet.append(row)
+
+wb.create_sheet('Neschopenky aktivní',0)
+sheet=wb["Neschopenky aktivní"]
+sheet.append(["ID pac","Rodne cislo","Jmeno","Datum neschopenky","Číslo neschopenky","Zacatek","Aktivní?","Konec","Pocet dni","Diagnoza zacatel","Diagnoza konec","Aktualizovano"])
+for row in tmpnacteno_aktivni:
+ sheet.append(row)
+
+#Načtení preventivni prohlidky
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=1022 or dokladd.kod=1021) "
+"order by datose desc")
+
+wb.create_sheet('Preventivni prohlidky',0)
+sheet=wb['Preventivni prohlidky']
+
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni INR
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=01443) "
+"order by datose desc")
+
+wb.create_sheet('INR',0)
+sheet=wb['INR']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni CRP
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=02230 or dokladd.kod=09111) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('CRP',0)
+sheet=wb['CRP']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+
+#Nacteni Holter
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=17129) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('Holter',0)
+sheet=wb['Holter']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni prostata
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=01130 or dokladd.kod=01131 or dokladd.kod=01132 or dokladd.kod=01133 or dokladd.kod=01134) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('Prostata',0)
+sheet=wb['Prostata']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni TOKS
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and "
+"(dokladd.kod=15118 or dokladd.kod=15119 or dokladd.kod=15120 or dokladd.kod=15121) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('TOKS',0)
+sheet=wb['TOKS']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni COVID
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and "
+"(dokladd.kod=01306) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('COVID',0)
+sheet=wb['COVID']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni Streptest
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and "
+"(dokladd.kod=02220) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('Streptest',0)
+sheet=wb['Streptest']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+
+
+# autofilter
+for ws in wb.worksheets:
+ # Get the maximum number of rows and columns
+ max_row = ws.max_row
+ max_column = ws.max_column
+ ws.auto_filter.ref = f"A1:{openpyxl.utils.get_column_letter(max_column)}{max_row}"
+ # ws.auto_filter.ref = ws.dimensions
+
+
+
+
+
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+
+# Tento modul je pouze na autofit jednotlivych sloupcu na vsech listech workbooku
+file = os.path.join(PathToSaveCSV ,timestr+CSVname)
+with xw.App(visible=False) as app:
+ wb = xw.Book(file)
+ for sheet in range(len(wb.sheets)):
+ ws = wb.sheets[sheet]
+ ws.autofit()
+
+ # centrování receptů
+ sheet = wb.sheets['Recepty']
+ for sloupec in ["C:C", "E:E", "F:F", "G:G", "I:I", "M:M", "N:N"]:
+ sheet.range(sloupec).api.HorizontalAlignment = 3 # 3 = Center
+
+
+ wb.save()
+ wb.close()
+
+
diff --git a/Reporty02.py b/Reporty02.py
new file mode 100644
index 0000000..627a4bc
--- /dev/null
+++ b/Reporty02.py
@@ -0,0 +1,346 @@
+import os
+import fdb
+import csv,time,pandas as pd
+import openpyxl
+
+
+PathToSaveCSV=r"U:\Dropbox\Ordinace\Test"
+timestr = time.strftime("%Y-%m-%d %H-%M-%S ")
+CSVname="Pacienti.xlsx"
+# PathToSaveCSV=r"//tower/tempspeed"
+
+con = fdb.connect(
+ host='localhost', database=r'm:\MEDICUS\data\medicus.FDB',
+ user='sysdba', password='masterkey',charset='WIN1250')
+
+# Create a Cursor object that operates in the context of Connection con:
+cur = con.cursor()
+
+# import openpyxl module
+import openpyxl
+import xlwings as xw
+wb = openpyxl.Workbook()
+sheet = wb.active
+# wb.save("sample.xlsx")
+
+
+#Načtení registrovaných pacientů
+cur.execute("select rodcis,prijmeni,jmeno,datum_registrace,registr.idpac,poj from registr join kar on registr.idpac=kar.idpac where kar.vyrazen!='A' and kar.rodcis is not null and idicp!=0 and datum_zruseni is null")
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+wb.create_sheet('Registrovani',0)
+sheet=wb['Registrovani']
+
+sheet.append(["Rodne cislo","Prijmeni","Jmeno","Datum registrace","ID pacienta","Pojistovna"])
+#nacteno jsou registrovani
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+
+#Načtení receptů
+cur.execute("""select
+kar.rodcis,
+TRIM(kar.prijmeni) ||' '|| substring(kar.jmeno from 1 for 1) ||'.' as jmeno,
+recept.datum,
+TRIM(recept.lek) ||' '|| trim(recept.dop) as lek,
+recept.expori AS Poc,
+CASE
+ WHEN recept.opakovani is null THEN 1
+ ELSE recept.opakovani
+ END AS OP,
+recept.uhrada,
+recept.dsig,
+recept.NOTIFIKACE_KONTAKT as notifikace,
+recept_epodani.erp,
+recept_epodani.vystavitel_jmeno,
+recept.atc,
+recept.CENAPOJ,
+recept.cenapac
+from recept LEFT Join RECEPT_EPODANI on recept.id_epodani=recept_epodani.id
+LEFT join kar on recept.idpac=kar.idpac
+order by datum desc,erp desc"""
+)
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+wb.create_sheet('Recepty',0)
+sheet=wb['Recepty']
+
+sheet.title="Recepty"
+sheet.append(["Rodné číslo","Jméno","Datum vystavení","Název leku","Poč.","Op.","Úhr.","Da signa","Notifikace","eRECEPT","Vystavil","ATC","Cena pojišťovna","Cena pacient"])
+#nacteno jsou ockovani
+for row in nacteno:
+ try:
+ sheet.append(row)
+ except:
+ continue
+
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Načtení vykony vsech
+cur.execute("select dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,dokladd.pocvyk,dokladd.ddgn,dokladd.body,vykony.naz "
+ "from kar join dokladd on kar.rodcis=dokladd.rodcis join vykony on dokladd.kod=vykony.kod where (datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null) order by dokladd.datose desc,dokladd.rodcis")
+
+wb.create_sheet('Vykony',0)
+sheet=wb['Vykony']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum vykonu","Kod","Pocet","Dg.","Body","Nazev"])
+#nacteno jsou ockovani
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Načtení neschopenek
+
+import datetime
+def pocet_dni(zacnes,konnes,pracne):
+ dnes=datetime.date.today()
+ if pracne=='A':
+ return (dnes-zacnes).days
+ if pracne=='N' and zacnes is not None and konnes is not None and zacnes<=konnes:
+ return (konnes-zacnes).days
+ else:
+ return "NA"
+
+cur.execute("select nes.idpac, "
+ "kar.rodcis, "
+ "TRIM(prijmeni) ||', '|| TRIM(jmeno), "
+ "nes.datnes, "
+ "nes.ecn, "
+ "nes.zacnes, "
+ "nes.pracne, "
+ "nes.konnes, "
+ "nes.diagno, "
+ "nes.kondia, "
+ "nes.updated "
+ "from nes "
+ "left join kar on nes.idpac=kar.idpac where nes.datnes<=current_date "
+ "order by datnes desc")
+
+
+tmpnacteno_vse=[]
+nacteno_vse=cur.fetchall()
+
+cur.execute("select nes.idpac, "
+ "kar.rodcis, "
+ "TRIM(prijmeni) ||', '|| TRIM(jmeno), "
+ "nes.datnes, "
+ "nes.ecn, "
+ "nes.zacnes, "
+ "nes.pracne, "
+ "nes.konnes, "
+ "nes.diagno, "
+ "nes.kondia, "
+ "nes.updated "
+ "from nes "
+ "left join kar on nes.idpac=kar.idpac where nes.datnes<=current_date and pracne='A'"
+ "order by datnes desc")
+
+tmpnacteno_aktivni=[]
+nacteno_aktivni=cur.fetchall()
+
+for row in nacteno_vse:
+ tmpnacteno_vse.append((row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7],pocet_dni(row[5],row[7],row[6]),row[8],row[9],row[10]))
+
+for row in nacteno_aktivni:
+ (tmpnacteno_aktivni.append((row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7],pocet_dni(row[5],row[7],row[6]),row[8],row[9],row[10])))
+
+wb.create_sheet('Neschopenky všechny',0)
+sheet=wb["Neschopenky všechny"]
+sheet.append(["ID pac","Rodne cislo","Jmeno","Datum neschopenky","Číslo neschopenky","Zacatek","Aktivní?","Konec","Pocet dni","Diagnoza zacatel","Diagnoza konec","Aktualizovano"])
+for row in tmpnacteno_vse:
+ sheet.append(row)
+
+wb.create_sheet('Neschopenky aktivní',0)
+sheet=wb["Neschopenky aktivní"]
+sheet.append(["ID pac","Rodne cislo","Jmeno","Datum neschopenky","Číslo neschopenky","Zacatek","Aktivní?","Konec","Pocet dni","Diagnoza zacatel","Diagnoza konec","Aktualizovano"])
+for row in tmpnacteno_aktivni:
+ sheet.append(row)
+
+#Načtení preventivni prohlidky
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=1022 or dokladd.kod=1021) "
+"order by datose desc")
+
+wb.create_sheet('Preventivni prohlidky',0)
+sheet=wb['Preventivni prohlidky']
+
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni INR
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=01443) "
+"order by datose desc")
+
+wb.create_sheet('INR',0)
+sheet=wb['INR']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni CRP
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=02230 or dokladd.kod=09111) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('CRP',0)
+sheet=wb['CRP']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+
+#Nacteni Holter
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=17129) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('Holter',0)
+sheet=wb['Holter']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni prostata
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and (dokladd.kod=01130 or dokladd.kod=01131 or dokladd.kod=01132 or dokladd.kod=01133 or dokladd.kod=01134) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('Prostata',0)
+sheet=wb['Prostata']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni TOKS
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and "
+"(dokladd.kod=15118 or dokladd.kod=15119 or dokladd.kod=15120 or dokladd.kod=15121) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('TOKS',0)
+sheet=wb['TOKS']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni COVID
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and "
+"(dokladd.kod=01306) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('COVID',0)
+sheet=wb['COVID']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+#Nacteni Streptest
+cur.execute("select all dokladd.rodcis,TRIM(prijmeni) ||', '|| TRIM(jmeno),dokladd.datose,dokladd.kod,vykony.naz,dokladd.ddgn,dokladd.body "
+"from dokladd left join kar on dokladd.rodcis=kar.rodcis join vykony on dokladd.kod=vykony.kod where "
+"((datose>=vykony.platiod and datose<=vykony.platido) OR (datose>=vykony.platiod and vykony.platido is null)) and "
+"(dokladd.kod=02220) "
+"order by datose desc,dokladd.rodcis,dokladd.kod")
+
+wb.create_sheet('Streptest',0)
+sheet=wb['Streptest']
+
+nacteno=cur.fetchall()
+print(len(nacteno))
+
+sheet.append(["Rodne cislo","Jmeno","Datum","Kod","Název","Dg.","Body"])
+
+for row in nacteno:
+ sheet.append(row)
+
+
+# autofilter
+for ws in wb.worksheets:
+ # Get the maximum number of rows and columns
+ max_row = ws.max_row
+ max_column = ws.max_column
+ ws.auto_filter.ref = f"A1:{openpyxl.utils.get_column_letter(max_column)}{max_row}"
+ # ws.auto_filter.ref = ws.dimensions
+
+
+
+
+
+wb.save(os.path.join(PathToSaveCSV ,timestr+CSVname))
+
+
+# Tento modul je pouze na autofit jednotlivych sloupcu na vsech listech workbooku
+file = os.path.join(PathToSaveCSV ,timestr+CSVname)
+with xw.App(visible=False) as app:
+ wb = xw.Book(file)
+ for sheet in range(len(wb.sheets)):
+ ws = wb.sheets[sheet]
+ ws.autofit()
+
+ # centrování receptů
+ sheet = wb.sheets['Recepty']
+ for sloupec in ["C:C", "E:E", "F:F", "G:G", "I:I", "M:M", "N:N"]:
+ sheet.range(sloupec).api.HorizontalAlignment = 3 # 3 = Center
+
+
+ wb.save()
+ wb.close()
+
+
diff --git a/SMSCallBackDebug.py b/SMSCallBackDebug.py
new file mode 100644
index 0000000..e2418d8
--- /dev/null
+++ b/SMSCallBackDebug.py
@@ -0,0 +1,17 @@
+from flask import Flask, request
+app = Flask(__name__)
+
+@app.route("/diafaan-callback", methods=["GET", "POST"])
+def diafaan_callback():
+ print("==== Callback received ====")
+ print("Method :", request.method)
+ print("Headers:", dict(request.headers))
+ print("Args :", request.args) # query string for GET
+ print("Form :", request.form) # form fields for POST
+ print("JSON :", request.get_json(silent=True))
+ print("==========================\n", flush=True)
+ return "OK" # must return 200 so Diafaan knows it succeeded
+
+if __name__ == "__main__":
+ # Install flask if needed: pip install flask
+ app.run(host="0.0.0.0", port=8088)
diff --git a/eRecept.py b/eRecept.py
new file mode 100644
index 0000000..7433c48
--- /dev/null
+++ b/eRecept.py
@@ -0,0 +1,34 @@
+#test přístupu do eReceptu
+# erecept_poc.py
+import os
+from requests import Session
+from requests_pkcs12 import Pkcs12Adapter
+from zeep import Client
+from zeep.transports import Transport
+
+PFX_FILE = "AMBSUKL214235369G_31DEC2024.pfx"
+PFX_PASSWORD = os.getenv("Vlado7309208104++", "") # nebo zadejte přímo jako řetězec
+# WSDL_URL = "https:///path?wsdl" # doplňte
+WSDL_URL = "https://lekar-soap.erecept.sukl.cz/cuer/Lekar?wsdl" # doplňte
+
+# Session s PFX (obstará klientskou autentizaci mTLS) https://lekar-soap.erecept.sukl.cz/cuer/Lekar?wsdl
+sess = Session()
+sess.mount("https://", Pkcs12Adapter(pkcs12_filename=PFX_FILE, pkcs12_password=PFX_PASSWORD))
+
+# zeep klient s naší session
+transport = Transport(session=sess, timeout=30)
+client = Client(wsdl=WSDL_URL, transport=transport)
+
+# Pro kontrolu: vylistuj dostupné služby a operace
+for service in client.wsdl.services.values():
+ print(f"Service: {service.name}")
+ for port in service.ports.values():
+ ops = sorted(port.binding._operations.values(), key=lambda o: o.name)
+ print(f" Port: {port.name}")
+ for op in ops:
+ print(f" Operation: {op.name}")
+
+# Příklad volání (názvy/parametry dle WSDL):
+# headers = {"UserID": "...", "WorkplaceID": "..."} # ilustrativní
+# resp = client.service.NazevOperace(requestPayload, _soapheaders=headers)
+# print(resp)
diff --git a/fio.py b/fio.py
new file mode 100644
index 0000000..0bf6312
--- /dev/null
+++ b/fio.py
@@ -0,0 +1,24 @@
+import requests
+import json
+
+# Replace with your actual token
+API_TOKEN = "v0GJaAVeefzV1lnx1jPCf2nFF7SuOPzzrL5tobPNsC7oCChXG4hahDYVb8Rdcex0"
+
+# Example: download last 30 days of transactions in JSON
+url = f"https://fioapi.fio.cz/v1/rest/periods/v0GJaAVeefzV1lnx1jPCf2nFF7SuOPzzrL5tobPNsC7oCChXG4hahDYVb8Rdcex0/2000-01-01/2025-07-23/transactions.json"
+
+response = requests.get(url)
+print(response)
+data = response.json()
+
+with open(r"u:\Dropbox\!!!Days\Downloads Z230\Fio\pohyby.json", "w", encoding="utf-8") as f:
+ json.dump(data, f, ensure_ascii=False, indent=4)
+#
+# # Print some info
+# for trans in data['accountStatement']['transactionList']['transaction']:
+# print(f"Date: {trans['column0']['value']}")
+# print(f"Amount: {trans['column1']['value']}")
+# print(f"Currency: {trans['column14']['value']}")
+# print(f"Sender/Receiver: {trans['column10']['value']}")
+# print(f"Message: {trans['column16']['value']}")
+# print("-" * 40)
diff --git a/outlook.py b/outlook.py
new file mode 100644
index 0000000..bbdd07f
--- /dev/null
+++ b/outlook.py
@@ -0,0 +1,32 @@
+import win32com.client
+
+
+def process_outlook_emails_from_root():
+ # Connect to Outlook
+ outlook = win32com.client.Dispatch("Outlook.Application").GetNamespace("MAPI")
+
+ # Get the root folder of the mailbox
+ root_folder = outlook.Folders.Item(1) # Typically the first item is the root
+
+ # Recursive function to process all folders
+ def process_folder(folder):
+ print(f"\nProcessing folder: {folder.Name}")
+
+ # # Iterate through all items in the current folder
+ # for item in folder.Items:
+ # if item.Class == 43: # 43 is the class for MailItem
+ # print(f"Found email - Subject: {item.Subject}")
+ # print(f" From: {item.SenderName}")
+ # print(f" Received: {item.ReceivedTime}")
+ # # Add your email processing logic here
+
+ # Recursively process subfolders
+ for subfolder in folder.Folders:
+ process_folder(subfolder)
+
+ # Start processing from the root folder
+ process_folder(root_folder)
+
+
+if __name__ == "__main__":
+ process_outlook_emails_from_root()
\ No newline at end of file
diff --git a/tagpdf.py b/tagpdf.py
new file mode 100644
index 0000000..dcc8825
--- /dev/null
+++ b/tagpdf.py
@@ -0,0 +1,24 @@
+from pypdf import PdfReader, PdfWriter
+
+# Load the existing PDF
+reader = PdfReader(r"u:\Dropbox\!!!Days\Downloads Z230\output11.pdf")
+writer = PdfWriter()
+
+# Copy all pages to the writer
+for page in reader.pages:
+ writer.add_page(page)
+
+#Get metadata
+metadata = reader.metadata
+author = metadata.get("/Author","")
+author=author+', YourName'
+print(author)
+
+# Set metadata
+writer.add_metadata({"/Author": ""})
+writer.add_metadata({"/Author": author})
+
+# Save the updated PDF
+with open(r"u:\Dropbox\!!!Days\Downloads Z230\output11.pdf", "wb") as f:
+ writer.write(f)
+
diff --git a/tinker.py b/tinker.py
new file mode 100644
index 0000000..a3602ce
--- /dev/null
+++ b/tinker.py
@@ -0,0 +1,35 @@
+import tkinter as tk
+from tkinter import messagebox
+
+def on_select(event):
+ # Get selected item's index
+ selection = listbox.curselection()
+ if selection:
+ index = selection[0]
+ # Get the selected item
+ item = listbox.get(index)
+ # Update label or show a message
+ label.config(text=f"Selected: {item}")
+ # Or display a message box
+ # messagebox.showinfo("Selection", f"You selected: {item}")
+
+root = tk.Tk()
+root.title("Listbox Example")
+
+# Sample list of items
+items = ["Apple", "Ban Banana", "Cherry", "Date", "Elderberry"]
+
+# Create a Listbox widget
+listbox = tk.Listbox(root)
+for item in items:
+ listbox.insert(tk.END, item)
+listbox.pack(padx=10, pady=10)
+
+# Bind the select event
+listbox.bind('<>', on_select)
+
+# Label to display selected item
+label = tk.Label(root, text="Select an item")
+label.pack(pady=5)
+
+root.mainloop()
\ No newline at end of file