/*******************************************************************************
* Copyright (c) 2008 Dennis Schenk, Peter Siska.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Dennis Schenk - initial implementation
* Peter Siska - initial implementation
*******************************************************************************/
package ch.unibe.iam.scg.archie.ui.charts;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map.Entry;
import java.util.TreeMap;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Query;
/**
* <p>
* Creates dataset for ConsultationMoneyChart.
* </p>
*
* $Id: ConsultationMoneyDatasetCreator.java 747 2009-07-23 09:14:53Z
* peschehimself $
*
* @author Peter Siska
* @author Dennis Schenk
* @version $Rev: 747 $
*/
public class ConsultationMoneyDatasetCreator extends AbstractDatasetCreator {
private static final String DATE_DB_FORMAT = "yyyyMMdd";
private static final String DATE_CONS_FORMAT = "dd.MM.yyyy";
private boolean isEmpty;
/**
* @param jobName
*/
public ConsultationMoneyDatasetCreator(String jobName) {
super(jobName);
this.isEmpty = true;
}
/**
* @{inheritDoc
*/
@Override
public IStatus createContent(final IProgressMonitor monitor) {
// date formats
final SimpleDateFormat databaseFormat = new SimpleDateFormat(DATE_DB_FORMAT);
final SimpleDateFormat consultationFormat = new SimpleDateFormat(DATE_CONS_FORMAT);
final Query<Konsultation> query = new Query<Konsultation>(Konsultation.class);
// now, corrected by end of last month
Calendar now = Calendar.getInstance();
now.add(Calendar.MONTH, -1);
now.set(Calendar.DAY_OF_MONTH, now.getMaximum(Calendar.DAY_OF_MONTH));
// then, corrected by beginning of that month
Calendar before = Calendar.getInstance();
before.add(Calendar.MONTH, -7);
before.set(Calendar.DAY_OF_MONTH, before.getMinimum(Calendar.DAY_OF_MONTH));
query.add("Datum", ">=", databaseFormat.format(before.getTime()));
query.add("Datum", "<", databaseFormat.format(now.getTime()));
query.add("MandantID", "=", CoreHub.actMandant.getId());
monitor.subTask("querying database");
final List<Konsultation> consults = query.execute();
this.isEmpty = consults.size() <= 0;
// size * 2, going over consultations twice
monitor.beginTask("doing calculations", query.size() * 2);
// Consultations map, grouping consultations by month
final TreeMap<Month, ArrayList<Konsultation>> consultsMap = new TreeMap<Month, ArrayList<Konsultation>>();
// Group consults
for (Konsultation consult : consults) {
// check for cancelation
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
try {
Date date = consultationFormat.parse(consult.getDatum());
Calendar cal = Calendar.getInstance();
cal.setTime(date);
// create month, +1 JFree months start with 1
Month month = new Month(cal.get(Calendar.MONTH) + 1, cal.get(Calendar.YEAR));
if (consultsMap.containsKey(month)) {
consultsMap.get(month).add(consult);
} else {
ArrayList<Konsultation> consultList = new ArrayList<Konsultation>(1);
consultList.add(consult);
consultsMap.put(month, consultList);
}
monitor.worked(1);
} catch (ParseException e) {
e.printStackTrace();
}
}
// create dataset
TimeSeries profitSeries = new TimeSeries("Profit", Month.class);
TimeSeries spendingSeries = new TimeSeries("Spending", Month.class);
TimeSeries incomeSeries = new TimeSeries("Income", Month.class);
// Compute money values for grouped consultations
for (Entry<Month, ArrayList<Konsultation>> entry : consultsMap.entrySet()) {
// check for cancellation
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
Month month = entry.getKey();
double profit = 0;
double spending = 0;
double income = 0;
for (Konsultation consult : entry.getValue()) {
profit += consult.getGewinn();
spending += consult.getKosten();
income += consult.getUmsatz();
monitor.worked(1);
}
profitSeries.add(month, profit / 100);
spendingSeries.add(month, spending / 100);
incomeSeries.add(month, income / 100);
}
this.dataset = new TimeSeriesCollection();
((TimeSeriesCollection) this.dataset).addSeries(profitSeries);
((TimeSeriesCollection) this.dataset).addSeries(spendingSeries);
((TimeSeriesCollection) this.dataset).addSeries(incomeSeries);
monitor.done();
return Status.OK_STATUS;
}
/**
* @{inheritDoc
*/
@Override
protected boolean isDatasetEmpty() {
return this.isEmpty;
}
}