/*
fEMR - fast Electronic Medical Records
Copyright (C) 2014 Team fEMR
fEMR 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 3 of the License, or
(at your option) any later version.
fEMR 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 fEMR. If not, see <http://www.gnu.org/licenses/>. If
you have any questions, contact <info@teamfemr.org>.
*/
package femr.util.startup;
import com.avaje.ebean.Ebean;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import femr.data.daos.IRepository;
import femr.data.daos.core.IPatientRepository;
import femr.data.daos.core.IUserRepository;
import femr.data.models.core.*;
import femr.data.models.mysql.*;
import femr.data.models.mysql.concepts.ConceptDiagnosis;
import femr.util.calculations.dateUtils;
import femr.util.encryptions.IPasswordEncryptor;
import femr.util.stringhelpers.StringUtils;
import play.Configuration;
import java.util.ArrayList;
import java.util.List;
@Singleton
public class DatabaseSeeder {
private final IPatientRepository patientRepository;
private final IUserRepository userRepository;
private final IRepository<IConceptDiagnosis> diagnosisRepository;
private final IRepository<IMissionCountry> missionCountryRepository;
private final IRepository<IMissionCity> missionCityRepository;
private final IRepository<IMissionTeam> missionTeamRepository;
private final IRepository<ISystemSetting> systemSettingRepository;
private final IRepository<ITabField> tabFieldRepository;
private final IRepository<ITabFieldSize> tabFieldSizeRepository;
private final IRepository<ITabFieldType> tabFieldTypeRepository;
private final IRepository<ITab> tabRepository;
private final Configuration configuration;
private final IPasswordEncryptor passwordEncryptor;
@Inject
public DatabaseSeeder(IPatientRepository patientRepository,
IUserRepository userRepository,
IRepository<IConceptDiagnosis> diagnosisRepository,
IRepository<IMissionCountry> missionCountryRepository,
IRepository<IMissionCity> missionCityRepository,
IRepository<IMissionTeam> missionTeamRepository,
IRepository<ISystemSetting> systemSettingRepository,
IRepository<ITabField> tabFieldRepository,
IRepository<ITabFieldSize> tabFieldSizeRepository,
IRepository<ITabFieldType> tabFieldTypeRepository,
IRepository<ITab> tabRepository,
Configuration configuration,
IPasswordEncryptor passwordEncryptor) {
this.patientRepository = patientRepository;
this.userRepository = userRepository;
this.configuration = configuration;
this.passwordEncryptor = passwordEncryptor;
this.diagnosisRepository = diagnosisRepository;
this.systemSettingRepository = systemSettingRepository;
this.tabFieldRepository = tabFieldRepository;
this.tabFieldSizeRepository = tabFieldSizeRepository;
this.tabFieldTypeRepository = tabFieldTypeRepository;
this.tabRepository = tabRepository;
this.missionCountryRepository = missionCountryRepository;
this.missionTeamRepository = missionTeamRepository;
this.missionCityRepository = missionCityRepository;
this.seed();
}
private void seed() {
seedMissionTripInformation();
seedSystemSettings();
seedSystemSettingsDescriptions();
seedAdminUser();
seedDefaultTabNames();
seedDefaultTabFieldSizes();
seedDefaultTabFieldTypes();
seedDefaultTabFields();
seedPatientAgeClassification();
seedDiagnosis();
seedUserRoles();
}
private void seedDiagnosis() {
List<? extends IConceptDiagnosis> diagnosis_but_plural = diagnosisRepository.findAll(ConceptDiagnosis.class);
List<String> availableDiagnosis = new ArrayList<>();
availableDiagnosis.add("Acne Vulgaris");
availableDiagnosis.add("Allergies");
availableDiagnosis.add("Amenorrhea");
availableDiagnosis.add("Anemia, Iron Deficiency");
availableDiagnosis.add("Anemia, Sickle Cell");
availableDiagnosis.add("Anxiety Disorder");
availableDiagnosis.add("Arthritis, Osteo");
availableDiagnosis.add("Arthritis, Rheumatoid");
availableDiagnosis.add("Ascites");
availableDiagnosis.add("Asthma");
availableDiagnosis.add("Bacterial Infection, Abscess");
availableDiagnosis.add("Bacterial Infection, Skin");
availableDiagnosis.add("Bacterial Vaginosis");
availableDiagnosis.add("Trichomonas Vaginalis");
availableDiagnosis.add("Benign Prostatic Hyperplasia");
availableDiagnosis.add("Bronchitis");
availableDiagnosis.add("Bursitis");
availableDiagnosis.add("Cataracts");
availableDiagnosis.add("Cerebral Palsy");
availableDiagnosis.add("Chlamydia");
availableDiagnosis.add("Chronic Obstructive Pulmonary Disease");
availableDiagnosis.add("Constipation");
availableDiagnosis.add("Contact Dermatitis");
availableDiagnosis.add("Cough");
availableDiagnosis.add("Conjuctivitis");
availableDiagnosis.add("Cystitis");
availableDiagnosis.add("Dehydration");
availableDiagnosis.add("Dental, Abscess");
availableDiagnosis.add("Dental, Chipped Tooth");
availableDiagnosis.add("Dental, Gingivitis");
availableDiagnosis.add("Dental, Infection");
availableDiagnosis.add("Dental, Pain");
availableDiagnosis.add("Depression");
availableDiagnosis.add("Diabetes Mellitus, Type 1");
availableDiagnosis.add("Diabetes mellitus, Type 2");
availableDiagnosis.add("Diarrhea");
availableDiagnosis.add("Dizziness");
availableDiagnosis.add("Dry Eyes");
availableDiagnosis.add("Dry Skin");
availableDiagnosis.add("Dysmenorrhea");
availableDiagnosis.add("Dysuria");
availableDiagnosis.add("Ear Infection (not Otitis Media)");
availableDiagnosis.add("Eczema");
availableDiagnosis.add("Fever");
availableDiagnosis.add("Folliculitis");
availableDiagnosis.add("Gastric Ulcer");
availableDiagnosis.add("Gastritis");
availableDiagnosis.add("Gastroenteritis");
availableDiagnosis.add("Gastroesophageal Reflux Disease");
availableDiagnosis.add("Headache");
availableDiagnosis.add("Herpangina");
availableDiagnosis.add("Herpes Simplex Virus, Oral");
availableDiagnosis.add("Herpes Simplex Virus, Genital");
availableDiagnosis.add("High Blood Pressure");
availableDiagnosis.add("Hypertension");
availableDiagnosis.add("Irregular Menstruation");
availableDiagnosis.add("Laceration");
availableDiagnosis.add("Lipoma");
availableDiagnosis.add("Lymphadenitis");
availableDiagnosis.add("Malaria");
availableDiagnosis.add("Malnutrition");
availableDiagnosis.add("Melena");
availableDiagnosis.add("Nausea");
availableDiagnosis.add("Neuropathy");
availableDiagnosis.add("Orthostatic Hypotension");
availableDiagnosis.add("Otitis Media");
availableDiagnosis.add("Pain, Abdominal");
availableDiagnosis.add("Pain, Arm");
availableDiagnosis.add("Pain, Bone");
availableDiagnosis.add("Pain, Breast");
availableDiagnosis.add("Pain, Costrochondral");
availableDiagnosis.add("Pain, Ear");
availableDiagnosis.add("Pain, Eye");
availableDiagnosis.add("Pain, Foot");
availableDiagnosis.add("Pain, Generalized");
availableDiagnosis.add("Pain, Joint");
availableDiagnosis.add("Pain, Knee");
availableDiagnosis.add("Pain, Leg");
availableDiagnosis.add("Pain, Muscle");
availableDiagnosis.add("Parasitic Infection");
availableDiagnosis.add("Pelvic Inflammatory Disease");
availableDiagnosis.add("Pharyngitis, Bacterial");
availableDiagnosis.add("Pharyngitis, Viral");
availableDiagnosis.add("Phimosis");
availableDiagnosis.add("Pneumonia");
availableDiagnosis.add("Pregnancy");
availableDiagnosis.add("Prostitis");
availableDiagnosis.add("Psoriasis");
availableDiagnosis.add("Pylonephritis");
availableDiagnosis.add("Scabies");
availableDiagnosis.add("Sebhorragic Dermatitis");
availableDiagnosis.add("Seizure Disorder");
availableDiagnosis.add("Shortness of Breath");
availableDiagnosis.add("Angina Pectoris, Stable");
availableDiagnosis.add("Angina Pectoris, Unstable");
availableDiagnosis.add("Sinusitis");
availableDiagnosis.add("Sty");
availableDiagnosis.add("Syphilis");
availableDiagnosis.add("Thelarche");
availableDiagnosis.add("Tinea Capitis");
availableDiagnosis.add("Tinea Corporis");
availableDiagnosis.add("Tinea Cruris");
availableDiagnosis.add("Tinea Legionella");
availableDiagnosis.add("Tinea Versicolor");
availableDiagnosis.add("Urinary Tract Infection");
availableDiagnosis.add("Uterine Fibroids");
availableDiagnosis.add("Uterine Prolapse");
availableDiagnosis.add("Candiasis, Vaginal");
availableDiagnosis.add("Candiasis, Oral");
availableDiagnosis.add("Candiasis, Cutaneous");
List<ConceptDiagnosis> newDiagnosis = new ArrayList<>();
ConceptDiagnosis diagnosis;
for (String diag : availableDiagnosis)
if (diagnosis_but_plural != null && !containDiagnosis(diagnosis_but_plural, diag)) {
diagnosis = new ConceptDiagnosis();
diagnosis.setName(diag);
newDiagnosis.add(diagnosis);
}
diagnosisRepository.createAll(newDiagnosis);
}
private void seedMissionTripInformation() {
//mission countries
List<? extends IMissionCountry> missionCountries = missionCountryRepository.findAll(MissionCountry.class);
List<String> availableCountries = new ArrayList<>();
availableCountries.add("Afghanistan");
availableCountries.add("Albania");
availableCountries.add("Algeria");
availableCountries.add("Andorra");
availableCountries.add("Angola");
availableCountries.add("Antigua & Deps");
availableCountries.add("Argentina");
availableCountries.add("Armenia");
availableCountries.add("Australia");
availableCountries.add("Austria");
availableCountries.add("Azerbaijan");
availableCountries.add("Bahamas");
availableCountries.add("Bahrain");
availableCountries.add("Bangladesh");
availableCountries.add("Barbados");
availableCountries.add("Belarus");
availableCountries.add("Belgium");
availableCountries.add("Belize");
availableCountries.add("Benin");
availableCountries.add("Bhutan");
availableCountries.add("Bolivia");
availableCountries.add("Bosnia Herzegovina");
availableCountries.add("Botswana");
availableCountries.add("Brazil");
availableCountries.add("Brunei");
availableCountries.add("Bulgaria");
availableCountries.add("Burkina");
availableCountries.add("Burundi");
availableCountries.add("Cambodia");
availableCountries.add("Cameroon");
availableCountries.add("Canada");
availableCountries.add("Cape Verde");
availableCountries.add("Central African Rep");
availableCountries.add("Chad");
availableCountries.add("Chile");
availableCountries.add("China");
availableCountries.add("Colombia");
availableCountries.add("Comoros");
availableCountries.add("Congo");
availableCountries.add("Congo {Democratic Rep}");
availableCountries.add("Costa Rica");
availableCountries.add("Croatia");
availableCountries.add("Cuba");
availableCountries.add("Cyprus");
availableCountries.add("Czech Republic");
availableCountries.add("Denmark");
availableCountries.add("Djibouti");
availableCountries.add("Dominica");
availableCountries.add("Dominican Republic");
availableCountries.add("East Timor");
availableCountries.add("Ecuador");
availableCountries.add("Egypt");
availableCountries.add("El Salvador");
availableCountries.add("Equatorial Guinea");
availableCountries.add("Eritrea");
availableCountries.add("Estonia");
availableCountries.add("Ethiopia");
availableCountries.add("Fiji");
availableCountries.add("Finland");
availableCountries.add("France");
availableCountries.add("Gabon");
availableCountries.add("Gambia");
availableCountries.add("Georgia");
availableCountries.add("Germany");
availableCountries.add("Ghana");
availableCountries.add("Greece");
availableCountries.add("Grenada");
availableCountries.add("Guatemala");
availableCountries.add("Guinea");
availableCountries.add("Guinea-Bissau");
availableCountries.add("Guyana");
availableCountries.add("Haiti");
availableCountries.add("Honduras");
availableCountries.add("Hungary");
availableCountries.add("Iceland");
availableCountries.add("India");
availableCountries.add("Indonesia");
availableCountries.add("Iran");
availableCountries.add("Iraq");
availableCountries.add("Ireland {Republic}");
availableCountries.add("Israel");
availableCountries.add("Italy");
availableCountries.add("Ivory Coast");
availableCountries.add("Jamaica");
availableCountries.add("Japan");
availableCountries.add("Jordan");
availableCountries.add("Kazakhstan");
availableCountries.add("Kenya");
availableCountries.add("Kiribati");
availableCountries.add("Korea North");
availableCountries.add("Korea South");
availableCountries.add("Kosovo");
availableCountries.add("Kuwait");
availableCountries.add("Kyrgyzstan");
availableCountries.add("Laos");
availableCountries.add("Latvia");
availableCountries.add("Lebanon");
availableCountries.add("Lesotho");
availableCountries.add("Liberia");
availableCountries.add("Libya");
availableCountries.add("Liechtenstein");
availableCountries.add("Lithuania");
availableCountries.add("Luxembourg");
availableCountries.add("Macedonia");
availableCountries.add("Madagascar");
availableCountries.add("Malawi");
availableCountries.add("Malaysia");
availableCountries.add("Maldives");
availableCountries.add("Mali");
availableCountries.add("Malta");
availableCountries.add("Marshall Islands");
availableCountries.add("Mauritania");
availableCountries.add("Mauritius");
availableCountries.add("Mexico");
availableCountries.add("Micronesia");
availableCountries.add("Moldova");
availableCountries.add("Monaco");
availableCountries.add("Mongolia");
availableCountries.add("Montenegro");
availableCountries.add("Morocco");
availableCountries.add("Mozambique");
availableCountries.add("Myanmar, {Burma}");
availableCountries.add("Namibia");
availableCountries.add("Nauru");
availableCountries.add("Nepal");
availableCountries.add("Netherlands");
availableCountries.add("New Zealand");
availableCountries.add("Nicaragua");
availableCountries.add("Niger");
availableCountries.add("Nigeria");
availableCountries.add("Norway");
availableCountries.add("Oman");
availableCountries.add("Pakistan");
availableCountries.add("Palau");
availableCountries.add("Panama");
availableCountries.add("Papua New Guinea");
availableCountries.add("Paraguay");
availableCountries.add("Peru");
availableCountries.add("Philippines");
availableCountries.add("Poland");
availableCountries.add("Portugal");
availableCountries.add("Qatar");
availableCountries.add("Romania");
availableCountries.add("Russian Federation");
availableCountries.add("Rwanda");
availableCountries.add("St Kitts & Nevis");
availableCountries.add("St Lucia");
availableCountries.add("Saint Vincent & the Grenadines");
availableCountries.add("Samoa");
availableCountries.add("San Marino");
availableCountries.add("Sao Tome & Principe");
availableCountries.add("Saudi Arabia");
availableCountries.add("Senegal");
availableCountries.add("Serbia");
availableCountries.add("Seychelles");
availableCountries.add("Sierra Leone");
availableCountries.add("Singapore");
availableCountries.add("Slovakia");
availableCountries.add("Slovenia");
availableCountries.add("Solomon Islands");
availableCountries.add("Somalia");
availableCountries.add("South Africa");
availableCountries.add("South Sudan");
availableCountries.add("Spain");
availableCountries.add("Sri Lanka");
availableCountries.add("Sudan");
availableCountries.add("Suriname");
availableCountries.add("Swaziland");
availableCountries.add("Sweden");
availableCountries.add("Switzerland");
availableCountries.add("Syria");
availableCountries.add("Taiwan");
availableCountries.add("Tajikistan");
availableCountries.add("Tanzania");
availableCountries.add("Thailand");
availableCountries.add("Togo");
availableCountries.add("Tonga");
availableCountries.add("Trinidad & Tobago");
availableCountries.add("Tunisia");
availableCountries.add("Turkey");
availableCountries.add("Turkmenistan");
availableCountries.add("Tuvalu");
availableCountries.add("Uganda");
availableCountries.add("Ukraine");
availableCountries.add("United Arab Emirates");
availableCountries.add("United Kingdom");
availableCountries.add("USA");
availableCountries.add("Uruguay");
availableCountries.add("Uzbekistan");
availableCountries.add("Vanuatu");
availableCountries.add("Vatican City");
availableCountries.add("Venezuela");
availableCountries.add("Vietnam");
availableCountries.add("Yemen");
availableCountries.add("Zambia");
availableCountries.add("Zimbabwe");
List<MissionCountry> newMissionCountries = new ArrayList<>();
MissionCountry missionCountry;
for (String country : availableCountries) {
if (missionCountries != null && !containMissionCountry(missionCountries, country)) {
missionCountry = new MissionCountry();
missionCountry.setName(country);
newMissionCountries.add(missionCountry);
}
}
missionCountryRepository.createAll(newMissionCountries);
missionCountries = missionCountryRepository.findAll(MissionCountry.class);
//mission teams
List<? extends IMissionTeam> missionTeams = missionTeamRepository.findAll(MissionTeam.class);
List<MissionTeam> newMissionTeams = new ArrayList<>();
MissionTeam missionTeam;
if (missionTeams != null && !containMissionTeam(missionTeams, "Aid for Haiti")) {
missionTeam = new MissionTeam();
missionTeam.setName("Aid for Haiti");
missionTeam.setLocation("Tennessee");
missionTeam.setDescription("Dr. Sutherland's group");
newMissionTeams.add(missionTeam);
}
if (missionTeams != null && !containMissionTeam(missionTeams, "WSU-WHSO")) {
missionTeam = new MissionTeam();
missionTeam.setName("WSU-WHSO");
missionTeam.setLocation("Detroit");
missionTeam.setDescription("Wayne State medical students");
newMissionTeams.add(missionTeam);
}
if (missionTeams != null && !containMissionTeam(missionTeams, "ApParent Project")) {
missionTeam = new MissionTeam();
missionTeam.setName("ApParent Project");
missionTeam.setLocation("New York");
missionTeam.setDescription("Dr. Parson's group - primarily operates in Port Au Prince");
newMissionTeams.add(missionTeam);
}
missionTeamRepository.createAll(newMissionTeams);
//countries
List<? extends IMissionCity> missionCities = missionCityRepository.findAll(MissionCity.class);
List<MissionCity> newMissionCities = new ArrayList<>();
MissionCity missionCity;
if (missionCities != null && !containMissionCity(missionCities, "Morne De L' Hopital", "Haiti")) {
missionCity = new MissionCity();
missionCity.setName("Morne De L' Hopital");
missionCity.setMissionCountry(getMissionCountry(missionCountries, "Haiti"));
newMissionCities.add(missionCity);
}
if (missionCities != null && !containMissionCity(missionCities, "Port-au-Prince", "Haiti")) {
missionCity = new MissionCity();
missionCity.setName("Port-au-Prince");
missionCity.setMissionCountry(getMissionCountry(missionCountries, "Haiti"));
newMissionCities.add(missionCity);
}
missionCityRepository.createAll(newMissionCities);
}
private void seedPatientAgeClassification() {
//sort order auto increments
List<? extends IPatientAgeClassification> patientAgeClassifications = patientRepository.retrieveAllPatientAgeClassifications();
if (patientAgeClassifications != null && !containClassification(patientAgeClassifications, "infant")) {
patientRepository.createPatientAgeClassification("infant", "0-1", 1);
}
if (patientAgeClassifications != null && !containClassification(patientAgeClassifications, "child")) {
patientRepository.createPatientAgeClassification("child", "2-12", 2);
}
if (patientAgeClassifications != null && !containClassification(patientAgeClassifications, "teen")) {
patientRepository.createPatientAgeClassification("teen", "13-17", 3);
}
if (patientAgeClassifications != null && !containClassification(patientAgeClassifications, "adult")) {
patientRepository.createPatientAgeClassification("adult", "18-64", 4);
}
if (patientAgeClassifications != null && !containClassification(patientAgeClassifications, "elder")) {
patientRepository.createPatientAgeClassification("elder", "65+", 5);
}
}
/**
* Seed available system settings
*/
private void seedSystemSettings() {
List<? extends ISystemSetting> systemSettings = systemSettingRepository.findAll(SystemSetting.class);
SystemSetting systemSetting;
if (systemSettings != null && !containSetting(systemSettings, "Multiple chief complaints")) {
systemSetting = new SystemSetting();
systemSetting.setName("Multiple chief complaints");
systemSetting.setActive(false);
systemSetting.setDescription("When checked, a user can add multiple chief complaints for a patient");
systemSettingRepository.create(systemSetting);
}
if (systemSettings != null && !containSetting(systemSettings, "Medical PMH Tab")) {
systemSetting = new SystemSetting();
systemSetting.setName("Medical PMH Tab");
systemSetting.setActive(true);
systemSetting.setDescription("When checked, the Past Medical History tab on medical appears");
systemSettingRepository.create(systemSetting);
}
if (systemSettings != null && !containSetting(systemSettings, "Medical Photo Tab")) {
systemSetting = new SystemSetting();
systemSetting.setName("Medical Photo Tab");
systemSetting.setActive(true);
systemSetting.setDescription("When checked, the Photo tab on medical appears");
systemSettingRepository.create(systemSetting);
}
if (systemSettings != null && !containSetting(systemSettings, "Medical HPI Consolidate")) {
systemSetting = new SystemSetting();
systemSetting.setName("Medical HPI Consolidate");
systemSetting.setActive(false);
systemSetting.setDescription("When checked, the HPI tab on medical is consolidated into one Narrative text field");
systemSettingRepository.create(systemSetting);
}
if (systemSettings != null && !containSetting(systemSettings, "Metric System Option")) {
systemSetting = new SystemSetting();
systemSetting.setName("Metric System Option");
systemSetting.setActive(true);
systemSetting.setDescription("When checked, the entire system becomes metric");
systemSettingRepository.create(systemSetting);
}
//Filters the patient search based on which country the team is currently in
if (systemSettings != null && !containSetting(systemSettings, "Country Filter")) {
systemSetting = new SystemSetting();
systemSetting.setName("Country Filter");
systemSetting.setActive(false);
systemSetting.setDescription("When checked, patients from other countries will not show up in a search");
systemSettingRepository.create(systemSetting);
}
if (systemSettings != null && !containSetting(systemSettings, "Research Only")) {
systemSetting = new SystemSetting();
systemSetting.setName("Research Only");
systemSetting.setActive(false);
systemSetting.setDescription("When checked, turns off all functionality except research. Not to be used in a clinic environment");
systemSettingRepository.create(systemSetting);
}
//Asks a physician in medical if they screened the patient for diabetes based on
//criteria: (Age >= 18) AND (Systolic bp >= 140 OR Diastolic bp >= 90)
if (systemSettings != null && !containSetting(systemSettings, "Diabetes Prompt")){
systemSetting = new SystemSetting();
systemSetting.setName("Diabetes Prompt");
systemSetting.setActive(false);
systemSetting.setDescription("When checked, asks a physician in medical if they screened a patient for diabetes when blood pressure is over 135/80 and age is over 18 OR older than 25 and BMI greater than or equal to 25");
systemSettingRepository.create(systemSetting);
}
}
private void seedSystemSettingsDescriptions() {
List<? extends ISystemSetting> systemSettings = systemSettingRepository.findAll(SystemSetting.class);
for (ISystemSetting ss : systemSettings)
{
if (ss.getName().equals("Multiple chief complaints")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, a user can add multiple chief complaints for a patient");
systemSettingRepository.update((SystemSetting)ss);
}
}
if (ss.getName().equals("Medical PMH Tab")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, the Past Medical History tab on medical appears");
systemSettingRepository.update((SystemSetting)ss);
}
}
if (ss.getName().equals("Medical Photo Tab")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, the Photo tab on medical appears");
systemSettingRepository.update((SystemSetting)ss);
}
}
if (ss.getName().equals("Medical HPI Consolidate")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, the HPI tab on medical is consolidated into one Narrative text field");
systemSettingRepository.update((SystemSetting)ss);
}
}
if (ss.getName().equals("Metric System Option")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, the entire system becomes metric");
systemSettingRepository.update((SystemSetting)ss);
}
}
if (ss.getName().equals("Country Filter")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, patients from other countries will not show up in a search");
systemSettingRepository.update((SystemSetting)ss);
}
}
if (ss.getName().equals("Research Only")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, turns off all functionality except research. Not to be used in a clinic environment");
systemSettingRepository.update((SystemSetting)ss);
}
}
if (ss.getName().equals("Diabetes Prompt")){
if (StringUtils.isNullOrWhiteSpace(ss.getDescription())){
ss.setDescription("When checked, asks a physician in medical if they screened a patient for diabetes when blood pressure is over 135/80 and age is over 18 OR older than 25 and BMI greater than or equal to 25");
systemSettingRepository.update((SystemSetting)ss);
}
}
}
}
/**
* Uses references to HPI, PMH, and Treatment Tabs
* Uses references to both number and text TabFieldTypes
*/
private void seedDefaultTabFields() {
List<? extends ITabField> tabFields = tabFieldRepository.findAll(TabField.class);
//get the id references for tabs
List<? extends ITab> tabs = tabRepository.findAll(Tab.class);
int hpiId = -1;
int pmhId = -1;
int treatmentId = -1;
for (ITab t : tabs) {
switch (t.getName()) {
case "HPI":
hpiId = t.getId();
break;
case "PMH":
pmhId = t.getId();
break;
case "Treatment":
treatmentId = t.getId();
break;
}
}
//get the id references for tab field types
List<? extends ITabFieldType> tabFieldTypes = tabFieldTypeRepository.findAll(TabFieldType.class);
int numberId = -1;
int textId = -1;
for (ITabFieldType tft : tabFieldTypes) {
switch (tft.getName()) {
case "number":
numberId = tft.getId();
break;
case "text":
textId = tft.getId();
break;
}
}
List<TabField> tabFieldsToAdd = new ArrayList<>();
if (tabFields != null) {
TabField tabField;
if (!containTabField(tabFields, "onset")) {
tabField = new TabField();
tabField.setName("onset");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "severity")) {
tabField = new TabField();
tabField.setName("severity");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, numberId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "radiation")) {
tabField = new TabField();
tabField.setName("radiation");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "quality")) {
tabField = new TabField();
tabField.setName("quality");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "provokes")) {
tabField = new TabField();
tabField.setName("provokes");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "palliates")) {
tabField = new TabField();
tabField.setName("palliates");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "timeOfDay")) {
tabField = new TabField();
tabField.setName("timeOfDay");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "physicalExamination")) {
tabField = new TabField();
tabField.setName("physicalExamination");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "narrative")) {
tabField = new TabField();
tabField.setName("narrative");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, hpiId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "assessment")) {
tabField = new TabField();
tabField.setName("assessment");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, treatmentId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "problem")) {
tabField = new TabField();
tabField.setName("problem");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, treatmentId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "procedure_counseling")) {
tabField = new TabField();
tabField.setName("procedure_counseling");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, treatmentId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "medicalSurgicalHistory")) {
tabField = new TabField();
tabField.setName("medicalSurgicalHistory");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, pmhId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "socialHistory")) {
tabField = new TabField();
tabField.setName("socialHistory");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, pmhId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "currentMedication")) {
tabField = new TabField();
tabField.setName("currentMedication");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, pmhId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
if (!containTabField(tabFields, "familyHistory")) {
tabField = new TabField();
tabField.setName("familyHistory");
tabField.setIsDeleted(false);
tabField.setTab(Ebean.getReference(Tab.class, pmhId));
tabField.setTabFieldType(Ebean.getReference(TabFieldType.class, textId));
tabFieldsToAdd.add(tabField);
}
}
tabFieldRepository.createAll(tabFieldsToAdd);
}
private void seedDefaultTabNames() {
List<? extends ITab> tabs = tabRepository.findAll(Tab.class);
List<Tab> tabsToAdd = new ArrayList<>();
if (tabs != null) {
Tab tab;
if (!containTab(tabs, "HPI")) {
tab = new Tab();
tab.setName("HPI");
tab.setIsDeleted(false);
tab.setDateCreated(dateUtils.getCurrentDateTime());
tab.setUserId(null);
tab.setLeftColumnSize(2);
tab.setRightColumnSize(2);
tab.setIsCustom(false);
tabsToAdd.add(tab);
}
if (!containTab(tabs, "PMH")) {
tab = new Tab();
tab.setName("PMH");
tab.setIsDeleted(false);
tab.setDateCreated(dateUtils.getCurrentDateTime());
tab.setUserId(null);
tab.setLeftColumnSize(0);
tab.setRightColumnSize(0);
tab.setIsCustom(false);
tabsToAdd.add(tab);
}
if (!containTab(tabs, "Treatment")) {
tab = new Tab();
tab.setName("Treatment");
tab.setIsDeleted(false);
tab.setDateCreated(dateUtils.getCurrentDateTime());
tab.setUserId(null);
tab.setLeftColumnSize(0);
tab.setRightColumnSize(0);
tab.setIsCustom(false);
tabsToAdd.add(tab);
}
if (!containTab(tabs, "Photos")) {
tab = new Tab();
tab.setName("Photos");
tab.setIsDeleted(false);
tab.setDateCreated(dateUtils.getCurrentDateTime());
tab.setUserId(null);
tab.setLeftColumnSize(0);
tab.setRightColumnSize(0);
tab.setIsCustom(false);
tabsToAdd.add(tab);
}
}
tabRepository.createAll(tabsToAdd);
}
private void seedDefaultTabFieldTypes() {
List<? extends ITabFieldType> tabFieldTypes = tabFieldTypeRepository.findAll(TabFieldType.class);
List<TabFieldType> tabFieldTypesToAdd = new ArrayList<>();
if (tabFieldTypes != null) {
TabFieldType tabFieldType;
if (!containTabFieldType(tabFieldTypes, "text")) {
tabFieldType = new TabFieldType();
tabFieldType.setName("text");
tabFieldTypesToAdd.add(tabFieldType);
}
if (!containTabFieldType(tabFieldTypes, "number")) {
tabFieldType = new TabFieldType();
tabFieldType.setName("number");
tabFieldTypesToAdd.add(tabFieldType);
}
tabFieldTypeRepository.createAll(tabFieldTypesToAdd);
}
}
private void seedDefaultTabFieldSizes() {
List<? extends ITabFieldSize> tabFieldSizes = tabFieldSizeRepository.findAll(TabFieldSize.class);
List<TabFieldSize> tabFieldSizesToAdd = new ArrayList<>();
if (tabFieldSizes != null) {
TabFieldSize tabFieldSize;
if (!containTabFieldSize(tabFieldSizes, "medium")) {
tabFieldSize = new TabFieldSize();
tabFieldSize.setName("medium");
tabFieldSizesToAdd.add(tabFieldSize);
}
if (!containTabFieldSize(tabFieldSizes, "large")) {
tabFieldSize = new TabFieldSize();
tabFieldSize.setName("large");
tabFieldSizesToAdd.add(tabFieldSize);
}
}
tabFieldSizeRepository.createAll(tabFieldSizesToAdd);
}
private static IMissionCountry getMissionCountry(List<? extends IMissionCountry> missionCountries, String countryName) {
for (IMissionCountry mc : missionCountries) {
if (mc.getName().toLowerCase().equals(countryName.toLowerCase())) {
return mc;
}
}
return null;
}
private static boolean containMissionCity(List<? extends IMissionCity> missionCities, String cityName, String countryName) {
for (IMissionCity mc : missionCities) {
if (mc.getName().toLowerCase().equals(cityName.toLowerCase()) && mc.getMissionCountry().getName().toLowerCase().equals(countryName.toLowerCase())) {
return true;
}
}
return false;
}
private static boolean containMissionTeam(List<? extends IMissionTeam> missionTeams, String name) {
for (IMissionTeam mt : missionTeams) {
if (mt.getName().equals(name)) {
return true;
}
}
return false;
}
private static boolean containMissionCountry(List<? extends IMissionCountry> missionCountries, String name) {
for (IMissionCountry mc : missionCountries) {
if (mc.getName().equals(name)) {
return true;
}
}
return false;
}
private static boolean containDiagnosis(List<? extends IConceptDiagnosis> diagnosises, String name) {
for (IConceptDiagnosis d : diagnosises) {
if (d.getName().equals(name)) {
return true;
}
}
return false;
}
private static boolean containClassification(List<? extends IPatientAgeClassification> ageClassifications, String name) {
for (IPatientAgeClassification pac : ageClassifications) {
if (pac.getName().equals(name)) {
return true;
}
}
return false;
}
private static boolean containSetting(List<? extends ISystemSetting> systemSettings, String setting) {
for (ISystemSetting ss : systemSettings) {
if (ss.getName().equals(setting)) {
return true;
}
}
return false;
}
private static boolean containTabField(List<? extends ITabField> tabFields, String tabField) {
for (ITabField tf : tabFields) {
if (tf.getName().equals(tabField)) {
return true;
}
}
return false;
}
private static boolean containTab(List<? extends ITab> tabs, String tab) {
for (ITab t : tabs) {
if (t.getName().equals(tab)) {
return true;
}
}
return false;
}
private static boolean containTabFieldType(List<? extends ITabFieldType> tabFieldTypes, String tabFieldType) {
for (ITabFieldType tft : tabFieldTypes) {
if (tft.getName().equals(tabFieldType)) {
return true;
}
}
return false;
}
private static boolean containTabFieldSize(List<? extends ITabFieldSize> tabFieldSizes, String tabFieldSize) {
for (ITabFieldSize tfs : tabFieldSizes) {
if (tfs.getName().equals(tabFieldSize)) {
return true;
}
}
return false;
}
private static boolean containRole(List<? extends IRole> roles, String roleName) {
for (IRole role : roles) {
if (role.getName().equals(roleName)) {
return true;
}
}
return false;
}
/**
* Seed the admin user from the configuration file
* and the super user information.
*/
private void seedAdminUser() {
int userCount = userRepository.countUsers();
if (userCount == 0) {
String defaultAdminUsername = configuration.getString("default.admin.username");
String defaultAdminPassword = configuration.getString("default.admin.password");
String defaultSuperuserUsername = configuration.getString("default.superuser.username");
String defaultSuperuserPassword = configuration.getString("default.superuser.password");
//create the Admin user
//Admin is used for managing users, creating users, managing inventory, etc
//Admin information is given to the manager/group leader/whoever is in charge
User adminUser = new User();
String encryptedAdminPassword = passwordEncryptor.encryptPassword(defaultAdminPassword);
adminUser.setFirstName("Administrator");
adminUser.setLastName("");
adminUser.setEmail(defaultAdminUsername);
adminUser.setPassword(encryptedAdminPassword);
adminUser.setLastLogin(dateUtils.getCurrentDateTime());
adminUser.setDateCreated( dateUtils.getCurrentDateTime() );
adminUser.setDeleted(false);
IRole role = userRepository.retrieveRoleByName("Administrator");
adminUser.addRole(role);
adminUser.setPasswordReset(false);
adminUser.setPasswordCreatedDate( dateUtils.getCurrentDateTime() );
userRepository.createUser(adminUser);
//SuperUser is currently only used for managing dynamic tabs on the medical page
//SuperUser is an account that gives access to important configuration
//settings
User superUser = new User();
String encryptedSuperuserPassword = passwordEncryptor.encryptPassword(defaultSuperuserPassword);
superUser.setFirstName("SuperUser");
superUser.setLastName("");
superUser.setEmail(defaultSuperuserUsername);
superUser.setPassword(encryptedSuperuserPassword);
superUser.setLastLogin(dateUtils.getCurrentDateTime());
superUser.setDateCreated( dateUtils.getCurrentDateTime() );
superUser.setDeleted(false);
IRole role1 = userRepository.retrieveRoleByName("SuperUser");
superUser.addRole(role1);
superUser.setPasswordReset(false);
superUser.setPasswordCreatedDate( dateUtils.getCurrentDateTime() );
userRepository.createUser(superUser);
}
}
private void seedUserRoles() {
//Retrieve other roles in the database excluding SuperUser role which is fine
//because we are only looking for Manager
List<? extends IRole> roles = userRepository.retrieveAllRoles();
if (!containRole(roles, "Manager")) {
// Manager role doesn't exist, add it
userRepository.createRole(Roles.MANAGER, "Manager");
}
}
}