Automatische Patientenmarker

Sie können mit vordefinierten Regeln Patientenmarker automatisch setzen und entfernen. Zum Auswerten der Regeln greift tomedo® auf die Skriptsprache Python zurück. Dies bietet Ihnen die Möglichkeit, einfache Skripte selbst zu schreiben. Im erweiterten Modus stehen Ihnen alle Möglichkeiten einer hochentwickelten Skriptsprache zur Verfügung.

Sobald Sie die Checkbox „automatisch setzen“ aktiviert haben, ermöglicht Ihnen der rechte Bereich der Marker-Verwaltung das Erstellen und Testen der automatischen Marker.

tomedo handbuch patientenmarker automatische marker

Mit dem Suchfeld 1 können Sie einen Patienten laden, an dem Sie die Automatisierung testen können. Unterhalb des Patientenbildes 2 sehen Sie alle bei diesem Patienten bereits vorhandenen Marker. Die Auswahltabs 3 erlauben Ihnen, zwischen dem „einfachen“, „erweiterten“ und modularen Modus zu wechseln. Eine genaue Beschreibung der Modi erfolgt in den jeweiligen Unterkapiteln. In das darunter liegende Textfeld können Sie die Skripte mit den Regeln zur Automatisierung schreiben. Der „Skripte testen“-Button 5 testet alle verfügbaren automatischen Marker am geladenen Patienten. Mögliche Fehler werden als Nachricht am oberen rechten Bildschirmrand angezeigt. Zusätzlich wird auch die Ausführungszeit aller Skripte gemessen und ausgegeben. Die Fehler- und Zeitausgabe findet nur in der Markerverwaltung statt.

Mit dem „Skript kopieren“-Button 4 kopieren Sie den gesamten Python-Code des geladenen Patienten in die Zwischenablage. Dies ermöglicht Ihnen das Entwickeln und Testen Ihrer Skripte in einer separaten Entwicklungsumgebung. Das kopierte Skript enthält dabei auch die zur Ausführung notwendigen Patientendaten. Eine ausführliche Anleitung zur Nutzung dieses Modus finden Sie unter dem Punkt „externe Entwicklungsumgebung nutzen“.

Beim Laden des Patientenbildes in Kartei, Patientendetails und Patienteninfo sowie bei Änderungen in der Kartei und Patientendetails werden die Skripte im Hintergrund ausgeführt und die entsprechenden Marker gesetzt bzw. entfernt, sobald die Berechnungen beendet wurden. Die Ladezeit des entsprechenden Fensters wird dadurch nicht verlängert. Falls die Ausführungszeit der Skripte jedoch sehr lang ist, kann es passieren, dass die Marker erst deutlich nach dem Laden des Patientenbildes durch die Automatisierung geändert werden. Vermeiden Sie deswegen Ausführzeiten oberhalb des einstelligen Sekundenbereichs.

Die Tabelle 6 im rechten Bereich der Markerverwaltung enthält alle verfügbaren Variablen sowie ihren Datentyp und eine kurze Beschreibung. Durch einen Doppelklick auf eine Zeile kopieren Sie die entsprechende Variable in das Skriptfeld. Mit dem Suchfeld 7 können Sie die Variablentabelle durchsuchen.

Ein Klick auf das Fragezeichenlogo 8 öffnet dieses Handbuchkapitel.

Manuelles Abschalten automatisierter Marker

Möchten Sie die Automatisierung bei einzelnen Patienten vorübergehend deaktivieren, so muss in der Markeransicht der Zustand des Markers (aktiviert oder deaktiviert) manuell geändert werden. Dadurch ändert sich das Pfeilsymbol in der Markerliste neben dem entsprechenden Marker zu einem durchgestrichenen Symbol 1 und zeigt damit an, dass der Marker nicht mehr automatisch aktualisiert wird. Um die Automatisierung wieder einzuschalten, klicken Sie auf das Pfeilsymbol (nicht auf die Checkbox).

tomedo handbuch patientenmarker automatische marker2

Aufgrund der historischen Entwicklung von tomedo® ist es nicht möglich, die Automatisierung über das Patienteninfo-Panel an- bzw. abzuschalten. Wird als Beispiel ein bestehender Marker über das Panel deaktiviert, so gilt er als inaktiv. Er ist damit bei diesem Patienten nicht mehr in der Markerliste sichtbar 2, weshalb die Automatisierung in diesem Zustand des Markers weder an- noch abgeschaltet werden kann. Wenn ein Marker vor der Inaktivschaltung automatisiert wurde, wird die Automatisierung erneut aktiviert, sobald sich an der Kartei Daten ändern. Die Verwendung der Vorberechnung setzt einen Marker ebenfalls wieder zurück auf aktiv, wodurch er automatisiert gesetzt wird.

Möchten Sie einen automatisiert gesetzten Marker bei einem Patienten entfernen, so muss zunächst die Automatisierung abgeschaltet und anschließend durch Klick auf die Checkbox der Marker entfernt werden.

tomedo handbuch patientenmarker automatische marker3

Der modulare Modus

Automatische Marker können auch anhand einer grafischen Oberfläche, analog der patientenbezogenen Statistiken, und ohne die Hilfe von Python-Skripten erstellt werden.

tomedo handbuch patientenmarker modularer modus

Über die Auswahlliste, die erscheint, sobald Sie auf das „+“-Symbol 1 klicken, wählen Sie die Kriterien aus, nach denen der Marker gesetzt werden soll. In Abhängigkeit vom ausgewählten Elementtyp 2 (z.B. Versicherung oder Patienteninfos) sind weitere Auswahl- und Eingabefelder 3 (z.B. IK-Nummer, Geschlecht oder Geburtstag) konfigurierbar. Über die „+“- und „–“-Buttons neben den Elementtypen können weitere Felder hinzugefügt oder gelöscht werden.

Hinweise zur Konfiguration einzelner Elemente

  1. Bei Texteinträgen, wie beispielsweise der Bezeichnung einer Diagnose oder dem Code einer Leistungsziffer, lässt sich festlegen, ob der gewünschte Texteintrag in der Patientenkartei exakt übereinstimmen muss oder ob der Text lediglich enthalten sein soll. Zum Beispiel im Falle von Diagnosen lässt sich damit leicht eine ganze Gruppe möglicher Diagnosen erfassen.
  2. Die Namen von Betriebsstätten und Nutzern müssen hingegen mit den in tomedo® hinterlegten Angaben exakt übereinstimmen.
  3. Datumsangaben können relativ zum aktuellen Tag/Quartal/Jahr oder als fester Wert vorgegeben werden.
  4. Einige Felder, wie z.B. Geschlecht und Privatpatient, erfordern die Angabe konkret vorgegebener Werte. Diese werden im zugehörigen Tooltip angezeigt.

Erklärung zur Verknüpfung der einzelnen Elemente

Für jeden eingetragenen Typ muss ein Bezeichner 4 definiert werden, über dessen Name dann in der Zeile „logische Verknüpfung“ 5 die verschiedenen Kriterien über verschiedene Relationen miteinander verknüpft werden. Mögliche Relationen sind „Und (&)“, „Oder (+)“ und „Nicht (–)“. So wird zum Beispiel. A&(-B+C) als „A Und (Nicht B Oder C)“ übersetzt.

tomedo handbuch patientenmarker modularer modus verknuepfungen

Alle Elemente die zu einem Typ gehören, werden durch eine UND-Bedingung verknüpft. Dies betrifft im Beispiel die Elemente „Geschlecht“ und „Geburtsdatum“, welchem mit dem Bezeichner B zusammengefasst werden. Demnach ist Bedingung B nur erfüllt wenn das Geschlecht des Patienten „W“, d.h. weiblich, ist und das Geburtsdatum bis 40 Jahre vom Anfang des aktuellen Jahres zurück liegt. Zu Bezeichner A gehört lediglich das Element IK-Nummer. D.h. wenn die IK-Nummer vom KV-Schein des Patienten mit dieser Nummer übereinstimmt, ist Bedingung A erfüllt. Als logische Verknüpfung wird A&B verwendet. Zusammengefasst bedeutet dies, dass der Marker nur gesetzt wird, wenn der Patient weiblich, höchstens 40 Jahre alt und bei der Krankenkasse mit der in Bedingung A hinterlegten IK-Nummer versichert ist.

Die Variablen

Für Experten: Vordefinierte globale Variablen ermöglichen Ihnen den Lesezugriff auf die Daten des Patienten für den einfachen und erweiterten Modus. Bei dem einfachen und erweiterten Modus benötigen Sie Kenntnisse in Python.

Hinweis: Achten Sie bitte unbedingt auch auf die Schreibweise mit Hochkommas anstatt Anführungszeichen!

Die Daten werden in verschiedenen Formaten zur Verfügung gestellt, diese sind:

  • String: Eine einfache Zeichenkette z.B. ‚chronisch’
  • Integer: Eine ganze Zahl, z.B. 3
  • Float: Eine rationale Zahl, z.B. 3,4. Achten Sie darauf, dass Sie im Skript einen Punkt als Dezimaltrennzeichen verwenden müssen, d.h. 3.4.
  • Date: Ein Datum als String im Format dd.mm.JJJJ z.B. ‚12.03.2017‘
  • Bool: Die Zahl 0 für falsch/false und 1 für wahr/true
  • Jahr + Quartal: Berechnet wird eine Gleitkommazahl nach der Formel Jahr+0.25*(Quartal-1). Beachten Sie die Punkt anstatt der Kommaschreibweise für rationale Zahlen. Für 2017 ergibt sich:
    • 2017.00 → 1. Quartal 2017
    • 2017.25 → 2. Quartal 2017
    • 2017.50 → 3. Quartal 2017
    • 2017.75 → 4. Quartal 2017
    • 2018.00 → 1. Quartal 2018

Neben diesen einfachen Datentypen steht auch ein komplexerer Datentyp zur Verfügung, nämlich das Wörterbuch. Wörterbücher geben den Eintrag, der hinter einem Schlüsselwort hinterlegt ist, wieder. So würde z.B. patient[’name‘] den Namen eines Patienten zurückgeben. Für die Markerautomatisierung stehen die folgenden komplexen Datentypen zur Verfügung:

OrgCAV

  • 'datum': Date – cave-Datum
  • 'text': String – cave-Eintrag

KarteiEintrag

  • 'betriebsstaette': String – Betriebsstätte des Karteieintrags
  • 'datum': Date – Datum des Karteieintrags
  • 'doku': String – Kürzel des dokumentierenden Nutzers des Karteieintrags
  • 'eintrag': String – Eintrag des Karteieintrags
  • 'jahr': Integer – Jahr des Karteieintrags
  • ’medientyp': String – Medientyp des Karteieintrags
  • 'quartal': Integer – Quartal des Karteieintrags
  • 'typ': String – Typ des Karteieintrags

Medikamentenverordnung

  • 'abgesetzt': Bool – Ob das Medikament abgesetzt ist
  • 'atc': String – ATC der verordneten Medikamentes
  • 'autIdem': Bool – Ob das Medikament aut-Idem verordnet wurde
  • 'datum': Date – Datum der Medikamentenverordnung
  • 'freitext': String – Freitext zur Verordnung
  • 'jahr': Integer – Jahr der Medikamentenverordnung
  • 'name': String – Name des Medikaments bei Verordnung
  • 'pzn': String – PZN des verordneten Medikamentes
  • 'quartal': Integer – Quartal der Medikamentenverordnung

Diagnose

  • 'bezeichnung': String – Bezeichnung der Diagnose nach dem ICD-Katalog
  • 'code': String – Code der Diagnose nach dem ICD-Katalog
  • 'datum': Date – Datum der Diagnose
  • 'dauerdiagnose': Integer – Dauerdiagnose, 0 für nein, 1 für ja
  • 'freitext': String – Ihr definierter Freitext zur Diagnose
  • 'jahr': Integer – Quartal der Diagnose
  • 'meldepflicht': Integer – Meldepflicht nach dem Infektionsschutzgesetz, 0 für nein, 1 für ja
  • 'ort': Lokalisation der Diagnose, ‚L‘ für links, ‚R‘ für rechts, ‚B‘ für beiderseits
  • 'quartal': Integer – Quartal der Diagnose
  • 'typ': Typ der Diagnose, ‚A‘ für Ausschluss, ‚G‘ für Gesichert, ‚V‘ für Verdacht, ‚Z‘ für symptomfreier Zustand nach Erkrankung
  • 'abgesetzt': Integer – Status der Diagnose, 0 für nein, 1 für ja
  • 'manuell abgesetzt': Status der Diagnose, betrachtet nur manuell abgesetzte Diagnosen, 0 für nein, 1 für ja

Leistung

  • 'abrechner': String – Kürzel des abrechnenden Arztes
  • 'anzahl': Integer – Anzahl der Leistung
  • 'betriebsstaette': String – Kürzel der Betriebsstätte in welcher die Leistung erbracht wurde
  • 'code': String – Code der Leistung gemäß Katalog
  • 'datum': Date – Datum der Leistung
  • 'jahr': integer – Jahr der Leistung
  • 'kurztext': String – Kurztext der Leistung gemäß Katalog
  • 'leistungserbringer': String – Kürzel des Leistungserbringers
  • 'quartal': Integer – Quartal der Leistung
  • 'steigerungsfaktor': Float – Steigerungsfaktor der GOÄ-Leistung, gibt bei allen anderen Leistungen einen Wert von 1.0 zurück

Rechnung

  • 'bemerkung': String – Bemerkungen zur Rechnung
  • 'bezahlt': Bool – Rechnung bezahlt
  • 'bezahltDatum': Date – Datum an dem die Rechnung bezahlt wurde
  • 'datumLetzteLeistung': Date – Datum der letzten Leistung
  • 'druckDatum': Date – Datum des Druckens
  • 'erstelltAm': Date – Erstellungsdatum
  • 'festbetrag': Float – Größe des gesetzten Festbetrags
  • 'freitext': String – Freitext der Rechnung
  • 'kostenvoranschlag': Bool – Kostenvoranschlag erstellt
  • 'kosten': Float – Rechnungsbetrag
  • 'mahnstufe': Integer – Mahnstufe der Rechnung
  • 'mahnDatum1': Date – 1. Mahndatum
  • 'mahnDatum2': Date – 2. Mahndatum
  • 'mahnDatum3': Date – 3. Mahndatum
  • 'sachkosten': Float – Betrag der Sachkosten
  • 'teilbetrag': Bool – Ob ein Teilbetrag gezahlt wurde
  • 'bezahlterTeilbetrag': Float – Höhe des gezahlten Teilbetrags
  • 'versandt': Bool – Ob die Rechnung versandt wurde

Schein

  • 'freitext': String – Notiz zum Schein
  • 'quartal': Integer – Quartal des Scheins
  • 'jahr': Integer – Jahr des Scheins
  • 'sachkosten': Float – Summe der Sachkosten des Scheins
  • 'vermittlungsart': Integer – Nummer der Vermittlungsart; von 0 für „kein Wert“ bis 6 für „Routinefall“
  • 'scheinart': Integer – Nummer der Scheinart; von 0 für „Ärztliche Behandlung“ bis 46 für „Zentraler Notfalldienst“

Zur dynamischen Behandlung von Zeiten gibt es die Variablen

  • 'heuteDatum': Date
  • 'heuteQuartal': Jahr+Quartal

Für die Filterung von Listen der komplexen Datentypen wird die Funktion ’select‘ zur Verfügung gestellt. Diese Funktion steht für Variablen zur Verfügung eine Liste (array) der obigen komplexen Datentypen sind. Die komplexen Datentypen in der Liste müssen das Attribut 'datum' enthalten.

Dieser Funktion wird als erstes Argument eine Liste übergeben und mit benannten Argumenten der entsprechende Zeitraum, auf den die Liste eingeschränkt werden soll. Ein Beispiel für die Liste Karteidiagnosen könnte sein:

select(karteidiagnosen, startQuartal=2016.25, endQuartal=2017.5)

Eine vollständige Übersicht aller verfügbaren Variablen und in welchem Datentyp sie zur Verfügung stehen finden Sie in tomedo®.

Der einfache Modus

Im einfachen Modus steht Ihnen eine Zeile zur Verfügung, die von Python ausgewertet wird. Ist das Ergebnis dieser Zeile ‚1‘ bzw. ‚true‘, wird der Marker gesetzt. In allen anderen Fällen wird der Marker nicht gesetzt bzw. entfernt. So führt p_vorname == 'Hans' zum Setzen des Markers bei allen Patienten mit dem Vornamen Hans.

Der erweiterte Modus

Im erweiterten Modus haben Sie alle Freiheiten, die Ihnen die Sprache Python bietet. Sie könne Schleifen schreiben, verschachtelte if-else-Abfragen konstruieren und externe Pakete importieren. Das Ergebnis der Berechnung muss wieder ‚1‘ bzw. ‚true‘ sein, damit der Marker gesetzt wird, in allen anderen Fällen wird der Marker nicht gesetzt bzw. entfernt. Das bestimmte Ergebnis muss von Ihnen auf die reservierte Variable ‚returnvalue‘ geschrieben werden. Ein mögliches Skript ist:

  1. array = select(karteieintraege, startQuartal=heuteQuartal-0.75,endQuartal=heuteQuartal)
  2. for e in array:
  3.   if e['typ'] == 'PVSEE':
  4.     returnvalue = 1

Dieses Skript prüft in allen Karteieinträgen der letzten 4 Quartale ob ein Karteieintrag vom Typ ‚PVSEE‘ vorhanden ist. Dabei könnte es sich z.B. um eine Privatpatienten Einverständniserklärung handeln.

Externe Entwicklungsumgebung nutzen

Die Nutzung einer externen Entwicklungsumgebung vereinfacht die Entwicklung und das Testen komplexer Skripte. Durch Drücken des „Skript kopieren“-Buttons kopiert tomedo® das Skript mitsamt dem notwendigen Zusatzcode in die Zwischenablage. Diesen Code können Sie dann in eine Entwicklungsumgebung kopieren und ausführen. Das Vorladen eines Patienten über das Patientensuchfeld ist notwendig, da die für das Skript notwendigen Variablen mit den Patientendaten gefüllt werden. Sie sollten beim Entwickeln sicherstellen, dass der ausgewählte Patient ein Kandidat für Ihr Skript ist. So wäre die Auswahl eines Kassenpatienten für ein Skript, welches Privatrechnungen untersucht, unpraktisch.

Haben Sie das letzte Skript

  1. startQuartal=heuteQuartal-0.75
  2. array = select(karteieintraege,startQuartal=startQuartal,endQuartal=heuteQuartal)
  3. for e in array:
  4.   if e['typ'] == 'PVSEE':
  5.     returnvalue = 1

eingegeben, dann hat eine mögliche – vom ausgewählten Patienten abhängige – Ausgabe die nachfolgende Struktur:

  1. # -*- coding: utf-8 -*-
  2. import datetime
  3. #Definition der Funktion select
  4. heuteQuartal = #Berechnung des heutigen Quartals
  5. karteieintraege = [] #Alle Karteieinträge des Patienten
  6. def testTag():
  7.   returnvalue = 0
  8.   array = select(karteieintraege, startQuartal=heuteQuartal-0.75,endQuartal=heuteQuartal)
  9.   for e in array:
  10.     if e[‚typ‘] == ‚PVSEE‘:
  11.       returnvalue = 1
  12.   try:
  13.   return eval("'long(returnvalue)'") except Exception as e:
  14.   return str(e)
  15. testTag()

Der von Ihnen in tomedo® geschriebene Code steht zwischen „def testTag():“ und dem „try“. Zwischen diesen beiden Stellen können Sie Ihren Code entwickeln und testen. Wenn Ihr Code funktioniert können Sie ihn – ggf. nach Löschung der führenden Freizeichen – wieder zurück nach tomedo® kopieren. Kopieren Sie dabei nur den Code zwischen „def testTag():“ und „try“!

Beispielskripte

Für alle Beispielskripte ist der erweiterte Modus notwendig.

Markerprüfung

Dieses Skript prüft, ob der vorgegebene Marker “marker” gesetzt ist und setzt dann diesen Marker.

  1. marker = 'Krankentransport'
  2. returnvalue = 0
  3. if marker in markerliste:
  4.   returnvalue = 1

Diagnosenprüfung

Dieses Skript prüft, ob eine Diagnose mit dem vorgegebenem ICD-Code existiert.

  1. diagnosen = kvdiagnosen + hzvdiagnosen + karteidiagnosen
  2. icdCode = 'I10.90'
  3. returnvalue = 0
  4. for diag in diagnosen:
  5.   if diag['code'] == icdCode:
  6.     returnvalue = 1

Schmerzdokumentation

Dieses Skript prüft, ob bei Schmerzpatienten – d.h. Patienten mit dem Marker „Schmerzpatient“ – in diesem Quartal die Schmerzdokumentation gemacht wurde. Dafür wird geprüft, ob im letzten Quartal ein Karteieintrag des Typs „DOK“ mit dem Eintrag „Schmerzverlauf“ existiert. Wurde die Schmerzdokumentation in diesem Quartal noch nicht gemacht, wird der Marker gesetzt, andernfalls nicht.

  1. typ = 'DOK'
  2. text = 'Schmerzverlauf'
  3. schmerzmarker = ‚Schmerzpatient‘
  4. bStatus = False
  5. if schmerzmarker in markerliste:
  6.   array = select(karteieintraege,startQuartal=heuteQuartal-0.25,endQuartal=heuteQuartal)
  7.   for e in array:
  8.     if e['typ'] == typ:
  9.       if text in e['eintrag']:
  10.         bStatus = True
  11. else:
  12.   bStatus = True
  13. if bStatus:
  14.   returnvalue = 0
  15. else:
  16.   returnvalue = 1

Privatrechnungsstatus

Dieses Skript prüft, ob noch unbezahlte Privatrechnungen vorhanden sind, die seit mehr als den angegebenen Wartetagen nicht bezahlt wurden. Zusätzlich kann die Prüfung für Rechnungen, die älter als ein Abbruchdatum sind, unterbunden werden.

  1. #Parameter
  2. wartetage = 28
  3. abbruch = '20.12.2010'
  4. #Code
  5. abbruchDatum = datetime.datetime.strptime(abbruch,’%d.%m.%Y').date()
  6. heute = datetime.datetime.strptime(heuteDatum, '%d.%m.%Y').date()
  7. for pr in privatrechnungen:
  8.   #Abbruch vor Konvertierungsdatum – die Rechnungen sind
  9.   #chronologisch in die Vergangenheit geordnet
  10.   gedruckt = datetime.datetime.strptime(pr['druckDatum'], '%d.%m.%Y').date()
  11.   if(gedruckt < abbruchDatum):
  12.     break;
  13.   #Falls die Rechnung nicht bezahlt ist, prüfe die Wartezeit seit Druck
  14.   if pr['bezahlt'] == 0:
  15.     gedruckt = datetime.datetime.strptime(pr['druckDatum'],’%d.%m.%Y').date()
  16.   wartezeit = heute – gedruckt
  17.   if(wartezeit.days > wartetage):
  18.     returnvalue = 1
  19.     break
Inhaltsverzeichnis