Zeitzone für den Kommserver ändern

Gerade bei Linux Systemen, die meist in der UTC Zeitzone arbeiten, kann es sein, dass das angezeigte Datumsformat im Kommserver nicht immer mit dem übereinstimmt, in der sich der Server befindet. Um den Kommserver die Daten in der Zeitzone Europe/Berlin anzeigen zu lassen, muss man in der mcservice.vmoptions (Mirth Connect) oder blservice.vmoptions (BridgeLink) Datei, die sich im ROOT-Installationsordner des Mirth Connect / BridgeLink befindet, folgende Zeile anfügen und danach den Dienst neu starten.

-Duser.timezone=Europe/Berlin

„Verbotene“ XML Steuerzeichen ersetzen

Es kann – z.B. innerhalb von Labordaten (HL7 ORU) – vorkommen, dass Steuerzeichen mit gesendet werden, die in XML nicht erlaubt sind. Da der Mirth / BridgeLink eine HL7v2 Nachricht – sofern es einen Filter oder Transformer gibt – immer in XML umwandelt, kann es hier zu Problemen kommen. Als Beispiel für einen dann auftretenden Fehler ist die Meldung:

TypeError: An invalid XML character (Unicode: 0x15) was found in the element content of the document.

Das Problem kann im Preprocessor des Channels abgefangen werden, indem man ungültige Steuerzeichen entfernt. Um alle ungültigen Steuerzeichen zu entfernen, kann man folgenden String verwenden:

message = message.replace(/[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD]/g, '');

Es ist allerdings ratsam die Steuerzeichen gegen das erwartete Zeichen zu ersetzen. Im obigen Beispiel ist der Unicode 0x15 erwähnt. Wenn man sich die Nachricht anschaut, sollte hier ein Paragraph-Zeichen stehen (§). In dem Fall könnte man also nur den Unicode 0x15 mit § ersetzen:

message = message.replace(/\u0015/g, '§');

Führende Nullen anhängen / entfernen

Grade bei Systemen wie SAP i.s.h. (med) werden Fall- und Patientennummer auf Grund fixer Längenwerte oft mit führenden Nullen versendet. Da manche Subsysteme mit diesen Werten nicht umgehen können, gibt es am Mirth® Connect oder BridgeLink Kommunikationsserver die Möglichkeit, mittels Javascript die führenden Nullen beim Versand zum Subsystem zu entfernen und für den Rückweg zum KIS wieder anzuhängen.

Um das Anhängen / Enfernen der Nullen dynamisch zu gestalten, wird hierfür eine while-Schleife verwendet. Wir gehen in dem Beispiel zudem davon aus, dass die Feldlänge 10-stellig ist.

In einen Transformer des Ziels zum Subsystem muss folgender Code (hier im Beispiel die Fallnummer im Feld 19 des PV1 Segmentes) hinzugefügt werden:

while(msg['PV1']['PV1.19']['PV1.19.1'].toString().length < 10)
{
msg['PV1']['PV1.19']['PV1.19.1'] = "0" + msg['PV1']['PV1.19']['PV1.19.1'].toString();
}

Wenn wir auf dem Rückweg vom Subsystem zum KIS die führenden Nullen wieder entfernen möchten, so nutzen wir folgenden Javascript Code im Transformer des Ziels:

while(msg['PV1']['PV1.19']['PV1.19.1'].toString().substring(0,1) == "0")
{
msg['PV1']['PV1.19']['PV1.19.1'] = msg['PV1']['PV1.19']['PV1.19.1'].toString().substring(1);
}

Prüfen, ob ein Feld numerisch ist

Manchmal kommt es vor, dass bestimmte Felder dahingehend geprüft werden müssen, ob diese ausschließlich Ziffern erhalten. Hierfür kann die JavaScript-Funktion isNaN() genutzt werden. isNaN steht für „is not a number“. Wenn Sie z.B. Nachrichten filtern möchten, bei denen die Fallnummer keine Zahl ist, so können Sie diesen JavaScript Code in ihrem Filter nutzen:

if(!isNaN(msg['PV1']['PV1.19']['PV1.19.1'].toString()))
        return true;
return false;

Wie Sie sehen, lassen wir die Nachricht durch, wenn die Funktion false zurück liefert. Dies hat den Grund, dass die Funktion ein true ausgibt, wenn es sich nicht um eine Zahl handelt.

Hierbei müssen jedoch einige Dinge beachtetet werden. Ist das Feld, das Sie prüfen wollen, nämlich leer, so liefert die Funktion isNaN() ebenfalls false zurück und die Nachricht würde weitergeleitet werden.

Weitere Informationen und Besonderheiten zu dieser Funktion finden Sie auch unter https://www.w3schools.com/jsref/jsref_isNaN.asp

Fehler herbeiführen wenn Daten unvollständig

Bei einem unserer aktuellen Projekte dürfen nur Daten weitergeleitet werden, deren Datensatz vollständig ist. Unvollständige Daten werden per Mail gemeldet. Dabei spielt die Reihenfolge der Daten kein Problem, weshalb wir bei unvollständigen Daten der Einfachheit halber mit dem gezielten Generieren eines Fehlers arbeiten.

Will man einen Datensatz beim Parsen unterbrechen und als Fehler darstellen, wenn der Datensatz unvollständig ist, so hat man mehrere Möglichkeiten. Der einfachste Weg, der bei allen Nachrichtentypen und Konfigurationen funktioniert, ist das Werfen eines Fehlers in JavaScript mit der Funktion throw(String message). Will man z.B. einen Fehler generieren, wenn in der Nachricht keine Fallnummer im Feld 19 des PV1 Segmentes mitgegeben wurde, so kann man dies wie folgt generieren:

if(msg['PV1']['PV1.19']['PV1.19.1'].toString() == '')
    throw('Es wurde keine Fallnummer mitgegeben!');

Das Problem hierbei ist nun, dass nicht rein der Text Es wurde keine Fallnummer mitgegeben! als Fehler erscheint, sondern eine vollständige Ausnahme-Meldung wie z.B.:

Transformer error
ERROR MESSAGE: Error evaluating transformer
com.mirth.connect.server.MirthJavascriptTransformerException: 
CHANNEL:	CSV_RECHNUNGEN_OUT
CONNECTOR:	CSV_RECHNUNGEN_IN
SCRIPT SOURCE:	TRANSFORMER
SOURCE CODE:	
102: 	csv += ";";
103: 
104: 	// Artikelnummer = Ziffer GOÄ. Wenn leer wirf eine Exception
105: 	if(row['column17'] == undefined || row['column17'] == "undefined" || row['column17'].toString() == "")
106: 		throw('In der Datei '+sourceMap.get('originalFilename')+' fehlt in Zeile '+ignoreFirst+' der Wert in Spalte Q');
107: 
108: 	csv += row['column17'].toString() + ";";
109: 
LINE NUMBER:	106
DETAILS:	In der Datei 000991_0557632_20200702.csv fehlt in Zeile 133 der Wert in Spalte Q
	at b1f62e07-c2b6-4ca4-bb80-2e876d04c3a3:106 (doTransform)
	at b1f62e07-c2b6-4ca4-bb80-2e876d04c3a3:198 (doScript)
	at b1f62e07-c2b6-4ca4-bb80-2e876d04c3a3:200
	at com.mirth.connect.server.transformers.JavaScriptFilterTransformer$FilterTransformerTask.doCall(JavaScriptFilterTransformer.java:154)
	at com.mirth.connect.server.transformers.JavaScriptFilterTransformer$FilterTransformerTask.doCall(JavaScriptFilterTransformer.java:119)
	at com.mirth.connect.server.util.javascript.JavaScriptTask.call(JavaScriptTask.java:113)
	at java.util.concurrent.FutureTask.run(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Will man die Fehlermeldung nun z.B. in den Alerts weiter verarbeiten, so muss man die eigentliche Fehlermeldung extrahieren.