diff --git a/0_application/app.py b/0_application/app.py
index 32c8741..da2d889 100644
--- a/0_application/app.py
+++ b/0_application/app.py
@@ -29,6 +29,7 @@ from src.models import AppConfig
from src.parser import parse_input_file, group_by_employee, get_unique_antragsnummern, get_unique_employees
from src.validator import validate_input_file, validate_template
from src.writer import generate_activity_reports
+from version_check import UPDATE_DIR, get_latest_version
def set_active_employee(employee_name: str):
@@ -76,6 +77,60 @@ except Exception as e:
st.error(f"Fehler beim Laden der Konfiguration: {e}")
st.stop()
+# --- Versionsinformation für die dezente Anzeige am Seitenende ---
+current_version_text = ""
+try:
+ local_version, latest_version = get_latest_version()
+ current_version_text = f"v{'.'.join(map(str, local_version))}"
+ if latest_version:
+ available_version, _ = latest_version
+ version_text = ".".join(map(str, available_version))
+ st.html(
+ f'''
+
+ '''
+ )
+ with st.container(key="update_notice_open"):
+ if st.button("Update Ordner öffnen 📁", key="open_update_directory", help="Update-Ordner öffnen"):
+ if sys.platform == "win32":
+ os.startfile(str(UPDATE_DIR))
+except Exception:
+ pass
+
# --- Session State initialisieren ---
if "parsed_records" not in st.session_state:
st.session_state.parsed_records = []
@@ -94,7 +149,6 @@ if "cached_tpl_result" not in st.session_state:
st.session_state.cached_tpl_result = None
if "employee_months" not in st.session_state:
st.session_state.employee_months = {}
-
# --- Layout: zwei Spalten ---
col1, col2 = st.columns(2)
@@ -433,3 +487,10 @@ if "generated_files" in st.session_state and st.session_state.generated_files:
help="Ordner im Finder öffnen",
use_container_width=True,
)
+
+if current_version_text:
+ st.markdown(
+ f'
'
+ f'Programmversion {current_version_text}
',
+ unsafe_allow_html=True,
+ )
diff --git a/0_application/version_check.py b/0_application/version_check.py
new file mode 100644
index 0000000..7ba6e1b
--- /dev/null
+++ b/0_application/version_check.py
@@ -0,0 +1,49 @@
+"""Prüft auf neuere Programmversionen im zentralen SMB-Verzeichnis."""
+
+import re
+from pathlib import Path
+
+UPDATE_DIR = Path(r"j:\Fachbereiche\BO\Produktionsschule\Maßnahmeunterlagen\20_Personal\05_Tätigkeitsnachweise ESF\Nachweise-automatisiert-generieren")
+VERSION_PATTERN = re.compile(r"Tätigkeitsnachweis-Generator v(\d+)\.(\d+)\.(\d+)(?:\.\d+)?\.(zip|exe)$", re.IGNORECASE)
+CHANGELOG_PATTERN = re.compile(r"^## \[(\d+)\.(\d+)(?:\.(\d+))?\]", re.MULTILINE)
+
+
+def get_latest_version():
+ match = CHANGELOG_PATTERN.search(Path(__file__).with_name("CHANGELOG.md").read_text(encoding="utf-8"))
+ current = tuple(int(part or 0) for part in match.groups()) if match else (0, 0, 0)
+ try:
+ available = UPDATE_DIR.exists()
+ except OSError:
+ available = False
+ if not available:
+ return current, None
+ newer = []
+ try:
+ paths = UPDATE_DIR.iterdir()
+ for path in paths:
+ found = VERSION_PATTERN.fullmatch(path.name)
+ if found:
+ version = tuple(int(found.group(i)) for i in range(1, 4))
+ if version > current:
+ newer.append((version, path))
+ except OSError:
+ return current, None
+ if newer:
+ return current, max(newer)
+ return current, None
+
+
+def main() -> int:
+ current, latest = get_latest_version()
+ print(f"[INFO] Lokale Version: v{'.'.join(map(str, current))}")
+ if latest:
+ version, path = latest
+ print(f"[HINWEIS] Neuere Version verfügbar: v{'.'.join(map(str, version))}")
+ print(f"[HINWEIS] Datei: {path}")
+ else:
+ print("[INFO] Keine neuere Version gefunden oder Update-Verzeichnis nicht erreichbar.")
+ return 0
+
+
+if __name__ == "__main__":
+ raise SystemExit(main())