/**
* This Source Code Form is subject to the terms of the Mozilla Public License,
* v. 2.0. If a copy of the MPL was not distributed with this file, You can
* obtain one at http://mozilla.org/MPL/2.0/. OpenMRS is also distributed under
* the terms of the Healthcare Disclaimer located at http://openmrs.org/license.
*
* Copyright (C) OpenMRS Inc. OpenMRS is a registered trademark and the OpenMRS
* graphic logo is a trademark of OpenMRS Inc.
*/
package org.openmrs;
import static org.apache.commons.lang3.time.DateUtils.addSeconds;
import java.util.Date;
import java.util.Locale;
import org.openmrs.api.APIException;
import org.springframework.validation.Errors;
import org.springframework.validation.ValidationUtils;
/**
* @since 1.10
*/
public class SimpleDosingInstructions implements DosingInstructions {
private Double dose;
private Concept doseUnits;
private Concept route;
private OrderFrequency frequency;
private Integer duration;
private Concept durationUnits;
private Boolean asNeeded;
private String asNeededCondition;
private String administrationInstructions;
/**
* @see DosingInstructions#getDosingInstructionsAsString(java.util.Locale)
*/
@Override
public String getDosingInstructionsAsString(Locale locale) {
StringBuilder dosingInstructions = new StringBuilder();
dosingInstructions.append(this.dose);
dosingInstructions.append(" ");
dosingInstructions.append(this.doseUnits.getName(locale).getName());
dosingInstructions.append(" ");
dosingInstructions.append(this.route.getName(locale).getName());
dosingInstructions.append(" ");
dosingInstructions.append(this.frequency);
if (duration != null) {
dosingInstructions.append(" ");
dosingInstructions.append(this.duration);
dosingInstructions.append(" ");
dosingInstructions.append(this.durationUnits.getName(locale).getName());
}
if (this.asNeeded) {
dosingInstructions.append(" ");
dosingInstructions.append("PRN");
if (this.asNeededCondition != null) {
dosingInstructions.append(" ");
dosingInstructions.append(this.asNeededCondition);
}
}
if (this.administrationInstructions != null) {
dosingInstructions.append(" ");
dosingInstructions.append(this.administrationInstructions);
}
return dosingInstructions.toString();
}
/**
* @see DosingInstructions#setDosingInstructions(DrugOrder)
*/
@Override
public void setDosingInstructions(DrugOrder order) {
order.setDosingType(this.getClass());
order.setDose(this.dose);
order.setDoseUnits(this.doseUnits);
order.setRoute(this.route);
order.setFrequency(this.frequency);
order.setDuration(this.duration);
order.setDurationUnits(this.durationUnits);
order.setAsNeeded(this.asNeeded);
order.setAsNeededCondition(this.asNeededCondition);
order.setDosingInstructions(this.administrationInstructions);
}
/**
* @see DosingInstructions#getDosingInstructions(DrugOrder)
*/
@Override
public DosingInstructions getDosingInstructions(DrugOrder order) {
if (!order.getDosingType().equals(this.getClass())) {
throw new APIException("DrugOrder.error.dosingTypeIsMismatched", new Object[] { this.getClass().getName(),
order.getDosingType() });
}
SimpleDosingInstructions simpleDosingInstructions = new SimpleDosingInstructions();
simpleDosingInstructions.setDose(order.getDose());
simpleDosingInstructions.setDoseUnits(order.getDoseUnits());
simpleDosingInstructions.setRoute(order.getRoute());
simpleDosingInstructions.setFrequency(order.getFrequency());
simpleDosingInstructions.setDuration(order.getDuration());
simpleDosingInstructions.setDurationUnits(order.getDurationUnits());
simpleDosingInstructions.setAsNeeded(order.getAsNeeded());
simpleDosingInstructions.setAsNeededCondition(order.getAsNeededCondition());
simpleDosingInstructions.setAdministrationInstructions(order.getDosingInstructions());
return simpleDosingInstructions;
}
/**
* @see DosingInstructions#validate(DrugOrder, org.springframework.validation.Errors)
* @param order
* @param errors
* @should reject a duration unit with a mapping of an invalid type
*/
@Override
public void validate(DrugOrder order, Errors errors) {
ValidationUtils.rejectIfEmpty(errors, "dose", "DrugOrder.error.doseIsNullForDosingTypeSimple");
ValidationUtils.rejectIfEmpty(errors, "doseUnits", "DrugOrder.error.doseUnitsIsNullForDosingTypeSimple");
ValidationUtils.rejectIfEmpty(errors, "route", "DrugOrder.error.routeIsNullForDosingTypeSimple");
ValidationUtils.rejectIfEmpty(errors, "frequency", "DrugOrder.error.frequencyIsNullForDosingTypeSimple");
if (order.getAutoExpireDate() == null && order.getDurationUnits() != null
&& Duration.getCode(order.getDurationUnits()) == null) {
errors.rejectValue("durationUnits", "DrugOrder.error.durationUnitsNotMappedToSnomedCtDurationCode");
}
}
/**
* @see DosingInstructions#getAutoExpireDate(DrugOrder)
*/
@Override
public Date getAutoExpireDate(DrugOrder drugOrder) {
if (drugOrder.getDuration() == null || drugOrder.getDurationUnits() == null) {
return null;
}
if (drugOrder.getNumRefills() != null && drugOrder.getNumRefills() > 0) {
return null;
}
String durationCode = Duration.getCode(drugOrder.getDurationUnits());
if (durationCode == null) {
return null;
}
Duration duration = new Duration(drugOrder.getDuration(), durationCode);
return aMomentBefore(duration.addToDate(drugOrder.getEffectiveStartDate(), drugOrder.getFrequency()));
}
public Double getDose() {
return dose;
}
public void setDose(Double dose) {
this.dose = dose;
}
public Concept getDoseUnits() {
return doseUnits;
}
public void setDoseUnits(Concept doseUnits) {
this.doseUnits = doseUnits;
}
public Concept getRoute() {
return route;
}
public void setRoute(Concept route) {
this.route = route;
}
public OrderFrequency getFrequency() {
return frequency;
}
public void setFrequency(OrderFrequency frequency) {
this.frequency = frequency;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public Concept getDurationUnits() {
return durationUnits;
}
public void setDurationUnits(Concept durationUnits) {
this.durationUnits = durationUnits;
}
public Boolean getAsNeeded() {
return asNeeded;
}
public void setAsNeeded(Boolean asNeeded) {
this.asNeeded = asNeeded;
}
public String getAsNeededCondition() {
return asNeededCondition;
}
public void setAsNeededCondition(String asNeededCondition) {
this.asNeededCondition = asNeededCondition;
}
public String getAdministrationInstructions() {
return administrationInstructions;
}
public void setAdministrationInstructions(String administrationInstructions) {
this.administrationInstructions = administrationInstructions;
}
private Date aMomentBefore(Date date) {
return addSeconds(date, -1);
}
}