diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index e9224b582..692d923d6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,10 +1,10 @@ #Installation and Configuration using IntelliJ IDEA ### Required downloads -1. [MySQL](http://www.mysql.com/) -2. [Play Framework](http://downloads.typesafe.com/typesafe-activator/1.2.10/typesafe-activator-1.2.10.zip) -3. [Java JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html) -4. [IntelliJ IDEA](http://www.jetbrains.com/idea/) +1. [MySQL 5.6](http://www.mysql.com/) +2. [Play Framework 2.3.7](http://downloads.typesafe.com/typesafe-activator/1.2.10/typesafe-activator-1.2.10.zip) +3. [Java JDK 1.7](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html) +4. [IntelliJ IDEA 13](http://www.jetbrains.com/idea/) 5. [Git](http://git-scm.com/) ### Configuration diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 309342c78..eaea7a301 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -12,4 +12,7 @@ These people have contributed to fEMR's design and implementation: * [Priyesh Pandya](https://github.com/priyeshp) * [Danny Reinheimer](https://github.com/codeitandloadit) * [Cohen Carlisle](https://github.com/Cohen-Carlisle) -* [Brandon Dane](https://github.com/b6025) \ No newline at end of file +* [Brandon Dane](https://github.com/b6025) +* [Ken Dunlap](https://github.com/kdunlap) +* [Arslan Gondal](https://github.com/unfixed) +* [Khoa Le](https://github.com/khoal) \ No newline at end of file diff --git a/app/femr/business/helpers/DomainMapper.java b/app/femr/business/helpers/DomainMapper.java index cc0e61b19..8c06154b5 100644 --- a/app/femr/business/helpers/DomainMapper.java +++ b/app/femr/business/helpers/DomainMapper.java @@ -20,12 +20,17 @@ import com.avaje.ebean.Ebean; import com.google.inject.Inject; + import javax.inject.Provider; + import femr.common.models.*; -import femr.data.models.*; +import femr.ui.models.research.FilterViewModel; +import femr.data.models.core.*; import femr.util.calculations.dateUtils; import femr.util.stringhelpers.StringUtils; import org.joda.time.DateTime; + +import java.util.Date; import java.util.List; /** @@ -39,6 +44,10 @@ public class DomainMapper { private final Provider medicationActiveDrugProvider; private final Provider medicationMeasurementUnitProvider; private final Provider medicationFormProvider; + private final Provider missionCityProvider; + private final Provider missionCountryProvider; + private final Provider missionTeamProvider; + private final Provider missionTripProvider; private final Provider patientProvider; private final Provider patientAgeClassificationProvider; private final Provider patientEncounterPhotoProvider; @@ -46,7 +55,6 @@ public class DomainMapper { private final Provider patientEncounterTabFieldProvider; private final Provider patientEncounterVitalProvider; private final Provider patientPrescriptionProvider; - private final Provider photoProvider; private final Provider roleProvider; private final Provider tabFieldProvider; @@ -63,6 +71,10 @@ public DomainMapper(Provider chiefComplaintProvider, Provider medicationFormProvider, Provider medicationActiveDrugProvider, Provider medicationMeasurementUnitProvider, + Provider missionCityProvider, + Provider missionCountryProvider, + Provider missionTeamProvider, + Provider missionTripProvider, Provider patientProvider, Provider patientAgeClassificationProvider, Provider patientEncounterPhotoProvider, @@ -84,7 +96,11 @@ public DomainMapper(Provider chiefComplaintProvider, this.medicationActiveDrugNameProvider = medicationActiveDrugNameProvider; this.medicationFormProvider = medicationFormProvider; this.medicationActiveDrugProvider = medicationActiveDrugProvider; - this.medicationMeasurementUnitProvider = medicationMeasurementUnitProvider; + this.medicationMeasurementUnitProvider = medicationMeasurementUnitProvider; + this.missionCityProvider = missionCityProvider; + this.missionCountryProvider = missionCountryProvider; + this.missionTeamProvider = missionTeamProvider; + this.missionTripProvider = missionTripProvider; this.patientProvider = patientProvider; this.patientAgeClassificationProvider = patientAgeClassificationProvider; this.patientEncounterPhotoProvider = patientEncounterPhotoProvider; @@ -175,6 +191,107 @@ public ITabField createTabField(TabFieldItem tabFieldItem, Boolean isDeleted, IT return tabField; } + /** + * Creates a trip item + * + * @param teamName name of the team + * @param tripCity city of the trip + * @param tripCountry country of the trip + * @param startDate when the trip starts + * @param endDate when the trip ends + * @return + */ + public static TripItem createTripItem(String teamName, String tripCity, String tripCountry, Date startDate, Date endDate) { + if (StringUtils.isNullOrWhiteSpace(teamName)|| + StringUtils.isNullOrWhiteSpace(tripCity) || + StringUtils.isNullOrWhiteSpace(tripCountry) || + startDate == null){ + return null; + } + + TripItem tripItem = new TripItem(); + tripItem.setTeamName(teamName); + tripItem.setTripCity(tripCity); + tripItem.setTripCountry(tripCountry); + tripItem.setTripStartDate(startDate); + tripItem.setTripEndDate(endDate); + return tripItem; + } + + public static TeamItem createTeamItem(String name, String location, String description){ + if (StringUtils.isNullOrWhiteSpace(name)){ + return null; + } + TeamItem teamItem = new TeamItem(); + teamItem.setName(name); + teamItem.setLocation(location); + teamItem.setDescription(description); + return teamItem; + } + + public static CityItem createCityItem(String cityName, String countryName){ + if (StringUtils.isNullOrWhiteSpace(cityName) || StringUtils.isNullOrWhiteSpace(countryName)) + return null; + + CityItem cityItem = new CityItem(); + cityItem.setCityName(cityName); + cityItem.setCountryName(countryName); + return cityItem; + } + + /** + * Create a new mission trip + * + * @param startDate start date of the trip + * @param endDate end date of the trip + * @param isCurrent is this the current trip? + * @param missionCity the city where the trip is taking place + * @param missionTeam the country where the trip is taking place + * @return a brand spankin' new freakin' mission trip + */ + public IMissionTrip createMissionTrip(Date startDate, Date endDate, boolean isCurrent, IMissionCity missionCity, IMissionTeam missionTeam) { + if (startDate == null || endDate == null || missionCity == null || missionTeam == null) { + return null; + } + IMissionTrip missionTrip = missionTripProvider.get(); + missionTrip.setCurrent(isCurrent); + missionTrip.setStartDate(startDate); + missionTrip.setEndDate(endDate); + missionTrip.setMissionCity(missionCity); + missionTrip.setMissionTeam(missionTeam); + return missionTrip; + } + + public IMissionCountry createMissionCountry(String name) { + if (StringUtils.isNullOrWhiteSpace(name)) { + return null; + } + IMissionCountry missionCountry = missionCountryProvider.get(); + missionCountry.setName(name); + return missionCountry; + } + + public IMissionCity createMissionCity(String name, IMissionCountry missionCountry) { + if (StringUtils.isNullOrWhiteSpace(name) || missionCountry == null) { + return null; + } + IMissionCity missionCity = missionCityProvider.get(); + missionCity.setMissionCountry(missionCountry); + missionCity.setName(name); + return missionCity; + } + + public IMissionTeam createMissionTeam(String name, String location, String description) { + if (StringUtils.isNullOrWhiteSpace(name)) { + return null; + } + IMissionTeam missionTeam = missionTeamProvider.get(); + missionTeam.setName(name); + missionTeam.setLocation(location); + missionTeam.setDescription(description); + return missionTeam; + } + /** * Create a new TabItem (DTO) * @@ -286,7 +403,7 @@ public static MedicationItem createMedicationItem(IMedication medication) { } String fullActiveDrugName = ""; - for(IMedicationActiveDrug medicationActiveDrug : medication.getMedicationActiveDrugs()){ + for (IMedicationActiveDrug medicationActiveDrug : medication.getMedicationActiveDrugs()) { medicationItem.addActiveIngredient(medicationActiveDrug.getMedicationActiveDrugName().getName(), medicationActiveDrug.getMedicationMeasurementUnit().getName(), medicationActiveDrug.getValue(), @@ -325,7 +442,7 @@ public IMedication createMedication(MedicationItem medicationItem, List 0) { + + filterItem.setGroupPrimary(filterViewModel.isGroupPrimary()); + } else { + + filterItem.setGroupPrimary(false); + } + + filterItem.setRangeStart(filterViewModel.getRangeStart()); + filterItem.setRangeEnd(filterViewModel.getRangeEnd()); + + filterItem.setMedicationId(filterViewModel.getMedicationId()); + + return filterItem; + } } diff --git a/app/femr/business/helpers/LogicDoer.java b/app/femr/business/helpers/LogicDoer.java index 2005d4e72..58bf3539a 100644 --- a/app/femr/business/helpers/LogicDoer.java +++ b/app/femr/business/helpers/LogicDoer.java @@ -19,7 +19,7 @@ package femr.business.helpers; import com.typesafe.config.ConfigFactory; -import femr.data.models.IPatientEncounter; +import femr.data.models.core.IPatientEncounter; import femr.util.calculations.dateUtils; import org.joda.time.DateTime; diff --git a/app/femr/business/helpers/QueryHelper.java b/app/femr/business/helpers/QueryHelper.java index 49726c39a..b183eaa50 100644 --- a/app/femr/business/helpers/QueryHelper.java +++ b/app/femr/business/helpers/QueryHelper.java @@ -19,10 +19,9 @@ package femr.business.helpers; import com.avaje.ebean.Query; -import femr.common.models.VitalItem; import femr.data.daos.IRepository; -import femr.data.models.IPatientEncounterVital; -import femr.data.models.PatientEncounterVital; +import femr.data.models.core.IPatientEncounterVital; +import femr.data.models.mysql.PatientEncounterVital; import java.util.List; diff --git a/app/femr/business/helpers/QueryProvider.java b/app/femr/business/helpers/QueryProvider.java index ea4f84b93..9737d3dbc 100644 --- a/app/femr/business/helpers/QueryProvider.java +++ b/app/femr/business/helpers/QueryProvider.java @@ -21,9 +21,7 @@ import com.avaje.ebean.Ebean; import com.avaje.ebean.Query; -import femr.data.models.Role; -import femr.data.models.User; -import femr.data.models.*; +import femr.data.models.mysql.*; /** * Responsible for providing all queries @@ -50,6 +48,14 @@ public static Query getMedicationFormQuery() { return Ebean.find(MedicationForm.class); } + public static Query getMissionTripQuery() { return Ebean.find(MissionTrip.class);} + + public static Query getMissionCityQuery() { return Ebean.find(MissionCity.class);} + + public static Query getMissionCountryQuery() { return Ebean.find(MissionCountry.class);} + + public static Query getMissionTeamQuery() { return Ebean.find(MissionTeam.class);} + public static Query getPatientQuery() { return Ebean.find(Patient.class); } diff --git a/app/femr/business/services/TriageService.java b/app/femr/business/services/TriageService.java deleted file mode 100644 index 64f8ba4b9..000000000 --- a/app/femr/business/services/TriageService.java +++ /dev/null @@ -1,270 +0,0 @@ -/* - 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 . If - you have any questions, contact . -*/ -package femr.business.services; - -import com.avaje.ebean.ExpressionList; -import com.avaje.ebean.Query; -import com.google.inject.Inject; -import com.google.inject.Provider; -import femr.business.helpers.DomainMapper; -import femr.business.helpers.QueryHelper; -import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; -import femr.data.daos.IRepository; -import femr.data.models.*; -import femr.common.models.PatientEncounterItem; -import femr.common.models.PatientItem; -import femr.common.models.VitalItem; -import femr.util.calculations.dateUtils; -import femr.util.stringhelpers.StringUtils; - -import java.util.*; - -public class TriageService implements ITriageService { - - private final IRepository chiefComplaintRepository; - private final IRepository patientRepository; - private final IRepository patientAgeClassificationRepository; - private final IRepository patientEncounterRepository; - private final IRepository patientEncounterVitalRepository; - private final IRepository userRepository; - private final IRepository vitalRepository; - private final Provider patientEncounterVitalProvider; - private final DomainMapper domainMapper; - - @Inject - public TriageService(IRepository chiefComplaintRepository, - IRepository patientRepository, - IRepository patientAgeClassificationRepository, - IRepository patientEncounterRepository, - IRepository patientEncounterVitaRepository, - IRepository userRepository, - IRepository vitalRepository, - Provider patientEncounterVitalProvider, - DomainMapper domainMapper) { - this.chiefComplaintRepository = chiefComplaintRepository; - this.patientRepository = patientRepository; - this.patientAgeClassificationRepository = patientAgeClassificationRepository; - this.patientEncounterRepository = patientEncounterRepository; - this.patientEncounterVitalRepository = patientEncounterVitaRepository; - this.userRepository = userRepository; - this.vitalRepository = vitalRepository; - this.patientEncounterVitalProvider = patientEncounterVitalProvider; - this.domainMapper = domainMapper; - } - - /** - * {@inheritDoc} - */ - public ServiceResponse> findPossibleAgeClassifications() { - ServiceResponse> response = new ServiceResponse<>(); - Map patientAgeClassificationStrings = new LinkedHashMap<>(); - try { - Query patientAgeClassificationExpressionList = QueryProvider.getPatientAgeClassificationQuery() - .where() - .eq("isDeleted", false) - .order() - .asc("sortOrder"); - List patientAgeClassifications = patientAgeClassificationRepository.find(patientAgeClassificationExpressionList); - for (IPatientAgeClassification pac : patientAgeClassifications) { - patientAgeClassificationStrings.put(pac.getName(), pac.getDescription()); - } - response.setResponseObject(patientAgeClassificationStrings); - } catch (Exception ex) { - response.addError("", ex.getMessage()); - } - return response; - } - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse findPatientAndUpdateSex(int id, String sex) { - ServiceResponse response = new ServiceResponse<>(); - if (id < 1) { - response.addError("", "patient id can not be less than 1"); - return response; - } - - ExpressionList query = QueryProvider.getPatientQuery() - .where() - .eq("id", id); - - try { - IPatient savedPatient = patientRepository.findOne(query); - //if a patient doesn't have a sex and the - //user is trying to identify the patients sex - if (StringUtils.isNullOrWhiteSpace(savedPatient.getSex()) && StringUtils.isNotNullOrWhiteSpace(sex)) { - savedPatient.setSex(sex); - savedPatient = patientRepository.update(savedPatient); - } - PatientItem patientItem = domainMapper.createPatientItem(savedPatient, null, null, null, null); - response.setResponseObject(patientItem); - - } catch (Exception ex) { - response.addError("exception", ex.getMessage()); - } - - return response; - } - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse> findAllVitalItems() { - ServiceResponse> response = new ServiceResponse<>(); - - try { - List vitals = vitalRepository.findAll(Vital.class); - List vitalItems = new ArrayList<>(); - for (IVital v : vitals) { - vitalItems.add(domainMapper.createVitalItem(v)); - } - response.setResponseObject(vitalItems); - } catch (Exception ex) { - response.addError("exception", ex.getMessage()); - } - - return response; - } - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse createPatient(PatientItem patient) { - ServiceResponse response = new ServiceResponse<>(); - if (patient == null) { - response.addError("", "no patient received"); - return response; - } - - try { - IPatient newPatient = domainMapper.createPatient(patient); - newPatient = patientRepository.create(newPatient); - response.setResponseObject(DomainMapper.createPatientItem(newPatient, null, null, null, null)); - } catch (Exception ex) { - response.addError("exception", ex.getMessage()); - } - - return response; - } - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse createPatientEncounter(PatientEncounterItem patientEncounterItem) { - ServiceResponse response = new ServiceResponse<>(); - if (patientEncounterItem == null) { - response.addError("", "no patient encounter item specified"); - return response; - } - - try { - //find the nurse that checked in the patient - ExpressionList nurseQuery = QueryProvider.getUserQuery() - .where() - .eq("email", patientEncounterItem.getNurseEmailAddress()); - - IUser nurseUser = userRepository.findOne(nurseQuery); - - //find the age classification of the patient, if it exists - ExpressionList patientAgeClassificationExpressionList = QueryProvider.getPatientAgeClassificationQuery() - .where() - .eq("name", patientEncounterItem.getAgeClassification()); - IPatientAgeClassification patientAgeClassification = patientAgeClassificationRepository.findOne(patientAgeClassificationExpressionList); - Integer patientAgeClassificationId = null; - if (patientAgeClassification != null) - patientAgeClassificationId = patientAgeClassification.getId(); - - IPatientEncounter newPatientEncounter = domainMapper.createPatientEncounter(patientEncounterItem, nurseUser.getId(), patientAgeClassificationId); - newPatientEncounter = patientEncounterRepository.create(newPatientEncounter); - - List chiefComplaints = new ArrayList<>(); - for (String cc : patientEncounterItem.getChiefComplaints()) { - chiefComplaints.add(domainMapper.createChiefComplaint(cc, newPatientEncounter.getId())); - } - if (chiefComplaints.size() > 0) { - chiefComplaintRepository.createAll(chiefComplaints); - } - - - response.setResponseObject(DomainMapper.createPatientEncounterItem(newPatientEncounter)); - } catch (Exception ex) { - response.addError("exception", ex.getMessage()); - } - - return response; - } - - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse> createPatientEncounterVitalItems(Map patientEncounterVitalMap, int userId, int encounterId) { - ServiceResponse> response = new ServiceResponse<>(); - if (patientEncounterVitalMap == null || userId < 1 || encounterId < 1) { - response.addError("", "bad parameters"); - return response; - } - - List patientEncounterVitals = new ArrayList<>(); - IPatientEncounterVital patientEncounterVital; - IVital vital; - - ExpressionList query; - String currentTime = dateUtils.getCurrentDateTimeString(); - - try { - - - for (String key : patientEncounterVitalMap.keySet()) { - if (patientEncounterVitalMap.get(key) != null) { - - query = QueryProvider.getVitalQuery().where().eq("name", key); - vital = vitalRepository.findOne(query); - patientEncounterVital = patientEncounterVitalProvider.get(); - patientEncounterVital.setPatientEncounterId(encounterId); - patientEncounterVital.setUserId(userId); - patientEncounterVital.setDateTaken(currentTime); - patientEncounterVital.setVital(vital); - patientEncounterVital.setVitalValue(patientEncounterVitalMap.get(key)); - patientEncounterVitals.add(patientEncounterVital); - } - } - - List newPatientEncounterVitals = patientEncounterVitalRepository.createAll(patientEncounterVitals); - List vitalItems = new ArrayList<>(); - for (IPatientEncounterVital pev : patientEncounterVitals) { - vitalItems.add(domainMapper.createVitalItem(pev)); - } - - response.setResponseObject(vitalItems); - } catch (Exception ex) { - response.addError("exception", ex.getMessage()); - } - - return response; - } - -} diff --git a/app/femr/business/services/IConfigureService.java b/app/femr/business/services/core/IConfigureService.java similarity index 91% rename from app/femr/business/services/IConfigureService.java rename to app/femr/business/services/core/IConfigureService.java index d6fe15671..519ee0a86 100644 --- a/app/femr/business/services/IConfigureService.java +++ b/app/femr/business/services/core/IConfigureService.java @@ -16,10 +16,10 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.ServiceResponse; -import femr.data.models.ISystemSetting; +import femr.common.dtos.ServiceResponse; +import femr.data.models.core.ISystemSetting; import java.util.List; diff --git a/app/femr/business/services/ISuperuserService.java b/app/femr/business/services/core/ICustomTabService.java similarity index 89% rename from app/femr/business/services/ISuperuserService.java rename to app/femr/business/services/core/ICustomTabService.java index 8fa8893c0..dd1ee3ed4 100644 --- a/app/femr/business/services/ISuperuserService.java +++ b/app/femr/business/services/core/ICustomTabService.java @@ -16,17 +16,16 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; - -import femr.common.dto.ServiceResponse; +import femr.common.dtos.ServiceResponse; import femr.common.models.TabFieldItem; import femr.common.models.TabItem; import java.util.List; +import java.util.Map; -public interface ISuperuserService { - +public interface ICustomTabService { /** * Edit a tab field * @@ -96,7 +95,7 @@ public interface ISuperuserService { * @param isDeleted whether or not the fields are deleted * @return a list of fields for the tab with possible exceptions */ - ServiceResponse> getTabFields(String tabName, Boolean isDeleted); + ServiceResponse> getTabFieldsByTabName(String tabName, Boolean isDeleted); /** * Get all possible types of tab fields @@ -128,4 +127,11 @@ public interface ISuperuserService { */ ServiceResponse doesTabExist(String tabName); + /** + * Maps a list of TabFieldItems to their respective tab + * + * @param encounterId current encounter id + * @return TabFieldItems mapped to their respective tab + */ + ServiceResponse>> getTabFields(int encounterId); } diff --git a/app/femr/business/services/IMedicalService.java b/app/femr/business/services/core/IEncounterService.java similarity index 56% rename from app/femr/business/services/IMedicalService.java rename to app/femr/business/services/core/IEncounterService.java index e1d5b72cb..0f6d58285 100644 --- a/app/femr/business/services/IMedicalService.java +++ b/app/femr/business/services/core/IEncounterService.java @@ -16,63 +16,53 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.ServiceResponse; -import femr.common.models.*; -import femr.data.models.IUser; +import femr.common.dtos.ServiceResponse; +import femr.common.models.PatientEncounterItem; +import femr.common.models.ProblemItem; +import femr.common.models.TabFieldItem; +import femr.common.models.UserItem; +import femr.data.models.core.IPatientEncounter; import java.util.List; import java.util.Map; -public interface IMedicalService { +public interface IEncounterService { /** - * Creates all patient encounter vitals + * Create a patient encounter * - * @param patientEncounterVital list of vitals for saving - * @param userId id of the user saving the vitals - * @param encounterId id of the current encounter - * @return vitals that were saved + * @param patientEncounterItem the patient encounter + * @return the patient encounter with id (pk) */ - ServiceResponse> createPatientEncounterVitals(Map patientEncounterVital, int userId, int encounterId); + ServiceResponse createPatientEncounter(PatientEncounterItem patientEncounterItem); /** - * Gets the physician that saw a patient in medical. + * Checks a patient into medical (updates date_of_medical_visit and the user checking them in) * - * @param encounterId id of the encounter to check - * @return the physician or null + * @param encounterId current encounter id + * @param userId id of the physician + * @return updated patient encounter */ - ServiceResponse getPhysicianThatCheckedInPatient(int encounterId); + ServiceResponse checkPatientInToMedical(int encounterId, int userId); /** - * creates multiple prescriptions + * Checks a patient into pharmacy (updates date_of_pharmacy_visit and identifies the user) * - * @param prescriptionItems list of prescription items - * @param userId id of the user saving the prescriptions - * @param encounterId id of the current encounter - * @return updated prescription list + * @param encounterId current encounter + * @param userId id of the pharmacist + * @return updated patient encounter */ - ServiceResponse> createPatientPrescriptions(List prescriptionItems, int userId, int encounterId, boolean isDispensed); + ServiceResponse checkPatientInToPharmacy(int encounterId, int userId); /** - * Adds tab field items to the PatientEncounterTabField table - * - * @param tabFieldItems list of fields to be saved - * @param encounterId id of the current encounter - * @param userId id of the user saving the fields - * @return updated list of items - */ - ServiceResponse> createPatientEncounterTabFields(List tabFieldItems, int encounterId, int userId); - - /** - * Checks a patient into medical (updates date_of_medical_visit and the user checking them in) + * Gets the physician that saw a patient in medical. * - * @param encounterId current encounter id - * @param userId id of the physician - * @return updated patient encounter + * @param encounterId id of the encounter to check + * @return the physician or null */ - ServiceResponse checkPatientIn(int encounterId, int userId); + ServiceResponse getPhysicianThatCheckedInPatientToMedical(int encounterId); /** * Finds non-custom current field values for medical tabs @@ -83,17 +73,21 @@ public interface IMedicalService { ServiceResponse> findCurrentTabFieldsByEncounterId(int encounterId); /** - * Gets all available custom tabs for the medical page + * Adds tab field items to the PatientEncounterTabField table * - * @return list of tabs + * @param tabFieldItems list of fields to be saved + * @param encounterId id of the current encounter + * @param userId id of the user saving the fields + * @return updated list of items */ - ServiceResponse> getCustomTabs(); + ServiceResponse> createPatientEncounterTabFields(List tabFieldItems, int encounterId, int userId); /** - * Matches a list of TabFieldItems to their respective tab + * Find all problems * - * @param encounterId current encounter id - * @return TabFieldItems mapped to their respective tab + * @param encounterId id of the encounter + * @return list of problems */ - ServiceResponse>> getCustomFields(int encounterId); + ServiceResponse> findProblemItems(int encounterId); + } diff --git a/app/femr/business/services/IInventoryService.java b/app/femr/business/services/core/IInventoryService.java similarity index 95% rename from app/femr/business/services/IInventoryService.java rename to app/femr/business/services/core/IInventoryService.java index 6dc2930ab..f967d2ca3 100644 --- a/app/femr/business/services/IInventoryService.java +++ b/app/femr/business/services/core/IInventoryService.java @@ -16,9 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.ServiceResponse; +import femr.common.dtos.ServiceResponse; import femr.common.models.MedicationItem; import java.util.List; diff --git a/app/femr/business/services/IPharmacyService.java b/app/femr/business/services/core/IMedicationService.java similarity index 72% rename from app/femr/business/services/IPharmacyService.java rename to app/femr/business/services/core/IMedicationService.java index 7dd636e0a..195602a7f 100644 --- a/app/femr/business/services/IPharmacyService.java +++ b/app/femr/business/services/core/IMedicationService.java @@ -16,51 +16,39 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; +import femr.common.dtos.ServiceResponse; import femr.common.models.PrescriptionItem; -import femr.common.dto.ServiceResponse; -import femr.common.models.ProblemItem; -import femr.common.models.VitalItem; -import femr.data.models.IPatientEncounter; import java.util.List; -public interface IPharmacyService { - +public interface IMedicationService { /** - * Checks a patient into pharmacy (updates date_of_pharmacy_visit and identifies the user) + * Get a JSON string representing medication names * - * @param encounterId current encounter - * @param userId id of the pharmacist - * @return updated patient encounter + * @return JSON object in the form of { medication# : "name" } */ - ServiceResponse checkPatientIn(int encounterId, int userId); + ServiceResponse getMedicationNames(); /** * Create a new prescription and replace an old one with it * * @param prescriptionItem new prescription to replace the old one * @param oldScriptId id of the old prescription that is being replaced - * @param isCounseled was the patient counseled on this prescription * @return updated new prescription */ ServiceResponse createAndReplacePrescription(PrescriptionItem prescriptionItem, int oldScriptId, int userId, boolean isCounseled); /** - * Find all problems - * - * @param encounterId id of the encounter - * @return list of problems - */ - ServiceResponse> findProblemItems(int encounterId); - - /** - * Retrieve all medication names for typeahead + * creates multiple prescriptions * - * @return + * @param prescriptionItems list of prescription items + * @param userId id of the user saving the prescriptions + * @param encounterId id of the current encounter + * @return updated prescription list */ - ServiceResponse> findAllMedications(); + ServiceResponse> createPatientPrescriptions(List prescriptionItems, int userId, int encounterId, boolean isDispensed, boolean isCounseled); /** * Mark prescriptions as filled @@ -77,4 +65,11 @@ public interface IPharmacyService { * @return prescription items that were marked as counseled */ ServiceResponse> markPrescriptionsAsCounseled(List prescriptionIds); + + /** + * Retrieve all medication names for typeahead + * + * @return + */ + ServiceResponse> findAllMedications(); } diff --git a/app/femr/business/services/core/IMissionTripService.java b/app/femr/business/services/core/IMissionTripService.java new file mode 100644 index 000000000..9c9582159 --- /dev/null +++ b/app/femr/business/services/core/IMissionTripService.java @@ -0,0 +1,93 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.business.services.core; + +import femr.common.dtos.ServiceResponse; +import femr.common.models.CityItem; +import femr.common.models.MissionItem; +import femr.common.models.TeamItem; +import femr.common.models.TripItem; +import femr.data.models.core.IMissionTrip; + +import java.util.List; + +public interface IMissionTripService { + /** + * Retrieve the current trip information + * @return the current trip or an error if one doesn't exist + */ + IMissionTrip findCurrentMissionTrip(); + + /** + * Retrieve a list of the teams that are already in the database + * @return a list of team names + */ + ServiceResponse> findAvailableTeams(); + + /** + * Retrieve a list of the cities that are already in the database + * @return a list of cities with respective country + */ + ServiceResponse> findAvailableCities(); + + /** + * Retrieve a list of the countries that are already in the database + * @return a list of countries + */ + ServiceResponse> findAvailableCountries(); + + /** + * Get all available team and trip information + * + * @return all mission teams with their respective trips + */ + ServiceResponse> findAllTripInformation(); + + /** + * Create a new team + * + * @param teamItem the name is required + * @return + */ + ServiceResponse createNewTeam(TeamItem teamItem); + + /** + * Create a new trip + * + * @param tripItem everything except end date required + * @return + */ + ServiceResponse createNewTrip(TripItem tripItem); + + /** + * Create a new city + * @param cityName name of the city + * @param countryName name of the country + * @return name of the created city + */ + ServiceResponse createNewCity(String cityName, String countryName); + + /** + * Mark a trip as current and all others as not current + * + * @param tripId the id of the trip to mark current + * @return the current trip + */ + ServiceResponse updateCurrentTrip(int tripId); +} diff --git a/app/femr/business/services/ITriageService.java b/app/femr/business/services/core/IPatientService.java similarity index 55% rename from app/femr/business/services/ITriageService.java rename to app/femr/business/services/core/IPatientService.java index 37ddb3f2e..17d028de3 100644 --- a/app/femr/business/services/ITriageService.java +++ b/app/femr/business/services/core/IPatientService.java @@ -16,21 +16,15 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.ServiceResponse; -import femr.common.models.PatientEncounterItem; +import femr.common.dtos.ServiceResponse; import femr.common.models.PatientItem; -import femr.common.models.VitalItem; -import java.util.List; import java.util.Map; -/** - * Interface for Triage Service. Contains the documentation which - * is inherited in the implementations. - */ -public interface ITriageService { +public interface IPatientService { + /** * Finds all possible age classifications for a patient */ @@ -45,35 +39,10 @@ public interface ITriageService { */ ServiceResponse findPatientAndUpdateSex(int id, String sex); - /** - * Gets vital items, but only the names - * - * @return Returns a list of all vitals without values - */ - ServiceResponse> findAllVitalItems(); - /** * Creates a new patient * @param patient patient to be created * @return patient with an assigned Id (pk) */ ServiceResponse createPatient(PatientItem patient); - - /** - * Create a patient encounter - * - * @param patientEncounterItem the patient encounter - * @return the patient encounter with id (pk) - */ - ServiceResponse createPatientEncounter(PatientEncounterItem patientEncounterItem); - - /** - * Create all vitals for an encounter - * - * @param patientEncounterVitalMap A keypair of vitals to be created - * @param userId User creating the vitals - * @param encounterId Encounter that the vitals are for - * @return List of vitals that were created - */ - ServiceResponse> createPatientEncounterVitalItems(Map patientEncounterVitalMap, int userId, int encounterId); } diff --git a/app/femr/business/services/IPhotoService.java b/app/femr/business/services/core/IPhotoService.java similarity index 96% rename from app/femr/business/services/IPhotoService.java rename to app/femr/business/services/core/IPhotoService.java index 7bf96d02c..ee6f819ee 100644 --- a/app/femr/business/services/IPhotoService.java +++ b/app/femr/business/services/core/IPhotoService.java @@ -16,11 +16,11 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; import java.util.List; import femr.common.models.PatientEncounterItem; -import femr.common.dto.ServiceResponse; +import femr.common.dtos.ServiceResponse; import femr.common.models.PhotoItem; import femr.ui.models.medical.EditViewModelPost; import play.mvc.Http.MultipartFormData.FilePart; diff --git a/app/femr/business/services/core/IResearchService.java b/app/femr/business/services/core/IResearchService.java new file mode 100644 index 000000000..d71cb1192 --- /dev/null +++ b/app/femr/business/services/core/IResearchService.java @@ -0,0 +1,34 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.business.services.core; + +import femr.common.dtos.ServiceResponse; +import femr.common.models.*; +import femr.ui.models.research.json.ResearchGraphDataItem; + +import java.util.Map; + +/** + * Interface for the Research Service + */ +public interface IResearchService { + + public ServiceResponse> getAllMedications(); + public ServiceResponse getGraphData(ResearchFilterItem filterItem); +} diff --git a/app/femr/business/services/IRoleService.java b/app/femr/business/services/core/IRoleService.java similarity index 89% rename from app/femr/business/services/IRoleService.java rename to app/femr/business/services/core/IRoleService.java index 5e876fa55..c91c345a1 100644 --- a/app/femr/business/services/IRoleService.java +++ b/app/femr/business/services/core/IRoleService.java @@ -16,10 +16,10 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.ServiceResponse; -import femr.data.models.IRole; +import femr.common.dtos.ServiceResponse; +import femr.data.models.core.IRole; import java.util.List; diff --git a/app/femr/business/services/ISearchService.java b/app/femr/business/services/core/ISearchService.java similarity index 90% rename from app/femr/business/services/ISearchService.java rename to app/femr/business/services/core/ISearchService.java index a90f299f4..b3fb316dc 100644 --- a/app/femr/business/services/ISearchService.java +++ b/app/femr/business/services/core/ISearchService.java @@ -16,11 +16,10 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.ServiceResponse; +import femr.common.dtos.ServiceResponse; import femr.common.models.*; -import femr.data.models.*; import femr.util.DataStructure.Mapping.TabFieldMultiMap; import femr.util.DataStructure.Mapping.VitalMultiMap; @@ -130,4 +129,18 @@ public interface ISearchService { * @return list of their names */ ServiceResponse> getCustomFieldList(); + + /** + * Get all patient information for searching users. + * + * @return patient item for json serialization + */ + ServiceResponse> findPatientsForSearch(); + + /** + * Get all diagnosis for help on problem input fields in medical + * + * @return ALL STRINGS, BABY + */ + ServiceResponse> findDiagnosisForSearch(); } diff --git a/app/femr/business/services/ISessionService.java b/app/femr/business/services/core/ISessionService.java similarity index 89% rename from app/femr/business/services/ISessionService.java rename to app/femr/business/services/core/ISessionService.java index c69e75403..cf4f09f48 100644 --- a/app/femr/business/services/ISessionService.java +++ b/app/femr/business/services/core/ISessionService.java @@ -16,10 +16,10 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; public interface ISessionService { ServiceResponse createSession(String email, String password); diff --git a/app/femr/business/services/IUserService.java b/app/femr/business/services/core/IUserService.java similarity index 93% rename from app/femr/business/services/IUserService.java rename to app/femr/business/services/core/IUserService.java index 0396cafc1..67f4606d9 100644 --- a/app/femr/business/services/IUserService.java +++ b/app/femr/business/services/core/IUserService.java @@ -16,12 +16,12 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.core; -import femr.common.dto.ServiceResponse; +import femr.common.dtos.ServiceResponse; import femr.common.models.UserItem; -import femr.data.models.IRole; -import femr.data.models.IUser; +import femr.data.models.core.IRole; +import femr.data.models.core.IUser; import java.util.List; diff --git a/app/femr/business/services/core/IVitalService.java b/app/femr/business/services/core/IVitalService.java new file mode 100644 index 000000000..ae503e08d --- /dev/null +++ b/app/femr/business/services/core/IVitalService.java @@ -0,0 +1,55 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.business.services.core; + +import femr.common.dtos.ServiceResponse; +import femr.common.models.VitalItem; + +import java.util.List; +import java.util.Map; + +public interface IVitalService { + + /** + * Creates all patient encounter vitals + * + * @param patientEncounterVital list of vitals for saving + * @param userId id of the user saving the vitals + * @param encounterId id of the current encounter + * @return vitals that were saved + */ + ServiceResponse> createPatientEncounterVitals(Map patientEncounterVital, int userId, int encounterId); + + /** + * Gets vital items, but only the names + * + * @return Returns a list of all vitals without values + */ + ServiceResponse> findAllVitalItems(); + + /** + * Create all vitals for an encounter + * + * @param patientEncounterVitalMap A keypair of vitals to be created + * @param userId User creating the vitals + * @param encounterId Encounter that the vitals are for + * @return List of vitals that were created + */ + ServiceResponse> createPatientEncounterVitalItems(Map patientEncounterVitalMap, int userId, int encounterId); +} diff --git a/app/femr/business/services/ConfigureService.java b/app/femr/business/services/system/ConfigureService.java similarity index 91% rename from app/femr/business/services/ConfigureService.java rename to app/femr/business/services/system/ConfigureService.java index d216cfff0..59b60af52 100644 --- a/app/femr/business/services/ConfigureService.java +++ b/app/femr/business/services/system/ConfigureService.java @@ -16,15 +16,14 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; -import com.avaje.ebean.ExpressionList; import com.google.inject.Inject; -import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.IConfigureService; +import femr.common.dtos.ServiceResponse; import femr.data.daos.IRepository; -import femr.data.models.ISystemSetting; -import femr.data.models.SystemSetting; +import femr.data.models.core.ISystemSetting; +import femr.data.models.mysql.SystemSetting; import java.util.List; diff --git a/app/femr/business/services/SuperuserService.java b/app/femr/business/services/system/CustomTabService.java similarity index 80% rename from app/femr/business/services/SuperuserService.java rename to app/femr/business/services/system/CustomTabService.java index 6ae29bad8..0aa2bb387 100644 --- a/app/femr/business/services/SuperuserService.java +++ b/app/femr/business/services/system/CustomTabService.java @@ -16,32 +16,32 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.ExpressionList; import com.avaje.ebean.Query; import com.google.inject.Inject; import femr.business.helpers.DomainMapper; import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.ICustomTabService; +import femr.common.dtos.ServiceResponse; import femr.common.models.TabFieldItem; import femr.common.models.TabItem; -import femr.data.models.ITab; -import femr.data.models.ITabField; -import femr.data.models.ITabFieldSize; -import femr.data.models.ITabFieldType; import femr.data.daos.IRepository; -import femr.data.models.Tab; -import femr.data.models.TabField; -import femr.data.models.TabFieldSize; -import femr.data.models.TabFieldType; +import femr.data.models.core.*; +import femr.data.models.mysql.*; import femr.util.stringhelpers.StringUtils; import org.joda.time.DateTime; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; -public class SuperuserService implements ISuperuserService { +public class CustomTabService implements ICustomTabService { + + private final IRepository chiefComplaintRepository; + private final IRepository patientEncounterTabFieldRepository; private final IRepository tabRepository; private final IRepository tabFieldRepository; private final IRepository tabFieldTypeRepository; @@ -49,11 +49,15 @@ public class SuperuserService implements ISuperuserService { private final DomainMapper domainMapper; @Inject - public SuperuserService(IRepository tabRepository, + public CustomTabService(IRepository chiefComplaintRepository, + IRepository patientEncounterTabFieldRepository, + IRepository tabRepository, IRepository tabFieldRepository, IRepository tabFieldTypeRepository, IRepository tabFieldSizeRepository, DomainMapper domainMapper) { + this.chiefComplaintRepository = chiefComplaintRepository; + this.patientEncounterTabFieldRepository = patientEncounterTabFieldRepository; this.tabRepository = tabRepository; this.tabFieldRepository = tabFieldRepository; this.tabFieldTypeRepository = tabFieldTypeRepository; @@ -90,7 +94,7 @@ public ServiceResponse toggleTab(String name) { return response; } - TabItem tabItem = domainMapper.createTabItem(tab); + TabItem tabItem = DomainMapper.createTabItem(tab); response.setResponseObject(tabItem); return response; } @@ -154,7 +158,7 @@ public ServiceResponse> getCustomTabs(Boolean isDeleted) { List tabItems = new ArrayList<>(); for (ITab t : tabs) { - tabItems.add(domainMapper.createTabItem(t)); + tabItems.add(DomainMapper.createTabItem(t)); } response.setResponseObject(tabItems); @@ -165,7 +169,7 @@ public ServiceResponse> getCustomTabs(Boolean isDeleted) { * {@inheritDoc} */ @Override - public ServiceResponse> getTabFields(String tabName, Boolean isDeleted) { + public ServiceResponse> getTabFieldsByTabName(String tabName, Boolean isDeleted) { ServiceResponse> response = new ServiceResponse<>(); if (StringUtils.isNullOrWhiteSpace(tabName)) { response.addError("", "bad parameters, wtf are you doing?"); @@ -183,7 +187,7 @@ public ServiceResponse> getTabFields(String tabName, Boolean List tabFields = tabFieldRepository.find(query); List customFieldItems = new ArrayList<>(); for (ITabField tf : tabFields) { - customFieldItems.add(domainMapper.createTabFieldItem(tf)); + customFieldItems.add(DomainMapper.createTabFieldItem(tf)); } response.setResponseObject(customFieldItems); } catch (Exception ex) { @@ -193,6 +197,64 @@ public ServiceResponse> getTabFields(String tabName, Boolean return response; } + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse>> getTabFields(int encounterId) { + ServiceResponse>> response = new ServiceResponse<>(); + if (encounterId < 1) { + response.addError("", "encounterId must be greater than 0"); + return response; + } + Map> customFieldMap = new HashMap<>(); + ExpressionList query = QueryProvider.getTabQuery() + .where() + .eq("isDeleted", false); + try { + //O(n^2) because who gives a fuck + List customTabs = tabRepository.find(query); + for (ITab ct : customTabs) { + Query query2 = QueryProvider.getTabFieldQuery() + .fetch("tab") + .where() + .eq("isDeleted", false) + .eq("tab.name", ct.getName()) + .order() + .asc("sort_order"); + + + List customFields = tabFieldRepository.find(query2); + List customFieldItems = new ArrayList<>(); + for (ITabField cf : customFields) { + Query query3 = QueryProvider.getPatientEncounterTabFieldQuery() + .where() + .eq("tabField", cf)//somethings fucky + .eq("patient_encounter_id", encounterId) + .order() + .desc("date_taken"); + + List patientEncounterCustomField = patientEncounterTabFieldRepository.find(query3); + if (patientEncounterCustomField != null && patientEncounterCustomField.size() > 0) { + customFieldItems.add(DomainMapper.createTabFieldItem(patientEncounterCustomField.get(0))); + } else { + customFieldItems.add(DomainMapper.createTabFieldItem(cf)); + } + + + } + customFieldMap.put(ct.getName(), customFieldItems); + + } + response.setResponseObject(customFieldMap); + } catch (Exception ex) { + response.addError("", "error"); + return response; + } + + return response; + } + /** * {@inheritDoc} */ @@ -418,20 +480,20 @@ public ServiceResponse> getSizes() { * {@inheritDoc} */ @Override - public ServiceResponse doesTabFieldExist(String fieldName){ + public ServiceResponse doesTabFieldExist(String fieldName) { ServiceResponse response = new ServiceResponse<>(); ExpressionList query = QueryProvider.getTabFieldQuery() .where() .eq("name", fieldName); - try{ + try { ITabField customField = tabFieldRepository.findOne(query); - if (customField == null){ + if (customField == null) { response.setResponseObject(false); - }else{ + } else { response.setResponseObject(true); } - }catch (Exception ex){ + } catch (Exception ex) { response.setResponseObject(false); } return response; @@ -441,22 +503,21 @@ public ServiceResponse doesTabFieldExist(String fieldName){ * {@inheritDoc} */ @Override - public ServiceResponse doesTabExist(String tabName){ + public ServiceResponse doesTabExist(String tabName) { ServiceResponse response = new ServiceResponse<>(); ExpressionList query = QueryProvider.getTabQuery() .where() .eq("name", tabName); - try{ + try { ITab customTab = tabRepository.findOne(query); - if (customTab == null){ + if (customTab == null) { response.setResponseObject(false); - }else{ + } else { response.setResponseObject(true); } - }catch(Exception ex){ + } catch (Exception ex) { response.setResponseObject(false); } return response; } - } diff --git a/app/femr/business/services/MedicalService.java b/app/femr/business/services/system/EncounterService.java similarity index 58% rename from app/femr/business/services/MedicalService.java rename to app/femr/business/services/system/EncounterService.java index d5c42f8f0..5411f9791 100644 --- a/app/femr/business/services/MedicalService.java +++ b/app/femr/business/services/system/EncounterService.java @@ -16,62 +16,60 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.ExpressionList; import com.avaje.ebean.Query; import com.google.inject.Inject; -import com.google.inject.Provider; import femr.business.helpers.DomainMapper; import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; -import femr.common.models.*; +import femr.business.services.core.IEncounterService; +import femr.business.services.core.IMissionTripService; +import femr.business.services.core.IUserService; +import femr.common.dtos.ServiceResponse; +import femr.common.models.PatientEncounterItem; +import femr.common.models.ProblemItem; +import femr.common.models.TabFieldItem; +import femr.common.models.UserItem; import femr.data.daos.IRepository; -import femr.data.models.*; -import femr.util.calculations.dateUtils; +import femr.data.models.core.*; +import femr.data.models.mysql.*; import femr.util.stringhelpers.StringUtils; import org.joda.time.DateTime; -import java.util.*; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; -public class MedicalService implements IMedicalService { +public class EncounterService implements IEncounterService { + private IMissionTripService missionTripService; private final IRepository chiefComplaintRepository; + private final IRepository patientAgeClassificationRepository; private final IRepository patientEncounterRepository; - private final IRepository patientEncounterVitalRepository; private final IRepository patientEncounterTabFieldRepository; - private final Provider patientEncounterVitalProvider; - private final IRepository patientPrescriptionRepository; - private final IRepository customTabRepository; private final IRepository tabFieldRepository; private final IRepository userRepository; - private final IRepository vitalRepository; - private final DomainMapper domainMapper; @Inject - public MedicalService(IRepository chiefComplaintRepository, - IRepository patientEncounterRepository, - IRepository patientEncounterVitalRepository, - IRepository tabFieldRepository, - IRepository patientEncounterTabFieldRepository, - IRepository patientPrescriptionRepository, - IRepository vitalRepository, - IRepository customTabRepository, - IRepository userRepository, - Provider patientEncounterVitalProvider, - DomainMapper domainMapper) { - + public EncounterService(IMissionTripService missionTripService, + IRepository chiefComplaintRepository, + IRepository patientAgeClassificationRepository, + IRepository patientEncounterRepository, + IRepository patientEncounterTabFieldRepository, + IRepository tabFieldRepository, + IRepository userRepository, + DomainMapper domainMapper){ + + this.missionTripService = missionTripService; this.chiefComplaintRepository = chiefComplaintRepository; + this.patientAgeClassificationRepository = patientAgeClassificationRepository; this.patientEncounterRepository = patientEncounterRepository; - this.patientEncounterVitalRepository = patientEncounterVitalRepository; - this.tabFieldRepository = tabFieldRepository; this.patientEncounterTabFieldRepository = patientEncounterTabFieldRepository; - this.patientPrescriptionRepository = patientPrescriptionRepository; - this.vitalRepository = vitalRepository; - this.customTabRepository = customTabRepository; + this.tabFieldRepository = tabFieldRepository; this.userRepository = userRepository; - this.patientEncounterVitalProvider = patientEncounterVitalProvider; this.domainMapper = domainMapper; } @@ -79,26 +77,53 @@ public MedicalService(IRepository chiefComplaintRepository, * {@inheritDoc} */ @Override - public ServiceResponse getPhysicianThatCheckedInPatient(int encounterId) { - ServiceResponse response = new ServiceResponse<>(); - if (encounterId < 1) { - response.addError("", "encounter id must be greater than 0"); + public ServiceResponse createPatientEncounter(PatientEncounterItem patientEncounterItem) { + ServiceResponse response = new ServiceResponse<>(); + if (patientEncounterItem == null) { + response.addError("", "no patient encounter item specified"); return response; } + try { - ExpressionList patientEncounterQuery = QueryProvider.getPatientEncounterQuery() + //find the nurse that checked in the patient + ExpressionList nurseQuery = QueryProvider.getUserQuery() .where() - .eq("id", encounterId); - IPatientEncounter patientEncounter = patientEncounterRepository.findOne(patientEncounterQuery); - if (patientEncounter.getDoctor() == null) { - response.setResponseObject(null); - } else { - UserItem userItem = DomainMapper.createUserItem(patientEncounter.getDoctor()); - response.setResponseObject(userItem); + .eq("email", patientEncounterItem.getNurseEmailAddress()); + + IUser nurseUser = userRepository.findOne(nurseQuery); + + //find the age classification of the patient, if it exists + ExpressionList patientAgeClassificationExpressionList = QueryProvider.getPatientAgeClassificationQuery() + .where() + .eq("name", patientEncounterItem.getAgeClassification()); + IPatientAgeClassification patientAgeClassification = patientAgeClassificationRepository.findOne(patientAgeClassificationExpressionList); + Integer patientAgeClassificationId = null; + if (patientAgeClassification != null) + patientAgeClassificationId = patientAgeClassification.getId(); + + //find the current trip, if one exists + IMissionTrip missionTrip = missionTripService.findCurrentMissionTrip(); + Integer missionTripId = null; + if (missionTrip != null) + missionTripId = missionTrip.getId(); + + IPatientEncounter newPatientEncounter = domainMapper.createPatientEncounter(patientEncounterItem, nurseUser.getId(), patientAgeClassificationId, missionTripId); + newPatientEncounter = patientEncounterRepository.create(newPatientEncounter); + + List chiefComplaints = new ArrayList<>(); + for (String cc : patientEncounterItem.getChiefComplaints()) { + chiefComplaints.add(domainMapper.createChiefComplaint(cc, newPatientEncounter.getId())); + } + if (chiefComplaints.size() > 0) { + chiefComplaintRepository.createAll(chiefComplaints); } + + + response.setResponseObject(DomainMapper.createPatientEncounterItem(newPatientEncounter)); } catch (Exception ex) { - response.addError("", "error finding encounter"); + response.addError("exception", ex.getMessage()); } + return response; } @@ -106,26 +131,59 @@ public ServiceResponse getPhysicianThatCheckedInPatient(int encounterI * {@inheritDoc} */ @Override - public ServiceResponse> createPatientPrescriptions(List prescriptionItems, int userId, int encounterId, boolean isDispensed) { - ServiceResponse> response = new ServiceResponse<>(); - if (prescriptionItems == null || userId < 1 || encounterId < 1) { - response.addError("", "invalid parameters"); + public ServiceResponse checkPatientInToMedical(int encounterId, int userId) { + ServiceResponse response = new ServiceResponse<>(); + if (encounterId < 1) { + response.addError("", "encounterId must be greater than 0"); return response; } - List patientPrescriptions = new ArrayList<>(); - for (PrescriptionItem pi : prescriptionItems) { - IMedication medication = domainMapper.createMedication(pi.getName()); - patientPrescriptions.add(domainMapper.createPatientPrescription(0, medication, userId, encounterId, null, false, false)); + ExpressionList query = QueryProvider.getPatientEncounterQuery() + .where() + .eq("id", encounterId); + + try { + IPatientEncounter patientEncounter = patientEncounterRepository.findOne(query); + patientEncounter.setDateOfMedicalVisit(DateTime.now()); + ExpressionList getUserQuery = QueryProvider.getUserQuery() + .where() + .eq("id", userId); + IUser user = userRepository.findOne(getUserQuery); + patientEncounter.setDoctor(user); + + patientEncounter = patientEncounterRepository.update(patientEncounter); + + + response.setResponseObject(DomainMapper.createPatientEncounterItem(patientEncounter)); + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse checkPatientInToPharmacy(int encounterId, int userId) { + ServiceResponse response = new ServiceResponse<>(); + if (encounterId < 1) { + response.addError("", "encounterId can not be less than 1"); + return response; } try { - List newPatientPrescriptions = patientPrescriptionRepository.createAll(patientPrescriptions); - List newPrescriptionItems = new ArrayList<>(); - for (IPatientPrescription pp : newPatientPrescriptions) { - newPrescriptionItems.add(domainMapper.createPatientPrescriptionItem(pp)); - } - response.setResponseObject(newPrescriptionItems); + ExpressionList query = QueryProvider.getPatientEncounterQuery().where().eq("id", encounterId); + IPatientEncounter patientEncounter = patientEncounterRepository.findOne(query); + patientEncounter.setDateOfPharmacyVisit(DateTime.now()); + ExpressionList getUserQuery = QueryProvider.getUserQuery() + .where() + .eq("id", userId); + IUser user = userRepository.findOne(getUserQuery); + patientEncounter.setPharmacist(user); + patientEncounter = patientEncounterRepository.update(patientEncounter); + response.setResponseObject(patientEncounter); } catch (Exception ex) { response.addError("exception", ex.getMessage()); } @@ -133,6 +191,33 @@ public ServiceResponse> createPatientPrescriptions(List

getPhysicianThatCheckedInPatientToMedical(int encounterId) { + ServiceResponse response = new ServiceResponse<>(); + if (encounterId < 1) { + response.addError("", "encounter id must be greater than 0"); + return response; + } + try { + ExpressionList patientEncounterQuery = QueryProvider.getPatientEncounterQuery() + .where() + .eq("id", encounterId); + IPatientEncounter patientEncounter = patientEncounterRepository.findOne(patientEncounterQuery); + if (patientEncounter.getDoctor() == null) { + response.setResponseObject(null); + } else { + UserItem userItem = DomainMapper.createUserItem(patientEncounter.getDoctor()); + response.setResponseObject(userItem); + } + } catch (Exception ex) { + response.addError("", "error finding encounter"); + } + return response; + } + /** * {@inheritDoc} */ @@ -210,10 +295,11 @@ public ServiceResponse> findCurrentTabFieldsByEncounte response.addError("exception", ex.getMessage()); } - return response; } + + /** * {@inheritDoc} */ @@ -263,7 +349,7 @@ public ServiceResponse> createPatientEncounterTabFields(List< List tabFieldItemsToReturn = new ArrayList<>(); for (IPatientEncounterTabField petf : savedTabFields) { - tabFieldItemsToReturn.add(domainMapper.createTabFieldItem(petf)); + tabFieldItemsToReturn.add(DomainMapper.createTabFieldItem(petf)); } response.setResponseObject(tabFieldItemsToReturn); } catch (Exception ex) { @@ -277,163 +363,31 @@ public ServiceResponse> createPatientEncounterTabFields(List< * {@inheritDoc} */ @Override - public ServiceResponse>> getCustomFields(int encounterId) { - ServiceResponse>> response = new ServiceResponse<>(); - if (encounterId < 1) { - response.addError("", "encounterId must be greater than 0"); - return response; - } - Map> customFieldMap = new HashMap<>(); - ExpressionList query = QueryProvider.getTabQuery() + public ServiceResponse> findProblemItems(int encounterId) { + ServiceResponse> response = new ServiceResponse<>(); + List problemItems = new ArrayList<>(); + Query query = QueryProvider.getPatientEncounterTabFieldQuery() + .fetch("tabField") .where() - .eq("isDeleted", false); - try { - //O(n^2) because who gives a fuck - List customTabs = customTabRepository.find(query); - for (ITab ct : customTabs) { - Query query2 = QueryProvider.getTabFieldQuery() - .fetch("tab") - .where() - .eq("isDeleted", false) - .eq("tab.name", ct.getName()) - .order() - .asc("sort_order"); - - - List customFields = tabFieldRepository.find(query2); - List customFieldItems = new ArrayList<>(); - for (ITabField cf : customFields) { - Query query3 = QueryProvider.getPatientEncounterTabFieldQuery() - .where() - .eq("tabField", cf)//somethings fucky - .eq("patient_encounter_id", encounterId) - .order() - .desc("date_taken"); - - List patientEncounterCustomField = patientEncounterTabFieldRepository.find(query3); - if (patientEncounterCustomField != null && patientEncounterCustomField.size() > 0) { - customFieldItems.add(domainMapper.createTabFieldItem(patientEncounterCustomField.get(0))); - } else { - customFieldItems.add(domainMapper.createTabFieldItem(cf)); - } - - - } - customFieldMap.put(ct.getName(), customFieldItems); - - } - response.setResponseObject(customFieldMap); - } catch (Exception ex) { - response.addError("", "error"); - return response; - } - - return response; - } - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse> createPatientEncounterVitals(Map patientEncounterVitalMap, int userId, int encounterId) { - ServiceResponse> response = new ServiceResponse<>(); - if (patientEncounterVitalMap == null || userId < 1 || encounterId < 1) { - response.addError("", "invalid parameters"); - return response; - } - List patientEncounterVitals = new ArrayList<>(); - IPatientEncounterVital patientEncounterVital; - IVital vital; - - ExpressionList query; - String currentTime = dateUtils.getCurrentDateTimeString(); - - for (String key : patientEncounterVitalMap.keySet()) { - if (patientEncounterVitalMap.get(key) != null) { - query = QueryProvider.getVitalQuery().where().eq("name", key); - vital = vitalRepository.findOne(query); - - patientEncounterVital = patientEncounterVitalProvider.get(); - patientEncounterVital.setPatientEncounterId(encounterId); - patientEncounterVital.setUserId(userId); - patientEncounterVital.setDateTaken(currentTime); - patientEncounterVital.setVital(vital); - patientEncounterVital.setVitalValue(patientEncounterVitalMap.get(key)); - patientEncounterVitals.add(patientEncounterVital); - } - } - - try { - List vitalItems = new ArrayList<>(); - List newPatientEncounterVitals = patientEncounterVitalRepository.createAll(patientEncounterVitals); - for (IPatientEncounterVital pev : newPatientEncounterVitals) { - vitalItems.add(domainMapper.createVitalItem(pev)); - } - response.setResponseObject(vitalItems); - } catch (Exception ex) { - response.addError("exception", ex.getMessage()); - } - - return response; - } + .eq("patient_encounter_id", encounterId) + .eq("tabField.name", "problem") + .order() + .asc("date_taken"); - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse> getCustomTabs() { - ServiceResponse> response = new ServiceResponse<>(); - ExpressionList query = QueryProvider.getTabQuery() - .where() - .eq("isDeleted", false) - .eq("isCustom", true); try { - List customTabs = customTabRepository.find(query); - List customTabNames = new ArrayList<>(); - - for (ITab t : customTabs) { - customTabNames.add(domainMapper.createTabItem(t)); + List patientEncounterTreatmentFields = patientEncounterTabFieldRepository.find(query); + if (patientEncounterTreatmentFields == null) { + response.addError("", "bad query"); + } else { + for (IPatientEncounterTabField petf : patientEncounterTreatmentFields) { + problemItems.add(domainMapper.createProblemItem(petf)); + } + response.setResponseObject(problemItems); } - response.setResponseObject(customTabNames); } catch (Exception ex) { response.addError("", "error"); } return response; } - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse checkPatientIn(int encounterId, int userId) { - ServiceResponse response = new ServiceResponse<>(); - if (encounterId < 1) { - response.addError("", "encounterId must be greater than 0"); - return response; - } - - ExpressionList query = QueryProvider.getPatientEncounterQuery() - .where() - .eq("id", encounterId); - - try { - IPatientEncounter patientEncounter = patientEncounterRepository.findOne(query); - patientEncounter.setDateOfMedicalVisit(DateTime.now()); - ExpressionList getUserQuery = QueryProvider.getUserQuery() - .where() - .eq("id", userId); - IUser user = userRepository.findOne(getUserQuery); - patientEncounter.setDoctor(user); - - patientEncounter = patientEncounterRepository.update(patientEncounter); - - - response.setResponseObject(DomainMapper.createPatientEncounterItem(patientEncounter)); - } catch (Exception ex) { - response.addError("exception", ex.getMessage()); - } - - return response; - } } diff --git a/app/femr/business/services/InventoryService.java b/app/femr/business/services/system/InventoryService.java similarity index 95% rename from app/femr/business/services/InventoryService.java rename to app/femr/business/services/system/InventoryService.java index 09cdac93f..35262cfd2 100644 --- a/app/femr/business/services/InventoryService.java +++ b/app/femr/business/services/system/InventoryService.java @@ -16,17 +16,21 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.ExpressionList; -import com.avaje.ebean.Query; import com.google.inject.Inject; import femr.business.helpers.DomainMapper; import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; -import femr.data.models.*; +import femr.business.services.core.IInventoryService; +import femr.common.dtos.ServiceResponse; import femr.data.daos.IRepository; import femr.common.models.MedicationItem; +import femr.data.models.core.*; +import femr.data.models.mysql.Medication; +import femr.data.models.mysql.MedicationActiveDrugName; +import femr.data.models.mysql.MedicationForm; +import femr.data.models.mysql.MedicationMeasurementUnit; import java.util.ArrayList; import java.util.List; diff --git a/app/femr/business/services/PharmacyService.java b/app/femr/business/services/system/MedicationService.java similarity index 67% rename from app/femr/business/services/PharmacyService.java rename to app/femr/business/services/system/MedicationService.java index 2e40eb370..62623fd20 100644 --- a/app/femr/business/services/PharmacyService.java +++ b/app/femr/business/services/system/MedicationService.java @@ -16,49 +16,37 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.*; +import com.google.gson.JsonObject; import com.google.inject.Inject; import femr.business.helpers.DomainMapper; import femr.business.helpers.QueryProvider; +import femr.business.services.core.IMedicationService; +import femr.common.dtos.ServiceResponse; import femr.common.models.PrescriptionItem; -import femr.common.dto.ServiceResponse; -import femr.common.models.ProblemItem; -import femr.common.models.VitalItem; -import femr.data.models.IUser; -import femr.data.models.User; import femr.data.daos.IRepository; -import femr.data.models.*; +import femr.data.models.core.IMedication; +import femr.data.models.core.IPatientPrescription; +import femr.data.models.mysql.Medication; +import femr.data.models.mysql.PatientPrescription; import femr.util.stringhelpers.StringUtils; -import org.joda.time.DateTime; - import java.util.ArrayList; import java.util.List; -public class PharmacyService implements IPharmacyService { +public class MedicationService implements IMedicationService { + private final IRepository medicationRepository; - private final IRepository patientEncounterRepository; - private final IRepository patientEncounterTabFieldRepository; - private final IRepository patientEncounterVitalRepository; private final IRepository patientPrescriptionRepository; - private final IRepository userRepository; private final DomainMapper domainMapper; @Inject - public PharmacyService(IRepository patientPrescriptionRepository, - IRepository patientEncounterTabFieldRepository, - IRepository patientEncounterVitalRepository, - IRepository medicationRepository, - IRepository patientEncounterRepository, - IRepository userRepository, - DomainMapper domainMapper) { - this.patientPrescriptionRepository = patientPrescriptionRepository; - this.patientEncounterTabFieldRepository = patientEncounterTabFieldRepository; - this.patientEncounterVitalRepository = patientEncounterVitalRepository; + public MedicationService(IRepository medicationRepository, + IRepository patientPrescriptionRepository, + DomainMapper domainMapper) { this.medicationRepository = medicationRepository; - this.patientEncounterRepository = patientEncounterRepository; - this.userRepository = userRepository; + this.patientPrescriptionRepository = patientPrescriptionRepository; this.domainMapper = domainMapper; } @@ -66,24 +54,22 @@ public PharmacyService(IRepository patientPrescriptionRepo * {@inheritDoc} */ @Override - public ServiceResponse checkPatientIn(int encounterId, int userId) { - ServiceResponse response = new ServiceResponse<>(); - if (encounterId < 1) { - response.addError("", "encounterId can not be less than 1"); - return response; - } + public ServiceResponse getMedicationNames() { + + ServiceResponse response = new ServiceResponse<>(); try { - ExpressionList query = QueryProvider.getPatientEncounterQuery().where().eq("id", encounterId); - IPatientEncounter patientEncounter = patientEncounterRepository.findOne(query); - patientEncounter.setDateOfPharmacyVisit(DateTime.now()); - ExpressionList getUserQuery = QueryProvider.getUserQuery() - .where() - .eq("id", userId); - IUser user = userRepository.findOne(getUserQuery); - patientEncounter.setPharmacist(user); - patientEncounter = patientEncounterRepository.update(patientEncounter); - response.setResponseObject(patientEncounter); + List medicationNames = new ArrayList<>(); + List medications = medicationRepository.findAll(Medication.class); + + JsonObject jsonObject = new JsonObject(); + if (medications != null) { + for (int medicationIndex = 0; medicationIndex < medications.size(); medicationIndex++) { + jsonObject.addProperty("medicine" + medicationIndex, medications.get(medicationIndex).getName()); + } + } + + response.setResponseObject(jsonObject.toString()); } catch (Exception ex) { response.addError("exception", ex.getMessage()); } @@ -116,7 +102,6 @@ public ServiceResponse createAndReplacePrescription(Prescripti //replace the old prescription oldPatientPrescription.setReplacementId(newPatientPrescription.getId()); - oldPatientPrescription.setDispensed(false); patientPrescriptionRepository.update(oldPatientPrescription); PrescriptionItem newPrescriptionItem = domainMapper.createPrescriptionItem(newPatientPrescription); @@ -132,65 +117,26 @@ public ServiceResponse createAndReplacePrescription(Prescripti * {@inheritDoc} */ @Override - public ServiceResponse> findProblemItems(int encounterId) { - ServiceResponse> response = new ServiceResponse<>(); - List problemItems = new ArrayList<>(); - Query query = QueryProvider.getPatientEncounterTabFieldQuery() - .fetch("tabField") - .where() - .eq("patient_encounter_id", encounterId) - .eq("tabField.name", "problem") - .order() - .asc("date_taken"); - - try { - List patientEncounterTreatmentFields = patientEncounterTabFieldRepository.find(query); - if (patientEncounterTreatmentFields == null) { - response.addError("", "bad query"); - } else { - for (IPatientEncounterTabField petf : patientEncounterTreatmentFields) { - problemItems.add(domainMapper.createProblemItem(petf)); - } - response.setResponseObject(problemItems); - } - } catch (Exception ex) { - response.addError("", "error"); + public ServiceResponse> createPatientPrescriptions(List prescriptionItems, int userId, int encounterId, boolean isDispensed, boolean isCounseled) { + ServiceResponse> response = new ServiceResponse<>(); + if (prescriptionItems == null || userId < 1 || encounterId < 1) { + response.addError("", "invalid parameters"); + return response; } - return response; - } - - /** - * {@inheritDoc} - */ - @Override - public ServiceResponse> findAllMedications() { - - ServiceResponse> response = new ServiceResponse<>(); + List patientPrescriptions = new ArrayList<>(); + for (PrescriptionItem pi : prescriptionItems) { + IMedication medication = domainMapper.createMedication(pi.getName()); + patientPrescriptions.add(domainMapper.createPatientPrescription(0, medication, userId, encounterId, null, isDispensed, isCounseled)); + } try { - List medicationNames = new ArrayList<>(); - - //List medications = medicationRepository.findAll(Medication.class); - - //use raw sql to temporarily filter out the duplicate medication names - //after implementing the inventory tracking feature, this shouldn't be needed - //as duplicates will never exist. - //Also - ebeans "setDistinct" method has known bugs in it hence rawsql crap - String rawSqlString = "SELECT id, name FROM medications GROUP BY name"; - RawSql rawSql = RawSqlBuilder.parse(rawSqlString).create(); - - Query medicationQuery = Ebean.find(Medication.class); - medicationQuery.setRawSql(rawSql); - - List medications = medicationQuery.findList(); - - - - for (IMedication m : medications) { - medicationNames.add(m.getName()); + List newPatientPrescriptions = patientPrescriptionRepository.createAll(patientPrescriptions); + List newPrescriptionItems = new ArrayList<>(); + for (IPatientPrescription pp : newPatientPrescriptions) { + newPrescriptionItems.add(domainMapper.createPatientPrescriptionItem(pp)); } - response.setResponseObject(medicationNames); + response.setResponseObject(newPrescriptionItems); } catch (Exception ex) { response.addError("exception", ex.getMessage()); } @@ -232,7 +178,7 @@ public ServiceResponse> markPrescriptionsAsFilled(List> markPrescriptionsAsCounseled(List prescriptionIds){ + public ServiceResponse> markPrescriptionsAsCounseled(List prescriptionIds) { ServiceResponse> response = new ServiceResponse<>(); List updatedPrescriptions = new ArrayList<>(); @@ -257,5 +203,40 @@ public ServiceResponse> markPrescriptionsAsCounseled(List return response; } -} + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findAllMedications() { + ServiceResponse> response = new ServiceResponse<>(); + + try { + List medicationNames = new ArrayList<>(); + + //List medications = medicationRepository.findAll(Medication.class); + + //use raw sql to temporarily filter out the duplicate medication names + //after implementing the inventory tracking feature, this shouldn't be needed + //as duplicates will never exist. + //Also - ebeans "setDistinct" method has known bugs in it hence rawsql crap + String rawSqlString = "SELECT id, name FROM medications GROUP BY name"; + RawSql rawSql = RawSqlBuilder.parse(rawSqlString).create(); + + Query medicationQuery = Ebean.find(Medication.class); + medicationQuery.setRawSql(rawSql); + + List medications = medicationQuery.findList(); + + + for (IMedication m : medications) { + medicationNames.add(m.getName()); + } + response.setResponseObject(medicationNames); + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } +} diff --git a/app/femr/business/services/system/MissionTripService.java b/app/femr/business/services/system/MissionTripService.java new file mode 100644 index 000000000..8b1077e5c --- /dev/null +++ b/app/femr/business/services/system/MissionTripService.java @@ -0,0 +1,336 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.business.services.system; + +import com.avaje.ebean.ExpressionList; +import com.avaje.ebean.Query; +import com.google.inject.Inject; +import femr.business.helpers.DomainMapper; +import femr.business.helpers.QueryProvider; +import femr.business.services.core.IMissionTripService; +import femr.common.dtos.ServiceResponse; +import femr.common.models.CityItem; +import femr.common.models.MissionItem; +import femr.common.models.TeamItem; +import femr.common.models.TripItem; +import femr.data.daos.IRepository; +import femr.data.models.core.IMissionCity; +import femr.data.models.core.IMissionCountry; +import femr.data.models.core.IMissionTeam; +import femr.data.models.core.IMissionTrip; +import femr.data.models.mysql.MissionCity; +import femr.data.models.mysql.MissionCountry; +import femr.data.models.mysql.MissionTeam; +import femr.data.models.mysql.MissionTrip; +import femr.util.stringhelpers.StringUtils; + +import java.util.ArrayList; +import java.util.List; + +public class MissionTripService implements IMissionTripService { + + private final IRepository missionCityRepository; + private final IRepository missionCountryRepository; + private final IRepository missionTeamRepository; + private final IRepository missionTripRepository; + private final DomainMapper domainMapper; + + @Inject + public MissionTripService(IRepository missionCityRepository, + IRepository missionCountryRepository, + IRepository missionTeamRepository, + IRepository missionTripRepository, + DomainMapper domainMapper) { + + this.missionCityRepository = missionCityRepository; + this.missionCountryRepository = missionCountryRepository; + this.missionTripRepository = missionTripRepository; + this.missionTeamRepository = missionTeamRepository; + this.domainMapper = domainMapper; + } + + /** + * {@inheritDoc} + */ + @Override + public IMissionTrip findCurrentMissionTrip() { + + return getCurrentMissionTrip(); + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findAvailableTeams() { + + ServiceResponse> response = new ServiceResponse<>(); + List teams = new ArrayList<>(); + Query missionTeamQuery = QueryProvider.getMissionTeamQuery() + .orderBy("name"); + List missionTeams = missionTeamRepository.find(missionTeamQuery); + for (IMissionTeam mt : missionTeams) { + teams.add(mt.getName()); + } + response.setResponseObject(teams); + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findAvailableCities() { + + ServiceResponse> response = new ServiceResponse<>(); + List cities = new ArrayList<>(); + Query missionCityQuery = QueryProvider.getMissionCityQuery() + .orderBy("name"); + List missionCities = missionCityRepository.find(missionCityQuery); + for (IMissionCity mc : missionCities) { + cities.add(DomainMapper.createCityItem(mc.getName(), mc.getMissionCountry().getName())); + } + response.setResponseObject(cities); + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findAvailableCountries() { + + ServiceResponse> response = new ServiceResponse<>(); + List countries = new ArrayList<>(); + Query missionCountryQuery = QueryProvider.getMissionCountryQuery() + .orderBy("name"); + List missionCountries = missionCountryRepository.find(missionCountryQuery); + for (IMissionCountry mc : missionCountries) { + countries.add(mc.getName()); + } + response.setResponseObject(countries); + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findAllTripInformation() { + + ServiceResponse> response = new ServiceResponse<>(); + List missionItems = new ArrayList<>(); + + try { + //start by getting all available mission teams. If you start by getting all the trips then + //you might miss some teams that don't have a trip, yet. + List missionTeams = missionTeamRepository.findAll(MissionTeam.class); + for (IMissionTeam missionTeam : missionTeams) { + missionItems.add(DomainMapper.createMissionItem(missionTeam)); + } + + response.setResponseObject(missionItems); + } catch (Exception ex) { + + response.addError("", ex.getMessage()); + } + + return response; + } + + /** + * {@inheritDoc} + */ + public ServiceResponse createNewTeam(TeamItem teamItem) { + + ServiceResponse response = new ServiceResponse<>(); + if (teamItem == null || StringUtils.isNullOrWhiteSpace(teamItem.getName())) { + + response.addError("", "team must have a name"); + } else { + + try { + + IMissionTeam missionTeam = domainMapper.createMissionTeam(teamItem.getName(), teamItem.getLocation(), teamItem.getDescription()); + missionTeam = missionTeamRepository.create(missionTeam); + response.setResponseObject(DomainMapper.createTeamItem(missionTeam.getName(), missionTeam.getLocation(), missionTeam.getDescription())); + } catch (Exception ex) { + + response.addError("", ex.getMessage()); + } + } + + return response; + } + + /** + * {@inheritDoc} + */ + public ServiceResponse createNewTrip(TripItem tripItem) { + + ServiceResponse response = new ServiceResponse<>(); + if (tripItem == null || + StringUtils.isNullOrWhiteSpace(tripItem.getTeamName()) || + StringUtils.isNullOrWhiteSpace(tripItem.getTripCity()) || + StringUtils.isNullOrWhiteSpace(tripItem.getTripCountry()) || + tripItem.getTripStartDate() == null) { + response.addError("", "you're missing required fields, try again"); + } else { + try { + + + ExpressionList missionTeamExpressionList = QueryProvider.getMissionTeamQuery() + .where() + .eq("name", tripItem.getTeamName()); + IMissionTeam missionTeam = missionTeamRepository.findOne(missionTeamExpressionList); + + ExpressionList missionCountryExpressionList = QueryProvider.getMissionCountryQuery() + .where() + .eq("name", tripItem.getTripCountry()); + IMissionCountry missionCountry = missionCountryRepository.findOne(missionCountryExpressionList); + + if (missionCountry == null) { + //make sure we have a country to work with + response.addError("", "someone sent a bad country in the request"); + } else if (missionTeam == null) { + //make sure we have a team to work with + response.addError("", "someone sent a bad team name in the request"); + } else { + + ExpressionList missionCityExpressionList = QueryProvider.getMissionCityQuery() + .where() + .eq("name", tripItem.getTripCity()) + .eq("missionCountry", missionCountry); + IMissionCity missionCity = missionCityRepository.findOne(missionCityExpressionList); + + if (missionCity == null) { + //city doesn't exist + missionCity = domainMapper.createMissionCity(tripItem.getTripCity(), missionCountry); + missionCity = missionCityRepository.create(missionCity); + } + + + IMissionTrip missionTrip = domainMapper.createMissionTrip(tripItem.getTripStartDate(), tripItem.getTripEndDate(), false, missionCity, missionTeam); + missionTrip = missionTripRepository.create(missionTrip); + response.setResponseObject(DomainMapper.createTripItem(missionTrip.getMissionTeam().getName(), missionTrip.getMissionCity().getName(), missionTrip.getMissionCity().getMissionCountry().getName(), missionTrip.getStartDate(), missionTrip.getEndDate())); + + } + } catch (Exception ex) { + + response.addError("", ex.getMessage()); + } + } + + return response; + } + + /** + * Get the current mission trip. + * + * @return null if none or more than one exists + */ + private IMissionTrip getCurrentMissionTrip() { + ExpressionList missionTripQuery = QueryProvider.getMissionTripQuery() + .where() + .eq("isCurrent", true); + IMissionTrip missionTrip = null; + + try { + missionTrip = missionTripRepository.findOne(missionTripQuery); + } catch (Exception ex) { + + } + + return missionTrip; + } + + /** + * {@inheritDoc} + */ + public ServiceResponse createNewCity(String cityName, String countryName) { + + ServiceResponse response = new ServiceResponse<>(); + + ExpressionList missionCountryExpressionList = QueryProvider.getMissionCountryQuery() + .where() + .eq("name", countryName); + try { + + IMissionCountry missionCountry = missionCountryRepository.findOne(missionCountryExpressionList); + if (missionCountry == null) { + response.addError("", "that country does not exist"); + } else { + + //check for duplicate + List missionCities = missionCityRepository.findAll(MissionCity.class); + boolean isDuplicate = false; + for (IMissionCity mc : missionCities){ + if (mc.getName().toUpperCase().equals(cityName.toUpperCase())){ + isDuplicate = true; + response.addError("", "duplicate city"); + } + } + if (!isDuplicate){ + IMissionCity missionCity = domainMapper.createMissionCity(cityName, missionCountry); + missionCity = missionCityRepository.create(missionCity); + response.setResponseObject(DomainMapper.createCityItem(missionCity.getName(), missionCity.getMissionCountry().getName())); + } + } + } catch (Exception ex) { + + response.addError("", "there was an issue saving the city"); + } + + return response; + } + + /** + * {@inheritDoc} + */ + public ServiceResponse updateCurrentTrip(int tripId) { + + ServiceResponse response = new ServiceResponse<>(); + ExpressionList missionTripExpressionList = QueryProvider.getMissionTripQuery() + .where() + .eq("id", tripId); + try { + IMissionTrip missionTrip = missionTripRepository.findOne(missionTripExpressionList); + if (missionTrip == null) { + response.addError("", "could not find a trip with that id"); + } else { + List allTrips = missionTripRepository.findAll(MissionTrip.class); + for (IMissionTrip mt : allTrips) { + if (mt.getId() == missionTrip.getId()) { + mt.setCurrent(true); + } else { + mt.setCurrent(false); + } + missionTripRepository.update(mt); + response.setResponseObject(DomainMapper.createTripItem(mt.getMissionTeam().getName(), mt.getMissionCity().getName(), mt.getMissionCity().getMissionCountry().getName(), mt.getStartDate(), mt.getEndDate())); + } + } + + } catch (Exception ex) { + + response.addError("", ex.getMessage()); + } + + return response; + } +} diff --git a/app/femr/business/services/system/PatientService.java b/app/femr/business/services/system/PatientService.java new file mode 100644 index 000000000..bcb8ed4b5 --- /dev/null +++ b/app/femr/business/services/system/PatientService.java @@ -0,0 +1,131 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.business.services.system; + +import com.avaje.ebean.ExpressionList; +import com.avaje.ebean.Query; +import com.google.inject.Inject; +import femr.business.helpers.DomainMapper; +import femr.business.helpers.QueryProvider; +import femr.business.services.core.IPatientService; +import femr.common.dtos.ServiceResponse; +import femr.common.models.PatientItem; +import femr.data.daos.IRepository; +import femr.data.models.core.*; +import femr.data.models.mysql.Patient; +import femr.data.models.mysql.PatientAgeClassification; +import femr.util.stringhelpers.StringUtils; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +public class PatientService implements IPatientService { + + private final IRepository patientRepository; + private final IRepository patientAgeClassificationRepository; + private final DomainMapper domainMapper; + + @Inject + public PatientService(IRepository patientRepository, + IRepository patientAgeClassificationRepository, + DomainMapper domainMapper){ + + this.patientRepository = patientRepository; + this.patientAgeClassificationRepository = patientAgeClassificationRepository; + this.domainMapper = domainMapper; + } + + /** + * {@inheritDoc} + */ + public ServiceResponse> findPossibleAgeClassifications() { + ServiceResponse> response = new ServiceResponse<>(); + Map patientAgeClassificationStrings = new LinkedHashMap<>(); + try { + Query patientAgeClassificationExpressionList = QueryProvider.getPatientAgeClassificationQuery() + .where() + .eq("isDeleted", false) + .order() + .asc("sortOrder"); + List patientAgeClassifications = patientAgeClassificationRepository.find(patientAgeClassificationExpressionList); + for (IPatientAgeClassification pac : patientAgeClassifications) { + patientAgeClassificationStrings.put(pac.getName(), pac.getDescription()); + } + response.setResponseObject(patientAgeClassificationStrings); + } catch (Exception ex) { + response.addError("", ex.getMessage()); + } + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse findPatientAndUpdateSex(int id, String sex) { + ServiceResponse response = new ServiceResponse<>(); + if (id < 1) { + response.addError("", "patient id can not be less than 1"); + return response; + } + + ExpressionList query = QueryProvider.getPatientQuery() + .where() + .eq("id", id); + + try { + IPatient savedPatient = patientRepository.findOne(query); + //if a patient doesn't have a sex and the + //user is trying to identify the patients sex + if (StringUtils.isNullOrWhiteSpace(savedPatient.getSex()) && StringUtils.isNotNullOrWhiteSpace(sex)) { + savedPatient.setSex(sex); + savedPatient = patientRepository.update(savedPatient); + } + PatientItem patientItem = DomainMapper.createPatientItem(savedPatient, null, null, null, null); + response.setResponseObject(patientItem); + + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse createPatient(PatientItem patient) { + ServiceResponse response = new ServiceResponse<>(); + if (patient == null) { + response.addError("", "no patient received"); + return response; + } + + try { + IPatient newPatient = domainMapper.createPatient(patient); + newPatient = patientRepository.create(newPatient); + response.setResponseObject(DomainMapper.createPatientItem(newPatient, null, null, null, null)); + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } +} diff --git a/app/femr/business/services/PhotoService.java b/app/femr/business/services/system/PhotoService.java similarity index 97% rename from app/femr/business/services/PhotoService.java rename to app/femr/business/services/system/PhotoService.java index 6fcf8d88d..273c1da6f 100644 --- a/app/femr/business/services/PhotoService.java +++ b/app/femr/business/services/system/PhotoService.java @@ -16,10 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.ExpressionList; -import com.typesafe.config.ConfigFactory; import java.awt.image.BufferedImage; import java.io.*; @@ -31,12 +30,18 @@ import femr.business.helpers.DomainMapper; import femr.business.helpers.LogicDoer; import femr.business.helpers.QueryProvider; +import femr.business.services.core.IPhotoService; import femr.common.models.PatientEncounterItem; -import femr.common.dto.ServiceResponse; +import femr.common.dtos.ServiceResponse; import com.google.inject.Inject; import femr.common.models.PhotoItem; import femr.data.daos.IRepository; -import femr.data.models.*; +import femr.data.models.core.IPatient; +import femr.data.models.core.IPatientEncounterPhoto; +import femr.data.models.core.IPhoto; +import femr.data.models.mysql.Patient; +import femr.data.models.mysql.PatientEncounterPhoto; +import femr.data.models.mysql.Photo; import femr.ui.models.medical.EditViewModelPost; import femr.util.stringhelpers.StringUtils; import org.apache.commons.codec.binary.Base64; diff --git a/app/femr/business/services/system/ResearchService.java b/app/femr/business/services/system/ResearchService.java new file mode 100644 index 000000000..1a94d4cfb --- /dev/null +++ b/app/femr/business/services/system/ResearchService.java @@ -0,0 +1,1052 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.business.services.system; + +import com.avaje.ebean.Query; +import com.google.inject.Inject; +import femr.business.services.core.IResearchService; +import femr.business.helpers.DomainMapper; +import femr.business.helpers.QueryProvider; +import femr.common.dtos.ServiceResponse; +import femr.common.models.*; +import femr.ui.models.research.json.ResearchGraphDataItem; +import femr.data.daos.IRepository; +import femr.data.models.core.*; +import femr.data.models.mysql.Medication; +import femr.data.models.mysql.PatientEncounter; +import femr.data.models.mysql.PatientEncounterVital; +import femr.data.models.mysql.PatientPrescription; +import femr.util.calculations.dateUtils; +import femr.util.stringhelpers.StringUtils; +import org.apache.commons.lang3.text.WordUtils; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.*; + +public class ResearchService implements IResearchService { + + private final IRepository patientEncounterRepository; + private final IRepository patientEncounterVitalRepository; + protected final IRepository vitalRepository; + private final IRepository prescriptionRepository; + private final IRepository medicationRepository; + private final DomainMapper domainMapper; + + /** + * Initializes the research service and injects the dependence + */ + @Inject + public ResearchService(IRepository patientEncounterRepository, + IRepository patientEncounterVitaRepository, + IRepository vitalRepository, + IRepository prescriptionRepository, + IRepository medicationRepository, + DomainMapper domainMapper) { + + this.patientEncounterRepository = patientEncounterRepository; + this.patientEncounterVitalRepository = patientEncounterVitaRepository; + this.vitalRepository = vitalRepository; + this.prescriptionRepository = prescriptionRepository; + this.medicationRepository = medicationRepository; + this.domainMapper = domainMapper; + } + + + @Override + public ServiceResponse getGraphData(ResearchFilterItem filters){ + + ServiceResponse response = new ServiceResponse<>(); + + String primaryDatasetName = filters.getPrimaryDataset(); + //TODO: gender throws error here due to patients with no sex + ResearchResult primaryItems = getDatasetItems(primaryDatasetName, filters); + + ResearchResult secondaryItems = new ResearchResult(); + String secondaryDatasetName = filters.getSecondaryDataset(); + if (!secondaryDatasetName.isEmpty()) { + + secondaryItems = getDatasetItems(secondaryDatasetName, filters); + } + + try{ + ResearchGraphDataItem graphDataItem = createResearchGraphItem(primaryItems, secondaryItems, filters); + response.setResponseObject(graphDataItem); + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } + + @Override + public ServiceResponse> getAllMedications(){ + + ServiceResponse> response = new ServiceResponse<>(); + + try { + List medications = medicationRepository.findAll(Medication.class); + + Map medicationItems = new HashMap<>(); + + for (IMedication medication : medications) { + + medicationItems.put( + medication.getId(), + medication.getName() + ); + } + response.setResponseObject(medicationItems); + + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } + + public static ResearchGraphDataItem createResearchGraphItem(ResearchResult primaryResult, ResearchResult secondaryResult, ResearchFilterItem filters) { + + ResearchGraphDataItem graphModel = new ResearchGraphDataItem(); + List graphData = new ArrayList<>(); + Map groupedData = new HashMap<>(); + + String yAxisTitle = "Number of Patients"; + String xAxisTitle = WordUtils.capitalize(StringUtils.splitCamelCase(primaryResult.getDataType())); + String unitOfMeasurement = primaryResult.getUnitOfMeasurement(); + + List sortedPrimary = new ArrayList<>(); + Map primaryDataset = primaryResult.getDataset(); + Map secondaryDataset = secondaryResult.getDataset(); + int sampleSize = primaryDataset.size(); + float total = 0; + float rangeHigh = 0; + float rangeLow = 10000; + float median = 0; + + // Medications will not group correctly, just bundle and return + if( filters.getPrimaryDataset().equals("prescribedMeds") || + filters.getPrimaryDataset().equals("dispensedMeds") ){ + + for (Integer key : primaryDataset.keySet()) { + + // Make sure all secondary keys are set for all items + Float value = primaryDataset.get(key); + + ResearchItem currItem = new ResearchItem(); + currItem.setPrimaryName(Float.toString((float) key)); + currItem.setPrimaryValue(value); + + graphData.add(currItem); + } + + + graphModel.setAverage(0.0f); + graphModel.setMedian(median); + graphModel.setRangeLow(rangeLow); + graphModel.setRangeHigh(rangeHigh); + graphModel.setGraphData(graphData); + graphModel.setPrimaryValuemap(primaryResult.getValueMap()); + graphModel.setSecondaryValuemap(secondaryResult.getValueMap()); + graphModel.setyAxisTitle(yAxisTitle); + graphModel.setxAxisTitle(xAxisTitle); + graphModel.setUnitOfMeasurement(unitOfMeasurement); + return graphModel; + } + + + // total the individual patients based on their value + Map primaryGraphTotals = new HashMap<>(); + + // used to ensure all secondary keys are present in all items, just in case they have no data + Map secondaryKeyset = new HashMap<>(); + + for( Integer key : primaryDataset.keySet() ){ + + Float value = primaryDataset.get(key); + sortedPrimary.add(value); + + // Find current primary Value and add to builder map + ResearchItem currItem; + if( primaryGraphTotals.containsKey(value) ){ + + currItem = primaryGraphTotals.get(value); + float currItemTotal = currItem.getPrimaryValue() + 1; + currItem.setPrimaryValue(currItemTotal); + } + else{ + + currItem = new ResearchItem(); + currItem.setPrimaryValue(1); + } + currItem.setPrimaryName(value.toString()); + + // check for and add secondary item to total + if( secondaryDataset.containsKey(key) ) { + + // Get secondary item form current ResearchItem + Map secondaryItems = currItem.getSecondaryData(); + Float secondaryValue = secondaryDataset.get(key); + Float secondaryTotal = 1.0f; + String secondaryKey = secondaryValue.toString(); + + // Keep track of unique keys for secondary items + // want to make sure all possible keys are present in graphData + secondaryKeyset.put(secondaryKey, 0); + + if (secondaryItems.containsKey(secondaryKey)) { + + secondaryTotal = secondaryItems.get(secondaryKey); + secondaryTotal++; + secondaryItems.put(secondaryKey, secondaryTotal); + } + else{ + + secondaryItems.put(secondaryKey, 1.0f); + } + + // add secondary totals to currItem + currItem.setSecondaryData(secondaryItems); + } + + + primaryGraphTotals.put(value, currItem); + + // Calculate Stats while building data + // check range + if( value > rangeHigh ){ + rangeHigh = value; + } + if( value < rangeLow){ + rangeLow = value; + } + + // sum total for average + total += value; + + } + + // If no grouping and over 30 items, force groups of 10 + if( primaryGraphTotals.keySet().size() > 30 && !filters.isGroupPrimary() + && (filters.getGraphType().equals("pie") || filters.getGraphType().equals("stacked-bar") || filters.getGraphType().equals("grouped-bar") ) ){ + + filters.setGroupPrimary(true); + filters.setGroupFactor(10); + } + + // Build group key values -- don't bother if there will only be 1 group + // make happen automatically too? -- primaryGraphTotals.keySet().size() > 20 + if( filters.isGroupPrimary() && primaryGraphTotals.keySet().size() > filters.getGroupFactor() ) { + + int groupFactor = filters.getGroupFactor(); + int firstLowKey = (int)(rangeLow / groupFactor) * groupFactor; + int lastLowKey = (int)(rangeHigh / groupFactor) * groupFactor; + + //int totalGroups = (int)((lastLowKey-firstLowKey) / groupFactor); + List groupIndexes = new ArrayList(); + for( int low = firstLowKey; low <= lastLowKey; low+=groupFactor ){ + + int lowTemp = low; + if( low < filters.getRangeStart() ){ + + lowTemp = filters.getRangeStart().intValue(); + } + + int high = low + (groupFactor - 1); + if( high > filters.getRangeEnd() ){ + + high = filters.getRangeEnd().intValue(); + } + + String groupIndex = String.format("%d - %d", lowTemp, high); + groupIndexes.add(groupIndex); + + ResearchItem blankItem = new ResearchItem(groupIndex); + groupedData.put(groupIndex, blankItem); + } + + for (Float key : primaryGraphTotals.keySet()) { + + ResearchItem currItem = primaryGraphTotals.get(key); + + Float newVal = Float.parseFloat(currItem.getPrimaryName()); + Float newCount = currItem.getPrimaryValue(); + + int targetGroup = (int)(newVal / groupFactor) - (firstLowKey / groupFactor); + String groupIndex = groupIndexes.get(targetGroup); + + ResearchItem finalItem; + if( groupedData.containsKey(groupIndex) ){ + + // add current single item to existing group Item + finalItem = groupedData.get(groupIndex); + + Float currCount = finalItem.getPrimaryValue(); + currCount += newCount; + finalItem.setPrimaryValue(currCount); + + Map currSecondaryData = currItem.getSecondaryData(); + for( String sKey : currSecondaryData.keySet() ){ + + Float sCount = currSecondaryData.get(sKey); + + Map finalSecondaryData = finalItem.getSecondaryData(); + if( finalSecondaryData.containsKey(sKey) ){ + + Float finalCount = finalSecondaryData.get(sKey); + finalCount += sCount; + finalSecondaryData.put(sKey, finalCount); + } + else{ + + finalSecondaryData.put(sKey, sCount); + } + + finalItem.setSecondaryData(finalSecondaryData); + } + + } + else{ + + // haven't encountered item in range before, just set to current single item + finalItem = new ResearchItem(); + finalItem.setPrimaryName(groupIndex); + finalItem.setPrimaryValue(newCount); + finalItem.setSecondaryData(currItem.getSecondaryData()); + + } + // add item to grouped data + groupedData.put(groupIndex, finalItem); + } + + SortedSet keys = new TreeSet<>(new GroupedCompare()); + keys.addAll(groupedData.keySet()); + for (String key : keys) { + + // Make sure all secondary keys are set for all items + ResearchItem currItem = groupedData.get(key); + Map secondaryData = currItem.getSecondaryData(); + for (String secondaryKey : secondaryKeyset.keySet()) { + + if( !secondaryData.containsKey(secondaryKey) ){ + + secondaryData.put(secondaryKey, 0.0f); + } + } + + graphData.add(currItem); + } + + } + else{ + + SortedSet keys = new TreeSet<>(primaryGraphTotals.keySet()); + for (Float key : keys) { + + // Make sure all secondary keys are set for all items + ResearchItem currItem = primaryGraphTotals.get(key); + Map secondaryData = currItem.getSecondaryData(); + for (String secondaryKey : secondaryKeyset.keySet()) { + + if( !secondaryData.containsKey(secondaryKey) ){ + + secondaryData.put(secondaryKey, 0.0f); + } + } + + graphData.add(currItem); + } + } + + + + // Sort primary Data + Collections.sort(sortedPrimary); + + // Get Median Value from sorted list + float average = total / sampleSize; + + if( sampleSize > 1 ) { + if (sampleSize % 2 == 0) { + + int i = (sampleSize / 2) - 1; + int j = i + 1; + + // get vals i and j + float val1 = sortedPrimary.get(i); + float val2 = sortedPrimary.get(j); + + + //Integer key1 = primaryKeyList.get(i); + //Integer key2 = primaryKeyList.get(j); + + //float val1 = primaryDataset.get(key1); + //float val2 = primaryDataset.get(key2); + + median = (val1 + val2) / 2; + } else { + + int i = (int) Math.floor(sampleSize / 2); + + //Integer key = primaryKeyList.get(i); + //median = primaryDataset.get(key); + + median = sortedPrimary.get(i); + + } + } + else{ + + median = sortedPrimary.get(0); + } + + // build graph model item + + graphModel.setAverage(average); + graphModel.setMedian(median); + graphModel.setRangeLow(rangeLow); + graphModel.setRangeHigh(rangeHigh); + graphModel.setGraphData(graphData); + graphModel.setPrimaryValuemap(primaryResult.getValueMap()); + graphModel.setSecondaryValuemap(secondaryResult.getValueMap()); + graphModel.setyAxisTitle(yAxisTitle); + graphModel.setxAxisTitle(xAxisTitle); + graphModel.setUnitOfMeasurement(unitOfMeasurement); + + return graphModel; + + } + + + + private ResearchResult getDatasetItems(String datasetName, ResearchFilterItem filters){ + + switch(datasetName){ + + // Single Value Vital Items + case "weight": + case "temperature": + case "heartRate": + case "respiratoryRate": + case "oxygenSaturation": + case "glucose": + case "bloodPressureSystolic": + case "bloodPressureDiastolic": + return getPatientVitals(datasetName, filters); + + // Special Case Vital Item + case "height": + return getPatientHeights(filters); + + // Patient Specific Items + case "age": + case "gender": + case "pregnancyStatus": + case "pregnancyTime": + return getPatientAttribute(datasetName, filters); + + // Medication Items + case "prescribedMeds": + return getPrescribedMedications(filters); + + case "dispensedMeds": + return getDispensedMedications(filters); + + default: + + return new ResearchResult(); + } + + } + + + /** + * {@inheritDoc} + */ + public ResearchResult getPatientVitals(String vitalName, ResearchFilterItem filters) { + + String startDateString = filters.getStartDate(); + String endDateString = filters.getEndDate(); + Integer medicationID = filters.getMedicationId(); + + ResearchResult resultObj = new ResearchResult(); + Map resultItems = new HashMap<>(); + + Date startDateObj; + Date endDateObj; + SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + + // Set Start Date to start of day + String startParseDate = startDateString + " 00:00:00"; + startDateObj = sqlFormat.parse(startParseDate); + + // Set End Date to end of day + String parseEndDate = endDateString + " 23:59:59"; + endDateObj = sqlFormat.parse(parseEndDate); + + } + catch(ParseException e){ + + startDateObj = new Date(); + endDateObj = new Date(); + } + + Query q = QueryProvider.getPatientEncounterVitalQuery(); + + if( medicationID > 0 ) { + + Query pQ = QueryProvider.getPatientPrescriptionQuery(); + + pQ.fetch("patientEncounter").where().eq("medication.id", medicationID); + List patientPrescriptions = prescriptionRepository.find(pQ); + + List scriptEncounterIds = new ArrayList<>(); + int i = 0; + for (IPatientPrescription script : patientPrescriptions) { + + scriptEncounterIds.add(script.getPatientEncounter().getId()); + } + + q.where().in("patientEncounterId", scriptEncounterIds); + } + + q.where() + .gt("dateTaken", sqlFormat.format(startDateObj)) + .lt("dateTaken", sqlFormat.format(endDateObj)) + .eq("vital.name", vitalName) + .orderBy("vital_value") + .findList(); + + List patientEncounterVitals = patientEncounterVitalRepository.find(q); + + + +/* + select t0.id c0, t0.user_id c1, t0.patient_encounter_id c2, t0.vital_value c3, t0.date_taken c4, + t1.id c5, t1.name c6, t1.data_type c7, t1.unit_of_measurement c8, t1.isDeleted c9 + from patient_encounter_vitals t0 + left outer join vitals as t1 on t1.id = t0.vital_id + left join patient_prescriptions as t2 on t2.encounter_id = t0.patient_encounter_id + where t0.date_taken > '2014-10-24 00:00:00' + and t0.date_taken < '2014-11-05 11:59:59' + and t1.name = 'temperature' + and t2.medication_id = 1 + order by vital_value + + select t0.id c0, t0.user_id c1, t0.patient_encounter_id c2, t0.vital_value c3, t0.date_taken c4 + from patient_encounter_vitals t0 + left outer join vitals t1 on t1.id = t0.vital_id + where t0.date_taken > ? + and t0.date_taken < ? + and t1.name = ? + order by vital_value +*/ + + + String unitOfMeasurement = ""; + for (IPatientEncounterVital eVital : patientEncounterVitals) { + + if( unitOfMeasurement.isEmpty() ) { + unitOfMeasurement = eVital.getVital().getUnitOfMeasurement(); + } + + Float vitalValue = eVital.getVitalValue(); + if( vitalValue >= filters.getRangeStart() && vitalValue <= filters.getRangeEnd() ) { + + resultItems.put( + eVital.getPatientEncounterId(), + vitalValue + ); + } + + } + + resultObj.setDataType(vitalName); + resultObj.setUnitOfMeasurement(unitOfMeasurement); + resultObj.setDataset(resultItems); + + return resultObj; + } + + /** + * {@inheritDoc} + */ + public ResearchResult getPatientAttribute(String attributeName, ResearchFilterItem filters) { + + String startDateString = filters.getStartDate(); + String endDateString = filters.getEndDate(); + Integer medicationID = filters.getMedicationId(); + + ResearchResult resultObj = new ResearchResult(); + Map resultItems = new HashMap<>(); + Map resultMap = new HashMap<>(); + + Date startDateObj; + Date endDateObj; + SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + + // Set Start Date to start of day + String startParseDate = startDateString + " 00:00:00"; + startDateObj = sqlFormat.parse(startParseDate); + + // Set End Date to end of day + String parseEndDate = endDateString + " 23:59:59"; + endDateObj = sqlFormat.parse(parseEndDate); + + } + catch(ParseException e){ + + startDateObj = new Date(); + endDateObj = new Date(); + } + + // Get patients that had an encounter between startDate and endDate + // using dateOfTriageVisit for now -- might want to also check dateOfMedicalVisit & dateOfPharmacyVisit + Query q = QueryProvider.getPatientEncounterQuery(); + + if( medicationID > 0 ) { + + Query pQ = QueryProvider.getPatientPrescriptionQuery(); + + pQ.fetch("patientEncounter").where().eq("medication.id", medicationID); + List patientPrescriptions = prescriptionRepository.find(pQ); + + List scriptEncounterIds = new ArrayList<>(); + int i = 0; + for (IPatientPrescription script : patientPrescriptions) { + + scriptEncounterIds.add(script.getPatientEncounter().getId()); + } + + q.where().in("id", scriptEncounterIds); + } + + q.fetch("patient") + .where() + .gt("dateOfTriageVisit", sqlFormat.format(startDateObj)) + .lt("dateOfTriageVisit", sqlFormat.format(endDateObj)) + .orderBy("id") + .findList(); + + List encounters = patientEncounterRepository.find(q); + + String unitOfMeasurement = ""; + switch (attributeName) { + + case "age": + + unitOfMeasurement = "years"; + for (IPatientEncounter encounter : encounters) { + IPatient patient = encounter.getPatient(); + + Float age = (float) Math.floor(dateUtils.getAgeFloat(patient.getAge())); + + if( age >= filters.getRangeStart() && age <= filters.getRangeEnd() ) { + + resultItems.put( + encounter.getId(), + age + ); + } + } + break; + + case "gender": + + resultMap.put(0.0f, "Male"); + resultMap.put(1.0f, "Female"); + resultMap.put(2.0f, "N/A"); + + for (IPatientEncounter encounter : encounters) { + IPatient patient = encounter.getPatient(); + + float gender = -1; + // Do case in-sensitve comparison to be safe + //1 = female + //0 = male + //2 = no sex + if (patient.getSex() == null){ + gender = 2; + }else if (patient.getSex().matches("(?i:Male)")) { + gender = 0; + } else if (patient.getSex().matches("(?i:Female)")) { + gender = 1; + } + resultItems.put( + encounter.getId(), + gender + ); + } + break; + + case "pregnancyStatus": + + for (IPatientEncounter encounter : encounters) { + + resultMap.put(0.0f, "No"); + resultMap.put(1.0f, "Yes"); + + Integer wksPregnant = encounter.getWeeksPregnant(); + if (wksPregnant == null) wksPregnant = 0; + float pregnancyStatus = 0; + if (wksPregnant > 0) { + pregnancyStatus = 1; + } + resultItems.put( + encounter.getId(), + pregnancyStatus + ); + } + break; + + case "pregnancyTime": + + unitOfMeasurement = "weeks"; + for (IPatientEncounter encounter : encounters) { + + Integer weeksPregnant = encounter.getWeeksPregnant(); + if (weeksPregnant == null) weeksPregnant = 0; + + if( weeksPregnant >= filters.getRangeStart() && weeksPregnant <= filters.getRangeEnd() ) { + + resultItems.put( + encounter.getId(), + (float) weeksPregnant + ); + } + } + break; + } + + + resultObj.setDataType(attributeName); + resultObj.setUnitOfMeasurement(unitOfMeasurement); + resultObj.setDataset(resultItems); + resultObj.setValueMap(resultMap); + + return resultObj; + } + + + public ResearchResult getPatientHeights(ResearchFilterItem filters){ + + String startDateString = filters.getStartDate(); + String endDateString = filters.getEndDate(); + Integer medicationID = filters.getMedicationId(); + + ResearchResult resultObj = new ResearchResult(); + Map buildItems = new HashMap<>(); + + Date startDateObj; + Date endDateObj; + SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + + // Set Start Date to start of day + String startParseDate = startDateString + " 00:00:00"; + startDateObj = sqlFormat.parse(startParseDate); + + // Set End Date to end of day + String parseEndDate = endDateString + " 23:59:59"; + endDateObj = sqlFormat.parse(parseEndDate); + + } + catch(ParseException e){ + + startDateObj = new Date(); + endDateObj = new Date(); + } + + + Query q = QueryProvider.getPatientEncounterVitalQuery(); + + List scriptEncounterIds = new ArrayList<>(); + if( medicationID > 0 ) { + + Query pQ = QueryProvider.getPatientPrescriptionQuery(); + + pQ.fetch("patientEncounter").where().eq("medication.id", medicationID); + List patientPrescriptions = prescriptionRepository.find(pQ); + + int i = 0; + for (IPatientPrescription script : patientPrescriptions) { + + scriptEncounterIds.add(script.getPatientEncounter().getId()); + } + + q.where().in("patientEncounterId", scriptEncounterIds); + } + + q.fetch("vital") + .where() + .gt("dateTaken", sqlFormat.format(startDateObj)) + .lt("dateTaken", sqlFormat.format(endDateObj)) + .eq("vital.name", "heightFeet") + .orderBy("patient_encounter_id") + .findList(); + List patientFeet = patientEncounterVitalRepository.find(q); + + q = QueryProvider.getPatientEncounterVitalQuery(); + + if( medicationID > 0 && scriptEncounterIds.size() > 0 ) { + + q.where().in("patientEncounterId", scriptEncounterIds); + } + q.fetch("vital") + .where() + .gt("dateTaken", sqlFormat.format(startDateObj)) + .lt("dateTaken", sqlFormat.format(endDateObj)) + .eq("vital.name", "heightInches") + .orderBy("patient_encounter_id") + .findList(); + List patientInches = patientEncounterVitalRepository.find(q); + + //Map researchItems = new HashMap<>(); + // Convert feet to inches + String unitOfMeasurement = "feet/inches"; + for (IPatientEncounterVital eVital : patientFeet) { + + float heightInches = 12 * eVital.getVitalValue(); + buildItems.put( + eVital.getPatientEncounterId(), + heightInches + ); + + } + + for(IPatientEncounterVital eVital : patientInches){ + + if( buildItems.containsKey(eVital.getPatientEncounterId()) ){ + + float heightInches = buildItems.get(eVital.getPatientEncounterId()); + heightInches = heightInches + eVital.getVitalValue(); + buildItems.put(eVital.getPatientEncounterId(), heightInches); + } + } + + Map resultItems = new HashMap<>(); + for( Integer key : buildItems.keySet() ){ + + Float value = buildItems.get(key); + if( value >= filters.getRangeStart() && value <= filters.getRangeEnd() ){ + + resultItems.put(key, value); + } + + } + + resultObj.setDataType("height"); + resultObj.setUnitOfMeasurement(unitOfMeasurement); + resultObj.setDataset(resultItems); + + return resultObj; + + } + + + + + public ResearchResult getPrescribedMedications(ResearchFilterItem filters){ + + String startDateString = filters.getStartDate(); + String endDateString = filters.getEndDate(); + + ResearchResult resultObj = new ResearchResult(); + Map resultItems = new HashMap<>(); + Map resultMap = new HashMap<>(); + + Date startDateObj; + Date endDateObj; + SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + + // Set Start Date to start of day + String startParseDate = startDateString + " 00:00:00"; + startDateObj = sqlFormat.parse(startParseDate); + + // Set End Date to end of day + String parseEndDate = endDateString + " 23:59:59"; + endDateObj = sqlFormat.parse(parseEndDate); + + } + catch(ParseException e){ + + startDateObj = new Date(); + endDateObj = new Date(); + } + + + Query q = QueryProvider.getPatientPrescriptionQuery(); + q.fetch("medication") + .where() + .gt("dateTaken", sqlFormat.format(startDateObj)) + .lt("dateTaken", sqlFormat.format(endDateObj)) + .findList(); + + List patientMedication = prescriptionRepository.find(q); + + String unitOfMeasurement = ""; + for (IPatientPrescription prescription : patientMedication) { + + Integer key = prescription.getMedication().getId(); + + // Build prescription name map + if( !resultMap.containsKey((float)key) ){ + + resultMap.put((float)key, prescription.getMedication().getName()); + } + + Float count = 1.0f; + if( resultItems.containsKey(key) ){ + + count = resultItems.get(key) + 1.0f; + } + resultItems.put( + key, + count + ); + + } + + resultObj.setDataType("prescribedMeds"); + resultObj.setUnitOfMeasurement(unitOfMeasurement); + resultObj.setDataset(resultItems); + resultObj.setValueMap(resultMap); + + return resultObj; + } + + + // @TODO - need to make this work correctly + // want Medication Name (xAxis) vs Total Dispensed (yAxis) + // Need to tweak some things, this is different than # of patients + public ResearchResult getDispensedMedications(ResearchFilterItem filters){ + + String startDateString = filters.getStartDate(); + String endDateString = filters.getEndDate(); + + ResearchResult resultObj = new ResearchResult(); + Map resultItems = new HashMap<>(); + Map resultMap = new HashMap<>(); + + Date startDateObj; + Date endDateObj; + SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + + // Set Start Date to start of day + String startParseDate = startDateString + " 00:00:00"; + startDateObj = sqlFormat.parse(startParseDate); + + // Set End Date to end of day + String parseEndDate = endDateString + " 23:59:59"; + endDateObj = sqlFormat.parse(parseEndDate); + + } + catch(ParseException e){ + + startDateObj = new Date(); + endDateObj = new Date(); + } + + Query q = QueryProvider.getPatientPrescriptionQuery(); + q.fetch("medication") + .where() + .gt("dateTaken", sqlFormat.format(startDateObj)) + .lt("dateTaken", sqlFormat.format(endDateObj)) + .findList(); + + List patientMedication = prescriptionRepository.find(q); + + String unitOfMeasurement = ""; + for (IPatientPrescription prescription : patientMedication) { + + Integer key = prescription.getMedication().getId(); + + // Build prescription name map + if( !resultMap.containsKey((float)key) ){ + + resultMap.put((float)key, prescription.getMedication().getName()); + } + + Float count = (float)prescription.getAmount(); + if( resultItems.containsKey(key) ){ + + count = resultItems.get(key) + count; + } + resultItems.put( + key, + count + ); + + } + + resultObj.setDataType("dispensedMeds"); + resultObj.setUnitOfMeasurement(unitOfMeasurement); + resultObj.setDataset(resultItems); + resultObj.setValueMap(resultMap); + + return resultObj; + + } + +} + + + +// Sorts Strings in format "float - float" by using the first float of the string +class GroupedCompare implements Comparator{ + + @Override + public int compare(String s1, String s2){ + + String[] s1Matches = s1.split("-"); + String s1First; + Float s1Val = 0.0f; + if( s1Matches.length > 1 ) { + s1First = s1Matches[0]; + } + else{ + s1First = s1; + } + s1Val = Float.parseFloat(s1First); + + String[] s2Matches = s2.split("-"); + String s2First; + Float s2Val = 0.0f; + if( s2Matches.length > 1 ) { + s2First = s2Matches[0]; + } + else{ + s2First = s2; + } + s2Val = Float.parseFloat(s2First); + + if( s1Val < s2Val ){ + + return -1; + } + else if( s1Val > s2Val ){ + + return 1; + } + return 0; + } +} diff --git a/app/femr/business/services/RoleService.java b/app/femr/business/services/system/RoleService.java similarity index 92% rename from app/femr/business/services/RoleService.java rename to app/femr/business/services/system/RoleService.java index ef952c665..2f358654f 100644 --- a/app/femr/business/services/RoleService.java +++ b/app/femr/business/services/system/RoleService.java @@ -16,15 +16,16 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.ExpressionList; import com.google.inject.Inject; import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; -import femr.data.models.IRole; +import femr.business.services.core.IRoleService; +import femr.common.dtos.ServiceResponse; +import femr.data.models.core.IRole; import femr.data.daos.IRepository; -import femr.data.models.Role; +import femr.data.models.mysql.Role; import java.util.ArrayList; import java.util.List; diff --git a/app/femr/business/services/SearchService.java b/app/femr/business/services/system/SearchService.java similarity index 89% rename from app/femr/business/services/SearchService.java rename to app/femr/business/services/system/SearchService.java index 6ae0f03c9..88485ab6c 100644 --- a/app/femr/business/services/SearchService.java +++ b/app/femr/business/services/system/SearchService.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.Expr; import com.avaje.ebean.ExpressionList; @@ -25,10 +25,12 @@ import femr.business.helpers.DomainMapper; import femr.business.helpers.QueryHelper; import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.ISearchService; +import femr.common.dtos.ServiceResponse; import femr.common.models.*; import femr.data.daos.IRepository; -import femr.data.models.*; +import femr.data.models.core.*; +import femr.data.models.mysql.*; import femr.util.DataStructure.Mapping.TabFieldMultiMap; import femr.util.DataStructure.Mapping.VitalMultiMap; import femr.util.stringhelpers.StringUtils; @@ -36,6 +38,8 @@ import java.util.*; public class SearchService implements ISearchService { + + private final IRepository diagnosisRepository; private final IRepository medicationRepository; private final IRepository patientRepository; private final IRepository patientEncounterRepository; @@ -48,7 +52,8 @@ public class SearchService implements ISearchService { private final DomainMapper domainMapper; @Inject - public SearchService(IRepository medicationRepository, + public SearchService(IRepository diagnosisRepository, + IRepository medicationRepository, IRepository patientRepository, IRepository patientEncounterRepository, IRepository patientEncounterTabFieldRepository, @@ -59,6 +64,7 @@ public SearchService(IRepository medicationRepository, IRepository tabFieldRepository, DomainMapper domainMapper) { + this.diagnosisRepository = diagnosisRepository; this.medicationRepository = medicationRepository; this.patientRepository = patientRepository; this.patientEncounterRepository = patientEncounterRepository; @@ -243,6 +249,8 @@ public ServiceResponse> findUnreplacedPrescriptionItems(i PrescriptionItem prescriptionItem = new PrescriptionItem(); prescriptionItem.setName(pp.getMedication().getName()); prescriptionItem.setId(pp.getId()); + prescriptionItem.setPrescriberFirstName(pp.getPhysician().getFirstName()); + prescriptionItem.setPrescriberLastName(pp.getPhysician().getLastName()); prescriptionItems.add(prescriptionItem); } @@ -520,5 +528,64 @@ public ServiceResponse> getCustomFieldList() { return response; } + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findPatientsForSearch() { + ServiceResponse> response = new ServiceResponse<>(); + + try { + List allPatients = patientRepository.findAll(Patient.class); + List patientItems = new ArrayList<>(); + for (IPatient allPatient : allPatients) { + + PatientItem currPatient = DomainMapper.createPatientItem(allPatient, null, null, null, null); + + if (allPatient.getPhoto() != null) { + currPatient.setPathToPhoto("/photo/patient/" + currPatient.getId() + "?showDefault=false"); + } else { + // If no photo for patient, show default + currPatient.setPathToPhoto("/photo/patient/" + currPatient.getId() + "?showDefault=true"); + } + + patientItems.add(currPatient); + + } + + + response.setResponseObject(patientItems); + + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findDiagnosisForSearch() { + + ServiceResponse> response = new ServiceResponse<>(); + try { + + List allDiagnoses = diagnosisRepository.findAll(Diagnosis.class); + List diagnoses = new ArrayList<>(); + + for (IDiagnosis d : allDiagnoses){ + if (StringUtils.isNotNullOrWhiteSpace(d.getName())) + diagnoses.add(d.getName()); + } + + response.setResponseObject(diagnoses); + + } catch (Exception ex) { + response.addError("", ex.getMessage()); + } + + return response; + } } diff --git a/app/femr/business/services/SessionService.java b/app/femr/business/services/system/SessionService.java similarity index 92% rename from app/femr/business/services/SessionService.java rename to app/femr/business/services/system/SessionService.java index f9c946d17..bd40a74d4 100644 --- a/app/femr/business/services/SessionService.java +++ b/app/femr/business/services/system/SessionService.java @@ -16,13 +16,15 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.ISessionService; +import femr.business.services.core.IUserService; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; import femr.business.wrappers.sessions.ISessionHelper; -import femr.data.models.IUser; +import femr.data.models.core.IUser; import femr.data.daos.IRepository; import femr.util.encryptions.IPasswordEncryptor; diff --git a/app/femr/business/services/UserService.java b/app/femr/business/services/system/UserService.java similarity index 96% rename from app/femr/business/services/UserService.java rename to app/femr/business/services/system/UserService.java index e6f2d7b3b..c07583428 100644 --- a/app/femr/business/services/UserService.java +++ b/app/femr/business/services/system/UserService.java @@ -16,19 +16,20 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; +package femr.business.services.system; import com.avaje.ebean.ExpressionList; import com.google.inject.Inject; import femr.business.helpers.DomainMapper; import femr.business.helpers.QueryProvider; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.IUserService; +import femr.common.dtos.ServiceResponse; import femr.common.models.UserItem; -import femr.data.models.IRole; -import femr.data.models.IUser; +import femr.data.models.core.IRole; +import femr.data.models.core.IUser; import femr.data.daos.IRepository; -import femr.data.models.Role; -import femr.data.models.User; +import femr.data.models.mysql.Role; +import femr.data.models.mysql.User; import femr.util.encryptions.IPasswordEncryptor; import femr.util.stringhelpers.StringUtils; diff --git a/app/femr/business/services/system/VitalService.java b/app/femr/business/services/system/VitalService.java new file mode 100644 index 000000000..46fda14c1 --- /dev/null +++ b/app/femr/business/services/system/VitalService.java @@ -0,0 +1,157 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.business.services.system; + +import com.avaje.ebean.ExpressionList; +import com.google.inject.Inject; +import femr.business.helpers.DomainMapper; +import femr.business.helpers.QueryProvider; +import femr.business.services.core.IVitalService; +import femr.common.dtos.ServiceResponse; +import femr.common.models.VitalItem; +import femr.data.daos.IRepository; +import femr.data.models.core.IPatientEncounterVital; +import femr.data.models.core.IVital; +import femr.data.models.mysql.Vital; +import femr.util.calculations.dateUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +public class VitalService implements IVitalService { + + private final IRepository patientEncounterVitalRepository; + private final IRepository vitalRepository; + private final DomainMapper domainMapper; + + @Inject + public VitalService(IRepository patientEncounterVitalRepository, + IRepository vitalRepository, + DomainMapper domainMapper){ + + this.patientEncounterVitalRepository = patientEncounterVitalRepository; + this.vitalRepository = vitalRepository; + this.domainMapper = domainMapper; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> createPatientEncounterVitals(Map patientEncounterVitalMap, int userId, int encounterId) { + ServiceResponse> response = new ServiceResponse<>(); + if (patientEncounterVitalMap == null || userId < 1 || encounterId < 1) { + response.addError("", "invalid parameters"); + return response; + } + List patientEncounterVitals = new ArrayList<>(); + IPatientEncounterVital patientEncounterVital; + IVital vital; + + ExpressionList query; + String currentTime = dateUtils.getCurrentDateTimeString(); + + for (String key : patientEncounterVitalMap.keySet()) { + if (patientEncounterVitalMap.get(key) != null) { + + query = QueryProvider.getVitalQuery().where().eq("name", key); + vital = vitalRepository.findOne(query); + patientEncounterVitals.add(domainMapper.createPatientEncounterVital(encounterId, userId, currentTime, vital, patientEncounterVitalMap.get(key))); + } + } + + try { + List vitalItems = new ArrayList<>(); + List newPatientEncounterVitals = patientEncounterVitalRepository.createAll(patientEncounterVitals); + for (IPatientEncounterVital pev : newPatientEncounterVitals) { + vitalItems.add(DomainMapper.createVitalItem(pev)); + } + response.setResponseObject(vitalItems); + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> findAllVitalItems() { + ServiceResponse> response = new ServiceResponse<>(); + + try { + List vitals = vitalRepository.findAll(Vital.class); + List vitalItems = new ArrayList<>(); + for (IVital v : vitals) { + vitalItems.add(DomainMapper.createVitalItem(v)); + } + response.setResponseObject(vitalItems); + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } + + /** + * {@inheritDoc} + */ + @Override + public ServiceResponse> createPatientEncounterVitalItems(Map patientEncounterVitalMap, int userId, int encounterId) { + ServiceResponse> response = new ServiceResponse<>(); + if (patientEncounterVitalMap == null || userId < 1 || encounterId < 1) { + response.addError("", "bad parameters"); + return response; + } + + List patientEncounterVitals = new ArrayList<>(); + IPatientEncounterVital patientEncounterVital; + IVital vital; + + ExpressionList query; + String currentTime = dateUtils.getCurrentDateTimeString(); + + try { + + + for (String key : patientEncounterVitalMap.keySet()) { + if (patientEncounterVitalMap.get(key) != null) { + + query = QueryProvider.getVitalQuery().where().eq("name", key); + vital = vitalRepository.findOne(query); + patientEncounterVitals.add(domainMapper.createPatientEncounterVital(encounterId, userId, currentTime, vital, patientEncounterVitalMap.get(key))); + } + } + + List newPatientEncounterVitals = patientEncounterVitalRepository.createAll(patientEncounterVitals); + List vitalItems = new ArrayList<>(); + for (IPatientEncounterVital pev : patientEncounterVitals) { + vitalItems.add(DomainMapper.createVitalItem(pev)); + } + + response.setResponseObject(vitalItems); + } catch (Exception ex) { + response.addError("exception", ex.getMessage()); + } + + return response; + } +} diff --git a/app/femr/common/dto/CurrentUser.java b/app/femr/common/dtos/CurrentUser.java similarity index 96% rename from app/femr/common/dto/CurrentUser.java rename to app/femr/common/dtos/CurrentUser.java index 265d3b697..cea42bb3e 100644 --- a/app/femr/common/dto/CurrentUser.java +++ b/app/femr/common/dtos/CurrentUser.java @@ -16,9 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.common.dto; +package femr.common.dtos; -import femr.data.models.IRole; +import femr.data.models.core.IRole; import java.util.List; diff --git a/app/femr/common/dto/ServiceResponse.java b/app/femr/common/dtos/ServiceResponse.java similarity index 98% rename from app/femr/common/dto/ServiceResponse.java rename to app/femr/common/dtos/ServiceResponse.java index 3fa5ce6f3..925b8d472 100644 --- a/app/femr/common/dto/ServiceResponse.java +++ b/app/femr/common/dtos/ServiceResponse.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.common.dto; +package femr.common.dtos; import java.util.HashMap; import java.util.Map; diff --git a/app/femr/common/models/CityItem.java b/app/femr/common/models/CityItem.java new file mode 100644 index 000000000..1da6232b3 --- /dev/null +++ b/app/femr/common/models/CityItem.java @@ -0,0 +1,41 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.common.models; + +public class CityItem { + + private String cityName; + private String countryName; + + public String getCityName() { + return cityName; + } + + public void setCityName(String cityName) { + this.cityName = cityName; + } + + public String getCountryName() { + return countryName; + } + + public void setCountryName(String countryName) { + this.countryName = countryName; + } +} diff --git a/app/femr/common/models/MissionItem.java b/app/femr/common/models/MissionItem.java new file mode 100644 index 000000000..a0e97c0f0 --- /dev/null +++ b/app/femr/common/models/MissionItem.java @@ -0,0 +1,143 @@ +package femr.common.models; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class MissionItem { + + private String teamName; + private String teamLocation; + private String teamDescription; + private List missionTrips; + + public MissionItem() { + this.missionTrips = new ArrayList<>(); + } + + public void addMissionTrip(int id, + String tripCity, + String tripCountry, + Date tripStartDate, + String friendlyTripStartDate, + Date tripEndDate, + String friendlyTripEndDate, + boolean isCurrent) { + + MissionTripItem missionTripItem = new MissionTripItem(); + missionTripItem.setId(id); + missionTripItem.setTripCity(tripCity); + missionTripItem.setTripCountry(tripCountry); + missionTripItem.setTripStartDate(tripStartDate); + missionTripItem.setFriendlyTripStartDate(friendlyTripStartDate); + missionTripItem.setTripEndDate(tripEndDate); + missionTripItem.setFriendlyTripEndDate(friendlyTripEndDate); + missionTripItem.setCurrent(isCurrent); + this.missionTrips.add(missionTripItem); + } + + public List getMissionTrips() { + return missionTrips; + } + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public String getTeamLocation() { + return teamLocation; + } + + public void setTeamLocation(String teamLocation) { + this.teamLocation = teamLocation; + } + + public String getTeamDescription() { + return teamDescription; + } + + public void setTeamDescription(String teamDescription) { + this.teamDescription = teamDescription; + } + + + public class MissionTripItem { + private int id; + private String tripCity; + private String tripCountry; + private Date tripStartDate; + private String friendlyTripStartDate; + private Date tripEndDate; + private String friendlyTripEndDate; + private boolean isCurrent; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getTripCity() { + return tripCity; + } + + public void setTripCity(String tripCity) { + this.tripCity = tripCity; + } + + public String getTripCountry() { + return tripCountry; + } + + public void setTripCountry(String tripCountry) { + this.tripCountry = tripCountry; + } + + public Date getTripStartDate() { + return tripStartDate; + } + + public void setTripStartDate(Date tripStartDate) { + this.tripStartDate = tripStartDate; + } + + public String getFriendlyTripStartDate() { + return friendlyTripStartDate; + } + + public void setFriendlyTripStartDate(String friendlyTripStartDate) { + this.friendlyTripStartDate = friendlyTripStartDate; + } + + public Date getTripEndDate() { + return tripEndDate; + } + + public void setTripEndDate(Date tripEndDate) { + this.tripEndDate = tripEndDate; + } + + public String getFriendlyTripEndDate() { + return friendlyTripEndDate; + } + + public void setFriendlyTripEndDate(String friendlyTripEndDate) { + this.friendlyTripEndDate = friendlyTripEndDate; + } + + public boolean isCurrent() { + return isCurrent; + } + + public void setCurrent(boolean isCurrent) { + this.isCurrent = isCurrent; + } + } + +} diff --git a/app/femr/common/models/PrescriptionItem.java b/app/femr/common/models/PrescriptionItem.java index 4804a6f46..3cfc8897e 100644 --- a/app/femr/common/models/PrescriptionItem.java +++ b/app/femr/common/models/PrescriptionItem.java @@ -22,7 +22,8 @@ public class PrescriptionItem { private int id; private String name; private Integer replacementId; - + private String prescriberFirstName; + private String prescriberLastName; public PrescriptionItem(String name){ this.name = name; @@ -55,4 +56,20 @@ public Integer getReplacementId() { public void setReplacementId(Integer replacementId) { this.replacementId = replacementId; } + + public String getPrescriberFirstName() { + return prescriberFirstName; + } + + public void setPrescriberFirstName(String prescriberFirstName) { + this.prescriberFirstName = prescriberFirstName; + } + + public String getPrescriberLastName() { + return prescriberLastName; + } + + public void setPrescriberLastName(String prescriberLastName) { + this.prescriberLastName = prescriberLastName; + } } diff --git a/app/femr/common/models/ResearchFilterItem.java b/app/femr/common/models/ResearchFilterItem.java new file mode 100644 index 000000000..1eeb9c8b2 --- /dev/null +++ b/app/femr/common/models/ResearchFilterItem.java @@ -0,0 +1,96 @@ +package femr.common.models; + + +public class ResearchFilterItem { + + private String primaryDataset; + private String secondaryDataset; + private String graphType; + private String startDate; + private String endDate; + private boolean groupPrimary; + private Integer groupFactor; + private Float rangeStart; + private Float rangeEnd; + private Integer medicationId; + + public String getPrimaryDataset() { + return primaryDataset; + } + + public void setPrimaryDataset(String primaryDataset) { + this.primaryDataset = primaryDataset; + } + + public String getSecondaryDataset() { + return secondaryDataset; + } + + public void setSecondaryDataset(String secondaryDataset) { + this.secondaryDataset = secondaryDataset; + } + + public String getGraphType() { + return graphType; + } + + public void setGraphType(String graphType) { + this.graphType = graphType; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public boolean isGroupPrimary() { return groupPrimary; } + + public void setGroupPrimary(boolean groupPrimary) { this.groupPrimary = groupPrimary; } + + public Integer getGroupFactor() { return groupFactor; } + + public void setGroupFactor(Integer groupFactor) { this.groupFactor = groupFactor; } + + public Float getRangeStart() { return rangeStart; } + + public void setRangeStart(Float rangeStart) { + + if (rangeStart == null) { + + this.rangeStart = Float.MIN_VALUE; + + } else { + + this.rangeStart = rangeStart; + } + } + + public Float getRangeEnd() { return rangeEnd; } + + public void setRangeEnd(Float rangeEnd) { + + if (rangeEnd == null) { + + this.rangeEnd = Float.MAX_VALUE; + + } else { + + this.rangeEnd = rangeEnd; + } + } + + public Integer getMedicationId() { return medicationId; } + + public void setMedicationId(Integer medicationId) { this.medicationId = medicationId; } +} diff --git a/app/femr/common/models/ResearchItem.java b/app/femr/common/models/ResearchItem.java new file mode 100644 index 000000000..4874504ea --- /dev/null +++ b/app/femr/common/models/ResearchItem.java @@ -0,0 +1,78 @@ +package femr.common.models; + +import java.util.HashMap; +import java.util.Map; + +/* + 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 . If + you have any questions, contact . +*/ +public class ResearchItem { + + + private String primaryName; + private float primaryValue; + private Map secondaryData; + + public ResearchItem(){ + + primaryName = ""; + primaryValue = 0.0f; + secondaryData = new HashMap<>(); + } + + public ResearchItem(String name){ + + primaryName = name; + primaryValue = 0.0f; + secondaryData = new HashMap<>(); + } + + public String getPrimaryName() { + return primaryName; + } + + + public void setPrimaryName(String primaryName) { + this.primaryName = primaryName; + } + + public float getPrimaryValue() { + return primaryValue; + } + + public void setPrimaryValue(float primaryValue) { + this.primaryValue = primaryValue; + } + + + public Map getSecondaryData() { + + if( secondaryData != null ) { + return secondaryData; + } + else{ + return new HashMap(); + } + } + + public void setSecondaryData(Map secondaryData) { + this.secondaryData = secondaryData; + } + +} + diff --git a/app/femr/common/models/ResearchResult.java b/app/femr/common/models/ResearchResult.java new file mode 100644 index 000000000..ccb076c60 --- /dev/null +++ b/app/femr/common/models/ResearchResult.java @@ -0,0 +1,52 @@ +package femr.common.models; + + +import java.util.HashMap; +import java.util.Map; + +public class ResearchResult { + + private String dataType; + private String unitOfMeasurement; + private Map dataset; + + // Used for non-number items - map float to String + private Map valueMap; + + public String getDataType() { + return dataType; + } + + public void setDataType(String dataType) { + this.dataType = dataType; + } + + public String getUnitOfMeasurement() { + return unitOfMeasurement; + } + + public void setUnitOfMeasurement(String unitOfMeasurement) { + this.unitOfMeasurement = unitOfMeasurement; + } + + public Map getDataset() { + + if( dataset == null ){ + + return new HashMap(); + } + return dataset; + } + + public void setDataset(Map dataset) { + this.dataset = dataset; + } + + public Map getValueMap() { + return valueMap; + } + + public void setValueMap(Map valueMap) { + this.valueMap = valueMap; + } +} diff --git a/app/femr/common/models/TeamItem.java b/app/femr/common/models/TeamItem.java new file mode 100644 index 000000000..3e85e9cfb --- /dev/null +++ b/app/femr/common/models/TeamItem.java @@ -0,0 +1,31 @@ +package femr.common.models; + +public class TeamItem { + private String name; + private String description; + private String location; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } +} diff --git a/app/femr/common/models/TripItem.java b/app/femr/common/models/TripItem.java new file mode 100644 index 000000000..3d592b21f --- /dev/null +++ b/app/femr/common/models/TripItem.java @@ -0,0 +1,51 @@ +package femr.common.models; + +import java.util.Date; + +public class TripItem { + private String teamName; + private String tripCity; + private String tripCountry; + private Date tripStartDate; + private Date tripEndDate; + + public String getTeamName() { + return teamName; + } + + public void setTeamName(String teamName) { + this.teamName = teamName; + } + + public String getTripCity() { + return tripCity; + } + + public void setTripCity(String tripCity) { + this.tripCity = tripCity; + } + + public String getTripCountry() { + return tripCountry; + } + + public void setTripCountry(String tripCountry) { + this.tripCountry = tripCountry; + } + + public Date getTripStartDate() { + return tripStartDate; + } + + public void setTripStartDate(Date tripStartDate) { + this.tripStartDate = tripStartDate; + } + + public Date getTripEndDate() { + return tripEndDate; + } + + public void setTripEndDate(Date tripEndDate) { + this.tripEndDate = tripEndDate; + } +} diff --git a/app/femr/data/models/IChiefComplaint.java b/app/femr/data/models/core/IChiefComplaint.java similarity index 97% rename from app/femr/data/models/IChiefComplaint.java rename to app/femr/data/models/core/IChiefComplaint.java index 8015ba092..2e9683fa2 100644 --- a/app/femr/data/models/IChiefComplaint.java +++ b/app/femr/data/models/core/IChiefComplaint.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * Tracks chief complaints. Important when trying to diff --git a/app/femr/data/models/core/IDiagnosis.java b/app/femr/data/models/core/IDiagnosis.java new file mode 100644 index 000000000..1c1fe6286 --- /dev/null +++ b/app/femr/data/models/core/IDiagnosis.java @@ -0,0 +1,31 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.core; + +public interface IDiagnosis { + + + int getId(); + + void setId(int id); + + String getName(); + + void setName(String name); +} diff --git a/app/femr/data/models/IMedication.java b/app/femr/data/models/core/IMedication.java similarity index 98% rename from app/femr/data/models/IMedication.java rename to app/femr/data/models/core/IMedication.java index 98e0d2c2b..e0dab6df8 100644 --- a/app/femr/data/models/IMedication.java +++ b/app/femr/data/models/core/IMedication.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; import java.util.List; diff --git a/app/femr/data/models/IMedicationActiveDrug.java b/app/femr/data/models/core/IMedicationActiveDrug.java similarity index 97% rename from app/femr/data/models/IMedicationActiveDrug.java rename to app/femr/data/models/core/IMedicationActiveDrug.java index 05147f6c0..29751f96d 100644 --- a/app/femr/data/models/IMedicationActiveDrug.java +++ b/app/femr/data/models/core/IMedicationActiveDrug.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * MedicationActiveDrug represents the active ingredient inside a medication, diff --git a/app/femr/data/models/IMedicationActiveDrugName.java b/app/femr/data/models/core/IMedicationActiveDrugName.java similarity index 97% rename from app/femr/data/models/IMedicationActiveDrugName.java rename to app/femr/data/models/core/IMedicationActiveDrugName.java index b7d000c16..bd425a0b4 100644 --- a/app/femr/data/models/IMedicationActiveDrugName.java +++ b/app/femr/data/models/core/IMedicationActiveDrugName.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * MedicationActiveDrugName is the name of the active drug inside diff --git a/app/femr/data/models/IMedicationAdministration.java b/app/femr/data/models/core/IMedicationAdministration.java similarity index 97% rename from app/femr/data/models/IMedicationAdministration.java rename to app/femr/data/models/core/IMedicationAdministration.java index d8159a2a6..6b5518888 100644 --- a/app/femr/data/models/IMedicationAdministration.java +++ b/app/femr/data/models/core/IMedicationAdministration.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * MedicationAdministration represents the manner in which a medication diff --git a/app/femr/data/models/IMedicationForm.java b/app/femr/data/models/core/IMedicationForm.java similarity index 97% rename from app/femr/data/models/IMedicationForm.java rename to app/femr/data/models/core/IMedicationForm.java index 306daa97c..1409e4532 100644 --- a/app/femr/data/models/IMedicationForm.java +++ b/app/femr/data/models/core/IMedicationForm.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * MedicationForm represents the form of the medication diff --git a/app/femr/data/models/IMedicationMeasurementUnit.java b/app/femr/data/models/core/IMedicationMeasurementUnit.java similarity index 97% rename from app/femr/data/models/IMedicationMeasurementUnit.java rename to app/femr/data/models/core/IMedicationMeasurementUnit.java index aa164100f..1fd80a706 100644 --- a/app/femr/data/models/IMedicationMeasurementUnit.java +++ b/app/femr/data/models/core/IMedicationMeasurementUnit.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * MedicationMeasurementUnit represents the unit of diff --git a/app/femr/data/models/core/IMissionCity.java b/app/femr/data/models/core/IMissionCity.java new file mode 100644 index 000000000..6aedb8664 --- /dev/null +++ b/app/femr/data/models/core/IMissionCity.java @@ -0,0 +1,31 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.core; + +public interface IMissionCity { + int getId(); + + String getName(); + + void setName(String name); + + IMissionCountry getMissionCountry(); + + void setMissionCountry(IMissionCountry missionCountry); +} diff --git a/app/femr/business/services/IResearchService.java b/app/femr/data/models/core/IMissionCountry.java similarity index 85% rename from app/femr/business/services/IResearchService.java rename to app/femr/data/models/core/IMissionCountry.java index 9c96346bd..0b8aa0968 100644 --- a/app/femr/business/services/IResearchService.java +++ b/app/femr/data/models/core/IMissionCountry.java @@ -16,17 +16,12 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.business.services; - - -/** - * Interface for the Research Service - */ -public interface IResearchService { - - - +package femr.data.models.core; +public interface IMissionCountry { + int getId(); + String getName(); + void setName(String name); } diff --git a/app/femr/data/models/core/IMissionTeam.java b/app/femr/data/models/core/IMissionTeam.java new file mode 100644 index 000000000..db8dc1371 --- /dev/null +++ b/app/femr/data/models/core/IMissionTeam.java @@ -0,0 +1,43 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.core; + +import femr.data.models.mysql.MissionTrip; + +import java.util.List; + +public interface IMissionTeam { + int getId(); + + String getName(); + + void setName(String name); + + String getLocation(); + + void setLocation(String location); + + String getDescription(); + + void setDescription(String description); + + List getMissionTrips(); + + void setMissionTrips(List missionTrips); +} diff --git a/app/femr/data/models/core/IMissionTrip.java b/app/femr/data/models/core/IMissionTrip.java new file mode 100644 index 000000000..c3ed874c9 --- /dev/null +++ b/app/femr/data/models/core/IMissionTrip.java @@ -0,0 +1,45 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.core; + +import java.util.Date; + +public interface IMissionTrip { + int getId(); + + IMissionTeam getMissionTeam(); + + void setMissionTeam(IMissionTeam missionTeam); + + IMissionCity getMissionCity(); + + void setMissionCity(IMissionCity missionCity); + + boolean isCurrent(); + + void setCurrent(boolean isCurrent); + + Date getStartDate(); + + void setStartDate(Date startDate); + + Date getEndDate(); + + void setEndDate(Date endDate); +} diff --git a/app/femr/data/models/IPatient.java b/app/femr/data/models/core/IPatient.java similarity index 97% rename from app/femr/data/models/IPatient.java rename to app/femr/data/models/core/IPatient.java index c1c7dd934..57dce9f24 100644 --- a/app/femr/data/models/IPatient.java +++ b/app/femr/data/models/core/IPatient.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; import java.util.Date; diff --git a/app/femr/data/models/IPatientAgeClassification.java b/app/femr/data/models/core/IPatientAgeClassification.java similarity index 97% rename from app/femr/data/models/IPatientAgeClassification.java rename to app/femr/data/models/core/IPatientAgeClassification.java index 769d0e8d3..335b4ec64 100644 --- a/app/femr/data/models/IPatientAgeClassification.java +++ b/app/femr/data/models/core/IPatientAgeClassification.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * Represents one of the ways of guessing a patients "length of living". diff --git a/app/femr/data/models/IPatientEncounter.java b/app/femr/data/models/core/IPatientEncounter.java similarity index 93% rename from app/femr/data/models/IPatientEncounter.java rename to app/femr/data/models/core/IPatientEncounter.java index 93a44fc82..fc0a5a36e 100644 --- a/app/femr/data/models/IPatientEncounter.java +++ b/app/femr/data/models/core/IPatientEncounter.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; import org.joda.time.DateTime; import java.util.List; @@ -63,4 +63,8 @@ public interface IPatientEncounter { IPatientAgeClassification getPatientAgeClassification(); void setPatientAgeClassification(IPatientAgeClassification patientAgeClassification); + + IMissionTrip getMissionTrip(); + + void setMissionTrip(IMissionTrip missionTrip); } diff --git a/app/femr/data/models/IPatientEncounterPhoto.java b/app/femr/data/models/core/IPatientEncounterPhoto.java similarity index 96% rename from app/femr/data/models/IPatientEncounterPhoto.java rename to app/femr/data/models/core/IPatientEncounterPhoto.java index 5a0b5003a..e229559d7 100644 --- a/app/femr/data/models/IPatientEncounterPhoto.java +++ b/app/femr/data/models/core/IPatientEncounterPhoto.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; public interface IPatientEncounterPhoto { int getPatientEncounterId(); diff --git a/app/femr/data/models/IPatientEncounterTabField.java b/app/femr/data/models/core/IPatientEncounterTabField.java similarity index 94% rename from app/femr/data/models/IPatientEncounterTabField.java rename to app/femr/data/models/core/IPatientEncounterTabField.java index 2aa4053b5..35025c9c7 100644 --- a/app/femr/data/models/IPatientEncounterTabField.java +++ b/app/femr/data/models/core/IPatientEncounterTabField.java @@ -16,8 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; +import femr.data.models.mysql.ChiefComplaint; import org.joda.time.DateTime; /** diff --git a/app/femr/data/models/IPatientEncounterVital.java b/app/femr/data/models/core/IPatientEncounterVital.java similarity index 97% rename from app/femr/data/models/IPatientEncounterVital.java rename to app/femr/data/models/core/IPatientEncounterVital.java index 4954b9e85..8c2a30d56 100644 --- a/app/femr/data/models/IPatientEncounterVital.java +++ b/app/femr/data/models/core/IPatientEncounterVital.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; public interface IPatientEncounterVital { int getId(); diff --git a/app/femr/data/models/IPatientPrescription.java b/app/femr/data/models/core/IPatientPrescription.java similarity index 98% rename from app/femr/data/models/IPatientPrescription.java rename to app/femr/data/models/core/IPatientPrescription.java index 3ca712f4b..8fb011291 100644 --- a/app/femr/data/models/IPatientPrescription.java +++ b/app/femr/data/models/core/IPatientPrescription.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; import org.joda.time.DateTime; @@ -24,7 +24,6 @@ public interface IPatientPrescription { int getId(); - IMedication getMedication(); void setMedication(IMedication medication); diff --git a/app/femr/data/models/IPhoto.java b/app/femr/data/models/core/IPhoto.java similarity index 97% rename from app/femr/data/models/IPhoto.java rename to app/femr/data/models/core/IPhoto.java index 3206ccb99..3cbc0695a 100644 --- a/app/femr/data/models/IPhoto.java +++ b/app/femr/data/models/core/IPhoto.java @@ -17,7 +17,7 @@ you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; import java.util.Date; diff --git a/app/femr/data/models/IRole.java b/app/femr/data/models/core/IRole.java similarity index 96% rename from app/femr/data/models/IRole.java rename to app/femr/data/models/core/IRole.java index e5559c4cb..c5ee4c16d 100644 --- a/app/femr/data/models/IRole.java +++ b/app/femr/data/models/core/IRole.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * User roles - nurse, physician, pharmacist, researcher, etc diff --git a/app/femr/data/models/ISystemSetting.java b/app/femr/data/models/core/ISystemSetting.java similarity index 97% rename from app/femr/data/models/ISystemSetting.java rename to app/femr/data/models/core/ISystemSetting.java index 62704d1be..b8bc032a8 100644 --- a/app/femr/data/models/ISystemSetting.java +++ b/app/femr/data/models/core/ISystemSetting.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * Created by kevin on 7/28/14. diff --git a/app/femr/data/models/ITab.java b/app/femr/data/models/core/ITab.java similarity index 97% rename from app/femr/data/models/ITab.java rename to app/femr/data/models/core/ITab.java index c0ee62312..14d641b21 100644 --- a/app/femr/data/models/ITab.java +++ b/app/femr/data/models/core/ITab.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; import org.joda.time.DateTime; diff --git a/app/femr/data/models/ITabField.java b/app/femr/data/models/core/ITabField.java similarity index 97% rename from app/femr/data/models/ITabField.java rename to app/femr/data/models/core/ITabField.java index acc9b8671..76bb4f5cf 100644 --- a/app/femr/data/models/ITabField.java +++ b/app/femr/data/models/core/ITabField.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; public interface ITabField { int getId(); diff --git a/app/femr/data/models/ITabFieldSize.java b/app/femr/data/models/core/ITabFieldSize.java similarity index 96% rename from app/femr/data/models/ITabFieldSize.java rename to app/femr/data/models/core/ITabFieldSize.java index c5145907b..c026b4df2 100644 --- a/app/femr/data/models/ITabFieldSize.java +++ b/app/femr/data/models/core/ITabFieldSize.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * Used to identify a dynamic tab fields size diff --git a/app/femr/data/models/ITabFieldType.java b/app/femr/data/models/core/ITabFieldType.java similarity index 96% rename from app/femr/data/models/ITabFieldType.java rename to app/femr/data/models/core/ITabFieldType.java index 51fab913c..0cd0c959d 100644 --- a/app/femr/data/models/ITabFieldType.java +++ b/app/femr/data/models/core/ITabFieldType.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; /** * Used to identify a tab fields type - number, text, etc diff --git a/app/femr/data/models/IUser.java b/app/femr/data/models/core/IUser.java similarity index 98% rename from app/femr/data/models/IUser.java rename to app/femr/data/models/core/IUser.java index 89d534958..498b8ec54 100644 --- a/app/femr/data/models/IUser.java +++ b/app/femr/data/models/core/IUser.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; import org.joda.time.DateTime; diff --git a/app/femr/data/models/IVital.java b/app/femr/data/models/core/IVital.java similarity index 97% rename from app/femr/data/models/IVital.java rename to app/femr/data/models/core/IVital.java index b3a30a839..e71fd518a 100644 --- a/app/femr/data/models/IVital.java +++ b/app/femr/data/models/core/IVital.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.core; public interface IVital { void setId(int id); diff --git a/app/femr/data/models/ChiefComplaint.java b/app/femr/data/models/mysql/ChiefComplaint.java similarity index 89% rename from app/femr/data/models/ChiefComplaint.java rename to app/femr/data/models/mysql/ChiefComplaint.java index a72b360d8..8290213da 100644 --- a/app/femr/data/models/ChiefComplaint.java +++ b/app/femr/data/models/mysql/ChiefComplaint.java @@ -16,13 +16,16 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IChiefComplaint; +import femr.data.models.core.IPatientEncounter; import javax.persistence.*; @Entity @Table(name = "chief_complaints") -public class ChiefComplaint implements IChiefComplaint{ +public class ChiefComplaint implements IChiefComplaint { @Id @Column(name = "id", unique = true, nullable = false) private int id; diff --git a/app/femr/data/models/mysql/Diagnosis.java b/app/femr/data/models/mysql/Diagnosis.java new file mode 100644 index 000000000..f97f2b92f --- /dev/null +++ b/app/femr/data/models/mysql/Diagnosis.java @@ -0,0 +1,54 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.mysql; + +import femr.data.models.core.IDiagnosis; + +import javax.persistence.*; + +@Entity +@Table(name = "diagnoses") +public class Diagnosis implements IDiagnosis { + + @Id + @Column(name = "id", unique = true, nullable = false) + private int id; + @Column(name = "name", nullable = false) + private String name; + + @Override + public int getId() { + return id; + } + + @Override + public void setId(int id) { + this.id = id; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } +} diff --git a/app/femr/data/models/Medication.java b/app/femr/data/models/mysql/Medication.java similarity index 91% rename from app/femr/data/models/Medication.java rename to app/femr/data/models/mysql/Medication.java index 9de8cb8c8..743dc20c9 100644 --- a/app/femr/data/models/Medication.java +++ b/app/femr/data/models/mysql/Medication.java @@ -16,7 +16,11 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IMedication; +import femr.data.models.core.IMedicationActiveDrug; +import femr.data.models.core.IMedicationForm; import javax.persistence.*; import java.util.List; @@ -46,6 +50,11 @@ public class Medication implements IMedication { inverseJoinColumns = {@JoinColumn(name = "medication_active_drugs_id", referencedColumnName = "id")}) private List medicationActiveDrugs; + /*@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.ALL) + @JoinColumn(name = "patient_encounters") + private PatientEncounter patientEncounter; +*/ + @Override public int getId() { return id; diff --git a/app/femr/data/models/MedicationActiveDrug.java b/app/femr/data/models/mysql/MedicationActiveDrug.java similarity index 93% rename from app/femr/data/models/MedicationActiveDrug.java rename to app/femr/data/models/mysql/MedicationActiveDrug.java index c742d8443..d7ed9a8c6 100644 --- a/app/femr/data/models/MedicationActiveDrug.java +++ b/app/femr/data/models/mysql/MedicationActiveDrug.java @@ -16,7 +16,11 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IMedicationActiveDrug; +import femr.data.models.core.IMedicationActiveDrugName; +import femr.data.models.core.IMedicationMeasurementUnit; import javax.persistence.*; diff --git a/app/femr/data/models/MedicationActiveDrugName.java b/app/femr/data/models/mysql/MedicationActiveDrugName.java similarity index 93% rename from app/femr/data/models/MedicationActiveDrugName.java rename to app/femr/data/models/mysql/MedicationActiveDrugName.java index 4895f9322..0c30191b1 100644 --- a/app/femr/data/models/MedicationActiveDrugName.java +++ b/app/femr/data/models/mysql/MedicationActiveDrugName.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IMedicationActiveDrugName; import javax.persistence.Column; import javax.persistence.Entity; @@ -25,7 +27,7 @@ @Entity @Table(name = "medication_active_drug_names") -public class MedicationActiveDrugName implements IMedicationActiveDrugName{ +public class MedicationActiveDrugName implements IMedicationActiveDrugName { @Id @Column(name = "id", unique = true, nullable = false) private int id; diff --git a/app/femr/data/models/MedicationAdministration.java b/app/femr/data/models/mysql/MedicationAdministration.java similarity index 93% rename from app/femr/data/models/MedicationAdministration.java rename to app/femr/data/models/mysql/MedicationAdministration.java index 10701d828..ec99ee4e2 100644 --- a/app/femr/data/models/MedicationAdministration.java +++ b/app/femr/data/models/mysql/MedicationAdministration.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IMedicationAdministration; import javax.persistence.Column; import javax.persistence.Entity; @@ -25,7 +27,7 @@ @Entity @Table(name = "medication_administrations") -public class MedicationAdministration implements IMedicationAdministration{ +public class MedicationAdministration implements IMedicationAdministration { @Id @Column(name = "id", unique = true, nullable = false) private int id; diff --git a/app/femr/data/models/MedicationForm.java b/app/femr/data/models/mysql/MedicationForm.java similarity index 93% rename from app/femr/data/models/MedicationForm.java rename to app/femr/data/models/mysql/MedicationForm.java index 855cee13d..df71f4da3 100644 --- a/app/femr/data/models/MedicationForm.java +++ b/app/femr/data/models/mysql/MedicationForm.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IMedicationForm; import javax.persistence.Column; import javax.persistence.Entity; @@ -25,7 +27,7 @@ @Entity @Table(name = "medication_forms") -public class MedicationForm implements IMedicationForm{ +public class MedicationForm implements IMedicationForm { @Id @Column(name = "id", unique = true, nullable = false) private int id; diff --git a/app/femr/data/models/MedicationMeasurementUnit.java b/app/femr/data/models/mysql/MedicationMeasurementUnit.java similarity index 94% rename from app/femr/data/models/MedicationMeasurementUnit.java rename to app/femr/data/models/mysql/MedicationMeasurementUnit.java index d578fbfe1..a3b131a95 100644 --- a/app/femr/data/models/MedicationMeasurementUnit.java +++ b/app/femr/data/models/mysql/MedicationMeasurementUnit.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IMedicationMeasurementUnit; import javax.persistence.Column; import javax.persistence.Entity; @@ -25,7 +27,7 @@ @Entity @Table(name = "medication_measurement_units") -public class MedicationMeasurementUnit implements IMedicationMeasurementUnit{ +public class MedicationMeasurementUnit implements IMedicationMeasurementUnit { @Id @Column(name = "id", unique = true, nullable = false) private int id; diff --git a/app/femr/data/models/mysql/MissionCity.java b/app/femr/data/models/mysql/MissionCity.java new file mode 100644 index 000000000..af1a5a6e5 --- /dev/null +++ b/app/femr/data/models/mysql/MissionCity.java @@ -0,0 +1,62 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.mysql; + +import femr.data.models.core.IMissionCity; +import femr.data.models.core.IMissionCountry; + +import javax.persistence.*; + +@Entity +@Table(name = "mission_cities") +public class MissionCity implements IMissionCity { + @Id + @Column(name = "id", unique = true, nullable = false) + private int id; + @Column(name = "name", unique = true, nullable = false) + private String name; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "mission_country_id", nullable = false) + private MissionCountry missionCountry; + + @Override + public int getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public IMissionCountry getMissionCountry() { + return missionCountry; + } + + @Override + public void setMissionCountry(IMissionCountry missionCountry) { + this.missionCountry = (MissionCountry) missionCountry; + } +} diff --git a/app/femr/data/models/mysql/MissionCountry.java b/app/femr/data/models/mysql/MissionCountry.java new file mode 100644 index 000000000..8c3e1083b --- /dev/null +++ b/app/femr/data/models/mysql/MissionCountry.java @@ -0,0 +1,51 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.mysql; + +import femr.data.models.core.IMissionCountry; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "mission_countries") +public class MissionCountry implements IMissionCountry { + @Id + @Column(name = "id", unique = true, nullable = false) + private int id; + @Column(name = "name", unique = true, nullable = false) + private String name; + + @Override + public int getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } +} diff --git a/app/femr/data/models/mysql/MissionTeam.java b/app/femr/data/models/mysql/MissionTeam.java new file mode 100644 index 000000000..af09fdfc9 --- /dev/null +++ b/app/femr/data/models/mysql/MissionTeam.java @@ -0,0 +1,86 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.mysql; + +import femr.data.models.core.IMissionTeam; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Table(name = "mission_teams") +public class MissionTeam implements IMissionTeam { + @Id + @Column(name = "id", unique = true, nullable = false) + private int id; + @Column(name = "name", unique = true, nullable = false) + private String name; + @Column(name = "location", unique = true, nullable = false) + private String location; + @Column(name = "description", unique = true, nullable = false) + private String description; + @OneToMany(fetch = FetchType.LAZY, + mappedBy = "missionTeam") + private List missionTrips; + + @Override + public int getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public void setName(String name) { + this.name = name; + } + + @Override + public String getLocation() { + return location; + } + + @Override + public void setLocation(String location) { + this.location = location; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public void setDescription(String description) { + this.description = description; + } + + @Override + public List getMissionTrips() { + return missionTrips; + } + + @Override + public void setMissionTrips(List missionTrips) { + this.missionTrips = missionTrips; + } +} diff --git a/app/femr/data/models/mysql/MissionTrip.java b/app/femr/data/models/mysql/MissionTrip.java new file mode 100644 index 000000000..ea025bab7 --- /dev/null +++ b/app/femr/data/models/mysql/MissionTrip.java @@ -0,0 +1,101 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.data.models.mysql; + +import femr.data.models.core.IMissionCity; +import femr.data.models.core.IMissionTeam; +import femr.data.models.core.IMissionTrip; + +import javax.persistence.*; +import java.util.Date; + +@Entity +@Table(name = "mission_trips") +public class MissionTrip implements IMissionTrip { + @Id + @Column(name = "id", unique = true, nullable = false) + private int id; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "mission_team_id") + private MissionTeam missionTeam; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "mission_city_id") + private MissionCity missionCity; + @Column(name = "isCurrent", nullable = false) + private boolean isCurrent; + @Column(name = "start_date") + private Date startDate; + @Column(name = "end_date") + private Date endDate; + + @Override + public int getId() { + return id; + } + + @Override + public IMissionTeam getMissionTeam() { + return missionTeam; + } + + @Override + public void setMissionTeam(IMissionTeam missionTeam) { + this.missionTeam = (MissionTeam) missionTeam; + } + + @Override + public IMissionCity getMissionCity() { + return missionCity; + } + + @Override + public void setMissionCity(IMissionCity missionCity) { + this.missionCity = (MissionCity) missionCity; + } + + @Override + public boolean isCurrent() { + return isCurrent; + } + + @Override + public void setCurrent(boolean isCurrent) { + this.isCurrent = isCurrent; + } + + @Override + public Date getStartDate() { + return startDate; + } + + @Override + public void setStartDate(Date startDate) { + this.startDate = startDate; + } + + @Override + public Date getEndDate() { + return endDate; + } + + @Override + public void setEndDate(Date endDate) { + this.endDate = endDate; + } +} diff --git a/app/femr/data/models/Patient.java b/app/femr/data/models/mysql/Patient.java similarity index 96% rename from app/femr/data/models/Patient.java rename to app/femr/data/models/mysql/Patient.java index cced180c1..648506c6e 100644 --- a/app/femr/data/models/Patient.java +++ b/app/femr/data/models/mysql/Patient.java @@ -16,7 +16,10 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IPatient; +import femr.data.models.core.IPhoto; import javax.persistence.*; import java.util.Date; diff --git a/app/femr/data/models/PatientAgeClassification.java b/app/femr/data/models/mysql/PatientAgeClassification.java similarity index 95% rename from app/femr/data/models/PatientAgeClassification.java rename to app/femr/data/models/mysql/PatientAgeClassification.java index 301b42c8c..f0957a8b3 100644 --- a/app/femr/data/models/PatientAgeClassification.java +++ b/app/femr/data/models/mysql/PatientAgeClassification.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IPatientAgeClassification; import javax.persistence.*; diff --git a/app/femr/data/models/PatientEncounter.java b/app/femr/data/models/mysql/PatientEncounter.java similarity index 92% rename from app/femr/data/models/PatientEncounter.java rename to app/femr/data/models/mysql/PatientEncounter.java index 0c1a8e553..0b7b0fdee 100644 --- a/app/femr/data/models/PatientEncounter.java +++ b/app/femr/data/models/mysql/PatientEncounter.java @@ -16,8 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; +import femr.data.models.core.*; import org.joda.time.DateTime; import javax.persistence.*; import java.util.ArrayList; @@ -55,6 +56,9 @@ public class PatientEncounter implements IPatientEncounter { @ManyToOne(fetch = FetchType.EAGER) @JoinColumn(name = "patient_age_classification_id") private PatientAgeClassification patientAgeClassification; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "mission_trip_id") + private MissionTrip missionTrip; @Override public int getId() { @@ -166,4 +170,14 @@ public IPatientAgeClassification getPatientAgeClassification() { public void setPatientAgeClassification(IPatientAgeClassification patientAgeClassification) { this.patientAgeClassification = (PatientAgeClassification) patientAgeClassification; } + + @Override + public IMissionTrip getMissionTrip() { + return missionTrip; + } + + @Override + public void setMissionTrip(IMissionTrip missionTrip) { + this.missionTrip = (MissionTrip) missionTrip; + } } diff --git a/app/femr/data/models/PatientEncounterPhoto.java b/app/femr/data/models/mysql/PatientEncounterPhoto.java similarity index 94% rename from app/femr/data/models/PatientEncounterPhoto.java rename to app/femr/data/models/mysql/PatientEncounterPhoto.java index f65e2d251..613f9cd49 100644 --- a/app/femr/data/models/PatientEncounterPhoto.java +++ b/app/femr/data/models/mysql/PatientEncounterPhoto.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IPatientEncounterPhoto; import javax.persistence.*; diff --git a/app/femr/data/models/PatientEncounterTabField.java b/app/femr/data/models/mysql/PatientEncounterTabField.java similarity index 94% rename from app/femr/data/models/PatientEncounterTabField.java rename to app/femr/data/models/mysql/PatientEncounterTabField.java index b374bc60c..7315cad0b 100644 --- a/app/femr/data/models/PatientEncounterTabField.java +++ b/app/femr/data/models/mysql/PatientEncounterTabField.java @@ -16,14 +16,17 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; +import femr.data.models.core.IChiefComplaint; +import femr.data.models.core.IPatientEncounterTabField; +import femr.data.models.core.ITabField; import org.joda.time.DateTime; import javax.persistence.*; @Entity @Table(name="patient_encounter_tab_fields") -public class PatientEncounterTabField implements IPatientEncounterTabField{ +public class PatientEncounterTabField implements IPatientEncounterTabField { @Id @Column(name = "id", unique = true, nullable = false) private int id; diff --git a/app/femr/data/models/PatientEncounterVital.java b/app/femr/data/models/mysql/PatientEncounterVital.java similarity index 95% rename from app/femr/data/models/PatientEncounterVital.java rename to app/femr/data/models/mysql/PatientEncounterVital.java index 34f671bb4..1ebd383e2 100644 --- a/app/femr/data/models/PatientEncounterVital.java +++ b/app/femr/data/models/mysql/PatientEncounterVital.java @@ -16,7 +16,10 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IPatientEncounterVital; +import femr.data.models.core.IVital; import javax.persistence.*; diff --git a/app/femr/data/models/PatientPrescription.java b/app/femr/data/models/mysql/PatientPrescription.java similarity index 98% rename from app/femr/data/models/PatientPrescription.java rename to app/femr/data/models/mysql/PatientPrescription.java index 934f472aa..a30639f8c 100644 --- a/app/femr/data/models/PatientPrescription.java +++ b/app/femr/data/models/mysql/PatientPrescription.java @@ -16,8 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; +import femr.data.models.core.*; import org.joda.time.DateTime; import javax.persistence.*; diff --git a/app/femr/data/models/Photo.java b/app/femr/data/models/mysql/Photo.java similarity index 96% rename from app/femr/data/models/Photo.java rename to app/femr/data/models/mysql/Photo.java index 56b8c3827..c7998e21b 100644 --- a/app/femr/data/models/Photo.java +++ b/app/femr/data/models/mysql/Photo.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IPhoto; import javax.persistence.*; import java.util.Date; diff --git a/app/femr/data/models/Role.java b/app/femr/data/models/mysql/Role.java similarity index 95% rename from app/femr/data/models/Role.java rename to app/femr/data/models/mysql/Role.java index e16270602..aeb438854 100644 --- a/app/femr/data/models/Role.java +++ b/app/femr/data/models/mysql/Role.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IRole; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/app/femr/data/models/Roles.java b/app/femr/data/models/mysql/Roles.java similarity index 97% rename from app/femr/data/models/Roles.java rename to app/femr/data/models/mysql/Roles.java index 41bdfcb88..427a7a607 100644 --- a/app/femr/data/models/Roles.java +++ b/app/femr/data/models/mysql/Roles.java @@ -16,7 +16,7 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; public class Roles { public static final int ADMINISTRATOR = 1; diff --git a/app/femr/data/models/SystemSetting.java b/app/femr/data/models/mysql/SystemSetting.java similarity index 95% rename from app/femr/data/models/SystemSetting.java rename to app/femr/data/models/mysql/SystemSetting.java index 99b13bffd..c362fc0e5 100644 --- a/app/femr/data/models/SystemSetting.java +++ b/app/femr/data/models/mysql/SystemSetting.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.ISystemSetting; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/app/femr/data/models/Tab.java b/app/femr/data/models/mysql/Tab.java similarity index 97% rename from app/femr/data/models/Tab.java rename to app/femr/data/models/mysql/Tab.java index 93a71c6cf..882ba255e 100644 --- a/app/femr/data/models/Tab.java +++ b/app/femr/data/models/mysql/Tab.java @@ -16,8 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; +import femr.data.models.core.ITab; import org.joda.time.DateTime; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/app/femr/data/models/TabField.java b/app/femr/data/models/mysql/TabField.java similarity index 94% rename from app/femr/data/models/TabField.java rename to app/femr/data/models/mysql/TabField.java index 441625ebf..7b926ba22 100644 --- a/app/femr/data/models/TabField.java +++ b/app/femr/data/models/mysql/TabField.java @@ -16,7 +16,12 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.ITab; +import femr.data.models.core.ITabField; +import femr.data.models.core.ITabFieldSize; +import femr.data.models.core.ITabFieldType; import javax.persistence.*; diff --git a/app/femr/data/models/TabFieldSize.java b/app/femr/data/models/mysql/TabFieldSize.java similarity index 95% rename from app/femr/data/models/TabFieldSize.java rename to app/femr/data/models/mysql/TabFieldSize.java index 90b426705..cebf83067 100644 --- a/app/femr/data/models/TabFieldSize.java +++ b/app/femr/data/models/mysql/TabFieldSize.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.ITabFieldSize; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/app/femr/data/models/TabFieldType.java b/app/femr/data/models/mysql/TabFieldType.java similarity index 95% rename from app/femr/data/models/TabFieldType.java rename to app/femr/data/models/mysql/TabFieldType.java index 280ee6154..4beddd04c 100644 --- a/app/femr/data/models/TabFieldType.java +++ b/app/femr/data/models/mysql/TabFieldType.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.ITabFieldType; import javax.persistence.Column; import javax.persistence.Entity; diff --git a/app/femr/data/models/User.java b/app/femr/data/models/mysql/User.java similarity index 97% rename from app/femr/data/models/User.java rename to app/femr/data/models/mysql/User.java index 5b3c10123..ffb0b9d01 100644 --- a/app/femr/data/models/User.java +++ b/app/femr/data/models/mysql/User.java @@ -16,8 +16,10 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; +import femr.data.models.core.IRole; +import femr.data.models.core.IUser; import org.joda.time.DateTime; import javax.persistence.*; diff --git a/app/femr/data/models/Vital.java b/app/femr/data/models/mysql/Vital.java similarity index 96% rename from app/femr/data/models/Vital.java rename to app/femr/data/models/mysql/Vital.java index 3499abd90..22956404f 100644 --- a/app/femr/data/models/Vital.java +++ b/app/femr/data/models/mysql/Vital.java @@ -16,7 +16,9 @@ along with fEMR. If not, see . If you have any questions, contact . */ -package femr.data.models; +package femr.data.models.mysql; + +import femr.data.models.core.IVital; import javax.persistence.*; diff --git a/app/femr/ui/controllers/HistoryController.java b/app/femr/ui/controllers/HistoryController.java index 9d12403fa..6c9e085fa 100644 --- a/app/femr/ui/controllers/HistoryController.java +++ b/app/femr/ui/controllers/HistoryController.java @@ -1,11 +1,14 @@ package femr.ui.controllers; import com.google.inject.Inject; -import femr.business.services.*; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.IEncounterService; +import femr.business.services.core.IPhotoService; +import femr.business.services.core.ISearchService; +import femr.business.services.core.ISessionService; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; import femr.common.models.*; -import femr.data.models.*; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.models.history.IndexEncounterMedicalViewModel; @@ -29,19 +32,21 @@ @Security.Authenticated(FEMRAuthenticated.class) @AllowedRoles({Roles.PHYSICIAN, Roles.PHARMACIST, Roles.NURSE}) public class HistoryController extends Controller { - private ISessionService sessionService; - private ISearchService searchService; - private IPharmacyService pharmacyService; - private IPhotoService photoService; + + private final IEncounterService encounterService; + private final ISessionService sessionService; + private final ISearchService searchService; + private final IPhotoService photoService; @Inject - public HistoryController(ISessionService sessionService, + public HistoryController(IEncounterService encounterService, + ISessionService sessionService, ISearchService searchService, - IPharmacyService pharmacyService, IPhotoService photoService) { + + this.encounterService = encounterService; this.sessionService = sessionService; this.searchService = searchService; - this.pharmacyService = pharmacyService; this.photoService = photoService; } @@ -166,7 +171,7 @@ public Result indexEncounterGet(int encounterId) { //get problems List problems = new ArrayList<>(); - ServiceResponse> problemItemServiceResponse = pharmacyService.findProblemItems(encounterId); + ServiceResponse> problemItemServiceResponse = encounterService.findProblemItems(encounterId); if (problemItemServiceResponse.hasErrors()){ throw new RuntimeException(); } diff --git a/app/femr/ui/controllers/HomeController.java b/app/femr/ui/controllers/HomeController.java index 3f3d99b4e..03af27c48 100644 --- a/app/femr/ui/controllers/HomeController.java +++ b/app/femr/ui/controllers/HomeController.java @@ -1,8 +1,8 @@ package femr.ui.controllers; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.business.services.ISessionService; +import femr.common.dtos.CurrentUser; +import femr.business.services.core.ISessionService; import femr.ui.views.html.home.index; import femr.ui.views.html.sessions.create; import play.mvc.Controller; @@ -26,4 +26,8 @@ public Result index() { return ok(create.render(null)); } + + + + } \ No newline at end of file diff --git a/app/femr/ui/controllers/MedicalController.java b/app/femr/ui/controllers/MedicalController.java index dd1351e75..19886d53b 100644 --- a/app/femr/ui/controllers/MedicalController.java +++ b/app/femr/ui/controllers/MedicalController.java @@ -3,11 +3,11 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.google.inject.Inject; -import femr.business.services.*; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.*; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; import femr.common.models.*; -import femr.data.models.Roles; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.models.medical.*; @@ -32,20 +32,29 @@ public class MedicalController extends Controller { private final Form createViewModelPostForm = Form.form(EditViewModelPost.class); private final Form updateVitalsModelForm = Form.form(UpdateVitalsModel.class); + private final ICustomTabService customTabService; + private final IEncounterService encounterService; + private final IMedicationService medicationService; + private final IPhotoService photoService; private final ISessionService sessionService; private final ISearchService searchService; - private final IMedicalService medicalService; - private final IPhotoService photoService; + private final IVitalService vitalService; @Inject - public MedicalController(ISessionService sessionService, + public MedicalController(ICustomTabService customTabService, + IEncounterService encounterService, + IMedicationService medicationService, + IPhotoService photoService, + ISessionService sessionService, ISearchService searchService, - IMedicalService medicalService, - IPhotoService photoService) { + IVitalService vitalService) { + this.customTabService = customTabService; + this.encounterService = encounterService; this.sessionService = sessionService; this.searchService = searchService; - this.medicalService = medicalService; + this.medicationService = medicationService; this.photoService = photoService; + this.vitalService = vitalService; } public Result indexGet() { @@ -77,7 +86,7 @@ public Result indexPost() { } //check if the doc has already seen the patient today - ServiceResponse userItemServiceResponse = medicalService.getPhysicianThatCheckedInPatient(patientEncounterItem.getId()); + ServiceResponse userItemServiceResponse = encounterService.getPhysicianThatCheckedInPatientToMedical(patientEncounterItem.getId()); if (userItemServiceResponse.hasErrors()) { throw new RuntimeException(); } else { @@ -133,7 +142,7 @@ public Result editGet(int patientId) { //Map // String = tab field name // TabFieldItem contains value - ServiceResponse> patientEncounterTabFieldResponse = medicalService.findCurrentTabFieldsByEncounterId(patientEncounter.getId()); + ServiceResponse> patientEncounterTabFieldResponse = encounterService.findCurrentTabFieldsByEncounterId(patientEncounter.getId()); Map tabFieldItemMap; if (patientEncounterTabFieldResponse.hasErrors()) { throw new RuntimeException(); @@ -143,13 +152,13 @@ public Result editGet(int patientId) { } //get custom tabs/fields - ServiceResponse> tabItemResponse = medicalService.getCustomTabs(); + ServiceResponse> tabItemResponse = customTabService.getCustomTabs(false); if (tabItemResponse.hasErrors()) { throw new RuntimeException(); } else { viewModelGet.setCustomTabs(tabItemResponse.getResponseObject()); } - ServiceResponse>> tabFieldResponse = medicalService.getCustomFields(patientEncounter.getId()); + ServiceResponse>> tabFieldResponse = customTabService.getTabFields(patientEncounter.getId()); if (tabFieldResponse.hasErrors()) { throw new RuntimeException(); } else { @@ -180,7 +189,7 @@ public Result editPost(int patientId) { throw new RuntimeException(); } PatientEncounterItem patientEncounterItem = patientEncounterServiceResponse.getResponseObject(); - patientEncounterItem = medicalService.checkPatientIn(patientEncounterItem.getId(), currentUserSession.getId()).getResponseObject(); + patientEncounterItem = encounterService.checkPatientInToMedical(patientEncounterItem.getId(), currentUserSession.getId()).getResponseObject(); //update patient encounter //Maps the dynamic tab name to the field list @@ -203,7 +212,7 @@ public Result editPost(int patientId) { //save the custom fields, if any if (customFieldItems.size() > 0) { ServiceResponse> customFieldItemResponse = - medicalService.createPatientEncounterTabFields(customFieldItems, patientEncounterItem.getId(), currentUserSession.getId()); + encounterService.createPatientEncounterTabFields(customFieldItems, patientEncounterItem.getId(), currentUserSession.getId()); if (customFieldItemResponse.hasErrors()) { throw new RuntimeException(); } @@ -225,7 +234,7 @@ public Result editPost(int patientId) { if (nonCustomFieldItems.size() > 0) { ServiceResponse> nonCustomFieldItemResponse = - medicalService.createPatientEncounterTabFields(nonCustomFieldItems, patientEncounterItem.getId(), currentUserSession.getId()); + encounterService.createPatientEncounterTabFields(nonCustomFieldItems, patientEncounterItem.getId(), currentUserSession.getId()); if (nonCustomFieldItemResponse.hasErrors()) { throw new RuntimeException(); } @@ -258,12 +267,9 @@ public Result editPost(int patientId) { if (viewModelPost.getPrescription5() != null && StringUtils.isNotNullOrWhiteSpace(viewModelPost.getPrescription5())) prescriptionItems.add(new PrescriptionItem(viewModelPost.getPrescription5())); if (prescriptionItems.size() > 0) { - ServiceResponse> prescriptionResponse = medicalService.createPatientPrescriptions( - prescriptionItems, - currentUserSession.getId(), - patientEncounterItem.getId(), - false - ); + + ServiceResponse> prescriptionResponse = + medicationService.createPatientPrescriptions(prescriptionItems, currentUserSession.getId(), patientEncounterItem.getId(), false, false); if (prescriptionResponse.hasErrors()) { throw new RuntimeException(); } @@ -282,7 +288,7 @@ public Result updateVitalsPost(int id) { throw new RuntimeException(); } //update date_of_medical_visit when a vital is updated - medicalService.checkPatientIn(currentEncounterByPatientId.getResponseObject().getId(), currentUser.getId()); + encounterService.checkPatientInToMedical(currentEncounterByPatientId.getResponseObject().getId(), currentUser.getId()); PatientEncounterItem patientEncounter = currentEncounterByPatientId.getResponseObject(); @@ -290,7 +296,7 @@ public Result updateVitalsPost(int id) { Map patientEncounterVitals = getPatientEncounterVitals(updateVitalsModel); ServiceResponse> patientEncounterVitalsServiceResponse = - medicalService.createPatientEncounterVitals(patientEncounterVitals, currentUser.getId(), patientEncounter.getId()); + vitalService.createPatientEncounterVitals(patientEncounterVitals, currentUser.getId(), patientEncounter.getId()); if (patientEncounterVitalsServiceResponse.hasErrors()) { throw new RuntimeException(); } diff --git a/app/femr/ui/controllers/PharmaciesController.java b/app/femr/ui/controllers/PharmaciesController.java index 44720e040..7313bfe40 100644 --- a/app/femr/ui/controllers/PharmaciesController.java +++ b/app/femr/ui/controllers/PharmaciesController.java @@ -1,12 +1,14 @@ package femr.ui.controllers; -import com.google.gson.JsonObject; import com.google.inject.Inject; -import femr.business.services.*; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.IEncounterService; +import femr.business.services.core.IMedicationService; +import femr.business.services.core.ISearchService; +import femr.business.services.core.ISessionService; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; import femr.common.models.*; -import femr.data.models.Roles; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.models.pharmacy.*; @@ -24,16 +26,20 @@ @Security.Authenticated(FEMRAuthenticated.class) @AllowedRoles({Roles.PHYSICIAN, Roles.PHARMACIST, Roles.NURSE}) public class PharmaciesController extends Controller { + private final Form populatedViewModelPostForm = Form.form(EditViewModelPost.class); - private ISessionService sessionService; - private ISearchService searchService; - private IPharmacyService pharmacyService; + private final IEncounterService encounterService; + private final IMedicationService medicationService; + private final ISessionService sessionService; + private final ISearchService searchService; @Inject - public PharmaciesController(IPharmacyService pharmacyService, + public PharmaciesController(IEncounterService encounterService, + IMedicationService medicationService, ISessionService sessionService, ISearchService searchService) { - this.pharmacyService = pharmacyService; + this.encounterService = encounterService; + this.medicationService = medicationService; this.sessionService = sessionService; this.searchService = searchService; } @@ -121,7 +127,7 @@ public Result editGet(int patientId) { viewModelGet.setMedications(prescriptionItemServiceResponse.getResponseObject()); //find patient problems, they do not have to exist. - ServiceResponse> problemItemServiceResponse = pharmacyService.findProblemItems(patientEncounterItem.getId()); + ServiceResponse> problemItemServiceResponse = encounterService.findProblemItems(patientEncounterItem.getId()); if (problemItemServiceResponse.hasErrors()) { throw new RuntimeException(); } else { @@ -160,7 +166,7 @@ public Result editPost(int id) { PrescriptionItem prescriptionItem = new PrescriptionItem(); if (StringUtils.isNotNullOrWhiteSpace(createViewModelPost.getReplacementMedication1())) { prescriptionItem.setName(createViewModelPost.getReplacementMedication1()); - ServiceResponse response = pharmacyService.createAndReplacePrescription( + ServiceResponse response = medicationService.createAndReplacePrescription( prescriptionItem, createViewModelPost.getId_prescription1(), currentUserSession.getId(), @@ -175,7 +181,7 @@ public Result editPost(int id) { //replace prescription 2 if (StringUtils.isNotNullOrWhiteSpace(createViewModelPost.getReplacementMedication2())) { prescriptionItem.setName(createViewModelPost.getReplacementMedication2()); - ServiceResponse response = pharmacyService.createAndReplacePrescription( + ServiceResponse response = medicationService.createAndReplacePrescription( prescriptionItem, createViewModelPost.getId_prescription2(), currentUserSession.getId(), @@ -190,7 +196,7 @@ public Result editPost(int id) { //replace prescription 3 if (StringUtils.isNotNullOrWhiteSpace(createViewModelPost.getReplacementMedication3())) { prescriptionItem.setName(createViewModelPost.getReplacementMedication3()); - ServiceResponse response = pharmacyService.createAndReplacePrescription( + ServiceResponse response = medicationService.createAndReplacePrescription( prescriptionItem, createViewModelPost.getId_prescription3(), currentUserSession.getId(), @@ -205,7 +211,7 @@ public Result editPost(int id) { //replace prescription 4 if (StringUtils.isNotNullOrWhiteSpace(createViewModelPost.getReplacementMedication4())) { prescriptionItem.setName(createViewModelPost.getReplacementMedication4()); - ServiceResponse response = pharmacyService.createAndReplacePrescription( + ServiceResponse response = medicationService.createAndReplacePrescription( prescriptionItem, createViewModelPost.getId_prescription4(), currentUserSession.getId(), @@ -220,7 +226,7 @@ public Result editPost(int id) { //replace prescription 5 if (StringUtils.isNotNullOrWhiteSpace(createViewModelPost.getReplacementMedication5())) { prescriptionItem.setName(createViewModelPost.getReplacementMedication5()); - ServiceResponse response = pharmacyService.createAndReplacePrescription( + ServiceResponse response = medicationService.createAndReplacePrescription( prescriptionItem, createViewModelPost.getId_prescription5(), currentUserSession.getId(), @@ -234,20 +240,20 @@ public Result editPost(int id) { } //update non-replaced prescriptions to dispensed - ServiceResponse> prescriptionDispensedResponse = pharmacyService.markPrescriptionsAsFilled(prescriptionToMarkAsDispensedOrCounseled); + ServiceResponse> prescriptionDispensedResponse = medicationService.markPrescriptionsAsFilled(prescriptionToMarkAsDispensedOrCounseled); if (prescriptionDispensedResponse.hasErrors()) { throw new RuntimeException(); } //update non-replaced prescriptions that the patient was counseled on if (isCounseled){ - ServiceResponse> prescriptionCounseledResponse = pharmacyService.markPrescriptionsAsCounseled(prescriptionToMarkAsDispensedOrCounseled); + ServiceResponse> prescriptionCounseledResponse = medicationService.markPrescriptionsAsCounseled(prescriptionToMarkAsDispensedOrCounseled); if (prescriptionCounseledResponse.hasErrors()){ throw new RuntimeException(); } } //check the patient in! - pharmacyService.checkPatientIn(patientEncounterItem.getId(), currentUserSession.getId()); + encounterService.checkPatientInToPharmacy(patientEncounterItem.getId(), currentUserSession.getId()); String message = "Patient information for " + patientItem.getFirstName() + " " + @@ -266,21 +272,12 @@ public Result editPost(int id) { * @return JSON object of medications that exist in the medications table */ public Result typeaheadJSONGet() { - JsonObject jsonObject = new JsonObject(); - //get a list of medications in the medication table - //these medications are added by an administrator in the admin section - ServiceResponse> medicationServiceResponse = pharmacyService.findAllMedications(); + ServiceResponse medicationServiceResponse = medicationService.getMedicationNames(); if (medicationServiceResponse.hasErrors()) { - return ok(jsonObject.toString()); + return ok(""); } - List medications = medicationServiceResponse.getResponseObject(); - - //create a JsonObject to send back via AJAX - for (int medication = 0; medication < medications.size(); medication++) { - jsonObject.addProperty("medicine" + medication, medications.get(medication)); - } - return ok(jsonObject.toString()); + return ok(medicationServiceResponse.getResponseObject()); } } diff --git a/app/femr/ui/controllers/PhotoController.java b/app/femr/ui/controllers/PhotoController.java index b4c117209..fd05331ca 100644 --- a/app/femr/ui/controllers/PhotoController.java +++ b/app/femr/ui/controllers/PhotoController.java @@ -2,9 +2,9 @@ import com.google.inject.Inject; import com.typesafe.config.ConfigFactory; -import femr.common.dto.ServiceResponse; -import femr.business.services.IPhotoService; -import femr.data.models.Roles; +import femr.common.dtos.ServiceResponse; +import femr.business.services.core.IPhotoService; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.util.stringhelpers.StringUtils; diff --git a/app/femr/ui/controllers/ResearchController.java b/app/femr/ui/controllers/ResearchController.java index 2296d7a8d..5312f1f4c 100644 --- a/app/femr/ui/controllers/ResearchController.java +++ b/app/femr/ui/controllers/ResearchController.java @@ -1,20 +1,30 @@ package femr.ui.controllers; - +import com.google.gson.Gson; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.business.services.IResearchService; -import femr.business.services.ISessionService; - -import femr.data.models.Roles; +import femr.business.helpers.DomainMapper; +import femr.common.dtos.ServiceResponse; +import femr.common.models.ResearchFilterItem; +import femr.ui.models.research.json.ResearchGraphDataItem; +import femr.common.dtos.CurrentUser; +import femr.business.services.core.IResearchService; +import femr.business.services.core.ISessionService; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.views.html.research.index; +import femr.ui.views.html.research.generatedata; +import femr.ui.models.research.FilterViewModel; +import play.data.Form; import play.mvc.Controller; import play.mvc.Result; import play.mvc.Security; +import java.text.SimpleDateFormat; +import java.util.*; + + /** * This is the controller for the research page, it is currently not supported. * Research was designed before combining of some tables in the database @@ -22,6 +32,9 @@ @Security.Authenticated(FEMRAuthenticated.class) @AllowedRoles({Roles.RESEARCHER}) public class ResearchController extends Controller { + + private final Form FilterViewModelForm = Form.form(FilterViewModel.class); + private IResearchService researchService; private ISessionService sessionService; @@ -38,9 +51,49 @@ public ResearchController(ISessionService sessionService, IResearchService resea } public Result indexGet() { + + // There isn't really a request here, should this be different? + //TODO: nothing to bind here + FilterViewModel filterViewModel = FilterViewModelForm.bindFromRequest().get(); + + // Set Default Start (30 Days Ago) and End Date (Today) + Calendar today = Calendar.getInstance(); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); + filterViewModel.setEndDate(dateFormat.format(today.getTime())); + today.add(Calendar.DAY_OF_MONTH, -30); + filterViewModel.setStartDate(dateFormat.format(today.getTime())); + + ServiceResponse> medResponse = researchService.getAllMedications(); + if( !medResponse.hasErrors() ) { + filterViewModel.setMedicationsList(medResponse.getResponseObject()); + } + CurrentUser currentUserSession = sessionService.getCurrentUserSession(); + return ok(index.render(currentUserSession, filterViewModel)); + } + + public Result generateData() { + FilterViewModel viewModel = FilterViewModelForm.bindFromRequest().get(); + CurrentUser currentUserSession = sessionService.getCurrentUserSession(); + return ok(generatedata.render(currentUserSession, viewModel)); + } + public Result getGraphPost(){ - return ok(index.render(currentUserSession)); + FilterViewModel filterViewModel = FilterViewModelForm.bindFromRequest().get(); + //TODO: domain mapper out of scope + ResearchFilterItem researchFilterItem = DomainMapper.createResearchFilterItem(filterViewModel); + + ServiceResponse response = researchService.getGraphData(researchFilterItem); + ResearchGraphDataItem graphModel = new ResearchGraphDataItem(); + if( !response.hasErrors() ) { + + graphModel = response.getResponseObject(); + } + + Gson gson = new Gson(); + String jsonString = gson.toJson(graphModel); + return ok(jsonString); } + } diff --git a/app/femr/ui/controllers/SearchController.java b/app/femr/ui/controllers/SearchController.java index 723e6bd0e..d8d093f3d 100644 --- a/app/femr/ui/controllers/SearchController.java +++ b/app/femr/ui/controllers/SearchController.java @@ -1,18 +1,22 @@ package femr.ui.controllers; +import com.google.gson.Gson; import com.google.inject.Inject; -import femr.business.services.ISearchService; -import femr.business.services.ISessionService; -import femr.common.dto.ServiceResponse; +import femr.business.services.core.ISearchService; +import femr.business.services.core.ISessionService; +import femr.common.dtos.ServiceResponse; import femr.common.models.PatientItem; -import femr.data.models.Roles; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; +import femr.ui.models.search.json.PatientSearch; +import femr.util.calculations.dateUtils; import org.h2.util.StringUtils; import play.mvc.Controller; import play.mvc.Result; import play.mvc.Security; +import java.util.ArrayList; import java.util.List; //The purpose of this controller is to provide a universal @@ -85,5 +89,37 @@ public Result doesPatientExist(String query){ return ok("true"); } + public Result typeaheadPatientsJSONGet(){ + ServiceResponse> patientItemsServiceResponse = searchService.findPatientsForSearch(); + if (patientItemsServiceResponse.hasErrors()){ + return ok(""); + } + List patientItems = patientItemsServiceResponse.getResponseObject(); + List patientSearches = new ArrayList<>(); + PatientSearch patientSearch; + + for (PatientItem patientItem : patientItems) { + patientSearch = new PatientSearch(); + patientSearch.setId(Integer.toString(patientItem.getId())); + patientSearch.setFirstName(patientItem.getFirstName()); + patientSearch.setLastName(patientItem.getLastName()); + if (patientItem.getAge() != null) + patientSearch.setAge(patientItem.getAge()); + if (patientItem.getPathToPhoto() != null) + patientSearch.setPhoto(patientItem.getPathToPhoto()); + patientSearches.add(patientSearch); + } + + return ok(new Gson().toJson(patientSearches)); + } + + public Result typeaheadDiagnosisJSONGet(){ + + ServiceResponse> allDiagnosesServiceResponse = searchService.findDiagnosisForSearch(); + if (allDiagnosesServiceResponse.hasErrors()) + return ok(""); + + return ok(new Gson().toJson(allDiagnosesServiceResponse.getResponseObject())); + } } diff --git a/app/femr/ui/controllers/SessionsController.java b/app/femr/ui/controllers/SessionsController.java index 488b89113..d8f5aab5e 100644 --- a/app/femr/ui/controllers/SessionsController.java +++ b/app/femr/ui/controllers/SessionsController.java @@ -1,11 +1,11 @@ package femr.ui.controllers; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; -import femr.business.services.ISessionService; -import femr.business.services.IUserService; -import femr.data.models.IUser; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; +import femr.business.services.core.ISessionService; +import femr.business.services.core.IUserService; +import femr.data.models.core.IUser; import femr.ui.models.sessions.CreateViewModel; import femr.ui.views.html.sessions.create; import femr.ui.views.html.sessions.editPassword; diff --git a/app/femr/ui/controllers/SuperuserController.java b/app/femr/ui/controllers/SuperuserController.java index 0d9ddcb63..4a94cb75f 100644 --- a/app/femr/ui/controllers/SuperuserController.java +++ b/app/femr/ui/controllers/SuperuserController.java @@ -1,13 +1,31 @@ +/* + 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 . If + you have any questions, contact . +*/ package femr.ui.controllers; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; -import femr.common.models.TabFieldItem; -import femr.common.models.TabItem; -import femr.business.services.ISessionService; -import femr.business.services.ISuperuserService; -import femr.data.models.Roles; +import femr.business.services.core.IMissionTripService; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; +import femr.common.models.*; +import femr.business.services.core.ISessionService; +import femr.business.services.core.ICustomTabService; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.models.superuser.*; @@ -19,6 +37,7 @@ import femr.ui.views.html.superuser.index; import femr.ui.views.html.superuser.tabs; import femr.ui.views.html.superuser.fields; +import femr.ui.views.html.superuser.trips; import java.util.List; @@ -27,14 +46,19 @@ public class SuperuserController extends Controller { private final Form TabsViewModelForm = Form.form(TabsViewModelPost.class); private final Form ContentViewModelForm = Form.form(ContentViewModelPost.class); - private ISessionService sessionService; - private ISuperuserService superuserService; + private Form tripViewModelPostForm = Form.form(TripViewModelPost.class); + private final ICustomTabService customTabService; + private final IMissionTripService missionTripService; + private final ISessionService sessionService; @Inject - public SuperuserController(ISessionService sessionService, - ISuperuserService superuserService) { + public SuperuserController(ICustomTabService customTabService, + IMissionTripService missionTripService, + ISessionService sessionService) { + + this.customTabService = customTabService; + this.missionTripService = missionTripService; this.sessionService = sessionService; - this.superuserService = superuserService; } public Result indexGet() { @@ -42,11 +66,102 @@ public Result indexGet() { return ok(index.render(currentUser)); } + public Result tripsGet() { + CurrentUser currentUser = sessionService.getCurrentUserSession(); + + ServiceResponse> missionItemServiceResponse = missionTripService.findAllTripInformation(); + if (missionItemServiceResponse.hasErrors()) + throw new RuntimeException(); + + ServiceResponse> availableTeamsServiceResponse = missionTripService.findAvailableTeams(); + if (availableTeamsServiceResponse.hasErrors()) + throw new RuntimeException(); + + ServiceResponse> availableCitiesServiceResponse = missionTripService.findAvailableCities(); + if (availableCitiesServiceResponse.hasErrors()) + throw new RuntimeException(); + + ServiceResponse> availableCountriesServiceResponse = missionTripService.findAvailableCountries(); + if (availableCountriesServiceResponse.hasErrors()) + throw new RuntimeException(); + + TripViewModelGet tripViewModel = new TripViewModelGet(); + tripViewModel.setMissionItems(missionItemServiceResponse.getResponseObject()); + tripViewModel.setAvailableTeams(availableTeamsServiceResponse.getResponseObject()); + tripViewModel.setAvailableCities(availableCitiesServiceResponse.getResponseObject()); + tripViewModel.setAvailableCountries(availableCountriesServiceResponse.getResponseObject()); + + + return ok(trips.render(currentUser, tripViewModel)); + } + + public Result toggleCurrentTripPost(int tripId) { + + CurrentUser currentUser = sessionService.getCurrentUserSession(); + + ServiceResponse tripItemUpdateServiceResponse = missionTripService.updateCurrentTrip(tripId); + if (tripItemUpdateServiceResponse.hasErrors()) { + throw new RuntimeException(); + } + + return ok(index.render(currentUser)); + } + + public Result tripsPost() { + + CurrentUser currentUser = sessionService.getCurrentUserSession(); + TripViewModelPost tripViewModelPost = tripViewModelPostForm.bindFromRequest().get(); + + //creating a new team or trip or city- + + //Create a new city if the user has entered the city and country + if (StringUtils.isNotNullOrWhiteSpace(tripViewModelPost.getNewCity()) && + StringUtils.isNotNullOrWhiteSpace(tripViewModelPost.getNewCityCountry())) { + + ServiceResponse newCityServiceResponse = missionTripService.createNewCity(tripViewModelPost.getNewCity(), tripViewModelPost.getNewCityCountry()); + if (newCityServiceResponse.hasErrors()) + throw new RuntimeException(); + } + + //Create a new team if the user has entered a team name + if (StringUtils.isNotNullOrWhiteSpace(tripViewModelPost.getNewTeamName())) { + + TeamItem teamItem = new TeamItem(); + teamItem.setName(tripViewModelPost.getNewTeamName()); + teamItem.setLocation(tripViewModelPost.getNewTeamLocation()); + teamItem.setDescription(tripViewModelPost.getNewTeamDescription()); + ServiceResponse newTeamItemServiceResponse = missionTripService.createNewTeam(teamItem); + if (newTeamItemServiceResponse.hasErrors()) + throw new RuntimeException(); + + } + + //create a new trip if the user has entered the information + if (StringUtils.isNotNullOrWhiteSpace(tripViewModelPost.getNewTripTeamName()) && + StringUtils.isNotNullOrWhiteSpace(tripViewModelPost.getNewTripCountry()) && + StringUtils.isNotNullOrWhiteSpace(tripViewModelPost.getNewTripCity()) && + tripViewModelPost.getNewTripStartDate() != null && + tripViewModelPost.getNewTripEndDate() != null) { + + TripItem tripItem = new TripItem(); + tripItem.setTeamName(tripViewModelPost.getNewTripTeamName()); + tripItem.setTripCity(tripViewModelPost.getNewTripCity()); + tripItem.setTripCountry(tripViewModelPost.getNewTripCountry()); + tripItem.setTripStartDate(tripViewModelPost.getNewTripStartDate()); + tripItem.setTripEndDate(tripViewModelPost.getNewTripEndDate()); + ServiceResponse newTripItemServiceResponse = missionTripService.createNewTrip(tripItem); + if (newTripItemServiceResponse.hasErrors()) + throw new RuntimeException(); + } + + return ok(index.render(currentUser)); + } + public Result tabsGet() { CurrentUser currentUser = sessionService.getCurrentUserSession(); ServiceResponse> response; - response = superuserService.getCustomTabs(false); + response = customTabService.getCustomTabs(false); if (response.hasErrors()) { throw new RuntimeException(); } @@ -55,7 +170,7 @@ public Result tabsGet() { viewModelGet.setCurrentTabs(response.getResponseObject()); //get deleted tabs - response = superuserService.getCustomTabs(true); + response = customTabService.getCustomTabs(true); if (response.hasErrors()) { throw new RuntimeException(); } @@ -72,11 +187,11 @@ public Result tabsPost() { if (StringUtils.isNotNullOrWhiteSpace(viewModelPost.getAddTabName())) { TabItem tabItem = new TabItem(); //new - if (!superuserService.doesTabExist(viewModelPost.getAddTabName()).getResponseObject()) { + if (!customTabService.doesTabExist(viewModelPost.getAddTabName()).getResponseObject()) { tabItem.setName(viewModelPost.getAddTabName()); if (viewModelPost.getAddTabLeft() != null) tabItem.setLeftColumnSize(viewModelPost.getAddTabLeft()); if (viewModelPost.getAddTabRight() != null) tabItem.setRightColumnSize(viewModelPost.getAddTabRight()); - ServiceResponse response = superuserService.createTab(tabItem, currentUser.getId()); + ServiceResponse response = customTabService.createTab(tabItem, currentUser.getId()); if (response.hasErrors()) { throw new RuntimeException(); } @@ -88,7 +203,7 @@ public Result tabsPost() { else tabItem.setRightColumnSize(viewModelPost.getAddTabRight()); tabItem.setName(viewModelPost.getAddTabName()); - ServiceResponse response = superuserService.editTab(tabItem, currentUser.getId()); + ServiceResponse response = customTabService.editTab(tabItem, currentUser.getId()); if (response.hasErrors()) { throw new RuntimeException(); } @@ -96,7 +211,7 @@ public Result tabsPost() { } //becomes toggle if (StringUtils.isNotNullOrWhiteSpace(viewModelPost.getDeleteTab())) { - ServiceResponse response = superuserService.toggleTab(viewModelPost.getDeleteTab()); + ServiceResponse response = customTabService.toggleTab(viewModelPost.getDeleteTab()); if (response.hasErrors()) { throw new RuntimeException(); } @@ -113,28 +228,28 @@ public Result contentGet(String name) { viewModelGet.setName(name); //get current custom fields - ServiceResponse> currentFieldItemsResponse = superuserService.getTabFields(name, false); + ServiceResponse> currentFieldItemsResponse = customTabService.getTabFieldsByTabName(name, false); if (currentFieldItemsResponse.hasErrors()) { throw new RuntimeException(); } viewModelGet.setCurrentCustomFieldItemList(currentFieldItemsResponse.getResponseObject()); //get removed custom fields - ServiceResponse> removedFieldItemsResponse = superuserService.getTabFields(name, true); + ServiceResponse> removedFieldItemsResponse = customTabService.getTabFieldsByTabName(name, true); if (currentFieldItemsResponse.hasErrors()) { throw new RuntimeException(); } viewModelGet.setRemovedCustomFieldItemList(removedFieldItemsResponse.getResponseObject()); //get available field types - ServiceResponse> fieldTypesResponse = superuserService.getTypes(); + ServiceResponse> fieldTypesResponse = customTabService.getTypes(); if (fieldTypesResponse.hasErrors()) { throw new RuntimeException(); } viewModelGet.setCustomFieldTypes(fieldTypesResponse.getResponseObject()); //get available fields sizes - ServiceResponse> fieldSizesResponse = superuserService.getSizes(); + ServiceResponse> fieldSizesResponse = customTabService.getSizes(); if (fieldSizesResponse.hasErrors()) { throw new RuntimeException(); } @@ -157,11 +272,11 @@ public Result contentPost(String name) { tabFieldItem.setOrder(viewModelPost.getAddOrder()); tabFieldItem.setPlaceholder(viewModelPost.getAddPlaceholder()); //edit - if (superuserService.doesTabFieldExist(viewModelPost.getAddName()).getResponseObject()) { - superuserService.editTabField(tabFieldItem); + if (customTabService.doesTabFieldExist(viewModelPost.getAddName()).getResponseObject()) { + customTabService.editTabField(tabFieldItem); } else { - ServiceResponse response = superuserService.createTabField(tabFieldItem, currentUser.getId(), name); + ServiceResponse response = customTabService.createTabField(tabFieldItem, currentUser.getId(), name); if (response.hasErrors()) { throw new RuntimeException(); } @@ -169,7 +284,7 @@ public Result contentPost(String name) { } //deactivating a field if (StringUtils.isNotNullOrWhiteSpace(viewModelPost.getToggleName())) { - ServiceResponse response = superuserService.toggleTabField(viewModelPost.getToggleName(), name); + ServiceResponse response = customTabService.toggleTabField(viewModelPost.getToggleName(), name); if (response.hasErrors()) { throw new RuntimeException(); } diff --git a/app/femr/ui/controllers/TriageController.java b/app/femr/ui/controllers/TriageController.java index 1d6bd513a..f0665c7e0 100644 --- a/app/femr/ui/controllers/TriageController.java +++ b/app/femr/ui/controllers/TriageController.java @@ -3,14 +3,11 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; -import femr.business.services.IPhotoService; -import femr.business.services.ISearchService; -import femr.business.services.ISessionService; -import femr.business.services.ITriageService; +import femr.business.services.core.*; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; import femr.common.models.SettingItem; -import femr.data.models.Roles; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.common.models.PatientEncounterItem; @@ -21,7 +18,6 @@ import femr.util.stringhelpers.StringUtils; import play.data.Form; import play.mvc.*; - import java.util.HashMap; import java.util.List; import java.util.Map; @@ -31,20 +27,27 @@ public class TriageController extends Controller { private final Form IndexViewModelForm = Form.form(IndexViewModelPost.class); - private ITriageService triageService; - private ISessionService sessionService; - private ISearchService searchService; - private IPhotoService photoService; + private final IEncounterService encounterService; + private final IPatientService patientService; + private final ISessionService sessionService; + private final ISearchService searchService; + private final IPhotoService photoService; + private final IVitalService vitalService; @Inject - public TriageController(ITriageService triageService, + public TriageController(IEncounterService encounterService, ISessionService sessionService, ISearchService searchService, - IPhotoService photoService) { - this.triageService = triageService; + IPatientService patientService, + IPhotoService photoService, + IVitalService vitalService) { + + this.encounterService = encounterService; this.sessionService = sessionService; this.searchService = searchService; + this.patientService = patientService; this.photoService = photoService; + this.vitalService = vitalService; } public Result indexGet() { @@ -52,7 +55,7 @@ public Result indexGet() { //retrieve all the vitals in the database so we can dynamically name //the vitals in the view - ServiceResponse> vitalServiceResponse = triageService.findAllVitalItems(); + ServiceResponse> vitalServiceResponse = vitalService.findAllVitalItems(); if (vitalServiceResponse.hasErrors()) { throw new RuntimeException(); } @@ -67,7 +70,7 @@ public Result indexGet() { } //get age classifications - ServiceResponse> patientAgeClassificationsResponse = triageService.findPossibleAgeClassifications(); + ServiceResponse> patientAgeClassificationsResponse = patientService.findPossibleAgeClassifications(); if (patientAgeClassificationsResponse.hasErrors()){ throw new RuntimeException(); } @@ -90,7 +93,7 @@ public Result indexPopulatedGet(int patientId) { CurrentUser currentUser = sessionService.getCurrentUserSession(); //retrieve vitals names for dynamic html element naming - ServiceResponse> vitalServiceResponse = triageService.findAllVitalItems(); + ServiceResponse> vitalServiceResponse = vitalService.findAllVitalItems(); if (vitalServiceResponse.hasErrors()) { throw new RuntimeException(); } @@ -109,7 +112,7 @@ public Result indexPopulatedGet(int patientId) { } //get age classifications - ServiceResponse> patientAgeClassificationsResponse = triageService.findPossibleAgeClassifications(); + ServiceResponse> patientAgeClassificationsResponse = patientService.findPossibleAgeClassifications(); if (patientAgeClassificationsResponse.hasErrors()){ throw new RuntimeException(); } @@ -137,9 +140,9 @@ public Result indexPost(int id) { PatientItem patientItem; if (id == 0) { patientItem = populatePatientItem(viewModel, currentUser); - patientServiceResponse = triageService.createPatient(patientItem); + patientServiceResponse = patientService.createPatient(patientItem); } else { - patientServiceResponse = triageService.findPatientAndUpdateSex(id, viewModel.getSex()); + patientServiceResponse = patientService.findPatientAndUpdateSex(id, viewModel.getSex()); } if (patientServiceResponse.hasErrors()) { throw new RuntimeException(); @@ -156,7 +159,7 @@ public Result indexPost(int id) { //create and save a new encounter PatientEncounterItem patientEncounterItem = populatePatientEncounterItem(viewModel.getChiefComplaint(), viewModel.getChiefComplaintsJSON(), viewModel.getWeeksPregnant(), currentUser, patientServiceResponse.getResponseObject().getId(), viewModel.getAgeClassification()); - ServiceResponse patientEncounterServiceResponse = triageService.createPatientEncounter(patientEncounterItem); + ServiceResponse patientEncounterServiceResponse = encounterService.createPatientEncounter(patientEncounterItem); if (patientEncounterServiceResponse.hasErrors()) { throw new RuntimeException(); } else { @@ -198,7 +201,7 @@ public Result indexPost(int id) { newVitals.put("glucose", viewModel.getGlucose().floatValue()); } - ServiceResponse> vitalServiceResponse = triageService.createPatientEncounterVitalItems(newVitals, currentUser.getId(), patientEncounterItem.getId()); + ServiceResponse> vitalServiceResponse = vitalService.createPatientEncounterVitalItems(newVitals, currentUser.getId(), patientEncounterItem.getId()); if (vitalServiceResponse.hasErrors()) { throw new RuntimeException(); } diff --git a/app/femr/ui/controllers/admin/AdminController.java b/app/femr/ui/controllers/admin/AdminController.java index 1823069e5..a12e568ea 100644 --- a/app/femr/ui/controllers/admin/AdminController.java +++ b/app/femr/ui/controllers/admin/AdminController.java @@ -19,9 +19,9 @@ package femr.ui.controllers.admin; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.business.services.ISessionService; -import femr.data.models.Roles; +import femr.common.dtos.CurrentUser; +import femr.business.services.core.ISessionService; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.views.html.admin.index; diff --git a/app/femr/ui/controllers/admin/ConfigureController.java b/app/femr/ui/controllers/admin/ConfigureController.java index 5d9d20e34..6cbb8a9ee 100644 --- a/app/femr/ui/controllers/admin/ConfigureController.java +++ b/app/femr/ui/controllers/admin/ConfigureController.java @@ -19,12 +19,12 @@ package femr.ui.controllers.admin; import com.google.inject.Inject; -import femr.business.services.IConfigureService; -import femr.business.services.ISessionService; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; -import femr.data.models.ISystemSetting; -import femr.data.models.Roles; +import femr.business.services.core.IConfigureService; +import femr.business.services.core.ISessionService; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; +import femr.data.models.core.ISystemSetting; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.models.admin.configure.IndexViewModelGet; diff --git a/app/femr/ui/controllers/admin/InventoryController.java b/app/femr/ui/controllers/admin/InventoryController.java index 712e73b9c..727bc40ca 100644 --- a/app/femr/ui/controllers/admin/InventoryController.java +++ b/app/femr/ui/controllers/admin/InventoryController.java @@ -19,17 +19,16 @@ package femr.ui.controllers.admin; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; -import femr.business.services.IInventoryService; -import femr.business.services.ISessionService; -import femr.data.models.Roles; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; +import femr.business.services.core.IInventoryService; +import femr.business.services.core.ISessionService; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.models.admin.inventory.InventoryViewModelGet; import femr.common.models.MedicationItem; import femr.ui.models.admin.inventory.InventoryViewModelPost; -import femr.ui.models.admin.users.CreateViewModel; import femr.ui.views.html.admin.inventory.index; import play.data.Form; import play.mvc.Controller; diff --git a/app/femr/ui/controllers/admin/UsersController.java b/app/femr/ui/controllers/admin/UsersController.java index d1737baa5..a349aea95 100644 --- a/app/femr/ui/controllers/admin/UsersController.java +++ b/app/femr/ui/controllers/admin/UsersController.java @@ -19,13 +19,13 @@ package femr.ui.controllers.admin; import com.google.inject.Inject; -import femr.common.dto.CurrentUser; -import femr.common.dto.ServiceResponse; -import femr.business.services.IRoleService; -import femr.business.services.ISessionService; -import femr.business.services.IUserService; +import femr.common.dtos.CurrentUser; +import femr.common.dtos.ServiceResponse; +import femr.business.services.core.IRoleService; +import femr.business.services.core.ISessionService; +import femr.business.services.core.IUserService; import femr.common.models.UserItem; -import femr.data.models.Roles; +import femr.data.models.mysql.Roles; import femr.ui.helpers.security.AllowedRoles; import femr.ui.helpers.security.FEMRAuthenticated; import femr.ui.models.admin.users.*; diff --git a/app/femr/ui/helpers/security/AllowedRolesAction.java b/app/femr/ui/helpers/security/AllowedRolesAction.java index 82440bea8..d119bf7e4 100644 --- a/app/femr/ui/helpers/security/AllowedRolesAction.java +++ b/app/femr/ui/helpers/security/AllowedRolesAction.java @@ -1,8 +1,8 @@ package femr.ui.helpers.security; import com.google.inject.Inject; -import femr.business.services.IUserService; -import femr.data.models.IRole; +import femr.business.services.core.IUserService; +import femr.data.models.core.IRole; import play.libs.F; import play.mvc.Action; import play.mvc.Http; diff --git a/app/femr/ui/models/admin/users/EditViewModel.java b/app/femr/ui/models/admin/users/EditViewModel.java index 26eff0370..41392e631 100644 --- a/app/femr/ui/models/admin/users/EditViewModel.java +++ b/app/femr/ui/models/admin/users/EditViewModel.java @@ -20,7 +20,6 @@ import femr.util.stringhelpers.StringUtils; import play.data.validation.ValidationError; - import java.util.ArrayList; import java.util.List; diff --git a/app/femr/ui/models/admin/users/IndexViewModelGet.java b/app/femr/ui/models/admin/users/IndexViewModelGet.java index 078cad869..a2b0c740d 100644 --- a/app/femr/ui/models/admin/users/IndexViewModelGet.java +++ b/app/femr/ui/models/admin/users/IndexViewModelGet.java @@ -18,7 +18,7 @@ */ package femr.ui.models.admin.users; -import femr.data.models.IUser; +import femr.data.models.core.IUser; import java.util.List; public class IndexViewModelGet { diff --git a/app/femr/ui/models/research/FilterViewModel.java b/app/femr/ui/models/research/FilterViewModel.java new file mode 100644 index 000000000..310268ceb --- /dev/null +++ b/app/femr/ui/models/research/FilterViewModel.java @@ -0,0 +1,136 @@ +package femr.ui.models.research; + +import play.data.validation.ValidationError; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.Map; + +public class FilterViewModel { + + private String primaryDataset; + private String secondaryDataset; + private String graphType; + private String startDate; + private String endDate; + private boolean groupPrimary; + private Integer groupFactor; + private Float rangeStart; + private Float rangeEnd; + private Integer medicationId; + private Map medicationsList; + + /* + public List validate() { + + List errors = new ArrayList(); + + if (primaryDataset == null || primaryDataset.length() == 0 ) { + errors.add(new ValidationError("primaryDataset", "Choose a primary dataset")); + } + + Date startDateObj; + Date endDateObj; + Date today = new Date(); + SimpleDateFormat sqlFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + + // Set Start Date to start of day + String startParseDate = startDate + " 00:00:00"; + startDateObj = sqlFormat.parse(startParseDate); + + // Set End Date to end of day + String parseEndDate = endDate + " 23:59:59"; + endDateObj = sqlFormat.parse(parseEndDate); + + } + catch(ParseException e){ + + startDateObj = new Date(); + endDateObj = new Date(); + } + + if( startDateObj.getTime() > endDateObj.getTime() ){ + + errors.add(new ValidationError("startDate", "Start Date cannot be after End Date")); + } + if( startDateObj.getTime() > today.getTime() ){ + + errors.add(new ValidationError("startDate", "Start Date cannot be in the future")); + } + if( endDateObj.getTime() > today.getTime() ){ + + errors.add(new ValidationError("endDate", "End Date cannot be in the future")); + } + + return errors.isEmpty() ? null : errors; + } + */ + + public String getPrimaryDataset() { + return primaryDataset; + } + + public void setPrimaryDataset(String primaryDataset) { + this.primaryDataset = primaryDataset; + } + + public String getSecondaryDataset() { + return secondaryDataset; + } + + public void setSecondaryDataset(String secondaryDataset) { + this.secondaryDataset = secondaryDataset; + } + + public String getGraphType() { + return graphType; + } + + public void setGraphType(String graphType) { + this.graphType = graphType; + } + + public String getStartDate() { + return startDate; + } + + public void setStartDate(String startDate) { + this.startDate = startDate; + } + + public String getEndDate() { + return endDate; + } + + public void setEndDate(String endDate) { + this.endDate = endDate; + } + + public boolean isGroupPrimary() { return groupPrimary; } + + public void setGroupPrimary(boolean groupPrimary) { this.groupPrimary = groupPrimary; } + + public Integer getGroupFactor() { return groupFactor; } + + public void setGroupFactor(Integer groupFactor) { this.groupFactor = groupFactor; } + + public Float getRangeStart() { return rangeStart; } + + public void setRangeStart(Float rangeStart) { this.rangeStart = rangeStart; } + + public Float getRangeEnd() { return rangeEnd; } + + public void setRangeEnd(Float rangeEnd) { this.rangeEnd = rangeEnd; } + + public Integer getMedicationId() { return medicationId; } + + public void setMedicationId(Integer medicationId) { this.medicationId = medicationId; } + + public Map getMedicationsList() { return medicationsList; } + + public void setMedicationsList(Map medicationsList) { this.medicationsList = medicationsList; } +} diff --git a/app/femr/ui/models/research/json/ResearchGraphDataItem.java b/app/femr/ui/models/research/json/ResearchGraphDataItem.java new file mode 100644 index 000000000..316e37b42 --- /dev/null +++ b/app/femr/ui/models/research/json/ResearchGraphDataItem.java @@ -0,0 +1,89 @@ +package femr.ui.models.research.json; + +import femr.common.models.ResearchItem; + +import java.util.List; +import java.util.Map; + +//technically shared in the service layer right now +public class ResearchGraphDataItem { + + private float average; + private float median; + private float rangeLow; + private float rangeHigh; + private List graphData; + private String xAxisTitle; + private String yAxisTitle; + private String unitOfMeasurement; + private Map primaryValuemap; + private Map secondaryValuemap; + + public float getAverage() { + return average; + } + + public void setAverage(float average) { + this.average = average; + } + + public float getMedian() { + return median; + } + + public void setMedian(float median) { + this.median = median; + } + + public float getRangeLow() { + return rangeLow; + } + + public void setRangeLow(float rangeLow) { + this.rangeLow = rangeLow; + } + + public float getRangeHigh() { + return rangeHigh; + } + + public void setRangeHigh(float rangeHigh) { + this.rangeHigh = rangeHigh; + } + + public String getxAxisTitle() { + return xAxisTitle; + } + + public void setxAxisTitle(String xAxisTitle) { + this.xAxisTitle = xAxisTitle; + } + + public String getyAxisTitle() { return yAxisTitle; } + + public void setyAxisTitle(String yAxisTitle) { this.yAxisTitle = yAxisTitle; } + + public String getUnitOfMeasurement() { + return unitOfMeasurement; + } + + public void setUnitOfMeasurement(String unitOfMeasurement) { + this.unitOfMeasurement = unitOfMeasurement; + } + + public List getGraphData() { + return graphData; + } + + public void setGraphData(List graphData) { + this.graphData = graphData; + } + + public Map getPrimaryValuemap() { return primaryValuemap; } + + public void setPrimaryValuemap(Map primaryValuemap) { this.primaryValuemap = primaryValuemap; } + + public Map getSecondaryValuemap() { return secondaryValuemap; } + + public void setSecondaryValuemap(Map secondaryValuemap) { this.secondaryValuemap = secondaryValuemap; } +} diff --git a/app/femr/ui/models/search/json/PatientSearch.java b/app/femr/ui/models/search/json/PatientSearch.java new file mode 100644 index 000000000..95f295b5d --- /dev/null +++ b/app/femr/ui/models/search/json/PatientSearch.java @@ -0,0 +1,28 @@ +package femr.ui.models.search.json; + +public class PatientSearch { + //an object designed to represent a patient while a user is searching + String id; + String firstName; + String lastName; + String age; + String photo;//the file location + + public void setId(String id){ + this.id = id; + } + public void setFirstName(String firstName){ + this.firstName = firstName; + } + public void setLastName(String lastName){ + this.lastName = lastName; + } + public void setAge(String age){ + this.age = age; + } + public void setPhoto(String photo){ + this.photo = photo; + } + + +} diff --git a/app/femr/ui/models/superuser/TripViewModelGet.java b/app/femr/ui/models/superuser/TripViewModelGet.java new file mode 100644 index 000000000..dd23192f9 --- /dev/null +++ b/app/femr/ui/models/superuser/TripViewModelGet.java @@ -0,0 +1,64 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.ui.models.superuser; + +import femr.common.models.CityItem; +import femr.common.models.MissionItem; + +import java.util.List; + +public class TripViewModelGet { + + private List missionItems; + private List availableTeams; + private List availableCities; + private List availableCountries; + + public List getMissionItems() { + return missionItems; + } + + public void setMissionItems(List missionItems) { + this.missionItems = missionItems; + } + + public List getAvailableTeams() { + return availableTeams; + } + + public void setAvailableTeams(List availableTeams) { + this.availableTeams = availableTeams; + } + + public List getAvailableCities() { + return availableCities; + } + + public void setAvailableCities(List availableCities) { + this.availableCities = availableCities; + } + + public List getAvailableCountries() { + return availableCountries; + } + + public void setAvailableCountries(List availableCountries) { + this.availableCountries = availableCountries; + } +} diff --git a/app/femr/ui/models/superuser/TripViewModelPost.java b/app/femr/ui/models/superuser/TripViewModelPost.java new file mode 100644 index 000000000..e74656f12 --- /dev/null +++ b/app/femr/ui/models/superuser/TripViewModelPost.java @@ -0,0 +1,129 @@ +/* + 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 . If + you have any questions, contact . +*/ +package femr.ui.models.superuser; + +import java.util.Date; + +public class TripViewModelPost { + + //add team + private String newTeamName; + private String newTeamLocation; + private String newTeamDescription; + + //add city + private String newCity; + private String newCityCountry; + + //add trip + private String newTripTeamName; + private String newTripCity; + private String newTripCountry; + private Date newTripStartDate; + private Date newTripEndDate; + private Integer currentTripIdToggle; + + public String getNewTeamName() { + return newTeamName; + } + + public void setNewTeamName(String newTeamName) { + this.newTeamName = newTeamName; + } + + public String getNewTeamLocation() { + return newTeamLocation; + } + + public void setNewTeamLocation(String newTeamLocation) { + this.newTeamLocation = newTeamLocation; + } + + public String getNewTeamDescription() { + return newTeamDescription; + } + + public void setNewTeamDescription(String newTeamDescription) { + this.newTeamDescription = newTeamDescription; + } + + public String getNewTripTeamName() { + return newTripTeamName; + } + + public void setNewTripTeamName(String newTripTeamName) { + this.newTripTeamName = newTripTeamName; + } + + public String getNewTripCity() { + return newTripCity; + } + + public void setNewTripCity(String newTripCity) { + this.newTripCity = newTripCity; + } + + public String getNewTripCountry() { + return newTripCountry; + } + + public void setNewTripCountry(String newTripCountry) { + this.newTripCountry = newTripCountry; + } + + public Date getNewTripStartDate() { + return newTripStartDate; + } + + public void setNewTripStartDate(Date newTripStartDate) { + this.newTripStartDate = newTripStartDate; + } + + public Date getNewTripEndDate() { + return newTripEndDate; + } + + public void setNewTripEndDate(Date newTripEndDate) { + this.newTripEndDate = newTripEndDate; + } + + public Integer getCurrentTripIdToggle() { + return currentTripIdToggle; + } + + public void setCurrentTripIdToggle(Integer currentTripIdToggle) { + this.currentTripIdToggle = currentTripIdToggle; + } + + public String getNewCity() { + return newCity; + } + + public void setNewCity(String newCity) { + this.newCity = newCity; + } + + public String getNewCityCountry() { + return newCityCountry; + } + + public void setNewCityCountry(String newCityCountry) { + this.newCityCountry = newCityCountry; + } +} diff --git a/app/femr/ui/views/admin/configure/index.scala.html b/app/femr/ui/views/admin/configure/index.scala.html index 83253ac4f..12112ff41 100644 --- a/app/femr/ui/views/admin/configure/index.scala.html +++ b/app/femr/ui/views/admin/configure/index.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, viewModel: femr.ui.models.admin.configure.IndexViewModelGet) +@(currentUser: femr.common.dtos.CurrentUser, viewModel: femr.ui.models.admin.configure.IndexViewModelGet) @import femr.ui.controllers.admin.routes.ConfigureController @import femr.ui.views.html.layouts.admin diff --git a/app/femr/ui/views/admin/index.scala.html b/app/femr/ui/views/admin/index.scala.html index f8ca98c4c..bb79a12d0 100644 --- a/app/femr/ui/views/admin/index.scala.html +++ b/app/femr/ui/views/admin/index.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser) +@(currentUser: femr.common.dtos.CurrentUser) @import femr.ui.views.html.layouts.admin diff --git a/app/femr/ui/views/admin/inventory/index.scala.html b/app/femr/ui/views/admin/inventory/index.scala.html index bdda7f4a2..04d2c04a3 100644 --- a/app/femr/ui/views/admin/inventory/index.scala.html +++ b/app/femr/ui/views/admin/inventory/index.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, viewModel: femr.ui.models.admin.inventory.InventoryViewModelGet) +@(currentUser: femr.common.dtos.CurrentUser, viewModel: femr.ui.models.admin.inventory.InventoryViewModelGet) @import femr.ui.controllers.admin.routes.InventoryController @@ -37,7 +37,7 @@

- +
diff --git a/app/femr/ui/views/admin/users/create.scala.html b/app/femr/ui/views/admin/users/create.scala.html index b06bcaf0f..026e22d90 100644 --- a/app/femr/ui/views/admin/users/create.scala.html +++ b/app/femr/ui/views/admin/users/create.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, form: play.data.Form[femr.ui.models.admin.users.CreateViewModel], messages: java.util.List[_ <: java.lang.String], availableRoles: java.util.List[_ <: java.lang.String]) +@(currentUser: femr.common.dtos.CurrentUser, form: play.data.Form[femr.ui.models.admin.users.CreateViewModel], messages: java.util.List[_ <: java.lang.String], availableRoles: java.util.List[_ <: java.lang.String]) @import views.html.helper.FieldConstructor @import femr.ui.views.html.partials.admin.inputFieldConstructor diff --git a/app/femr/ui/views/admin/users/edit.scala.html b/app/femr/ui/views/admin/users/edit.scala.html index 609590bd3..1ee67fb2f 100644 --- a/app/femr/ui/views/admin/users/edit.scala.html +++ b/app/femr/ui/views/admin/users/edit.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, form: play.data.Form[femr.ui.models.admin.users.EditViewModel], availableRoles: java.util.List[_ <: java.lang.String], messages: java.util.List[_ <: java.lang.String]) +@(currentUser: femr.common.dtos.CurrentUser, form: play.data.Form[femr.ui.models.admin.users.EditViewModel], availableRoles: java.util.List[_ <: java.lang.String], messages: java.util.List[_ <: java.lang.String]) @import views.html.helper.FieldConstructor @import femr.ui.views.html.partials.admin.inputFieldConstructor diff --git a/app/femr/ui/views/admin/users/manage.scala.html b/app/femr/ui/views/admin/users/manage.scala.html index 57c0de4fa..ecb6d7645 100644 --- a/app/femr/ui/views/admin/users/manage.scala.html +++ b/app/femr/ui/views/admin/users/manage.scala.html @@ -1,8 +1,8 @@ -@(currentUser: femr.common.dto.CurrentUser, viewModelGet: femr.ui.models.admin.users.ManageViewModelGet) -@import femr.ui.controllers.admin.routes.UsersController +@(currentUser: femr.common.dtos.CurrentUser, viewModelGet: femr.ui.models.admin.users.ManageViewModelGet) +@import femr.ui.controllers.admin.routes.UsersController @import femr.ui.views.html.layouts.admin -@import femr.ui.views.html.partials.admin._ +@import femr.ui.views.html.partials.admin.toggleButton @additionalStyles = { @@ -50,7 +50,13 @@ @viewModelGet.getUser(y - 1).getLastLoginDate - @toggleButton(viewModelGet.getUser(y - 1)) + @defining(viewModelGet.getUser(y - 1)) { user => + @if(user.getEmail != "admin") { + @toggleButton(!user.isDeleted, user.getId) + } + + } + } diff --git a/app/femr/ui/views/history/indexEncounter.scala.html b/app/femr/ui/views/history/indexEncounter.scala.html index a84cb103e..2e132be09 100644 --- a/app/femr/ui/views/history/indexEncounter.scala.html +++ b/app/femr/ui/views/history/indexEncounter.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, viewModel: femr.ui.models.history.IndexEncounterViewModel, viewModelMedical: femr.ui.models.history.IndexEncounterMedicalViewModel, viewModelPharmacy: femr.ui.models.history.IndexEncounterPharmacyViewModel) +@(currentUser: femr.common.dtos.CurrentUser, viewModel: femr.ui.models.history.IndexEncounterViewModel, viewModelMedical: femr.ui.models.history.IndexEncounterMedicalViewModel, viewModelPharmacy: femr.ui.models.history.IndexEncounterPharmacyViewModel) @import femr.ui.views.html.layouts.main @import femr.ui.views.html.partials.helpers.outputFloatOrNA diff --git a/app/femr/ui/views/history/indexPatient.scala.html b/app/femr/ui/views/history/indexPatient.scala.html index d65bdbf88..700b37f92 100644 --- a/app/femr/ui/views/history/indexPatient.scala.html +++ b/app/femr/ui/views/history/indexPatient.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, searchError: java.lang.Boolean, viewModel: femr.ui.models.history.IndexPatientViewModelGet, patientEncounters: List[_ <: femr.common.models.PatientEncounterItem]) +@(currentUser: femr.common.dtos.CurrentUser, searchError: java.lang.Boolean, viewModel: femr.ui.models.history.IndexPatientViewModelGet, patientEncounters: List[_ <: femr.common.models.PatientEncounterItem]) @import femr.ui.views.html.layouts.main @import femr.ui.views.html.partials.search diff --git a/app/femr/ui/views/home/index.scala.html b/app/femr/ui/views/home/index.scala.html index 985263a2d..27e13b578 100644 --- a/app/femr/ui/views/home/index.scala.html +++ b/app/femr/ui/views/home/index.scala.html @@ -1,18 +1,30 @@ -@(currentUser: femr.common.dto.CurrentUser) +@(currentUser: femr.common.dtos.CurrentUser) @import femr.ui.views.html.layouts.main + @additionalScripts = { + + + } + + @top = {
-
-

Welcome to fEMR 2.1.2, @currentUser.getFirstName!

+
+

Welcome to fEMR 2.1.3, @currentUser.getFirstName!

@*

This is a placeholder landing page. As more features are developed, this page will change over time.

*@

Please select a tab at the top to get started!

+ +

or

+

Search Below:

+
+ +
} -@main("Home", currentUser, outsideContainerTop = top) { +@main("Home", currentUser, outsideContainerTop = top, scripts = additionalScripts) { @*
    @for(role <- currentUser.getRoles) {
  • @role.getName
  • diff --git a/app/femr/ui/views/layouts/admin.scala.html b/app/femr/ui/views/layouts/admin.scala.html index 08b91c0e8..b0c10d181 100644 --- a/app/femr/ui/views/layouts/admin.scala.html +++ b/app/femr/ui/views/layouts/admin.scala.html @@ -1,6 +1,5 @@ @(title: String, - currentUser: femr.common.dto.CurrentUser, - menus: Html = Html(""), + currentUser: femr.common.dtos.CurrentUser, styles: Html = Html(""), scripts: Html = Html(""), message: Html = Html(""), @@ -11,6 +10,7 @@ @import femr.ui.controllers.admin.routes.UsersController @import femr.ui.controllers.admin.routes.ConfigureController @import femr.ui.controllers.admin.routes.InventoryController +@import femr.ui.controllers.routes.SuperuserController @* Add scripts to script variable, how? *@ @adminScripts = { @@ -31,13 +31,16 @@ Manage Users Add User + + Configure @if(currentUser.getEmail == "superuser"){ Inventory Tracking + + Trip Tracking + + Manage Tabs } - - Configure - @menus
diff --git a/app/femr/ui/views/layouts/main.scala.html b/app/femr/ui/views/layouts/main.scala.html index 8cf8bb3d8..7936c1908 100644 --- a/app/femr/ui/views/layouts/main.scala.html +++ b/app/femr/ui/views/layouts/main.scala.html @@ -1,4 +1,4 @@ -@(title: String, currentUser: femr.common.dto.CurrentUser = null, +@(title: String, currentUser: femr.common.dtos.CurrentUser = null, styles: Html = Html(""), scripts: Html = Html(""), outsideContainerTop: Html = Html(""), outsideContainerBottom: Html = Html(""), search: Html = Html(""))(content: Html) diff --git a/app/femr/ui/views/medical/edit.scala.html b/app/femr/ui/views/medical/edit.scala.html index 3b56cf6b5..476a4d330 100644 --- a/app/femr/ui/views/medical/edit.scala.html +++ b/app/femr/ui/views/medical/edit.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, viewModel: femr.ui.models.medical.EditViewModelGet) +@(currentUser: femr.common.dtos.CurrentUser, viewModel: femr.ui.models.medical.EditViewModelGet) @import femr.ui.controllers.routes.MedicalController @@ -15,6 +15,8 @@ } @additionalScripts = { + + diff --git a/app/femr/ui/views/medical/index.scala.html b/app/femr/ui/views/medical/index.scala.html index e4bae3174..98630046c 100644 --- a/app/femr/ui/views/medical/index.scala.html +++ b/app/femr/ui/views/medical/index.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser, message: java.lang.String, patientId: java.lang.Integer) +@(currentUser: femr.common.dtos.CurrentUser, message: java.lang.String, patientId: java.lang.Integer) @import femr.ui.controllers.routes.MedicalController @import femr.ui.views.html.layouts.main diff --git a/app/femr/ui/views/partials/admin/toggleButton.scala.html b/app/femr/ui/views/partials/admin/toggleButton.scala.html index 44f5030ea..d9988ca69 100644 --- a/app/femr/ui/views/partials/admin/toggleButton.scala.html +++ b/app/femr/ui/views/partials/admin/toggleButton.scala.html @@ -1,10 +1,7 @@ -@(user: femr.common.models.UserItem) +@(isDeactivate: java.lang.Boolean, id: java.lang.Integer) -@*Make sure you can't remove the master admin account*@ -@if(user.getEmail != "admin") { - @if(!user.isDeleted) { - - } else { - - } -} \ No newline at end of file +@if(isDeactivate) { + +} else { + +} diff --git a/app/femr/ui/views/partials/authenticated.scala.html b/app/femr/ui/views/partials/authenticated.scala.html index 24dd37a13..1069288f2 100644 --- a/app/femr/ui/views/partials/authenticated.scala.html +++ b/app/femr/ui/views/partials/authenticated.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser) +@(currentUser: femr.common.dtos.CurrentUser) @import femr.ui.views.partials.helpers.AuthenticatedPartialHelper @import femr.ui.controllers.routes.HomeController diff --git a/app/femr/ui/views/partials/footer.scala.html b/app/femr/ui/views/partials/footer.scala.html index 8ec69ccb1..a43d81765 100644 --- a/app/femr/ui/views/partials/footer.scala.html +++ b/app/femr/ui/views/partials/footer.scala.html @@ -1,4 +1,4 @@

-

fEMR 2.1.2 © 2014

+

fEMR 2.1.3 © 2015

\ No newline at end of file diff --git a/app/femr/ui/views/partials/header.scala.html b/app/femr/ui/views/partials/header.scala.html index 01fc1c059..b159bf101 100644 --- a/app/femr/ui/views/partials/header.scala.html +++ b/app/femr/ui/views/partials/header.scala.html @@ -1,4 +1,4 @@ -@(currentUser: femr.common.dto.CurrentUser = null) +@(currentUser: femr.common.dtos.CurrentUser = null) @import femr.ui.views.html.partials