package model.manager.exports.excel;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import model.manager.excel.interfaces.GenerateExcelReportInterface;
import model.manager.excel.reports.out.CohortDrugCollectionsReport;
import model.manager.exports.DataExportFunctions;
import model.nonPersistent.EntitySet;
import org.celllife.idart.database.hibernate.Episode;
import org.celllife.idart.database.hibernate.Packages;
import org.celllife.idart.database.hibernate.util.HibernateUtil;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
public class RowPerPatientExcelExporter extends ExcelExporter {
private final EntitySet patients;
public RowPerPatientExcelExporter(EntitySet patients) {
this.patients = patients;
}
@Override
protected GenerateExcelReportInterface getExcelReport(
ExcelReportObject report) {
return new CohortDrugCollectionsReport(report.getPath(), report);
}
@Override
protected int getNumberOfExtraColumn() {
int size = 0;
for (List<Integer> packages : patientPackageMap.values()) {
if (packages.size() > size) {
size = packages.size();
}
}
return size;
}
@Override
protected void setupFunctions(DataExportFunctions functions,
ExcelReportObject report) {
functions.setAllPatients(false);
}
@Override
public EntitySet getPatientSet(ExcelReportObject report) {
if (patientPackageMap == null) {
populatePatientPackageMap(report);
}
return new EntitySet(new ArrayList<Integer>(patientPackageMap.keySet()));
}
private void populatePatientPackageMap(ExcelReportObject report) {
session = HibernateUtil.getNewSession();
Criteria critPackg = session.createCriteria(Packages.class, "package")
.addOrder(Order.asc("package.packDate"))
.add(Restrictions.isNotNull("package.prescription"));
critPackg.createAlias("package.prescription", "prescription")
.createAlias("prescription.patient", "patient");
critPackg.add(Restrictions.isNotNull("package.pickupDate"))
.add(Restrictions.in("patient.id", patients.getEntityIds()));
ProjectionList projectionList = Projections.projectionList();
projectionList.add(Projections.property("patient.id"));
projectionList.add(Projections.property("package.id"));
critPackg.setProjection(projectionList);
@SuppressWarnings("rawtypes")
List list = critPackg.list();
patientPackageMap = new LinkedHashMap<Integer, List<Integer>>();
for (Object object : list) {
Object[] ar = (Object[]) object;
Integer patid = (Integer) ar[0];
Integer packid = (Integer) ar[1];
if (patientPackageMap.containsKey(patid)) {
List<Integer> packlist = patientPackageMap.get(patid);
if (!packlist.contains(packid))
packlist.add(packid);
} else {
ArrayList<Integer> packIds = new ArrayList<Integer>();
packIds.add(packid);
patientPackageMap.put(patid, packIds);
}
}
}
@Override
protected void exportPage(EntitySet pagedEntitySet, DataExportFunctions functions, GenerateExcelReportInterface excelReport) throws Exception {
functions.setPatientSet(pagedEntitySet);
for (Integer patientId : pagedEntitySet.getEntityIds()) {
functions.setPatientId(patientId);
List<Integer> packageIds = patientPackageMap
.get(patientId);
excelReport.writeRow(functions);
for (int i = 0; i < packageIds.size(); i++) {
functions.setPackageId(packageIds.get(i));
excelReport.writeExtraColumns(functions, i);
}
excelReport.incrementRowCounter();
}
}
}