/** * 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.openmrs.Order.Action.DISCONTINUE; import org.apache.commons.lang.StringUtils; import org.openmrs.util.OpenmrsUtil; /** * DrugOrder * * @version 1.0 */ public class DrugOrder extends Order { public static final long serialVersionUID = 72232L; // Fields private Double dose; private Concept doseUnits; private OrderFrequency frequency; private Boolean asNeeded = false; private Double quantity; private Concept quantityUnits; private Drug drug; private String asNeededCondition; private Class<? extends DosingInstructions> dosingType = SimpleDosingInstructions.class; private Integer numRefills; private String dosingInstructions; private Integer duration; private Concept durationUnits; private Concept route; private String brandName; private Boolean dispenseAsWritten = Boolean.FALSE; private String drugNonCoded; // Constructors /** default constructor */ public DrugOrder() { } /** constructor with id */ public DrugOrder(Integer orderId) { this.setOrderId(orderId); } /** * @see org.openmrs.Order#copy() * @should copy all drug order fields */ @Override public DrugOrder copy() { return copyHelper(new DrugOrder()); } /** * @see org.openmrs.Order#copyHelper(Order) */ protected DrugOrder copyHelper(DrugOrder target) { super.copyHelper(target); target.setDose(getDose()); target.setDoseUnits(getDoseUnits()); target.setFrequency(getFrequency()); target.setAsNeeded(getAsNeeded()); target.setAsNeededCondition(getAsNeededCondition()); target.setQuantity(getQuantity()); target.setQuantityUnits(getQuantityUnits()); target.setDrug(getDrug()); target.setDosingType(getDosingType()); target.setDosingInstructions(getDosingInstructions()); target.setDuration(getDuration()); target.setDurationUnits(getDurationUnits()); target.setNumRefills(getNumRefills()); target.setRoute(getRoute()); target.setBrandName(getBrandName()); target.setDispenseAsWritten(getDispenseAsWritten()); target.setDrugNonCoded(getDrugNonCoded()); return target; } public boolean isDrugOrder() { return true; } // Property accessors /** * Gets the doseUnits of this drug order * * @return doseUnits */ public Concept getDoseUnits() { return this.doseUnits; } /** * Sets the doseUnits of this drug order * * @param doseUnits */ public void setDoseUnits(Concept doseUnits) { this.doseUnits = doseUnits; } /** * Gets the frequency * * @return frequency * @since 1.10 (signature changed) */ public OrderFrequency getFrequency() { return this.frequency; } /** * Sets the frequency * * @param frequency * @since 1.10 (signature changed) */ public void setFrequency(OrderFrequency frequency) { this.frequency = frequency; } /** * Returns true/false whether the drug is a "pro re nata" drug * * @return Boolean * @since 1.10 */ public Boolean getAsNeeded() { return asNeeded; } /** * @param asNeeded the value to set * @since 1.10 */ public void setAsNeeded(Boolean asNeeded) { this.asNeeded = asNeeded; } /** * Gets the quantity * * @return quantity */ public Double getQuantity() { return this.quantity; } /** * Sets the quantity * * @param quantity */ public void setQuantity(Double quantity) { this.quantity = quantity; } /** * @since 1.10 * @return concept */ public Concept getQuantityUnits() { return quantityUnits; } /** * @since 1.10 * @param quantityUnits */ public void setQuantityUnits(Concept quantityUnits) { this.quantityUnits = quantityUnits; } /** * Gets the drug * * @return drug */ public Drug getDrug() { return this.drug; } /** * Sets the drug * * @param drug */ public void setDrug(Drug drug) { this.drug = drug; if (drug != null && getConcept() == null) { setConcept(drug.getConcept()); } } /** * @return the asNeededCondition * @since 1.10 */ public String getAsNeededCondition() { return asNeededCondition; } /** * @param asNeededCondition the asNeededCondition to set * @since 1.10 */ public void setAsNeededCondition(String asNeededCondition) { this.asNeededCondition = asNeededCondition; } /** * Gets the route * * @since 1.10 */ public Concept getRoute() { return route; } /** * Sets the route * * @param route * @since 1.10 */ public void setRoute(Concept route) { this.route = route; } public void setDose(Double dose) { this.dose = dose; } public Double getDose() { return dose; } /** * Gets the dosingType * * @since 1.10 */ public Class<? extends DosingInstructions> getDosingType() { return dosingType; } /** * Sets the dosingType * * @param dosingType the dosingType to set * @since 1.10 */ public void setDosingType(Class<? extends DosingInstructions> dosingType) { this.dosingType = dosingType; } /** * Gets the dosingInstructions instance * * @since 1.10 */ public DosingInstructions getDosingInstructionsInstance() { try { DosingInstructions instructions = getDosingType().newInstance(); return instructions.getDosingInstructions(this); } catch (InstantiationException e) { throw new IllegalStateException(e); } catch (IllegalAccessException e) { throw new IllegalStateException(e); } } /** * Gets numRefills * * @since 1.10 */ public Integer getNumRefills() { return numRefills; } /** * Sets numRefills * * @param numRefills the numRefills to set * @since 1.10 */ public void setNumRefills(Integer numRefills) { this.numRefills = numRefills; } /** * Sets the dosingInstructions * * @param dosingInstructions to set * @since 1.10 */ public void setDosingInstructions(String dosingInstructions) { this.dosingInstructions = dosingInstructions; } /** * Gets the dosingInstructions * * @since 1.10 */ public String getDosingInstructions() { return this.dosingInstructions; } /** * Gets the duration of a Drug Order * * @since 1.10 */ public Integer getDuration() { return duration; } /** * Sets the duration of a Drug Order * * @param duration to set * @since 1.10 */ public void setDuration(Integer duration) { this.duration = duration; } /** * Gets durationUnits of a Drug Order * * @since 1.10 */ public Concept getDurationUnits() { return durationUnits; } /** * Sets the durationUnits of a Drug Order * * @param durationUnits * @since 1.10 */ public void setDurationUnits(Concept durationUnits) { this.durationUnits = durationUnits; } /** * Gets the brandName * * @return brandName * @since 1.10 */ public String getBrandName() { return brandName; } /** * Sets the brandName * * @since 1.10 * @param brandName the brandName to set to */ public void setBrandName(String brandName) { this.brandName = brandName; } /** * @return true or false * @since 1.10 */ public Boolean getDispenseAsWritten() { return dispenseAsWritten; } /** * @param dispenseAsWritten * @since 1.10 */ public void setDispenseAsWritten(Boolean dispenseAsWritten) { this.dispenseAsWritten = dispenseAsWritten; } /** * @see org.openmrs.Order#cloneForDiscontinuing() * @should set all the relevant fields * @since 1.10 */ @Override public DrugOrder cloneForDiscontinuing() { DrugOrder newOrder = new DrugOrder(); newOrder.setCareSetting(getCareSetting()); newOrder.setConcept(getConcept()); newOrder.setAction(DISCONTINUE); newOrder.setPreviousOrder(this); newOrder.setPatient(getPatient()); newOrder.setDrug(getDrug()); newOrder.setOrderType(getOrderType()); newOrder.setDrugNonCoded(getDrugNonCoded()); return newOrder; } /** * Creates a DrugOrder for revision from this order, sets the previousOrder, action field and * other drug order fields. * * @return the newly created order * @since 1.10 * @should set all the relevant fields * @should set the relevant fields for a DC order */ @Override public DrugOrder cloneForRevision() { return cloneForRevisionHelper(new DrugOrder()); } /** * @see Order#cloneForRevisionHelper(Order) */ protected DrugOrder cloneForRevisionHelper(DrugOrder target) { super.cloneForRevisionHelper(target); target.setDose(getDose()); target.setDoseUnits(getDoseUnits()); target.setFrequency(getFrequency()); target.setAsNeeded(getAsNeeded()); target.setAsNeededCondition(getAsNeededCondition()); target.setQuantity(getQuantity()); target.setQuantityUnits(getQuantityUnits()); target.setDrug(getDrug()); target.setDosingType(getDosingType()); target.setDosingInstructions(getDosingInstructions()); target.setDuration(getDuration()); target.setDurationUnits(getDurationUnits()); target.setRoute(getRoute()); target.setNumRefills(getNumRefills()); target.setBrandName(getBrandName()); target.setDispenseAsWritten(getDispenseAsWritten()); target.setDrugNonCoded(getDrugNonCoded()); return target; } /** * Sets autoExpireDate based on duration. * * @should delegate calculation to dosingInstructions * @should not calculate for discontinue action * @should not calculate if autoExpireDate already set */ public void setAutoExpireDateBasedOnDuration() { if (DISCONTINUE != getAction() && getAutoExpireDate() == null) { setAutoExpireDate(getDosingInstructionsInstance().getAutoExpireDate(this)); } } @Override public String toString() { String prefix = DISCONTINUE == getAction() ? "DC " : ""; return prefix + "DrugOrder(" + getDose() + getDoseUnits() + " of " + (isNonCodedDrug() ? getDrugNonCoded() : (getDrug() != null ? getDrug().getName() : "[no drug]")) + " from " + getDateActivated() + " to " + (isDiscontinuedRightNow() ? getDateStopped() : getAutoExpireDate()) + ")"; } /** * Set dosing instructions to drug order * * @param di dosing instruction object to fetch data * @since 1.10 */ public void setDosing(DosingInstructions di) { di.setDosingInstructions(this); } /** * Checks whether orderable of this drug order is same as other order * * @since 1.10 * @param otherOrder the other order to match on * @return true if the drugs match * @should return false if the other order is null * @should return false if the other order is not a drug order * @should return false if both drugs are null and the concepts are different * @should return false if the concepts match and only this has a drug * @should return false if the concepts match and only the other has a drug * @should return false if the concepts match and drugs are different and not null * @should return true if both drugs are null and the concepts match * @should return true if the drugs match */ @Override public boolean hasSameOrderableAs(Order otherOrder) { if (!super.hasSameOrderableAs(otherOrder)) { return false; } if (!(otherOrder instanceof DrugOrder)) { return false; } DrugOrder otherDrugOrder = (DrugOrder) otherOrder; if (isNonCodedDrug() || otherDrugOrder.isNonCodedDrug()) { return OpenmrsUtil.nullSafeEqualsIgnoreCase(this.getDrugNonCoded(), otherDrugOrder.getDrugNonCoded()); } return OpenmrsUtil.nullSafeEquals(this.getDrug(), otherDrugOrder.getDrug()); } /** * @since 1.12 * @return drugNonCoded */ public String getDrugNonCoded() { return drugNonCoded; } /** * @since 1.12 * sets drugNonCoded */ public void setDrugNonCoded(String drugNonCoded) { this.drugNonCoded = StringUtils.isNotBlank(drugNonCoded) ? drugNonCoded.trim() : drugNonCoded; } /** * @since 1.12 * return true if a drug is non coded */ public boolean isNonCodedDrug() { return StringUtils.isNotBlank(this.drugNonCoded); } }