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