/* fEMR - fast Electronic Medical Records Copyright (C) 2014 Team fEMR fEMR is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. fEMR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with fEMR. If not, see <http://www.gnu.org/licenses/>. If you have any questions, contact <info@teamfemr.org>. */ package femr.data; import com.avaje.ebean.Ebean; import com.google.inject.Inject; import femr.business.services.core.IEncounterService; import femr.data.models.core.*; import femr.util.calculations.dateUtils; import femr.util.stringhelpers.StringUtils; import org.joda.time.DateTime; import javax.inject.Provider; import java.util.Date; import java.util.List; /** * Responsible for creating model objects (data/models). * Only visible to data & service layer. */ public class DataModelMapper implements IDataModelMapper{ private final Provider<IChiefComplaint> chiefComplaintProvider; private final Provider<IMedication> medicationProvider; private final Provider<IMedicationGeneric> medicationGenericProvider; private final Provider<IMedicationGenericStrength> medicationGenericStrengthProvider; private final Provider<IConceptMedicationUnit> conceptMedicationUnitProvider; private final Provider<IConceptPrescriptionAdministration> conceptPrescriptionAdministrationProvider; private final Provider<IConceptMedicationForm> conceptMedicationFormProvider; private final Provider<IMedicationInventory> medicationInventoryProvider; private final Provider<IMissionCity> missionCityProvider; private final Provider<IMissionTeam> missionTeamProvider; private final Provider<IMissionTrip> missionTripProvider; private final Provider<IPatient> patientProvider; private final Provider<IPatientAgeClassification> patientAgeClassificationProvider; private final Provider<IPatientEncounter> patientEncounterProvider; private final Provider<IPatientEncounterTabField> patientEncounterTabFieldProvider; private final Provider<IPatientEncounterVital> patientEncounterVitalProvider; private final Provider<IPatientPrescription> patientPrescriptionProvider; private final Provider<IPatientPrescriptionReplacement> patientPrescriptionReplacementProvider; private final Provider<IPatientPrescriptionReplacementReason> patientPrescriptionReplacementReasonProvider; private final Provider<IPhoto> photoProvider; private final Provider<IRole> roleProvider; private final Provider<ITabField> tabFieldProvider; private final Provider<ITabFieldSize> tabFieldSizeProvider; private final Provider<ITabFieldType> tabFieldTypeProvider; private final Provider<ITab> tabProvider; private final Provider<IVital> vitalProvider; private final Provider<IUser> userProvider; @Inject public DataModelMapper(Provider<IChiefComplaint> chiefComplaintProvider, Provider<IMedication> medicationProvider, Provider<IMedicationGeneric> medicationGenericProvider, Provider<IConceptMedicationForm> conceptMedicationFormProvider, Provider<IMedicationGenericStrength> medicationGenericStrengthProvider, Provider<IConceptMedicationUnit> conceptMedicationUnitProvider, Provider<IConceptPrescriptionAdministration> conceptPrescriptionAdministrationProvider, Provider<IMedicationInventory> medicationInventoryProvider, Provider<IMissionCity> missionCityProvider, Provider<IMissionTeam> missionTeamProvider, Provider<IMissionTrip> missionTripProvider, Provider<IPatient> patientProvider, Provider<IPatientAgeClassification> patientAgeClassificationProvider, Provider<IPatientEncounter> patientEncounterProvider, Provider<IPatientEncounterTabField> patientEncounterTabFieldProvider, Provider<IPatientEncounterVital> patientEncounterVitalProvider, Provider<IPatientPrescription> patientPrescriptionProvider, Provider<IPatientPrescriptionReplacement> patientPrescriptionReplacementProvider, Provider<IPatientPrescriptionReplacementReason> patientPrescriptionReplacementReasonProvider, Provider<IPhoto> photoProvider, Provider<IRole> roleProvider, Provider<ITabField> tabFieldProvider, Provider<ITabFieldSize> tabFieldSizeProvider, Provider<ITabFieldType> tabFieldTypeProvider, Provider<ITab> tabProvider, Provider<IUser> userProvider, Provider<IVital> vitalProvider) { this.chiefComplaintProvider = chiefComplaintProvider; this.patientEncounterProvider = patientEncounterProvider; this.medicationProvider = medicationProvider; this.medicationGenericProvider = medicationGenericProvider; this.conceptPrescriptionAdministrationProvider = conceptPrescriptionAdministrationProvider; this.conceptMedicationFormProvider = conceptMedicationFormProvider; this.medicationGenericStrengthProvider = medicationGenericStrengthProvider; this.conceptMedicationUnitProvider = conceptMedicationUnitProvider; this.medicationInventoryProvider = medicationInventoryProvider; this.missionCityProvider = missionCityProvider; this.missionTeamProvider = missionTeamProvider; this.missionTripProvider = missionTripProvider; this.patientProvider = patientProvider; this.patientAgeClassificationProvider = patientAgeClassificationProvider; this.patientEncounterTabFieldProvider = patientEncounterTabFieldProvider; this.patientEncounterVitalProvider = patientEncounterVitalProvider; this.patientPrescriptionProvider = patientPrescriptionProvider; this.patientPrescriptionReplacementProvider = patientPrescriptionReplacementProvider; this.patientPrescriptionReplacementReasonProvider = patientPrescriptionReplacementReasonProvider; this.photoProvider = photoProvider; this.roleProvider = roleProvider; this.tabFieldProvider = tabFieldProvider; this.tabFieldSizeProvider = tabFieldSizeProvider; this.tabFieldTypeProvider = tabFieldTypeProvider; this.tabProvider = tabProvider; this.userProvider = userProvider; this.vitalProvider = vitalProvider; } /** * {@inheritDoc} */ @Override public IChiefComplaint createChiefComplaint(String value, int patientEncounterId, Integer sortOrder) { if (StringUtils.isNullOrWhiteSpace(value)) { return null; } IChiefComplaint chiefComplaint = chiefComplaintProvider.get(); chiefComplaint.setValue(value); chiefComplaint.setPatientEncounter(Ebean.getReference(patientEncounterProvider.get().getClass(), patientEncounterId)); chiefComplaint.setSortOrder(sortOrder); return chiefComplaint; } /** * {@inheritDoc} */ @Override public IMedication createMedication(String name) { if (StringUtils.isNullOrWhiteSpace(name)) { return null; } IMedication medication = medicationProvider.get(); medication.setName(name); medication.setIsDeleted(false); return medication; } /** * {@inheritDoc} */ @Override public IMedication createMedication(String name, List<IMedicationGenericStrength> medicationGenericStrengths, IConceptMedicationForm conceptMedicationForm) { IMedication medication = medicationProvider.get(); medication.setName(name); medication.setIsDeleted(false); medication.setMedicationGenericStrengths(medicationGenericStrengths); medication.setConceptMedicationForm(conceptMedicationForm); return medication; } /** * {@inheritDoc} */ @Override public IMedicationGenericStrength createMedicationGenericStrength(Double value, boolean isDenominator, int activeDrugUnitId, IMedicationGeneric medicationGeneric) { IMedicationGenericStrength medicationGenericStrength = medicationGenericStrengthProvider.get(); medicationGenericStrength.setValue(value); medicationGenericStrength.setDenominator(isDenominator); medicationGenericStrength.setConceptMedicationUnit(Ebean.getReference(conceptMedicationUnitProvider.get().getClass(), activeDrugUnitId)); medicationGenericStrength.setMedicationGeneric(medicationGeneric); return medicationGenericStrength; } /** * {@inheritDoc} */ @Override public IMedicationGeneric createMedicationActiveDrugName(String name) { if (StringUtils.isNullOrWhiteSpace(name)) { return null; } IMedicationGeneric medicationGeneric = medicationGenericProvider.get(); medicationGeneric.setName(name); return medicationGeneric; } /** * {@inheritDoc} */ @Override public IConceptMedicationForm createConceptMedicationForm(String name) { if (StringUtils.isNullOrWhiteSpace(name)) { return null; } IConceptMedicationForm conceptMedicationForm = conceptMedicationFormProvider.get(); conceptMedicationForm.setName(name); conceptMedicationForm.setIsDeleted(false); return conceptMedicationForm; } /** * {@inheritDoc} */ @Override public IMedicationInventory createMedicationInventory(int quantityCurrent, int quantityTotal, int medicationId, int missionTripId) { IMedicationInventory medicationInventory; try{ medicationInventory = medicationInventoryProvider.get(); medicationInventory.setMedication(Ebean.getReference(medicationProvider.get().getClass(), medicationId)); medicationInventory.setMissionTrip(Ebean.getReference(missionTripProvider.get().getClass(), missionTripId)); medicationInventory.setQuantityCurrent(quantityCurrent); medicationInventory.setQuantityInitial(quantityTotal); }catch(Exception ex){ medicationInventory = null; } return medicationInventory; } /** * {@inheritDoc} */ @Override 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; } /** * {@inheritDoc} */ @Override 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; } /** * {@inheritDoc} */ @Override public IMissionTrip createMissionTrip(Date startDate, Date endDate, IMissionCity missionCity, IMissionTeam missionTeam) { if (startDate == null || endDate == null || missionCity == null || missionTeam == null) { return null; } IMissionTrip missionTrip = missionTripProvider.get(); missionTrip.setStartDate(startDate); missionTrip.setEndDate(endDate); missionTrip.setMissionCity(missionCity); missionTrip.setMissionTeam(missionTeam); return missionTrip; } /** * {@inheritDoc} */ @Override public IPatient createPatient(int userID, String firstName, String lastName, String phoneNumber, Date birthday, String sex, String address, String city, Integer photoID) { if (StringUtils.isNullOrWhiteSpace(firstName) || StringUtils.isNullOrWhiteSpace(lastName) || StringUtils.isNullOrWhiteSpace(city)) { return null; } IPatient patient = patientProvider.get(); patient.setUserId(userID); patient.setFirstName(firstName); patient.setLastName(lastName); if (StringUtils.isNotNullOrWhiteSpace(phoneNumber)) patient.setPhoneNumber(phoneNumber); if (birthday != null) patient.setAge(birthday); patient.setSex(sex); patient.setAddress(address); patient.setCity(city); if (photoID != null) patient.setPhoto(Ebean.getReference(photoProvider.get().getClass(), photoID)); return patient; } /** * {@inheritDoc} */ @Override public IPatientEncounter createPatientEncounter(int patientID, DateTime date, int userId, Integer patientAgeClassificationId, Integer tripId) { if (patientID < 1 || userId < 1 || date == null) { return null; } IPatientEncounter patientEncounter = patientEncounterProvider.get(); patientEncounter.setDateOfTriageVisit(date); //provide a proxy patient for the encounter patientEncounter.setPatient(Ebean.getReference(patientProvider.get().getClass(), patientID)); patientEncounter.setNurse(Ebean.getReference(userProvider.get().getClass(), userId)); if (patientAgeClassificationId != null) patientEncounter.setPatientAgeClassification(Ebean.getReference(patientAgeClassificationProvider.get().getClass(), patientAgeClassificationId)); if (tripId != null) patientEncounter.setMissionTrip(Ebean.getReference(missionTripProvider.get().getClass(), tripId)); return patientEncounter; } /** * {@inheritDoc} */ @Override public IPatientEncounterTabField createPatientEncounterTabField(int tabFieldId, int userId, String value, int encounterId, DateTime dateTaken, Integer chiefComplaintId) { if (tabFieldId < 1 || userId < 1 || StringUtils.isNullOrWhiteSpace(value) || encounterId < 1 || dateTaken == null) { return null; } IPatientEncounterTabField patientEncounterTabField = patientEncounterTabFieldProvider.get(); patientEncounterTabField.setDateTaken(dateTaken); patientEncounterTabField.setUserId(userId); patientEncounterTabField.setPatientEncounterId(encounterId); patientEncounterTabField.setTabField(Ebean.getReference(tabFieldProvider.get().getClass(), tabFieldId)); patientEncounterTabField.setTabFieldValue(value); if (chiefComplaintId != null) patientEncounterTabField.setChiefComplaint(Ebean.getReference(chiefComplaintProvider.get().getClass(), chiefComplaintId)); return patientEncounterTabField; } /** * {@inheritDoc} */ @Override public IPatientEncounterVital createPatientEncounterVital(int encounterId, int userId, String time, int vitalID, float value) { if (encounterId < 1 || userId < 1 || StringUtils.isNullOrWhiteSpace(time) || vitalID < 1) { return null; } IPatientEncounterVital patientEncounterVital = patientEncounterVitalProvider.get(); patientEncounterVital.setPatientEncounterId(encounterId); patientEncounterVital.setUserId(userId); patientEncounterVital.setDateTaken(time); patientEncounterVital.setVital(Ebean.getReference(vitalProvider.get().getClass(), vitalID)); patientEncounterVital.setVitalValue(value); return patientEncounterVital; } /** * {@inheritDoc} */ @Override public IPatientPrescription createPatientPrescription(Integer amount, int medicationId, Integer medicationAdministrationId, int userId, int encounterId, DateTime dateDispensed, boolean isCounseled) { IPatientPrescription patientPrescription = patientPrescriptionProvider.get(); patientPrescription.setAmount(amount); patientPrescription.setDateTaken(dateUtils.getCurrentDateTime()); patientPrescription.setPatientEncounter(Ebean.getReference(patientEncounterProvider.get().getClass(), encounterId)); patientPrescription.setMedication(Ebean.getReference(medicationProvider.get().getClass(), medicationId)); if (medicationAdministrationId != null) patientPrescription.setConceptPrescriptionAdministration(Ebean.getReference(conceptPrescriptionAdministrationProvider.get().getClass(), medicationAdministrationId)); patientPrescription.setPhysician(Ebean.getReference(userProvider.get().getClass(), userId)); patientPrescription.setDateDispensed(dateDispensed); patientPrescription.setCounseled(isCounseled); return patientPrescription; } /** * {@inheritDoc} */ @Override public IPatientPrescriptionReplacement createPatientPrescriptionReplacement(int originalId, int replacementId, int reasonId){ IPatientPrescriptionReplacement patientPrescriptionReplacement = patientPrescriptionReplacementProvider.get(); patientPrescriptionReplacement.setOriginalPrescription(Ebean.getReference(patientPrescriptionProvider.get().getClass(), originalId)); patientPrescriptionReplacement.setReplacementPrescription(Ebean.getReference(patientPrescriptionProvider.get().getClass(), replacementId)); patientPrescriptionReplacement.setPatientPrescriptionReplacementReason(Ebean.getReference(patientPrescriptionReplacementReasonProvider.get().getClass(), reasonId)); return patientPrescriptionReplacement; } /** * {@inheritDoc} */ @Override public IPhoto createPhoto(String description, String filePath, byte[] photoData) { if (StringUtils.isNullOrWhiteSpace(filePath)) { //this happens when defining the photo name //because you have to create the photo before //defining the file path filePath = ""; } IPhoto photo = photoProvider.get(); if (StringUtils.isNullOrWhiteSpace(description)) photo.setDescription(""); else photo.setDescription(description); photo.setFilePath(filePath); if(photoData != null) photo.setPhotoBlob(photoData); return photo; } /** * {@inheritDoc} */ @Override public IRole createRole(String name) { // @TODO - Check for null name IRole role = roleProvider.get(); role.setName(name); return role; } /** * {@inheritDoc} */ @Override public ITab createTab(DateTime date, int leftSize, int rightSize, String name, boolean isDeleted, int userId) { if (date == null || StringUtils.isNullOrWhiteSpace(name) || userId < 1) { return null; } ITab tab = tabProvider.get(); tab.setDateCreated(date); tab.setIsDeleted(isDeleted); tab.setLeftColumnSize(leftSize); tab.setRightColumnSize(rightSize); tab.setName(name); tab.setUserId(userId); //this will always be true if a tab is being programmatically created by a user tab.setIsCustom(true); return tab; } /** * {@inheritDoc} */ @Override public ITabField createTabField(String name, Integer order, String placeholder, boolean isDeleted, int tabFieldSizeID, int tabFieldTypeID, int tabID) { if (StringUtils.isNullOrWhiteSpace(name)) { return null; } ITabField tabField = tabFieldProvider.get(); tabField.setIsDeleted(isDeleted); tabField.setName(name); tabField.setOrder(order); tabField.setPlaceholder(placeholder); tabField.setTabFieldSize(Ebean.getReference(tabFieldSizeProvider.get().getClass(), tabFieldSizeID)); tabField.setTabFieldType(Ebean.getReference(tabFieldTypeProvider.get().getClass(), tabFieldTypeID)); tabField.setTab(Ebean.getReference(tabProvider.get().getClass(), tabID)); return tabField; } /** * {@inheritDoc} */ @Override public IUser createUser(String firstName, String lastName, String email, DateTime date, String notes, String password, boolean isDeleted, boolean isPasswordReset, List<? extends IRole> roles, int userId) { if (StringUtils.isNullOrWhiteSpace(firstName) || StringUtils.isNullOrWhiteSpace(password) || StringUtils.isNullOrWhiteSpace(email) || date == null || roles == null || roles.size() < 1) { return null; } IUser user = userProvider.get(); user.setFirstName(firstName); user.setLastName(lastName); user.setEmail(email); user.setPassword(password); user.setLastLogin(date); user.setDeleted(isDeleted); user.setPasswordReset(isPasswordReset); user.setNotes(notes); user.setRoles(roles); user.setPasswordCreatedDate(date); user.setDateCreated(date); user.setCreatedBy(userId); return user; } /** * {@inheritDoc} */ @Override public IUser createUser(int userId) { return Ebean.getReference(userProvider.get().getClass(), userId); } /** * {@inheritDoc} */ @Override public IPatientEncounter updatePatientEncounterWithDiabetesScreening(IPatientEncounter patientEncounter, int diabetesScreenerId, Boolean isDiabetesScreened){ if (patientEncounter == null){ return null; } //if screening was performed, set date and screener else if (isDiabetesScreened) { patientEncounter.setDateOfDiabeteseScreen(dateUtils.getCurrentDateTime()); patientEncounter.setDiabetesScreener(Ebean.getReference(userProvider.get().getClass(), diabetesScreenerId)); } //note whether screening was performed or not patientEncounter.setIsDiabetesScreened(isDiabetesScreened); return patientEncounter; } }