diff --git a/server/src/main/java/org/hl7/davinci/endpoint/rems/DatabaseInit.java b/server/src/main/java/org/hl7/davinci/endpoint/rems/DatabaseInit.java index 1cb358a68..52b9febb7 100644 --- a/server/src/main/java/org/hl7/davinci/endpoint/rems/DatabaseInit.java +++ b/server/src/main/java/org/hl7/davinci/endpoint/rems/DatabaseInit.java @@ -61,8 +61,9 @@ CommandLineRunner initDatabase(DrugsRepository repository, RemsFhirRepository re patientEnrollmentResource.setResource(patientQuestionnaireResource); patientEnrollmentResource.setId("turalio-patient-enrollment"); remsFhirRepository.save(patientEnrollmentResource); + patientEnrollmentRequirement.setName("Patient Enrollment"); patientEnrollmentRequirement.setResource(patientEnrollmentResource); - patientEnrollmentRequirement.setDescription("complete patient enrollment questionnaire"); + patientEnrollmentRequirement.setDescription("Submit Patient Enrollment form to the REMS Administrator"); patientEnrollmentRequirement.setDrug(turalio); requirementRepository.save(patientEnrollmentRequirement); @@ -75,8 +76,9 @@ CommandLineRunner initDatabase(DrugsRepository repository, RemsFhirRepository re prescriberEnrollmentResource.setResource(prescriberQuestionnaireResource); prescriberEnrollmentResource.setId("turalio-prescriber-enrollment"); remsFhirRepository.save(prescriberEnrollmentResource); + prescriberEnrollmentRequirement.setName("Prescriber Enrollment"); prescriberEnrollmentRequirement.setResource(prescriberEnrollmentResource); - prescriberEnrollmentRequirement.setDescription("complete prescriber enrollment questionnaire"); + prescriberEnrollmentRequirement.setDescription("Submit Prescriber Enrollment form and training certification to the REMS Administrator"); prescriberEnrollmentRequirement.setDrug(turalio); requirementRepository.save(prescriberEnrollmentRequirement); @@ -89,11 +91,46 @@ CommandLineRunner initDatabase(DrugsRepository repository, RemsFhirRepository re prescriberKnowledgeResource.setResource(prescriberKnowledgeQuestionnaireResource); prescriberKnowledgeResource.setId("turalio-prescriber-knowledge-check"); remsFhirRepository.save(prescriberKnowledgeResource); + prescriberCertificationRequirement.setName("Prescriber Knowledge Assessment"); prescriberCertificationRequirement.setResource(prescriberKnowledgeResource); - prescriberCertificationRequirement.setDescription("complete prescriber knowledge check"); - prescriberCertificationRequirement.setParent(prescriberEnrollmentRequirement); + prescriberCertificationRequirement.setDescription("Submit Prescriber Knowledge Assessment Form to REMS Administrator to receive certification"); + prescriberCertificationRequirement.setParentRequirement(prescriberEnrollmentRequirement); + // prescriberCertificationRequirement.setDrug(turalio); requirementRepository.save(prescriberCertificationRequirement); + // pharmacist enrollment form requirement + // change form below to pharmacist enrollment once form is translated + String pharmacistQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/Questionnaire-R4-Prescriber-Enrollment.json", Charset.defaultCharset()); + Requirement pharmacistEnrollmentRequirement = new Requirement(); + RemsFhir pharmacistEnrollmentResource = new RemsFhir(); + pharmacistEnrollmentResource.setResourceType(ResourceType.Questionnaire.toString()); + JsonNode pharmacistQuestionnaireResource = JacksonUtil.toJsonNode(pharmacistQuestionnaire); + pharmacistEnrollmentResource.setResource(pharmacistQuestionnaireResource); + pharmacistEnrollmentResource.setId("turalio-pharmacist-enrollment"); + remsFhirRepository.save(pharmacistEnrollmentResource); + pharmacistEnrollmentRequirement.setName("Pharmacist Enrollment"); + pharmacistEnrollmentRequirement.setResource(pharmacistEnrollmentResource); + pharmacistEnrollmentRequirement.setDescription("Submit Pharmacist Enrollment form and training certification to the REMS Administrator"); + pharmacistEnrollmentRequirement.setDrug(turalio); + requirementRepository.save(pharmacistEnrollmentRequirement); + + // pharmacist knowledge assessment / certification sub-requirement + // change form below to pharmacist knowledge assessment once form is translated + String pharmacistKnowledgeQuestionnaire = readFile("src/main/java/org/hl7/davinci/endpoint/rems/resources/Turalio/Questionnaire-R4-Prescriber-Knowledge-Assessment.json", Charset.defaultCharset()); + Requirement pharmacistCertificationRequirement = new Requirement(); + RemsFhir pharmacistKnowledgeResource = new RemsFhir(); + pharmacistKnowledgeResource.setResourceType(ResourceType.Questionnaire.toString()); + JsonNode pharmacistKnowledgeQuestionnaireResource = JacksonUtil.toJsonNode(pharmacistKnowledgeQuestionnaire); + pharmacistKnowledgeResource.setResource(pharmacistKnowledgeQuestionnaireResource); + pharmacistKnowledgeResource.setId("turalio-pharmacist-knowledge-check"); + remsFhirRepository.save(pharmacistKnowledgeResource); + pharmacistCertificationRequirement.setName("Pharmacist Knowledge Assessment"); + pharmacistCertificationRequirement.setResource(pharmacistKnowledgeResource); + pharmacistCertificationRequirement.setDescription("Submit Pharmacist Knowledge Assessment Form to REMS Administrator to receive certification"); + pharmacistCertificationRequirement.setParentRequirement(pharmacistEnrollmentRequirement); + // pharmacistCertificationRequirement.setDrug(turalio); + requirementRepository.save(pharmacistCertificationRequirement); + }; } } \ No newline at end of file diff --git a/server/src/main/java/org/hl7/davinci/endpoint/rems/controller/RemsController.java b/server/src/main/java/org/hl7/davinci/endpoint/rems/controller/RemsController.java index 2564fba7f..8e866ca9e 100644 --- a/server/src/main/java/org/hl7/davinci/endpoint/rems/controller/RemsController.java +++ b/server/src/main/java/org/hl7/davinci/endpoint/rems/controller/RemsController.java @@ -118,15 +118,32 @@ public ResponseEntity postRems(@RequestBody String jsonData) { remsRequest.setStatus("Pending"); remsRequest.setResource(remsObject); remsRepository.save(remsRequest); - - // this loop needs to change to handle multiple levels of sub-requirement conditions - // this loop needs to also handle parsing out resources for each requirement - may need to be separate endpoints + for (Requirement requirement : drug.getRequirements()) { MetRequirement metReq = new MetRequirement(); metReq.setRequirement(requirement); metReq.setRemsRequest(remsRequest); remsRequest.addMetRequirement(metReq); + + //logic to set requirement as met or not, for now hard code only patient enrollment form + if (requirement.getName().equals("Patient Enrollment")) { + metReq.setCompleted(true); + } + metRequirementsRepository.save(metReq); + + // only handle one level of sub requirements for now + for (Requirement subRequirement : requirement.getChildRequirements()) { + MetRequirement subMetReq = new MetRequirement(); + subMetReq.setRequirement(subRequirement); + // subMetReq.setRemsRequest(remsRequest); + subMetReq.setParentMetRequirement(metReq); + // remsRequest.addMetRequirement(subMetReq); + metReq.addChildMetRequirements(subMetReq); + metRequirementsRepository.save(subMetReq); + } + + } remsRepository.save(remsRequest); updateRemsRequestStatusInBackground(id); diff --git a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/drugs/Drug.java b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/drugs/Drug.java index 0ec47c097..5938e1be2 100644 --- a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/drugs/Drug.java +++ b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/drugs/Drug.java @@ -44,7 +44,7 @@ public List getRequirements() { return this.requirements; } - public void setResource(List requirements) { + public void setRequirements(List requirements) { this.requirements = requirements; } @@ -52,7 +52,7 @@ public void addRequirement(Requirement requirement) { this.requirements.add(requirement); } public String getCreatedAt() { - return createdAt; + return this.createdAt; } public void setCreatedAt(String createdAt) { @@ -60,7 +60,7 @@ public void setCreatedAt(String createdAt) { } public String getCodeSystem() { - return codeSystem; + return this.codeSystem; } public void setCodeSystem(String codeSystem) { @@ -68,7 +68,7 @@ public void setCodeSystem(String codeSystem) { } public String getCode() { - return code; + return this.code; } public void setCode(String code) { diff --git a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/fhir/RemsFhir.java b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/fhir/RemsFhir.java index 2c06e6062..94cae42cf 100644 --- a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/fhir/RemsFhir.java +++ b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/fhir/RemsFhir.java @@ -49,7 +49,7 @@ public void setResource(JsonNode resource) { } public String getResourceType() { - return resourceType; + return this.resourceType; } public void setResourceType(String resourceType) { @@ -57,7 +57,7 @@ public void setResourceType(String resourceType) { } public String getCreatedAt() { - return createdAt; + return this.createdAt; } public void setCreatedAt(String createdAt) { diff --git a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/Rems.java b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/Rems.java index b59975ac6..9a053437d 100644 --- a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/Rems.java +++ b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/rems/Rems.java @@ -1,5 +1,6 @@ package org.hl7.davinci.endpoint.rems.database.rems; import org.hl7.davinci.endpoint.rems.database.requirement.MetRequirement; +import com.fasterxml.jackson.annotation.JsonManagedReference; import java.util.ArrayList; import java.util.List; import javax.persistence.*; @@ -32,6 +33,7 @@ public class Rems { private JsonNode resource; @OneToMany(mappedBy="remsRequest", fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @JsonManagedReference private List metRequirements = new ArrayList<>(); public void Rems() {} diff --git a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/MetRequirement.java b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/MetRequirement.java index 56a64a356..b6c383abc 100644 --- a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/MetRequirement.java +++ b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/MetRequirement.java @@ -1,5 +1,7 @@ package org.hl7.davinci.endpoint.rems.database.requirement; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import com.fasterxml.jackson.annotation.JsonBackReference; import org.hl7.davinci.endpoint.rems.database.drugs.Drug; import org.hl7.davinci.endpoint.rems.database.fhir.RemsFhir; import org.hl7.davinci.endpoint.rems.database.rems.Rems; @@ -22,7 +24,7 @@ public class MetRequirement { private String createdAt; @Column(name = "completed", nullable = false) - private boolean completed ; + private Boolean completed ; // FHIR resource which defines the requirement (task, questionnaire, etc) @JoinColumn(name = "completedRequirement", nullable = true) @@ -31,26 +33,34 @@ public class MetRequirement { @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name="REQUIREMENT_ID") - @JsonIgnore private Requirement requirement; @ManyToOne @JoinColumn(name="REMS_REQUEST") - @JsonIgnore + @JsonBackReference private Rems remsRequest; @OneToMany(mappedBy="parentMetRequirement", fetch = FetchType.EAGER) + @JsonManagedReference private List childMetRequirements = new ArrayList<>(); @ManyToOne - @JoinColumn(name="PARENT_MET_REQUIREMENT") - @JsonIgnore + @JoinColumn(name="PARENT_MET_REQUIREMENT", nullable = true) + @JsonBackReference private MetRequirement parentMetRequirement; public MetRequirement() { this.createdAt = ZonedDateTime.now().format(DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )); this.completed = false; } + public Integer getId() { + return this.id; + } + + public void setId(Integer id) { + this.id = id; + } + public Rems getRemsRequest() { return this.remsRequest; } @@ -68,46 +78,45 @@ public void setCompletedRequirement(RemsFhir requirement) { } public String getCreatedAt() { - return createdAt; + return this.createdAt; } public void setCreatedAt(String createdAt) { this.createdAt = createdAt; } - public boolean isCompleted() { - return completed; + public Boolean getCompleted() { + return this.completed; } - public void setCompleted(boolean completed) { + public void setCompleted(Boolean completed) { this.completed = completed; } public Requirement getRequirement() { - return requirement; + return this.requirement; } public void setRequirement(Requirement requirement) { this.requirement = requirement; } - - public List getChildren() { + public List getChildMetRequirements() { return this.childMetRequirements; } - public void setChildren(List requirements) { + public void setChildMetRequirements(List requirements) { this.childMetRequirements = requirements; } - public void addChild(MetRequirement requirement) { + public void addChildMetRequirements(MetRequirement requirement) { this.childMetRequirements.add(requirement); } - public MetRequirement getParent() { + public MetRequirement getParentMetRequirement () { return this.parentMetRequirement; } - public void setParent(MetRequirement requirement) { + public void setParentMetRequirement(MetRequirement requirement) { this.parentMetRequirement = requirement; } diff --git a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/Requirement.java b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/Requirement.java index f9efa8bf5..3b37ab9a0 100644 --- a/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/Requirement.java +++ b/server/src/main/java/org/hl7/davinci/endpoint/rems/database/requirement/Requirement.java @@ -1,5 +1,7 @@ package org.hl7.davinci.endpoint.rems.database.requirement; import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonManagedReference; +import com.fasterxml.jackson.annotation.JsonBackReference; import org.hl7.davinci.endpoint.rems.database.drugs.Drug; import org.hl7.davinci.endpoint.rems.database.fhir.RemsFhir; import java.util.ArrayList; @@ -23,12 +25,16 @@ public class Requirement { @Column(name = "description", nullable = true) private String description; + @Column(name = "name", nullable = true) + private String name; + // FHIR resource which defines the requirement (task, questionnaire, etc) - @JoinColumn(name = "resource", nullable = false) + @JoinColumn(name = "resource", nullable = true) @OneToOne private RemsFhir resource; @OneToMany(mappedBy="requirement") + @JsonIgnore private List metRequirements = new ArrayList<>(); @ManyToOne @@ -37,17 +43,26 @@ public class Requirement { private Drug drug; @OneToMany(mappedBy="parentRequirement", fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @JsonManagedReference private List childRequirements = new ArrayList<>(); @ManyToOne(fetch = FetchType.EAGER) - @JoinColumn(name="PARENT_REQUIREMENT") - @JsonIgnore + @JoinColumn(name="PARENT_REQUIREMENT", nullable = true) + @JsonBackReference private Requirement parentRequirement; public Requirement() { this.createdAt = ZonedDateTime.now().format(DateTimeFormatter.ofPattern( "uuuu.MM.dd.HH.mm.ss" )); } + public Integer getId() { + return this.id; + } + + public void setId(Integer id) { + this.id = id; + } + public RemsFhir getResource() { return this.resource; } @@ -57,7 +72,7 @@ public void setResource(RemsFhir resource) { } public String getCreatedAt() { - return createdAt; + return this.createdAt; } public void setCreatedAt(String createdAt) { @@ -65,13 +80,21 @@ public void setCreatedAt(String createdAt) { } public String getDescription() { - return description; + return this.description; } public void setDescription(String description) { this.description = description; } + public String getName() { + return this.name; + } + + public void setName(String name) { + this.name = name; + } + public Drug getDrug() { return drug; } @@ -80,23 +103,23 @@ public void setDrug(Drug drug) { this.drug = drug; } - public List getChildren() { + public List getChildRequirements() { return this.childRequirements; } - public void setChildren(List requirements) { + public void setChildRequirements(List requirements) { this.childRequirements = requirements; } - public void addChild(Requirement requirement) { + public void addChildRequirements(Requirement requirement) { this.childRequirements.add(requirement); } - public Requirement getParent() { + public Requirement getParentRequirement () { return this.parentRequirement; } - public void setParent(Requirement requirement) { + public void setParentRequirement(Requirement requirement) { this.parentRequirement = requirement; } diff --git a/server/src/main/resources/application.yml b/server/src/main/resources/application.yml index 7af34557e..abaae3377 100644 --- a/server/src/main/resources/application.yml +++ b/server/src/main/resources/application.yml @@ -2,8 +2,11 @@ spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation: true spring: - h2: - console.enabled: true + h2: + console: + enabled: true + settings: + web-allow-others: true thymeleaf: cache: false datasource: