/*********************************************************************** * * Standard HL7 to CareVue mapping */ /* * Copyright (c) 1995, 1996 Gunther Schadow. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "carevue.h" /* * Sex Code */ #include "SexCode.h" const char* sex2cv(SexCode::Value sex) { switch(sex) { case SexCode::Fem: return "W"; case SexCode::Male: return "M"; case SexCode::Other: return ""; case SexCode::Unk: return ""; default: return NULL; } } /* * Date */ #include "DTtyp.h" extern "C" int sprintf(char *, const char *, ...); const char* dt2cvdate(DTtyp& dt) { if(dt.ispresent()) if(dt.isnull()) return ""; else { char *res = new char[11]; sprintf(res, "%02u/%02u/%04u", dt.getDay(), dt.getMonth(), dt.getYear()); return res; } else return NULL; } /* * ZDM Segment */ #include "ZDMseg.h" #include "PIDseg.h" #include "NK1seg.h" #include "PV1seg.h" #include "AL1seg.h" #include "DG1seg.h" #include #define TRNC(str, len) ({ const char *s = (const char *)str; \ buf[0] = '\0'; \ s = ( s == NULL ? s : strncpy(buf, s, len + 1) ); \ buf[len + 1] = '\0'; s; }) #define CONC(str, len, del) ({ const char *s = (const char *)str; \ if(s != NULL && *s != '\0') { \ int l = strlen(buf); \ l = ( l == 0 ? 0 : l - 1 ); \ if(buf[l] != '\0' && buf[l] != *del) \ strncat(buf, del, len + 1); \ strncat(buf, s, len + 1); \ buf[len + 1] = '\0'; } buf; }) ZDMseg assemble_zdm(PIDseg &pid, PV1seg &pv1) return zdm { char buf[256]; zdm.Zdm1 = TRNC(pid.PatName.FamName, 30); // name zdm.Zdm2 = TRNC(pid.PatName.GivenName, 20); // Vorname zdm.Zdm3 = TRNC(pid.PatIdIntId[0].IdNum, 14); // acctNum zdm.Zdm4 = TRNC(pv1.VisitNum.IdNum, 9); // medRecNum zdm.Zdm5 = sex2cv(pid.Sex); // sex zdm.Zdm6 = dt2cvdate(pid.DateOfBirth); // DOB zdm.Zdm7 = dt2cvdate(pv1.AdmitDateTime); // admDate zdm.Zdm8 = TRNC(pv1.ConSulDoc[0].IdNum, 8); // attendMD // Patient Address TRNC(pid.PatAdd[0].StrAdd, 40); CONC(pid.PatAdd[0].OtherDes, 40, ","); CONC(pid.PatAdd[0].City, 40, ","); CONC(pid.PatAdd[0].StateOrPro, 40, ","); CONC(pid.PatAdd[0].Zip, 40, ","); CONC(pid.PatAdd[0].Cou, 40, ","); zdm.Zdm19 = buf; // Patient Telephon TRNC(pid.PhoneNumHome[0], 20); CONC(pid.PhoneNumHome[1], 20, ","); CONC(pid.PhoneNumHome[2], 20, ","); CONC(pid.PhoneNumBus[0], 20, ","); CONC(pid.PhoneNumBus[1], 20, ","); CONC(pid.PhoneNumBus[2], 20, ","); zdm.Zdm20 = buf; } ZDMseg assemble_zdm(PIDseg &pid, PV1seg &pv1, repstruc &rnk1, repstruc &al1, DG1seg &dg1, repstruc &robx) return zdm { char buf[256]; // A COPY OF THE ABOVE ASSIGNMENTS // zdm.Zdm1 = TRNC(pid.PatName.FamName, 30); // name zdm.Zdm2 = TRNC(pid.PatName.GivenName, 20); // Vorname zdm.Zdm3 = TRNC(pid.PatIdIntId[0].IdNum, 14); // acctNum zdm.Zdm4 = TRNC(pv1.VisitNum.IdNum, 9); // medRecNum zdm.Zdm5 = sex2cv(pid.Sex); // sex zdm.Zdm6 = dt2cvdate(pid.DateOfBirth); // DOB zdm.Zdm7 = dt2cvdate(pv1.AdmitDateTime); // admDate zdm.Zdm8 = TRNC(pv1.ConSulDoc[0].IdNum, 8); // attendMD // Patient Address TRNC(pid.PatAdd[0].StrAdd, 40); CONC(pid.PatAdd[0].OtherDes, 40, ","); CONC(pid.PatAdd[0].City, 40, ","); CONC(pid.PatAdd[0].StateOrPro, 40, ","); CONC(pid.PatAdd[0].Zip, 40, ","); CONC(pid.PatAdd[0].Cou, 40, ","); zdm.Zdm19 = buf; // Patient Telephon TRNC(pid.PhoneNumHome[0], 20); CONC(pid.PhoneNumHome[1], 20, ","); CONC(pid.PhoneNumHome[2], 20, ","); CONC(pid.PhoneNumBus[0], 20, ","); CONC(pid.PhoneNumBus[1], 20, ","); CONC(pid.PhoneNumBus[2], 20, ","); zdm.Zdm20 = buf; // // END OF COPY zdm.Zdm9 = TRNC(dg1.DiaGnoDes, 39); // Diagnose zdm.Zdm10 = TRNC(al1[0].AllCodeMneDes.Text, 20); // allergy1 zdm.Zdm11 = TRNC(al1[1].AllCodeMneDes.Text, 20); // allergy2 zdm.Zdm12 = TRNC(al1[2].AllCodeMneDes.Text, 20); // allergy3 // NextOfKin is mapped dependent on ConTactRole: for(repstruc *rnk1p = &rnk1; !rnk1p->end(); rnk1p = rnk1p->next()) { NK1seg &nk1 = rnk1p->first(); if((nk1.ConTactRole.Ide == "EA") || (nk1.ConTactRole.Ide == "NK")) { // nextKin ``GivenName FamName'' TRNC(nk1.Name.GivenName, 20); CONC(nk1.Name.FamName, 20, " "); zdm.Zdm13 = buf; zdm.Zdm14 = TRNC(nk1.PhoneNum[0], 20); // kinPhone zdm.Zdm15 = TRNC(nk1.PhoneNum[1], 20); // kinPhonezwei zdm.Zdm16 = TRNC(nk1.PhoneNum[2], 20); // kinPhonedrei } else if(nk1.ConTactRole.Ide == "FD") { // Hausarzt ``GivenName FamName'' TRNC(nk1.Name.GivenName, 20); CONC(nk1.Name.FamName, 20, " "); zdm.Zdm17 = buf; // HArztTel TRNC(nk1.BusPhoneNum, 20); CONC(nk1.PhoneNum[0], 20, ","); CONC(nk1.PhoneNum[1], 20, ","); CONC(nk1.PhoneNum[2], 20, ","); zdm.Zdm18 = buf; } } // OBX for Original Severity (APACHE score) for(repstruc *robxp = &robx; !robxp->end(); robxp = robxp->next()) { OBXseg &obx = robxp->first(); if(obx.ObsIde.Ide == "1000.17") zdm.Zdm21 = TRNC(obx.ObsValue, 15); } return zdm; } /* * Fix for CareVue's medRecNum/acctNum mismatch */ #include "CheckDigit.h" void fix_pid(PIDseg &pid, PV1seg &pv1) { IDtyp id = pv1.VisitNum.IdNum; pv1.VisitNum = pid.PatIdIntId[0]; pid.PatIdIntId[0].IdNum = id; pid.PatIdIntId[0].CheckDigit = cdmod(id, 10); pid.PatIdIntId[0].CheckDigitSch = CheckDigitSchCode::M10val; } /* * DISCHARGE DISPOSITION x DISCHARGE TO LOCATION -> DISCHARGE DISPOSITION */ #include "DisDisCode.h" DisDisCode::Value dis2hp(DisDisCode::Value dis) { switch(dis) { case DisDisCode::not_present: return DisDisCode::not_present; case DisDisCode::null: return DisDisCode::null; case DisDisCode::Home: return DisDisCode::HpHome; case DisDisCode::Dec: return DisDisCode::HpDec; default: return DisDisCode::HpOther; } } ResStatusCode::Value obrrsc2hp(ResStatusCode::Value x) { switch(x) { case ResStatusCode::Oval: case ResStatusCode::Yval: case ResStatusCode::Zval: return ResStatusCode::Xval; case ResStatusCode::Rval: return ResStatusCode::Pval; case ResStatusCode::Sval: return ResStatusCode::Ival; default: return x; } } ObsResStatusCodesIntCode::Value obxrsc2hp(ObsResStatusCodesIntCode::Value x) { switch(x) { case ObsResStatusCodesIntCode::Dval: return ObsResStatusCodesIntCode::Xval; case ObsResStatusCodesIntCode::Rval: return ObsResStatusCodesIntCode::Pval; case ObsResStatusCodesIntCode::Uval: return ObsResStatusCodesIntCode::null; default: return x; } } AbnFlagsCode::Value abf2hp(AbnFlagsCode::Value x) { switch(x) { case AbnFlagsCode::not_present: return AbnFlagsCode::not_present; case AbnFlagsCode::Nval: return AbnFlagsCode::Nval; case AbnFlagsCode::Aval: case AbnFlagsCode::_LTval: case AbnFlagsCode::_GTval: case AbnFlagsCode::Hval: case AbnFlagsCode::Lval: case AbnFlagsCode::Wval: return AbnFlagsCode::Aval; case AbnFlagsCode::AAval: case AbnFlagsCode::HHval: case AbnFlagsCode::LLval: return AbnFlagsCode::Lval; default: return AbnFlagsCode::null; } }