package model.manager.reports; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Map.Entry; import model.manager.PrescriptionManager; import model.manager.excel.conversion.exceptions.ReportException; import model.nonPersistent.AggregateRegimenInfo; import model.nonPersistent.RegimenInfo; import org.celllife.idart.database.hibernate.Clinic; import org.celllife.idart.database.hibernate.Prescription; import org.celllife.idart.database.hibernate.Regimen; import org.celllife.idart.misc.iDARTUtil; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.swt.widgets.Shell; public class DrugCombinationReport extends AbstractJasperReport { private final Clinic clinic; private final int lowerAgeBoundry; private final int upperAgeBoundry; private String filename; private final Date endDate; private final Date startDate; public DrugCombinationReport(Shell parent, Date theStartDate, Date theEndDate, Clinic clinic, int lowerAgeBoundry, int upperAgeBoundry, String filename) { super(parent); this.clinic = clinic; this.lowerAgeBoundry = lowerAgeBoundry; this.upperAgeBoundry = upperAgeBoundry; this.filename = filename; this.startDate = getBeginningOfDay(theStartDate); this.endDate = getEndOfDay(theEndDate); } @Override protected void generateData() throws ReportException { List<Prescription> scripts = PrescriptionManager.getValidPrescriptions( hSession, clinic.getId(), false, startDate, endDate, null, false); List<AggregateRegimenInfo> regInfos = getAggregateDrugCombos(scripts); FileWriter out = null; try { if (filename.lastIndexOf(".") == -1) { filename += ".csv"; } else if (!filename.endsWith(".csv")) { filename = filename.substring(0, filename.lastIndexOf(".")) + ".csv"; } File csvFile = new File(filename); out = new FileWriter(csvFile); out.write("iDART Drug Combinations\n"); out.write("This report shows all patients who are on treatment (i.e. they have a valid prescription) during the time period specified. \n" + "Please note that the patients may not have received all of the drugs that have been prescribed!\n"); out.write("-----------------------\n"); out.write("\nClinic: " + clinic.getClinicName()); out.write("\nStart date: " + iDARTUtil.format(startDate)); out.write("\nEnd date: " + iDARTUtil.format(endDate) + "\n\n"); out.write("\n\n\n"); RegimenInfo.END_DATE = AggregateRegimenInfo.END_DATE; out.write(RegimenInfo.getHeaderString()); for (AggregateRegimenInfo regimenInfo : regInfos) { Set<RegimenInfo> regimenInfos = regimenInfo .getRegimenInfos(hSession); for (RegimenInfo info : regimenInfos) { out.write(info.toString()); } } } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); } catch (IOException e) { e.printStackTrace(); } } } } @Override protected Map<String, Object> getParameterMap() throws ReportException { return null; } @Override protected String getReportFileName() { return null; } @Override public void viewReport() { MessageDialog.openInformation(parent, "CSV Report complete", "Report save to " + filename); } @Override public void fillReport(IProgressMonitor monitor) throws ReportException { monitor.worked(20); monitor.setTaskName("Generating report"); generateData(); monitor.done(); } private List<AggregateRegimenInfo> getAggregateDrugCombos( List<Prescription> scripts) { Map<Integer, AggregateRegimenInfo> regMap = new HashMap<Integer, AggregateRegimenInfo>(); AggregateRegimenInfo.LOWER_AGE = lowerAgeBoundry; AggregateRegimenInfo.UPPER_AGE = upperAgeBoundry; AggregateRegimenInfo.START_DATE = startDate; AggregateRegimenInfo.END_DATE = endDate; for (Prescription script : scripts) { Integer hashCode = script.getARVDrugSet().hashCode(); if (regMap.containsKey(hashCode)) { regMap.get(hashCode).addScript(script); } else { regMap.put(hashCode, new AggregateRegimenInfo(script)); } } List<AggregateRegimenInfo> regInfos = new ArrayList<AggregateRegimenInfo>(); regInfos.addAll(regMap.values()); Map<Regimen, Set<Integer>> regimenIdMap = PrescriptionManager .getRegimenIdMap(hSession); for (AggregateRegimenInfo info : regInfos) { Set<Integer> drugIdSet = info.getDrugIdSet(); for (Entry<Regimen, Set<Integer>> entry : regimenIdMap.entrySet()) { if (drugIdSet.containsAll(entry.getValue())) { Regimen theReg = entry.getKey(); info.addRegimen(theReg.getDrugGroup()); } } } return regInfos; } }