From e635d7fda533d253de9566e6cd78eb955dd0726b Mon Sep 17 00:00:00 2001 From: Vladimir Buzalka Date: Sun, 26 Oct 2025 18:47:00 +0100 Subject: [PATCH] notebook --- .idea/.name | 1 + .idea/Medicus1.iml | 7 + 2025-06-17 Files and Folders.py | 168 +++++++++++++++ AMBSUKL214235369G_31DEC2024.pfx | Bin 0 -> 9203 bytes Access.py | 48 +++++ DatovaSchranka.py | 105 ++++++++++ Davka001.py | 276 ++++++++++++++++++++++++ FIO1.py | 85 ++++++++ Kontakty01.py | 78 +++++++ PDF - doplnění jména.py | 58 +++++ PDFmanipulation (2).py | 22 ++ Pojistovna.py | 10 + Reporty01.py | 361 ++++++++++++++++++++++++++++++++ Reporty02.py | 346 ++++++++++++++++++++++++++++++ SMSCallBackDebug.py | 17 ++ eRecept.py | 34 +++ fio.py | 24 +++ outlook.py | 32 +++ tagpdf.py | 24 +++ tinker.py | 35 ++++ 20 files changed, 1731 insertions(+) create mode 100644 .idea/.name create mode 100644 .idea/Medicus1.iml create mode 100644 2025-06-17 Files and Folders.py create mode 100644 AMBSUKL214235369G_31DEC2024.pfx create mode 100644 Access.py create mode 100644 DatovaSchranka.py create mode 100644 Davka001.py create mode 100644 FIO1.py create mode 100644 Kontakty01.py create mode 100644 PDF - doplnění jména.py create mode 100644 PDFmanipulation (2).py create mode 100644 Pojistovna.py create mode 100644 Reporty01.py create mode 100644 Reporty02.py create mode 100644 SMSCallBackDebug.py create mode 100644 eRecept.py create mode 100644 fio.py create mode 100644 outlook.py create mode 100644 tagpdf.py create mode 100644 tinker.py 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 0000000000000000000000000000000000000000..1a4a2f5b178673c08785136404ce7634f6114a68 GIT binary patch literal 9203 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 literal 0 HcmV?d00001 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