package model.manager.exports;
import java.util.HashMap;
import java.util.Map;
import org.celllife.idart.database.hibernate.PatientAttributeInterface;
import model.manager.exports.columns.DrugDetailsEnum;
import model.manager.exports.columns.DrugsDispensedEnum;
import model.manager.exports.columns.PackageDetailsEnum;
/**
* This object will be used to represent the columns in the drug dispensed
* report
*
*/
public class DrugDispensedObject extends AbstractExportObject implements Cloneable{
private int drugid = 0;
private DrugsDispensedEnum columnEnum;
private Map<String, Integer> batchTotalsMap;
private int packSize;
/**
*
*/
public DrugDispensedObject() {
super();
}
/**
* @param title
* @param displayName
* @param dataType
*/
public DrugDispensedObject(String title, Class dataType) {
super(title, dataType);
}
public DrugDispensedObject(DrugsDispensedEnum enu) {
super(enu.getTitle(), enu.getDataType());
setColumnIndex(-1);
setColumnWidth(enu.getColumnWidth());
this.columnEnum = enu;
drugid = 0;
}
/**
* @return the id
*/
public int getDrugId() {
return drugid;
}
/**
* @param id
* the id to set
*/
public void setId(int id) {
this.drugid = id;
}
public Map<String, Integer> getBatchTotalsMap(){
return batchTotalsMap;
}
public int getTotalUnitsDispensed(){
Integer total = 0;
if (batchTotalsMap != null) {
for (Integer batchtotal : batchTotalsMap.values()) {
total += batchtotal;
}
}
return total;
}
@Override
public Object getData(DataExportFunctions functions, int index) {
if (columnEnum != null){
switch (columnEnum) {
case dateDispensed:
return functions.getPackageDetailForCurrentPackage(PackageDetailsEnum.DATE_DISPENSED.toString());
case clinic:
return functions.getPatientField("Patient", "clinic.clinicName");
case patientFirstName:
return functions.getPatientField("Patient", "firstNames");
case patientLastName:
return functions.getPatientField("Patient", "lastname");
case patientId:
return functions.getPatientField("Patient", "patientId");
case sex:
return functions.getPatientField("Patient", "sex");
case dateOfBirth:
return functions.getPatientField("Patient", "dateOfBirth");
case age:
return functions.getPaitentAgeAtEndDate();
case packageId:
return functions.getPackageDetailForCurrentPackage(PackageDetailsEnum.PACKAGE_ID.name());
case regimen:
return functions.getPackageDetailForCurrentPackage(PackageDetailsEnum.REGIMEN.name());
case drugGroupName:
return functions.getPackageDetailForCurrentPackage(PackageDetailsEnum.DRUG_GROUP_NAME.name());
case pregnant:
boolean pregnantAtEndDate = functions.isPregnantAtEndDate();
Character patientField = (Character) functions.getPatientField("Patient", "sex");
if (patientField.equals('M')){
return "N.A";
} else {
return pregnantAtEndDate ? "yes" : "no";
}
case drugsCollected:
return functions.getPackageContentSummary();
case arvStartDate:
return functions.getPatientAttribute(PatientAttributeInterface.ARV_START_DATE);
case expectedRunoutDate:
return functions.getPackageDetailForCurrentPackage(PackageDetailsEnum.EXPECTED_RUNOUT_DATE.toString());
default:
return null;
}
} else {
if (drugid > 0){
if (index == 0) {
String quantity = (String) functions.getExportDrugDetailCurrentPackage(DrugDetailsEnum.QUANTITYDISPENSED.name(),drugid);
String batch = (String) functions.getExportDrugDetailCurrentPackage(DrugDetailsEnum.BATCHNUMBER.name(),drugid);
updateDrugTotals(quantity, batch);
return quantity;
}
if (index == 1) {
return functions.getExportDrugDetailCurrentPackage(DrugDetailsEnum.BATCHNUMBER.name(),drugid);
}
}
}
return null;
}
private void updateDrugTotals(String quantity, String batch) {
if (batch.isEmpty() || quantity.isEmpty())
return;
if (batchTotalsMap == null)
batchTotalsMap = new HashMap<String, Integer>();
String[] batches = batch.split(",");
Integer[] quantities;
String[] qtyStrings = quantity.split(",");
quantities = new Integer[qtyStrings.length];
for (int i = 0; i < qtyStrings.length; i++) {
quantities[i] = Integer.parseInt(qtyStrings[i]);
}
for (int i = 0; i < batches.length; i++) {
if (batchTotalsMap.containsKey(batches[i])){
batchTotalsMap.put(batches[i], batchTotalsMap.get(batches[i])+quantities[i]);
}else {
batchTotalsMap.put(batches[i],quantities[i]);
}
}
}
public void setDrugPackSize(int packSize) {
this.packSize = packSize;
}
public int getDrugPackSize() {
return packSize;
}
}