This commit is contained in:
2025-10-26 18:47:00 +01:00
parent e07296f23f
commit e635d7fda5
20 changed files with 1731 additions and 0 deletions

1
.idea/.name generated Normal file
View File

@@ -0,0 +1 @@
Medicus

7
.idea/Medicus1.iml generated Normal file
View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="NewModuleRootManager">
<orderEntry type="jdk" jdkName="Python 3.12" jdkType="Python SDK" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
</module>

View File

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

Binary file not shown.

48
Access.py Normal file
View File

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

105
DatovaSchranka.py Normal file
View File

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

276
Davka001.py Normal file
View File

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

85
FIO1.py Normal file
View File

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

78
Kontakty01.py Normal file
View File

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

View File

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

22
PDFmanipulation (2).py Normal file
View File

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

10
Pojistovna.py Normal file
View File

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

361
Reporty01.py Normal file
View File

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

346
Reporty02.py Normal file
View File

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

17
SMSCallBackDebug.py Normal file
View File

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

34
eRecept.py Normal file
View File

@@ -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://<ERECEPT_ENDPOINT>/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)

24
fio.py Normal file
View File

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

32
outlook.py Normal file
View File

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

24
tagpdf.py Normal file
View File

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

35
tinker.py Normal file
View File

@@ -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('<<ListboxSelect>>', on_select)
# Label to display selected item
label = tk.Label(root, text="Select an item")
label.pack(pady=5)
root.mainloop()