Skip to content
Snippets Groups Projects
AddObstetricsAction.java 9.14 KiB
Newer Older
  • Learn to ignore specific revisions
  • HMoss's avatar
    HMoss committed
    package edu.ncsu.csc.itrust.action;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import edu.ncsu.csc.itrust.beans.FlagsBean;
    import edu.ncsu.csc.itrust.beans.HealthRecord;
    import edu.ncsu.csc.itrust.beans.ObstetricsRecordBean;
    import edu.ncsu.csc.itrust.beans.PatientBean;
    import edu.ncsu.csc.itrust.dao.DAOFactory;
    import edu.ncsu.csc.itrust.dao.mysql.AllergyDAO;
    import edu.ncsu.csc.itrust.dao.mysql.FlagsDAO;
    import edu.ncsu.csc.itrust.dao.mysql.HealthRecordsDAO;
    import edu.ncsu.csc.itrust.dao.mysql.ObstetricsRecordDAO;
    import edu.ncsu.csc.itrust.dao.mysql.PatientDAO;
    import edu.ncsu.csc.itrust.dao.mysql.PreExistingConditionsDAO;
    import edu.ncsu.csc.itrust.enums.DeliveryType;
    import edu.ncsu.csc.itrust.enums.FlagValue;
    import edu.ncsu.csc.itrust.enums.PregnancyStatus;
    import edu.ncsu.csc.itrust.enums.TransactionType;
    import edu.ncsu.csc.itrust.exception.FormValidationException;
    import edu.ncsu.csc.itrust.exception.ITrustException;
    import edu.ncsu.csc.itrust.validate.ObstetricsRecordValidator;
    /**
     * Used for add obstetrics record page (addObstetricsRecord.jsp). 
     * 
     * Very similar to {@link AddOfficeVisitAction}
     * 
     * 
     */
    public class AddObstetricsAction {
    	private ObstetricsRecordDAO obstetricsDAO;
    	private FlagsDAO flagsDAO;
    	private AllergyDAO allergyDAO;
    	private PreExistingConditionsDAO conditionsDAO;
    	private PatientDAO patientDAO;
    	private long loggedInMID;
    	private EventLoggingAction loggingAction;
    	private HealthRecordsDAO hDao;
    	private DAOFactory prodDAO;
    	
    	/**
    	 * Just the factory and logged in MID
    	 * 
    	 * @param factory
    	 * @param loggedInMID
    	 */
    	public AddObstetricsAction(DAOFactory factory, long loggedInMID) {
    		this.obstetricsDAO = factory.getObstetricsRecordDAO();
    		this.flagsDAO = factory.getFlagsDAO();
    		this.allergyDAO = factory.getAllergyDAO();
    		this.conditionsDAO = factory.getPreExistingConditionsDAO();
    		this.patientDAO = factory.getPatientDAO();
    		this.loggedInMID = loggedInMID;
    		this.loggingAction = new EventLoggingAction(factory);
    		this.hDao = new HealthRecordsDAO(factory);
    		this.prodDAO = factory;
    	}
    	
    	/**
    	 * Add a new obstetrics record
    	 * 
    	 * @param p ObstetricsRecordBean containing the info for the record to be created
    	 * @param flags FlagsBean ArrayList containing all flags manually set on the form that submitted this
    	 * @throws FormValidationException if the patient is not successfully validated
    	 * @throws ITrustException 
    	 */
    	public void addObstetricsRecord(ObstetricsRecordBean p, ArrayList<FlagsBean> flags) 
    			throws FormValidationException, ITrustException {
    		if (p != null) {
    			new ObstetricsRecordValidator().validate(p);
    			
    			List<ObstetricsRecordBean> initialBeans = null;
    			
    			//if not an office visit
    			if (!p.getPregnancyStatus().equals(PregnancyStatus.Office)) {
    				ObstetricsRecordBean bean = obstetricsDAO.getObstetricsRecordsByMIDLargestpregId(p.getMid());
    				if (bean == null || bean.getPregnancyStatus() == null) {
    					p.setPregId(0);
    				}
    				else {
    					p.setPregId(bean.getPregId() + 1);
    				}
    			}
    			//else, it is an office visit
    			else {
    				initialBeans = obstetricsDAO.getObstetricsRecordsByMIDPregStatus(
    						p.getMid(), PregnancyStatus.Initial.toString());
    				if (initialBeans == null || initialBeans.isEmpty()) {
    					throw new ITrustException("The patient chosen is not a current obstetrics patient");
    				}
    				else {
    					p.setPregId(initialBeans.get(0).getPregId());
    				}
    			}
    			
    			//add the obstetrics record to the database
    			obstetricsDAO.addObstetricsRecord(p);
    			
    			
    			boolean isTwins = false;
    			
    			//set the manual flags first to load from later and pull if twins is set
    			for (FlagsBean flag : flags) {
    				flag.setPregId(p.getPregId());
    				flagsDAO.setFlag(flag);
    				if (flag.getFlagValue() == FlagValue.Twins)
    					isTwins = flag.isFlagged();
    			}
    				
    			//Office Visit flags
    			if (p.getPregnancyStatus().equals(PregnancyStatus.Office)) {
    				//Weight flag processing
    				boolean setWeightFlag = false;
    				List<HealthRecord> records = hDao.getAllRecordsBeforeOVDate(p.getMid(), p.getLmp());
    				//can only do BMI calculations if a normal office visit (with height/weight) exists before LMP
    				if (records.isEmpty()) {
    					records = hDao.getAllHealthRecords(p.getMid());
    				} 
    				if (!records.isEmpty()) {
    					double height = records.get(0).getHeight();
    					double origWeight = records.get(0).getWeight();
    					double newWeight = p.getWeight();
    					
    					//calculate the original BMI
    					double origBMI = HealthRecord.calculateBMI(height, origWeight);
    					double weightChange = newWeight - origWeight;
    					
    					//find the expected weight offsets in BMI/weight tables
    					for (int i = 0; i < FlagsBean.WEIGHTGAINBMIBOUNDS.length; i++) {
    						//This is the correct upper bound
    						if (FlagsBean.WEIGHTGAINBMIBOUNDS[i] > origBMI) {
    							if (isTwins) {
    								//If not in expected twins range
    								if (FlagsBean.WeightGainTwinsBMIMin[i] > weightChange ||
    										FlagsBean.WeightGainTwinsBMIMax[i] < weightChange) {
    									setWeightFlag = true;								
    								}
    							} else {
    								//If not in expected range
    								if (FlagsBean.WEIGHTGAINBMIMIN[i] > weightChange ||
    										FlagsBean.WeightGainBMIMax[i] < weightChange) {
    									setWeightFlag = true;								
    								}
    							}					
    							break; //exit after computed
    						}
    					}
    				}
    				
    				//Set weight flag if needed
    				FlagsBean wFlag = new FlagsBean();
    				wFlag.setMid(p.getMid());
    				wFlag.setPregId(p.getPregId());
    				wFlag.setFlagValue(FlagValue.WeightChange);
    				wFlag = flagsDAO.getFlag(wFlag);
    				if (!wFlag.isFlagged()) {
    					wFlag.setFlagged(setWeightFlag);
    					flagsDAO.setFlag(wFlag);
    				}
    				
    				
    				//Set FHR flag if needed
    				FlagsBean fhrFlag = new FlagsBean();
    				fhrFlag.setMid(p.getMid());
    				fhrFlag.setPregId(p.getPregId());
    				fhrFlag.setFlagValue(FlagValue.AbnormalFHR);
    				fhrFlag = flagsDAO.getFlag(fhrFlag);
    				if (!fhrFlag.isFlagged()) {
    					if(p.getFhr() > FlagsBean.FHR_MAX_TRIGGER || ((p.getFhr() > 0) && (p.getFhr() < FlagsBean.FHR_MIN_TRIGGER))) {
    						fhrFlag.setFlagged(true);
    						flagsDAO.setFlag(fhrFlag);
    					}
    				}
    				
    				//Set BP flag if needed
    				FlagsBean bpFlag = new FlagsBean();
    				bpFlag.setMid(p.getMid());
    				bpFlag.setPregId(p.getPregId());
    				bpFlag.setFlagValue(FlagValue.HighBloodPressure);
    				bpFlag = flagsDAO.getFlag(bpFlag);
    				if (!bpFlag.isFlagged()) {
    					if(p.getBloodPressureS() > FlagsBean.SYS_BP_MAX_TRIGGER || p.getBloodPressureD() > FlagsBean.DIA_BP_MAX_TRIGGER) {
    						bpFlag.setFlagged(true);
    						flagsDAO.setFlag(bpFlag);
    					}
    				}
    			}
    			
    			//UC67: Allergies Flag			
    			FlagsBean allergiesFlag = new FlagsBean();
    			allergiesFlag.setFlagValue(FlagValue.MaternalAllergies);
    			allergiesFlag.setMid(p.getMid());
    			allergiesFlag.setPregId(p.getPregId());
    			allergiesFlag.setFlagged(!allergyDAO.getAllergies(p.getMid()).isEmpty()); //if not empty, have allergies
    			flagsDAO.setFlag(allergiesFlag);
    			
    			//Advanced maternal age flag
    			PatientBean chosenPatient = patientDAO.getPatient(p.getMid());
    			if (chosenPatient.getAge() > 35) {
    				FlagsBean advancedMaternalAge = new FlagsBean();
    				advancedMaternalAge.setMid(p.getMid());
    				advancedMaternalAge.setPregId(p.getPregId());
    				advancedMaternalAge.setFlagValue(FlagValue.AdvancedMaternalAge);
    				advancedMaternalAge.setFlagged(true);
    				flagsDAO.setFlag(advancedMaternalAge);
    			}
    			
    			//Rh- flag
    			if (chosenPatient.getBloodType().toString().contains("-")) {
    				FlagsBean rhNeg = new FlagsBean();
    				rhNeg.setMid(p.getMid());
    				rhNeg.setPregId(p.getPregId());
    				rhNeg.setFlagValue(FlagValue.rhNeg);
    				rhNeg.setFlagged(true);
    			 	flagsDAO.setFlag(rhNeg);
    			}
    			
    			//Genetic miscarriage flag
    			ViewObstetricsAction viewObstetrics = new ViewObstetricsAction(prodDAO, loggedInMID);
    			List<ObstetricsRecordBean> priorPregnancies = viewObstetrics.getViewableObstetricsRecordsByMIDType(p.getMid(), PregnancyStatus.Complete);
    			int priorMiscarriageCount = 0;
    			for (ObstetricsRecordBean prior : priorPregnancies) {
    				if(prior.getDeliveryType().equals(DeliveryType.Miscarriage)) {
    					priorMiscarriageCount++;
    				}
    			}
    			if (priorMiscarriageCount > 1) {
    				FlagsBean miscarriage = new FlagsBean();
    				miscarriage.setMid(p.getMid());
    				miscarriage.setPregId(p.getPregId());
    				miscarriage.setFlagValue(FlagValue.GeneticMiscarriage);
    				miscarriage.setFlagged(true);
    				flagsDAO.setFlag(miscarriage);
    			}
    			
    			//Pre-existing conditions flag
    			List<String> conditions = conditionsDAO.getConditionsByMID(p.getMid());
    			if (!conditions.isEmpty()) {
    				FlagsBean conds = new FlagsBean();
    				conds.setMid(p.getMid());
    				conds.setPregId(p.getPregId());
    				conds.setFlagValue(FlagValue.PreExistingConditions);
    				conds.setFlagged(true);
    				flagsDAO.setFlag(conds);
    			}
    			
    			if (p.getPregnancyStatus().equals(PregnancyStatus.Initial)) {
    				loggingAction.logEvent(TransactionType.parse(6300), loggedInMID, 
    						p.getMid(), "Initial Obstetrics Record " +  p.getOid() + " added");
    			}
    			else if (p.getPregnancyStatus().equals(PregnancyStatus.Office)) {
    				loggingAction.logEvent(TransactionType.parse(6400), loggedInMID, 
    						p.getMid(), "Obstetrics Office Visit " +  p.getOid() + " added");
    			}
    		}
    		else {
    			throw new ITrustException("Cannot add a null Obstetrics Record.");
    		}
    	}
    }