Skip to content
Snippets Groups Projects
EditObstetricsAction.java 6.35 KiB
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.dao.DAOFactory;
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.enums.FlagValue;
import edu.ncsu.csc.itrust.enums.PregnancyStatus;
import edu.ncsu.csc.itrust.enums.TransactionType;
import edu.ncsu.csc.itrust.exception.DBException;
import edu.ncsu.csc.itrust.exception.FormValidationException;
import edu.ncsu.csc.itrust.exception.ITrustException;
import edu.ncsu.csc.itrust.validate.ObstetricsRecordValidator;

public class EditObstetricsAction {
    private ObstetricsRecordDAO obstetricsDAO;
    private FlagsDAO flagsDAO;
    private long loggedInMID;
    private EventLoggingAction loggingAction;
    private HealthRecordsDAO hDao;
    
    /**
	 * Just the factory and logged in MID
	 * 
	 * @param factory
	 * @param loggedInMID
	 */
	public EditObstetricsAction(DAOFactory factory, long loggedInMID) {
		this.obstetricsDAO = factory.getObstetricsRecordDAO();
		this.flagsDAO = factory.getFlagsDAO();
		this.loggedInMID = loggedInMID;
		this.loggingAction = new EventLoggingAction(factory);
		this.hDao = new HealthRecordsDAO(factory);
	}
    
	public void updateFhrFlag(ObstetricsRecordBean p) throws DBException {
		List<ObstetricsRecordBean> lst = obstetricsDAO.getObstetricsRecordsByMID(loggedInMID);
		
		//Get the current flag bean
		FlagsBean f = new FlagsBean();
		f.setMid(p.getMid());
		f.setPregId(p.getPregId());
		f.setFlagValue(FlagValue.AbnormalFHR);
		f = flagsDAO.getFlag(f);
		
		boolean setFlag = false;
		for (ObstetricsRecordBean r : lst) {
			if(r.getFhr() > FlagsBean.FHR_MAX_TRIGGER || r.getFhr() < FlagsBean.FHR_MIN_TRIGGER) {
				setFlag = true;
			}
		}
		
		f.setFlagged(setFlag);
		flagsDAO.setFlag(f);
	}
	
    public void editObstetricsRecord(long oid, ObstetricsRecordBean p, ArrayList<FlagsBean> flags)
    		throws FormValidationException, ITrustException {
    	if (p != null) {
    		List<ObstetricsRecordBean> initialBeans = obstetricsDAO.getObstetricsRecordsByMIDPregStatus(
					p.getMid(), PregnancyStatus.Initial.toString());
			if (initialBeans == null || initialBeans.isEmpty()) {
				throw new ITrustException("Invalid office visit to edit.");
			}
			else {
				p.setPregId(initialBeans.get(0).getPregId());
			}
    		new ObstetricsRecordValidator().validate(p);
    		//TODO set the calculation flags

	    	obstetricsDAO.editObstetricsRecord(p.getOid(), 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();
			}
	    	
	    	//Download the list of office visits for this patient
	    	List<ObstetricsRecordBean> visits = obstetricsDAO.getObstetricsRecordsByMIDPregStatus(
					p.getMid(), PregnancyStatus.Office.toString());
	    	
	    	//Get FHR flag
			FlagsBean fhrFlag = new FlagsBean();
			fhrFlag.setMid(p.getMid());
			fhrFlag.setPregId(p.getPregId());
			fhrFlag.setFlagValue(FlagValue.AbnormalFHR);
			fhrFlag = flagsDAO.getFlag(fhrFlag);
			fhrFlag.setFlagged(false);
			
			//Get BP flag
			FlagsBean bpFlag = new FlagsBean();
			bpFlag.setMid(p.getMid());
			bpFlag.setPregId(p.getPregId());
			bpFlag.setFlagValue(FlagValue.HighBloodPressure);
			bpFlag = flagsDAO.getFlag(bpFlag);
			bpFlag.setFlagged(false);
			
			//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());
			} 
			
			//check if any record trigges any flags
			for (ObstetricsRecordBean bean : visits){	
				
				//Do weight gain stuff
				if (!records.isEmpty() && !setWeightFlag) {
					double height = records.get(0).getHeight();
					double origWeight = records.get(0).getWeight();
					double newWeight = p.getWeight();
					
					//caluclate the original BMI
					double origBMI = HealthRecord.calculateBMI(height, origWeight);
					double weightChange = newWeight - origWeight;
					double scaler = ((double)(p.getDateVisit().getTime() - p.getLmp().getTime())) / ((double)(p.getEdd().getTime() - p.getLmp().getTime()));
					
					//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] * scaler > weightChange ||
										FlagsBean.WeightGainTwinsBMIMax[i] < weightChange) {
									setWeightFlag = true;								
								}
							} else {
								//If not in expected range
								if (FlagsBean.WEIGHTGAINBMIMIN[i] * scaler > weightChange ||
										FlagsBean.WeightGainBMIMax[i] < weightChange) {
									setWeightFlag = true;								
								}
							}					
							break; //exit after computed
						}
					}
				}
				
				//do fhr stuff
				if (!fhrFlag.isFlagged()) {
					if(bean.getFhr() > FlagsBean.FHR_MAX_TRIGGER || bean.getFhr() < FlagsBean.FHR_MIN_TRIGGER) {
						fhrFlag.setFlagged(true);
					}
				}
				
				//do bp stuff
				if (!bpFlag.isFlagged()) {
					if(bean.getBloodPressureS() > FlagsBean.SYS_BP_MAX_TRIGGER || bean.getBloodPressureD() > FlagsBean.DIA_BP_MAX_TRIGGER) {
						bpFlag.setFlagged(true);
						
					}
				}
	    	}
			flagsDAO.setFlag(fhrFlag);
			flagsDAO.setFlag(bpFlag);
			
			//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);
			wFlag.setFlagged(setWeightFlag);
			flagsDAO.setFlag(wFlag);
			
	    	loggingAction.logEvent(TransactionType.parse(6402), loggedInMID, 
					p.getMid(), "Obstetrics Office Visit " +  p.getOid() + " edited by " + loggedInMID);
    	}
    	else {
			throw new ITrustException("Cannot edit a null Obstetrics Record.");
		}
    }
}