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