diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f6b277 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ + +target/* diff --git a/src/main/java/edu/gatech/chai/VRDR/model/BirthRecordIdentifier.java b/src/main/java/edu/gatech/chai/VRDR/model/BirthRecordIdentifier.java index 4f737d2..96bd6d7 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/BirthRecordIdentifier.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/BirthRecordIdentifier.java @@ -3,6 +3,7 @@ import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.DateTimeType; import org.hl7.fhir.r4.model.Observation; +import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.StringType; import ca.uhn.fhir.model.api.annotation.ResourceDef; @@ -17,17 +18,22 @@ public BirthRecordIdentifier() { CommonUtil.initResource(this); } - public BirthRecordIdentifier(String value, CodeableConcept birthState, + public BirthRecordIdentifier(String value, Decedent decedent, CodeableConcept birthJurisdiction, DateTimeType birthYear) { this(); setStatus(BirthRecordIdentifierUtil.status); setCode(BirthRecordIdentifierUtil.code); + setDecedent(decedent); setValue(new StringType(value)); - addBirthState(birthState); + addBirthState(birthJurisdiction); addBirthYear(birthYear); } - public CodeableConcept getBirthState() { + public void setDecedent(Decedent decedent) { + Reference reference = new Reference(decedent); + this.setSubject(reference); + } + public CodeableConcept getBirthJurisdiction() { for (ObservationComponentComponent component : getComponent()) { if (component.getCode().equalsShallow(BirthRecordIdentifierUtil.componentBirthStateCode)) { return component.getValueCodeableConcept(); @@ -36,7 +42,7 @@ public CodeableConcept getBirthState() { return null; } - public void setBirthState(CodeableConcept birthState) { + public void setBirthJurisdiction(CodeableConcept birthState) { for (ObservationComponentComponent component : getComponent()) { if (component.getCode().equalsShallow(BirthRecordIdentifierUtil.componentBirthStateCode)) { component.setValue(birthState); diff --git a/src/main/java/edu/gatech/chai/VRDR/model/CauseOfDeathCondition.java b/src/main/java/edu/gatech/chai/VRDR/model/CauseOfDeathCondition.java index 9079c42..97ad7f3 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/CauseOfDeathCondition.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/CauseOfDeathCondition.java @@ -1,26 +1,45 @@ package edu.gatech.chai.VRDR.model; +import java.util.List; + import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Condition; +import org.hl7.fhir.r4.model.Observation; +import org.hl7.fhir.r4.model.Quantity; import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.StringType; import ca.uhn.fhir.model.api.annotation.ResourceDef; import edu.gatech.chai.VRDR.model.util.CauseOfDeathConditionUtil; import edu.gatech.chai.VRDR.model.util.CommonUtil; -@ResourceDef(name = "Condition", profile = "http://hl7.org/fhir/us/vrdr/StructureDefinition/VRDR-Cause-Of-Death-Condition") -public class CauseOfDeathCondition extends Condition { +//NOTE: While the resource name is "CauseOfDeathCondition", it actually derived from Observation +@ResourceDef(name = "Observation", profile = "http://hl7.org/fhir/us/vrdr/StructureDefinition/VRDR-Cause-Of-Death-Condition") +public class CauseOfDeathCondition extends Observation { public CauseOfDeathCondition() { super(); CommonUtil.initResource(this); - this.addCategory(CauseOfDeathConditionUtil.causeOfDeathConditionCategory); + this.setCode(CauseOfDeathConditionUtil.code); } - public CauseOfDeathCondition(Decedent decedent) { + public CauseOfDeathCondition(Decedent decedent, Certifier certifier, String value, Quantity interval) { super(); CommonUtil.initResource(this); - this.addCategory(CauseOfDeathConditionUtil.causeOfDeathConditionCategory); + this.setCode(CauseOfDeathConditionUtil.code); setDecedent(decedent); + setPerformer(certifier); + setValue(value); + createInterval(interval); + } + + public CauseOfDeathCondition(Decedent decedent, Certifier certifier, String value, String interval) { + super(); + CommonUtil.initResource(this); + this.setCode(CauseOfDeathConditionUtil.code); + setDecedent(decedent); + setPerformer(certifier); + setValue(value); + createInterval(interval); } public void setDecedent(Decedent decedent) { @@ -38,32 +57,54 @@ public Reference getDecedent() { public void setCertifier(Certifier certifier) { Reference reference = new Reference(certifier.getId()); - this.asserter = reference; + this.performer.add(reference); } public void setAsserter(Certifier certifier) { setCertifier(certifier); } + public void setPerformer(Certifier certifier) { + setCertifier(certifier); + } - public Reference getCertifier() { - return asserter; + public List getCertifiers(int index) { + return performer; } - public Condition setClinicalStatus(String clinicalStatus) { - CodeableConcept clinicalStatusCC = CommonUtil.findConceptFromCollectionUsingSimpleString(clinicalStatus, CauseOfDeathConditionUtil.conditionClinicalStatusSet); - this.setClinicalStatus(clinicalStatusCC); - return this; + public List getAsserters(int index) { + return performer; } - public Condition setVerificationStatus(String verificationStatus) { - CodeableConcept verificationStatusCC = CommonUtil.findConceptFromCollectionUsingSimpleString(verificationStatus, CauseOfDeathConditionUtil.verificationStatusSet); - this.setVerificationStatus(verificationStatusCC); - return this; + public List getPerformers(int index) { + return performer; } - /*public Condition setCategory(String category) { - CodeableConcept categoryCC = CommonUtil.findConceptFromCollectionUsingSimpleString(category, CauseOfDeathConditionUtil.categorySet); - this.setVerificationStatus(categoryCC); - return this; - }*/ + public Reference getCertifier(int index) { + return performer.get(index); + } + + public void setValue(StringType value) { + if((value.getValue().length() > 120)) { + throw new IllegalArgumentException("CauseOfDeathCondition value "+value.getValue()+" is too long, must be 120 characters or less."); + } + this.setValue(value); + } + + public void setValue(String value) { + setValue(new StringType(value)); + } + + public void createInterval(Quantity quantity) { + ObservationComponentComponent component = new ObservationComponentComponent(); + component.setCode(CauseOfDeathConditionUtil.intervalComponentCode); + component.setValue(quantity); + + } + + public void createInterval(String string) { + ObservationComponentComponent component = new ObservationComponentComponent(); + component.setCode(CauseOfDeathConditionUtil.intervalComponentCode); + component.setValue(new StringType(string)); + + } } \ No newline at end of file diff --git a/src/main/java/edu/gatech/chai/VRDR/model/ConditionContributingToDeath.java b/src/main/java/edu/gatech/chai/VRDR/model/ConditionContributingToDeath.java index 6d6637d..b2128aa 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/ConditionContributingToDeath.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/ConditionContributingToDeath.java @@ -1,41 +1,34 @@ package edu.gatech.chai.VRDR.model; +import java.util.List; + import org.hl7.fhir.r4.model.Condition; +import org.hl7.fhir.r4.model.Observation; +import org.hl7.fhir.r4.model.Quantity; import org.hl7.fhir.r4.model.Reference; +import org.hl7.fhir.r4.model.StringType; +import org.hl7.fhir.r4.model.Observation.ObservationComponentComponent; import ca.uhn.fhir.model.api.annotation.ResourceDef; import edu.gatech.chai.VRDR.model.util.CauseOfDeathConditionUtil; import edu.gatech.chai.VRDR.model.util.CommonUtil; import edu.gatech.chai.VRDR.model.util.ConditionContributingToDeathUtil; -@ResourceDef(name = "Condition", profile = "http://hl7.org/fhir/us/vrdr/StructureDefinition/VRDR-Condition-Contributing-To-Death") -public class ConditionContributingToDeath extends Condition { +@ResourceDef(name = "Observation", profile = "http://hl7.org/fhir/us/vrdr/StructureDefinition/VRDR-Condition-Contributing-To-Death") +public class ConditionContributingToDeath extends Observation { public ConditionContributingToDeath() { super(); CommonUtil.initResource(this); - this.addCategory(ConditionContributingToDeathUtil.conditionContributingToDeathCategory); - } - - public ConditionContributingToDeath(Decedent decedent) { - super(); - CommonUtil.initResource(this); - this.addCategory(CauseOfDeathConditionUtil.causeOfDeathConditionCategory); - setDecedent(decedent); - } - - public ConditionContributingToDeath(Certifier certifier) { - super(); - CommonUtil.initResource(this); - this.addCategory(CauseOfDeathConditionUtil.causeOfDeathConditionCategory); - setCertifier(certifier); + this.setCode(ConditionContributingToDeathUtil.code); } - public ConditionContributingToDeath(Decedent decedent, Certifier certifier) { + public ConditionContributingToDeath(Decedent decedent, Certifier certifier, String value) { super(); CommonUtil.initResource(this); + this.setCode(ConditionContributingToDeathUtil.code); setDecedent(decedent); - this.addCategory(CauseOfDeathConditionUtil.causeOfDeathConditionCategory); - setCertifier(certifier); + setPerformer(certifier); + setValue(value); } public void setDecedent(Decedent decedent) { @@ -53,13 +46,39 @@ public Reference getDecedent() { public void setCertifier(Certifier certifier) { Reference reference = new Reference(certifier.getId()); - this.asserter = reference; + this.performer.add(reference); } public void setAsserter(Certifier certifier) { setCertifier(certifier); } + public void setPerformer(Certifier certifier) { + setCertifier(certifier); + } + + public List getCertifiers(int index) { + return performer; + } + + public List getAsserters(int index) { + return performer; + } + + public List getPerformers(int index) { + return performer; + } + + public Reference getCertifier(int index) { + return performer.get(index); + } + + public void setValue(StringType value) { + if((value.getValue().length() > 240)) { + throw new IllegalArgumentException("CauseOfDeathCondition value "+value.getValue()+" is too long, must be 240 characters or less."); + } + this.setValue(value); + } - public Reference getCertifier() { - return asserter; + public void setValue(String value) { + setValue(new StringType(value)); } } \ No newline at end of file diff --git a/src/main/java/edu/gatech/chai/VRDR/model/DeathCertificateDocument.java b/src/main/java/edu/gatech/chai/VRDR/model/DeathCertificateDocument.java index 3aceb4b..1f3e6ea 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/DeathCertificateDocument.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/DeathCertificateDocument.java @@ -5,10 +5,13 @@ import java.util.stream.Collectors; import org.hl7.fhir.r4.model.Bundle; +import org.hl7.fhir.r4.model.Extension; import org.hl7.fhir.r4.model.Resource; +import org.hl7.fhir.r4.model.StringType; import ca.uhn.fhir.model.api.annotation.ResourceDef; import edu.gatech.chai.VRDR.model.util.CommonUtil; +import edu.gatech.chai.VRDR.model.util.DeathCertificateDocumentUtil; @ResourceDef(name = "Bundle", profile = "http://hl7.org/fhir/us/vrdr/StructureDefinition/VRDR-Death-Certificate-Document") public class DeathCertificateDocument extends Bundle { @@ -19,6 +22,13 @@ public DeathCertificateDocument() { setType(BundleType.DOCUMENT); } + public void addAuxillaryStateIdentifier(String auxillaryStateIdentifierValue) { + Extension extension = new Extension(); + extension.setUrl(DeathCertificateDocumentUtil.auxillaryStateIndentifierUrl); + extension.setValue(new StringType(auxillaryStateIdentifierValue)); + this.getIdentifier().addExtension(extension); + } + //Helper Accessor methods private List getRecords(Class type){ diff --git a/src/main/java/edu/gatech/chai/VRDR/model/DeathLocation.java b/src/main/java/edu/gatech/chai/VRDR/model/DeathLocation.java index d71a6ab..efbecd5 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/DeathLocation.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/DeathLocation.java @@ -15,33 +15,21 @@ public DeathLocation() { super(); CommonUtil.initResource(this); } - public DeathLocation(String name, String jurisdicitionId, String description, CodeableConcept type, Address address, - CodeableConcept physicalType) { + public DeathLocation(String name, String description, CodeableConcept type, Address address) { this(); setName(name); - addJurisdictionIdExtension(jurisdicitionId); setDescription(description); addType(type); setAddress(address); - setPhysicalType(physicalType); } - public DeathLocation(String name, String jurisdicitionId, String description, String type, Address address, - CodeableConcept physicalType) { + public DeathLocation(String name, String description, String type, Address address) { this(); CodeableConcept typeCC = CommonUtil.findConceptFromCollectionUsingSimpleString(type, DeathLocationUtil.placeOfDeathTypeSet); setName(name); - addJurisdictionIdExtension(jurisdicitionId); setDescription(description); addType(typeCC); setAddress(address); - setPhysicalType(physicalType); } - public DeathLocation addJurisdictionIdExtension(String jurisdicitionId) { - Extension extension = new Extension(DeathLocationUtil.locationJurisdictionIdExtension); - extension.setValue(CommonUtil.findConceptFromCollectionUsingSimpleString(jurisdicitionId, CommonUtil.locationJurisdictionalConceptSet)); - this.addExtension(extension); - return this; - } } \ No newline at end of file diff --git a/src/main/java/edu/gatech/chai/VRDR/model/Decedent.java b/src/main/java/edu/gatech/chai/VRDR/model/Decedent.java index c127ca7..0c6dba8 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/Decedent.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/Decedent.java @@ -1,6 +1,7 @@ package edu.gatech.chai.VRDR.model; import org.hl7.fhir.r4.model.Address; +import org.hl7.fhir.r4.model.BooleanType; import org.hl7.fhir.r4.model.CodeType; import org.hl7.fhir.r4.model.CodeableConcept; import org.hl7.fhir.r4.model.Coding; @@ -27,86 +28,61 @@ public Extension getRace() { return CommonUtil.getExtension(this, DecedentUtil.raceExtensionURL); } - public Extension setRace(String ombCategory, String detailed, String text) { - Extension extension = getRace(); - if (extension != null) { - for (Extension subExtension : extension.getExtension()) { - if (subExtension.getUrl().equals("ombCategory")) { - ((Coding) subExtension.getValue()).setCode(ombCategory); - } - if (subExtension.getUrl().equals("detailed")) { - ((Coding) subExtension.getValue()).setCode(detailed); + public Extension addRace(String raceString) { + Extension baseRaceExtension = getRace(); + if(baseRaceExtension == null) { + baseRaceExtension = new Extension(); + baseRaceExtension.setUrl(DecedentUtil.raceExtensionURL); + this.addExtension(baseRaceExtension); + } + for(String raceUrl: DecedentUtil.raceNVSSUrlSet) { + if(raceUrl.contains(raceString)) { + Extension specificRaceExtension = new Extension(); + specificRaceExtension.setUrl(raceUrl); + if(raceUrl.contains("Literal")) { //Literal subtype urls use strings, not booleans + specificRaceExtension.setValue(new StringType(raceString)); } - if (subExtension.getUrl().equals("text")) { - subExtension.setValue(new StringType(text)); + else { + specificRaceExtension.setValue(new BooleanType(true)); } + baseRaceExtension.addExtension(specificRaceExtension); + return baseRaceExtension; } - return extension; - } - return addRace(ombCategory, detailed, text); - } - - public Extension addRace(String ombCategory, String detailed, String text) { - Extension extension = new Extension(DecedentUtil.raceExtensionURL); - if(!ombCategory.isEmpty()) { - Extension ombCategoryExt = new Extension("ombCategory", - new Coding().setCode(ombCategory).setSystem(DecedentUtil.raceSystem)); - extension.addExtension(ombCategoryExt); } - if(!detailed.isEmpty()) { - Extension detailedExt = new Extension("detailed", - new Coding().setCode(detailed).setSystem(DecedentUtil.raceSystem)); - extension.addExtension(detailedExt); - } - if(!text.isEmpty()) { - Extension textExt = new Extension("text", new StringType(text)); - extension.addExtension(textExt); - } - this.addExtension(extension); - return extension; + return baseRaceExtension; } - + public Extension getEthnicity() { return CommonUtil.getExtension(this, DecedentUtil.ethnicityExtensionURL); } - - public Extension setEthnicity(String ombCategory, String detailed, String text) { - Extension extension = getEthnicity(); - if (extension != null) { - for (Extension subExtension : extension.getExtension()) { - if (subExtension.getUrl().equals("ombCategory")) { - ((Coding) subExtension.getValue()).setCode(ombCategory); - } - if (subExtension.getUrl().equals("detailed")) { - ((Coding) subExtension.getValue()).setCode(detailed); + + public Extension addEthnicity(String ethnicityString) { + return addEthnicity (ethnicityString, "yes"); + } + + public Extension addEthnicity(String ethnicityString, String yesNoUnknown) { + Extension baseEthnicityExtension = getEthnicity(); + if(baseEthnicityExtension == null) { + baseEthnicityExtension = new Extension(); + baseEthnicityExtension.setUrl(DecedentUtil.ethnicityExtensionURL); + this.addExtension(baseEthnicityExtension); + } + for(String ethnicityUrl: DecedentUtil.ethnicityNVSSUrlSet) { + if(ethnicityUrl.contains(ethnicityString)) { + Extension specificRaceExtension = new Extension(); + specificRaceExtension.setUrl(ethnicityUrl); + if(ethnicityUrl.contains("Literal")) { //Literal subtype urls use strings, not booleans + specificRaceExtension.setValue(new StringType(ethnicityString)); } - if (subExtension.getUrl().equals("text")) { - subExtension.setValue(new StringType(text)); + else { + CodeableConcept yesNoUnknownCodeableConcept = CommonUtil.findConceptFromCollectionUsingSimpleString(yesNoUnknown, CommonUtil.yesNoUnknownSet); + specificRaceExtension.setValue(yesNoUnknownCodeableConcept); } + baseEthnicityExtension.addExtension(specificRaceExtension); + return baseEthnicityExtension; } - return extension; } - return addEthnicity(ombCategory, detailed, text); - } - - public Extension addEthnicity(String ombCategory, String detailed, String text) { - Extension extension = new Extension(DecedentUtil.ethnicityExtensionURL); - if(!ombCategory.isEmpty()) { - Extension ombCategoryExt = new Extension("ombCategory", - new Coding().setCode(ombCategory).setSystem(DecedentUtil.ethnicitySystem)); - extension.addExtension(ombCategoryExt); - } - if(!detailed.isEmpty()) { - Extension detailedExt = new Extension("detailed", - new Coding().setCode(detailed).setSystem(DecedentUtil.ethnicitySystem)); - extension.addExtension(detailedExt); - } - if(!text.isEmpty()) { - Extension textExt = new Extension("text", new StringType(text)); - extension.addExtension(textExt); - } - this.addExtension(extension); - return extension; + return baseEthnicityExtension; } public Extension getBirthSex() { diff --git a/src/main/java/edu/gatech/chai/VRDR/model/util/AddressUtil.java b/src/main/java/edu/gatech/chai/VRDR/model/util/AddressUtil.java new file mode 100644 index 0000000..a1537dc --- /dev/null +++ b/src/main/java/edu/gatech/chai/VRDR/model/util/AddressUtil.java @@ -0,0 +1,153 @@ +package edu.gatech.chai.VRDR.model.util; + +import org.hl7.fhir.r4.model.Address; +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Extension; +import org.hl7.fhir.r4.model.PositiveIntType; +import org.hl7.fhir.r4.model.StringType; + +public class AddressUtil { + public static String withinCityLimitsIndicatorUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/Within-City-Limits-Indicator"; + public static String locationJurisdictionIdUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/Location-Jurisdiction-Id"; + public static String cityCodeUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/CityCode"; + public static String districtCodeUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/DistrictCode"; + public static String predirectionalUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/PreDirectional"; + public static String streetNumberUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/StreetNumber"; + public static String streetNameUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/StreetName"; + public static String streetDesignatorUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/StreetDesignator"; + public static String postDirectionalUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/PostDirectional"; + public static String unitOrApartmentNumberUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/UnitOrAptNumber"; + public static Address addCityLimitsIndicator(CodeableConcept indicator,Address address) { + Extension extension = new Extension(); + extension.setUrl(withinCityLimitsIndicatorUrl); + extension.setValue(indicator); + address.addExtension(extension); + return address; + } + + public static Address addCityLimitsIndicator(String indicator,Address address) { + CodeableConcept ccIndicator = CommonUtil.findConceptFromCollectionUsingSimpleString(indicator, CommonUtil.yesNoUnknownSet); + return addCityLimitsIndicator(ccIndicator, address); + } + + public static Address addCityCode(PositiveIntType integer,Address address) { + if(integer.getValueAsString().length() > 5) { + throw new IllegalArgumentException("City code value "+integer.asStringValue()+" is too long, must be 5 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(cityCodeUrl); + extension.setValue(integer); + address.addExtension(extension); + return address; + } + + public static Address addCityCode(int integer,Address address) { + return addCityCode(new PositiveIntType(integer), address); + } + + public static Address addDistrictCode(PositiveIntType integer,Address address) { + if(integer.getValueAsString().length() > 5) { + throw new IllegalArgumentException("District code value "+integer.asStringValue()+" is too long, must be 5 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(districtCodeUrl); + extension.setValue(integer); + address.addExtension(extension); + return address; + } + + public static Address addDistrictCode(int integer,Address address) { + return addDistrictCode(new PositiveIntType(integer), address); + } + + + public static Address addPredirectional(StringType str,Address address) { + if(str.getValueAsString().length() > 10) { + throw new IllegalArgumentException("Predirectional value "+str.asStringValue()+" is too long, must be 10 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(predirectionalUrl); + extension.setValue(str); + address.addExtension(extension); + return address; + } + + public static Address addPredirectional(String str,Address address) { + return addPredirectional(new StringType(str), address); + } + + public static Address addStreetNumber(StringType str,Address address) { + if(str.getValueAsString().length() > 10) { + throw new IllegalArgumentException("StreetNumber value"+str.asStringValue()+" is too long, must be 10 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(streetNumberUrl); + extension.setValue(str); + address.addExtension(extension); + return address; + } + + public static Address addStreetNumber(String str,Address address) { + return addStreetNumber(new StringType(str), address); + } + + public static Address addStreetName(StringType str,Address address) { + if(str.getValueAsString().length() > 50) { + throw new IllegalArgumentException("StreetName value"+str.asStringValue()+" is too long, must be 50 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(streetNameUrl); + extension.setValue(str); + address.addExtension(extension); + return address; + } + + public static Address addStreetName(String str,Address address) { + return addStreetName(new StringType(str), address); + } + + public static Address addStreetDesignator(StringType str,Address address) { + if(str.getValueAsString().length() > 10) { + throw new IllegalArgumentException("StreetDesignator value"+str.asStringValue()+" is too long, must be 10 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(streetDesignatorUrl); + extension.setValue(str); + address.addExtension(extension); + return address; + } + + public static Address addStreetDesignator(String str,Address address) { + return addStreetDesignator(new StringType(str), address); + } + + public static Address addPostDirectional(StringType str,Address address) { + if(str.getValueAsString().length() > 10) { + throw new IllegalArgumentException("PostDirectional value"+str.asStringValue()+" is too long, must be 50 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(postDirectionalUrl); + extension.setValue(str); + address.addExtension(extension); + return address; + } + + public static Address addPostDirectional(String str,Address address) { + return addPostDirectional(new StringType(str), address); + } + + public static Address addUnitOrAparmentNumber(StringType str,Address address) { + if(str.getValueAsString().length() > 10) { + throw new IllegalArgumentException("UnitOrAparmentNumber value"+str.asStringValue()+" is too long, must be 50 characters or less."); + } + Extension extension = new Extension(); + extension.setUrl(unitOrApartmentNumberUrl); + extension.setValue(str); + address.addExtension(extension); + return address; + } + + public static Address addUnitOrAparmentNumber(String str,Address address) { + return addUnitOrAparmentNumber(new StringType(str), address); + } +} diff --git a/src/main/java/edu/gatech/chai/VRDR/model/util/CauseOfDeathConditionUtil.java b/src/main/java/edu/gatech/chai/VRDR/model/util/CauseOfDeathConditionUtil.java index 261a0a9..f80ddf0 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/util/CauseOfDeathConditionUtil.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/util/CauseOfDeathConditionUtil.java @@ -28,5 +28,6 @@ public class CauseOfDeathConditionUtil { new CodeableConcept().addCoding(new Coding(categorySystemUrl,"problem-list-item","Problem List Item")), new CodeableConcept().addCoding(new Coding(categorySystemUrl,"encounter-diagnosis","Encounter Diagnosis")), new CodeableConcept().addCoding(new Coding(categorySystemUrl,"health-concern","Health Concern"))));*/ - public static final CodeableConcept causeOfDeathConditionCategory = new CodeableConcept().addCoding(new Coding(CommonUtil.snomedSystemUrl, "16100001", "Death Diagnosis")); -} + public static final CodeableConcept code = new CodeableConcept().addCoding(new Coding(CommonUtil.loincSystemUrl, "69453-9", "Cause of death [US Standard Certificate of Death]")); + public static final CodeableConcept intervalComponentCode = new CodeableConcept().addCoding(new Coding(CommonUtil.loincSystemUrl, "69440-6", "Disease onset to death interval")); +} \ No newline at end of file diff --git a/src/main/java/edu/gatech/chai/VRDR/model/util/CommonUtil.java b/src/main/java/edu/gatech/chai/VRDR/model/util/CommonUtil.java index 2e9bf1b..638e11b 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/util/CommonUtil.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/util/CommonUtil.java @@ -16,6 +16,7 @@ import org.hl7.fhir.r4.model.DomainResource; import org.hl7.fhir.r4.model.Extension; import org.hl7.fhir.r4.model.IdType; +import org.hl7.fhir.r4.model.PositiveIntType; import org.hl7.fhir.r4.model.Reference; import org.hl7.fhir.r4.model.Resource; @@ -23,15 +24,17 @@ import edu.gatech.chai.VRDR.model.DeathCertificateDocument; public class CommonUtil { - public static String basicBooleanHL7System = "http://hl7.org/CodeSystem/v2-0136"; - public static String yesNoNASystemOID = "urn:oid:2.16.840.1.113883.12.136"; - public static String nullFlavorSystemOID = "urn:oid:2.16.840.1.113883.5.1008"; - public static String nullFlavorHL7System = "http://hl7.org/fhir/v3/NullFlavor"; - public static String snomedSystemUrl = "http://snomed.info/sct"; - public static String loincSystemUrl = "http://loinc.org"; - public static String withinCityLimitsIndicatorUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/Within-City-Limits-Indicator"; - public static String locationJurisdictionOID = "urn:oid:2.16.840.1.113883.6.92"; - public static String dataAbsentReasonUrl = "http://terminology.hl7.org/CodeSystem/data-absent-reason"; + public static final String basicBooleanHL7System = "http://hl7.org/CodeSystem/v2-0136"; + public static final String yesNoNASystemOID = "urn:oid:2.16.840.1.113883.12.136"; + public static final String nullFlavorSystemOID = "urn:oid:2.16.840.1.113883.5.1008"; + public static final String nullFlavorHL7System = "http://hl7.org/fhir/v3/NullFlavor"; + public static final String snomedSystemUrl = "http://snomed.info/sct"; + public static final String loincSystemUrl = "http://loinc.org"; + + public static final String locationJurisdictionOID = "urn:oid:2.16.840.1.113883.6.92"; + public static final String dataAbsentReasonUrl = "http://terminology.hl7.org/CodeSystem/data-absent-reason"; + public static final String unitsOfMeasureUrl = "http://terminology.hl7.org/CodeSystem/data-absent-reason"; + public static final String missingValueReasonUrl = "http://hl7.org/fhir/us/vrdr/CodeSystem/vrdr-missing-value-reason-cs"; public static final String partialDatePartAbsentReasonURL = "http://hl7.org/fhir/us/vrdr/StructureDefinition/VRDR-Partial-date-part-absent-reason"; public static final String partialDateDateYearURL = "date-year"; public static final String partialDateDateYearAbsentReasonURL = "year-absent-reason"; @@ -45,7 +48,7 @@ public class CommonUtil { public static CodeableConcept otherCode = new CodeableConcept().addCoding(new Coding(nullFlavorHL7System,"OTH","other")); public static CodeableConcept notApplicableCode = new CodeableConcept().addCoding(new Coding(nullFlavorHL7System,"NA","not applicable")); public static CodeableConcept notAskedCode = new CodeableConcept().addCoding(new Coding(nullFlavorHL7System,"NASK","not asked")); - public static String deathReportingIdentifierTypeSystem = "urn:oid:2.16.840.1.114222.4.11.7382"; + public static final String deathReportingIdentifierTypeSystem = "urn:oid:2.16.840.1.114222.4.11.7382"; public static CodeableConcept deathCertificateIdCode = new CodeableConcept().addCoding(new Coding(deathReportingIdentifierTypeSystem,"DC","Death Certificate Id")); public static CodeableConcept deathCertificateFileNumberCode = new CodeableConcept().addCoding(new Coding(deathReportingIdentifierTypeSystem,"DCFN","Death Certificate File Number")); public static CodeableConcept deathCertificateLicenseNumberCode = new CodeableConcept().addCoding(new Coding(deathReportingIdentifierTypeSystem,"LN","Death Certificate License Number")); @@ -153,6 +156,17 @@ public class CommonUtil { new CodeableConcept().addCoding(new Coding(CommonUtil.locationJurisdictionOID,"54", "West Virginia")), new CodeableConcept().addCoding(new Coding(CommonUtil.locationJurisdictionOID,"55", "Wisconsin")), new CodeableConcept().addCoding(new Coding(CommonUtil.locationJurisdictionOID,"56", "Wyoming")))); + public static final HashSet ucumUnitsConceptSet = new HashSet<>(Arrays.asList( + new CodeableConcept().addCoding(new Coding(CommonUtil.unitsOfMeasureUrl,"min","Minutes")), + new CodeableConcept().addCoding(new Coding(CommonUtil.unitsOfMeasureUrl,"d","Days")), + new CodeableConcept().addCoding(new Coding(CommonUtil.unitsOfMeasureUrl,"h", "Hours")), + new CodeableConcept().addCoding(new Coding(CommonUtil.unitsOfMeasureUrl,"mo", "Months")), + new CodeableConcept().addCoding(new Coding(CommonUtil.unitsOfMeasureUrl,"a", "Years")))); + public static final HashSet missingValueConceptSet = new HashSet<>(Arrays.asList( + new CodeableConcept().addCoding(new Coding(CommonUtil.missingValueReasonUrl,"R","Refused")), + new CodeableConcept().addCoding(new Coding(CommonUtil.missingValueReasonUrl,"S","Sought, but unknown")), + new CodeableConcept().addCoding(new Coding(CommonUtil.missingValueReasonUrl,"C", "Not obtainable")))); + public static Extension getExtension(DomainResource resource, String url) { for (Extension extension : resource.getExtension()) { if (extension.getUrl().equals(url)) { @@ -202,17 +216,4 @@ public static CodeType findCodeFromCollectionUsingSimpleString(String key,Collec } return null; } - - public static Address addCityLimitsIndicator(CodeableConcept indicator,Address address) { - Extension extension = new Extension(); - extension.setUrl(withinCityLimitsIndicatorUrl); - extension.setValue(indicator); - address.addExtension(extension); - return address; - } - - public static Address addCityLimitsIndicator(String indicator,Address address) { - CodeableConcept ccIndicator = findConceptFromCollectionUsingSimpleString(indicator, yesNoUnknownSet); - return addCityLimitsIndicator(ccIndicator, address); - } } \ No newline at end of file diff --git a/src/main/java/edu/gatech/chai/VRDR/model/util/ConditionContributingToDeathUtil.java b/src/main/java/edu/gatech/chai/VRDR/model/util/ConditionContributingToDeathUtil.java index 30d1c5d..781efe5 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/util/ConditionContributingToDeathUtil.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/util/ConditionContributingToDeathUtil.java @@ -7,26 +7,5 @@ import org.hl7.fhir.r4.model.Coding; public class ConditionContributingToDeathUtil { - public static final String conditionalClinicalSystemUrl = "http://terminology.hl7.org/CodeSystem/condition-clinical"; - public static final String verificationSystemUrl = "http://terminology.hl7.org/CodeSystem/condition-ver-status"; - public static final String categorySystemUrl = "http://hl7.org/fhir/us/core/ValueSet/us-core-condition-category"; - public static final HashSet conditionClinicalStatusSet = new HashSet<>(Arrays.asList( - new CodeableConcept().addCoding(new Coding(conditionalClinicalSystemUrl,"active","Active")), - new CodeableConcept().addCoding(new Coding(conditionalClinicalSystemUrl,"recurrence","Recurrence")), - new CodeableConcept().addCoding(new Coding(conditionalClinicalSystemUrl,"relapse","Relapse")), - new CodeableConcept().addCoding(new Coding(conditionalClinicalSystemUrl,"inactive","Inactive")), - new CodeableConcept().addCoding(new Coding(conditionalClinicalSystemUrl,"remission","Remission")), - new CodeableConcept().addCoding(new Coding(conditionalClinicalSystemUrl,"resolved","Resolved")))); - public static final HashSet verificationStatusSet = new HashSet<>(Arrays.asList( - new CodeableConcept().addCoding(new Coding(verificationSystemUrl,"unconfirmed","Unconfirmed")), - new CodeableConcept().addCoding(new Coding(verificationSystemUrl,"provisional","Provisional")), - new CodeableConcept().addCoding(new Coding(verificationSystemUrl,"differential","Differential")), - new CodeableConcept().addCoding(new Coding(verificationSystemUrl,"confirmed","Confirmed")), - new CodeableConcept().addCoding(new Coding(verificationSystemUrl,"refuted","Refuted")), - new CodeableConcept().addCoding(new Coding(verificationSystemUrl,"entered-in-error","Entered-in-Error")))); - /*public static final HashSet categorySet = new HashSet<>(Arrays.asList( - new CodeableConcept().addCoding(new Coding(categorySystemUrl,"problem-list-item","Problem List Item")), - new CodeableConcept().addCoding(new Coding(categorySystemUrl,"encounter-diagnosis","Encounter Diagnosis")), - new CodeableConcept().addCoding(new Coding(categorySystemUrl,"health-concern","Health Concern"))));*/ - public static final CodeableConcept conditionContributingToDeathCategory = new CodeableConcept().addCoding(new Coding(CommonUtil.snomedSystemUrl, "16100001", "Death Diagnosis")); + public static final CodeableConcept code = new CodeableConcept().addCoding(new Coding(CommonUtil.loincSystemUrl, "69441-4", "Other significant causes or conditions of death")); } diff --git a/src/main/java/edu/gatech/chai/VRDR/model/util/DeathCertificateDocumentUtil.java b/src/main/java/edu/gatech/chai/VRDR/model/util/DeathCertificateDocumentUtil.java new file mode 100644 index 0000000..918c31c --- /dev/null +++ b/src/main/java/edu/gatech/chai/VRDR/model/util/DeathCertificateDocumentUtil.java @@ -0,0 +1,10 @@ +package edu.gatech.chai.VRDR.model.util; + +import org.hl7.fhir.r4.model.CodeableConcept; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Composition; +import org.hl7.fhir.r4.model.Composition.CompositionStatus; + +public class DeathCertificateDocumentUtil { + public static final String auxillaryStateIndentifierUrl = "http://hl7.org/fhir/us/vrdr/StructureDefinition/AuxiliaryStateIdentifier"; +} \ No newline at end of file diff --git a/src/main/java/edu/gatech/chai/VRDR/model/util/DeathLocationUtil.java b/src/main/java/edu/gatech/chai/VRDR/model/util/DeathLocationUtil.java index 041af84..e245a61 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/util/DeathLocationUtil.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/util/DeathLocationUtil.java @@ -7,7 +7,6 @@ import org.hl7.fhir.r4.model.Coding; public class DeathLocationUtil { - public static String locationJurisdictionIdExtension = "http://hl7.org/fhir/us/vrdr/StructureDefinition/Location-Jurisdiction-Id"; public static final HashSet placeOfDeathTypeSet = new HashSet<>(Arrays.asList( new CodeableConcept().addCoding(new Coding(CommonUtil.snomedSystemUrl,"63238001","Dead on arrival at hospital")), new CodeableConcept().addCoding(new Coding(CommonUtil.snomedSystemUrl,"440081000124100","Death in home")), diff --git a/src/main/java/edu/gatech/chai/VRDR/model/util/DecedentUtil.java b/src/main/java/edu/gatech/chai/VRDR/model/util/DecedentUtil.java index a354f71..172e5c5 100644 --- a/src/main/java/edu/gatech/chai/VRDR/model/util/DecedentUtil.java +++ b/src/main/java/edu/gatech/chai/VRDR/model/util/DecedentUtil.java @@ -2,6 +2,7 @@ import java.util.Arrays; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.hl7.fhir.r4.model.CodeableConcept; @@ -10,9 +11,9 @@ import ca.uhn.fhir.model.primitive.CodeDt; public class DecedentUtil { - public static final String raceExtensionURL = "http://hl7.org/fhir/us/core/StructureDefinition/us-core-race"; + public static final String raceExtensionURL = "http://hl7.org/fhir/us/vrdr/StructureDefinition/NVSS-Race"; public static final String raceSystem = "urn:oid:2.16.840.1.113883.6.238"; - public static final String ethnicityExtensionURL = "http://hl7.org/fhir/us/core/StructureDefinition/us-core-ethnicity"; + public static final String ethnicityExtensionURL = "http://hl7.org/fhir/us/vrdr/StructureDefinition/NVSS-Ethnicity"; public static final String ethnicitySystem = "urn:oid:2.16.840.1.113883.6.238"; public static final String birthSexExtensionURL = "http://hl7.org/fhir/us/core/StructureDefinition/us-core-birthsex"; public static final String birthSexValueSetURL = "http://hl7.org/fhir/us/core/ValueSet/us-core-birthsex"; @@ -34,6 +35,13 @@ public class DecedentUtil { new CodeableConcept().addCoding(new Coding(maritalStatusURL,"S","Single")), new CodeableConcept().addCoding(new Coding(maritalStatusURL,"U","Unknown")))); + public static final List raceNVSSUrlSet = Arrays.asList("White", "BlackOrAfricanAmerican", + "AmericanIndianOrAlaskaNative", "AsianIndian", "Chinese", "Filipino", "Japanese", "Korean", "Vietnamese", + "OtherAsian", "NativeHawaiian", "GuamanianOrChamorro", "Samoan","OtherPacificIslander","OtherRace", + "AmericanIndianOrAlaskaNativeLiteral","OtherAsianLiteral","OtherPacificIslanderLiteral","OtherRaceLiteral"); + public static final List ethnicityNVSSUrlSet = Arrays.asList("HispanicMexican", "HispanicPuertoRican", + "HispanicOther", "HispanicCuban", "HispanicLiteral"); + public static Set genderCodesetList = new HashSet(Arrays.asList( genderValueMale,genderValueFemale,genderValueUnknown)); diff --git a/src/test/java/edu/gatech/VRDR/BuildDCD.java b/src/test/java/edu/gatech/VRDR/BuildDCD.java index db5b3bb..8d02845 100644 --- a/src/test/java/edu/gatech/VRDR/BuildDCD.java +++ b/src/test/java/edu/gatech/VRDR/BuildDCD.java @@ -85,8 +85,8 @@ public static DeathCertificateDocument buildExampleDeathCertificateDocument() { withinCityLimits.setValue(new BooleanType(true)); decedentsHome.addExtension(withinCityLimits); decedent.setGender(AdministrativeGender.MALE); - decedent.setRace("2106-3", "", "White"); - decedent.setEthnicity("", "", ""); + decedent.addRace("White"); //Refer to Decedent fhir profile, or DecedentUtil.java for complete list of races + decedent.addEthnicity("HispanicCuban"); //Refer to Decedent fhir profile, or DecedentUtil.java for complete list of ethnicities decedent.setBirthSex("M", "Male"); decedent.setBirthPlace(decedentsHome); decedent.addIdentifier("1AN2BN3DE45"); @@ -110,7 +110,7 @@ public static DeathCertificateDocument buildExampleDeathCertificateDocument() { CodeableConcept gaState = new CodeableConcept().addCoding(new Coding("","32","Georgia")); DateTimeType birthYear = new DateTimeType("1935"); - BirthRecordIdentifier birthRecordIdentifier = new BirthRecordIdentifier("June 3rd 1935",gaState,birthYear); + BirthRecordIdentifier birthRecordIdentifier = new BirthRecordIdentifier("June 3rd 1935",decedent,gaState,birthYear); initResourceForTesting(birthRecordIdentifier); birthRecordIdentifier.setSubject(decedentReference); contents.add(birthRecordIdentifier); @@ -147,16 +147,15 @@ public static DeathCertificateDocument buildExampleDeathCertificateDocument() { CauseOfDeathCondition causeOfDeathCondition = new CauseOfDeathCondition(); initResourceForTesting(causeOfDeathCondition); causeOfDeathCondition.setDecedent(decedent); - causeOfDeathCondition.setAsserter(certifierReference); + causeOfDeathCondition.setAsserter(certifier); causeOfDeathCondition.setCode(new CodeableConcept().addCoding(new Coding("http://snomed.info/sct","42343007","Congestive heart failure (disorder)"))); - causeOfDeathCondition.setClinicalStatus("active"); - causeOfDeathCondition.setVerificationStatus("confirmed"); + causeOfDeathCondition.createInterval("10 minutes"); contents.add(causeOfDeathCondition); //ConditionContributingToDeath ConditionContributingToDeath conditionContributingToDeath = new ConditionContributingToDeath(); initResourceForTesting(conditionContributingToDeath); - conditionContributingToDeath.setSubject(decedentReference); - conditionContributingToDeath.setAsserter(certifierReference); + conditionContributingToDeath.setDecedent(decedent); + conditionContributingToDeath.setAsserter(certifier); conditionContributingToDeath.setCode(new CodeableConcept().addCoding(new Coding("http://snomed.info/sct","241006","Epilepsia partialis continua"))); contents.add(conditionContributingToDeath); //CauseOfDeathPathway: this defines the cause of death pathway, it's a chain BEGINNING with the CauseOfDeathCondition @@ -187,12 +186,9 @@ public static DeathCertificateDocument buildExampleDeathCertificateDocument() { contents.add(deathDate); //DeathLocation CodeableConcept deathLocationType = new CodeableConcept().addCoding(new Coding("http://hl7.org/fhir/v3/RoleCode","wi","Wing")); - CodeableConcept physicalLocationType = new CodeableConcept().addCoding(new Coding("http://hl7.org/fhir/location-physical-type","HOSP","Hospital")); Address hospitalAddress = new Address().addLine("80 Jesse Hill Jr Dr SE").setCity("Atlanta") .setState("GA").setPostalCode("30303").setCountry("USA").setUse(AddressUse.WORK); - //GA = FIPS (52) 2 letter state code for jurisdicitional id - DeathLocation deathLocation = new DeathLocation("Grady Hospital", "GA", "Grady Hospital of Atlanta",deathLocationType,hospitalAddress,physicalLocationType); - deathLocation.addJurisdictionIdExtension("Georgia"); + DeathLocation deathLocation = new DeathLocation("Grady Hospital","Grady Hospital of Atlanta",deathLocationType,hospitalAddress); initResourceForTesting(deathLocation); contents.add(deathLocation); deathDate.addPatientLocationExtension(deathLocation); @@ -309,8 +305,8 @@ public static Decedent buildDecedentWithBirthDateAbsentReason() { withinCityLimits.setValue(new BooleanType(true)); decedentsHome.addExtension(withinCityLimits); decedent.setGender(AdministrativeGender.MALE); - decedent.setRace("2106-3", "", "White"); - decedent.setEthnicity("", "", ""); + decedent.addRace("White"); //Refer to Decedent fhir profile, or DecedentUtil.java for complete list of races + decedent.addEthnicity("HispanicCuban"); //Refer to Decedent fhir profile, or DecedentUtil.java for complete list of ethnicities decedent.setBirthSex("M", "Male"); decedent.setBirthPlace(decedentsHome); decedent.addIdentifier("1AN2BN3DE45");