/*******************************************************************************
* Copyright (c) 2006-2010, G. Weirich and Elexis
* 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:
* G. Weirich - initial implementation
*
*******************************************************************************/
package ch.elexis.core.ui.views;
import static ch.elexis.core.ui.text.TextTemplateRequirement.TT_BILLING_LIST;
import java.io.FileWriter;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.dialogs.TitleAreaDialog;
import org.eclipse.jface.viewers.ArrayContentProvider;
import org.eclipse.jface.viewers.ComboViewer;
import org.eclipse.jface.viewers.ISelectionChangedListener;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.jface.viewers.StructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.dnd.DropTargetEvent;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.FileDialog;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.ui.ISaveablePart2;
import org.eclipse.ui.PartInitException;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.forms.widgets.Form;
import org.eclipse.ui.forms.widgets.FormToolkit;
import org.eclipse.ui.part.ViewPart;
import com.tiff.common.ui.datepicker.DatePickerCombo;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.events.ElexisEvent;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.events.ElexisEventListener;
import ch.elexis.core.data.interfaces.IVerrechenbar;
import ch.elexis.core.ui.Hub;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.actions.AbstractDataLoaderJob;
import ch.elexis.core.ui.actions.BackgroundJob;
import ch.elexis.core.ui.actions.BackgroundJob.BackgroundJobListener;
import ch.elexis.core.ui.actions.CodeSelectorHandler;
import ch.elexis.core.ui.actions.GlobalActions;
import ch.elexis.core.ui.actions.GlobalEventDispatcher;
import ch.elexis.core.ui.actions.IActivationListener;
import ch.elexis.core.ui.events.ElexisUiEventListenerImpl;
import ch.elexis.core.ui.icons.Images;
import ch.elexis.core.ui.text.ITextPlugin;
import ch.elexis.core.ui.text.ITextPlugin.ICallback;
import ch.elexis.core.ui.text.TextContainer;
import ch.elexis.core.ui.util.ListDisplay;
import ch.elexis.core.ui.util.Log;
import ch.elexis.core.ui.util.PersistentObjectDropTarget;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.core.ui.util.viewers.CommonViewer.DoubleClickListener;
import ch.elexis.core.ui.util.viewers.DefaultContentProvider;
import ch.elexis.core.ui.util.viewers.DefaultLabelProvider;
import ch.elexis.core.ui.util.viewers.SimpleWidgetProvider;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer;
import ch.elexis.core.ui.views.codesystems.LeistungenView;
import ch.elexis.data.Brief;
import ch.elexis.data.Fall;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.data.Verrechnet;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.IFilter;
import ch.rgw.tools.Money;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
public class PatHeuteView extends ViewPart implements IActivationListener, ISaveablePart2,
BackgroundJobListener {
public static final String ID = "ch.elexis.PatHeuteView"; //$NON-NLS-1$
static final String LEISTUNG_HINZU = Messages.PatHeuteView_add; //$NON-NLS-1$
static final String STAT_LEEREN = Messages.PatHeuteView_empty; //$NON-NLS-1$
private IAction printAction, reloadAction, filterAction, statAction;
CommonViewer cv;
ViewerConfigurer vc;
FormToolkit tk = UiDesk.getToolkit();
Form form;
Text tPat, tTime, tMoney, tTime2, tMoney2;
TimeTool datVon, datBis;
// boolean bOnlyOpen;
boolean bOpen = true;
boolean bClosed = true;
private String accountSys;
private Konsultation[] kons;
private final KonsLoader kload;
private int numPat;
private double sumTime;
private double sumAll;
PersistentObjectDropTarget dropTarget;
ListDisplay<IVerrechenbar> ldFilter;
// private double sumSelected;
private final Query<Konsultation> qbe;
Composite parent;
private final ElexisEventListener eeli_kons =
new ElexisUiEventListenerImpl(Konsultation.class) {
public void runInUi(ElexisEvent ev){
selection((Konsultation) ev.getObject());
}
};
public PatHeuteView(){
super();
datVon = new TimeTool();
datBis = new TimeTool();
qbe = new Query<Konsultation>(Konsultation.class);
kload = new KonsLoader(qbe);
kload.addListener(this);
}
@Override
public void createPartControl(final Composite parent){
parent.setLayout(new GridLayout());
this.parent = parent;
makeActions();
ldFilter = new ListDisplay<IVerrechenbar>(parent, SWT.NONE, new ListDisplay.LDListener() {
public String getLabel(final Object o){
return ((IVerrechenbar) o).getCode();
}
public void hyperlinkActivated(final String l){
if (l.equals(LEISTUNG_HINZU)) {
try {
if (StringTool.isNothing(LeistungenView.ID)) {
SWTHelper.alert(Messages.PatHeuteView_error, //$NON-NLS-1$
"LeistungenView.ID"); //$NON-NLS-1$
}
getViewSite().getPage().showView(LeistungenView.ID);
CodeSelectorHandler.getInstance().setCodeSelectorTarget(dropTarget);
} catch (Exception ex) {
ExHandler.handle(ex);
}
} else if (l.equals(STAT_LEEREN)) {
ldFilter.clear();
}
}
});
ldFilter.addHyperlinks(LEISTUNG_HINZU, STAT_LEEREN);
ldFilter.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
((GridData) ldFilter.getLayoutData()).heightHint = 0;
dropTarget = new PersistentObjectDropTarget("Statfilter", ldFilter, //$NON-NLS-1$
new DropReceiver());
Composite top = new Composite(parent, SWT.BORDER);
top.setLayout(new RowLayout());
final DatePickerCombo dpc = new DatePickerCombo(top, SWT.BORDER);
dpc.setDate(datVon.getTime());
dpc.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
datVon.setTimeInMillis(dpc.getDate().getTime());
}
});
final DatePickerCombo dpb = new DatePickerCombo(top, SWT.BORDER);
dpb.setDate(datBis.getTime());
dpb.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
datBis.setTimeInMillis(dpb.getDate().getTime());
}
});
final Button bOpenKons = new Button(top, SWT.CHECK);
bOpenKons.setText(Messages.PatHeuteView_open); //$NON-NLS-1$
bOpenKons.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
bOpen = bOpenKons.getSelection();
}
});
final Button bClosedKons = new Button(top, SWT.CHECK);
bClosedKons.addSelectionListener(new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
bClosed = bClosedKons.getSelection();
}
});
ComboViewer cAccountingSys = new ComboViewer(top, SWT.READ_ONLY);
cAccountingSys.setContentProvider(ArrayContentProvider.getInstance());
cAccountingSys.setLabelProvider(new LabelProvider());
String allCases = Messages.PatHeuteView_all;
List<String> faelle = Arrays.asList(Fall.getAbrechnungsSysteme());
List<String> accountingSys = new ArrayList<String>();
accountingSys.add(allCases);
accountingSys.addAll(faelle);
cAccountingSys.setInput(accountingSys);
cAccountingSys.setSelection(new StructuredSelection(allCases));
cAccountingSys.addSelectionChangedListener(new ISelectionChangedListener() {
@Override
public void selectionChanged(SelectionChangedEvent event){
IStructuredSelection selection = (IStructuredSelection) event.getSelection();
accountSys = (String) selection.getFirstElement();
// call reload
if (kons != null) {
kload.schedule();
}
}
});
bClosedKons.setText(Messages.PatHeuteView_billed); //$NON-NLS-1$
bOpenKons.setSelection(bOpen);
bClosedKons.setSelection(bClosed);
cv = new CommonViewer();
vc =
new ViewerConfigurer(new DefaultContentProvider(cv, Patient.class) {
@Override
public Object[] getElements(final Object inputElement){
if (!CoreHub.acl.request(AccessControlDefaults.ACCOUNTING_STATS)) {
return new Konsultation[0];
}
if (kons == null) {
kons = new Konsultation[0];
kload.schedule();
}
return kons;
}
}, new DefaultLabelProvider() {
@Override
public String getText(final Object element){
if (element instanceof Konsultation) {
Fall fall = ((Konsultation) element).getFall();
if (fall == null) {
return Messages.PatHeuteView_noCase
+ ((Konsultation) element).getLabel(); //$NON-NLS-1$
}
Patient pat = fall.getPatient();
return pat.getLabel();
}
return super.getText(element);
}
}, null, new ViewerConfigurer.DefaultButtonProvider(), new SimpleWidgetProvider(
SimpleWidgetProvider.TYPE_LIST, SWT.V_SCROLL, cv));
cv.create(vc, parent, SWT.BORDER, getViewSite());
form = tk.createForm(parent);
form.setText(Messages.PatHeuteView_all); //$NON-NLS-1$
form.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Composite bottom = form.getBody();
bottom.setLayout(new GridLayout(2, false));
tk.createLabel(bottom, Messages.PatHeuteView_consultations); //$NON-NLS-1$
tPat = tk.createText(bottom, "", SWT.BORDER); //$NON-NLS-1$
tPat.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tPat.setEditable(false);
tk.createLabel(bottom, Messages.PatHeuteView_accTime); //$NON-NLS-1$
tTime = tk.createText(bottom, "", SWT.BORDER); //$NON-NLS-1$
tTime.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tTime.setEditable(false);
tk.createLabel(bottom, Messages.PatHeuteView_accAmount); //$NON-NLS-1$
tMoney = tk.createText(bottom, "", SWT.BORDER); //$NON-NLS-1$
tMoney.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tMoney.setEditable(false);
// Group grpSel=new Group(parent,SWT.BORDER);
// grpSel.setText("Markierte");
// grpSel.setLayoutData(SWTHelper.getFillGridData(1,true,1,true));
Form fSel = tk.createForm(parent);
fSel.setText(Messages.PatHeuteView_marked); //$NON-NLS-1$
fSel.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
Composite cSel = fSel.getBody();
cSel.setLayout(new GridLayout(2, false));
tk.createLabel(cSel, Messages.PatHeuteView_accTime); //$NON-NLS-1$
tTime2 = tk.createText(cSel, "", SWT.BORDER); //$NON-NLS-1$
tTime2.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tk.createLabel(cSel, Messages.PatHeuteView_accAmount); //$NON-NLS-1$
tMoney2 = tk.createText(cSel, "", SWT.BORDER); //$NON-NLS-1$
tMoney2.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));
tTime2.setEditable(false);
tMoney2.setEditable(false);
ViewMenus menus = new ViewMenus(getViewSite());
menus.createMenu(printAction, reloadAction, statAction);
menus.createToolbar(reloadAction, filterAction);
// setFocus();
cv.getConfigurer().getContentProvider().startListening();
GlobalEventDispatcher.addActivationListener(this, this);
kload.schedule();
cv.addDoubleClickListener(new DoubleClickListener() {
@Override
public void doubleClicked(PersistentObject obj, CommonViewer cv){
Konsultation k = (Konsultation) obj;
ElexisEventDispatcher.fireSelectionEvent(k);
ElexisEventDispatcher.fireSelectionEvent(k.getFall());
ElexisEventDispatcher.fireSelectionEvent(k.getFall().getPatient());
try {
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.showView(KonsDetailView.ID);
} catch (PartInitException e) {
ExHandler.handle(e);
}
}
});
}
@Override
public void dispose(){
cv.getConfigurer().getContentProvider().stopListening();
kload.removeListener(this);
GlobalEventDispatcher.removeActivationListener(this, this);
}
@Override
public void setFocus(){
cv.notify(CommonViewer.Message.update);
}
private void selection(final Konsultation k){
if (k == null) {
tTime2.setText("");
tMoney2.setText("");
} else {
try {
tTime2.setText(Integer.toString(k.getMinutes()));
Money mon = new Money();
for (Verrechnet ver : k.getLeistungen()) {
mon = mon.addMoney(ver.getNettoPreis().multiply(ver.getZahl()));
}
tMoney2.setText(mon.getAmountAsString());
} catch (NullPointerException e) {
// ignore -> handled during update
}
}
}
public void activation(final boolean mode){ /* leer */
}
public void visible(final boolean mode){
if (mode == true) {
ElexisEventDispatcher.getInstance().addListeners(eeli_kons);
} else {
ElexisEventDispatcher.getInstance().removeListeners(eeli_kons);
}
}
/*
* Die folgenden 6 Methoden implementieren das Interface ISaveablePart2 Wir benötigen das
* Interface nur, um das Schliessen einer View zu verhindern, wenn die Perspektive fixiert ist.
* Gibt es da keine einfachere Methode?
*/
public int promptToSaveOnClose(){
return GlobalActions.fixLayoutAction.isChecked() ? ISaveablePart2.CANCEL
: ISaveablePart2.NO;
}
public void doSave(final IProgressMonitor monitor){ /* leer */
}
public void doSaveAs(){ /* leer */
}
public boolean isDirty(){
return true;
}
public boolean isSaveAsAllowed(){
return false;
}
public boolean isSaveOnCloseNeeded(){
return true;
}
class StatLoader extends Job {
StatLoader(){
super(Messages.PatHeuteView_calculateStats); //$NON-NLS-1$
setPriority(Job.LONG);
setUser(true);
}
@Override
protected IStatus run(IProgressMonitor monitor){
HashMap<IVerrechenbar, StatCounter> counter = new HashMap<IVerrechenbar, StatCounter>();
monitor.beginTask(Messages.PatHeuteView_calculateStats, kons.length + 20); //$NON-NLS-1$
System.out.println(Messages.PatHeuteView_consElexis + kons.length); //$NON-NLS-1$
int serviceCounter = 0;
for (Konsultation k : kons) {
List<Verrechnet> list = k.getLeistungen();
serviceCounter += list.size();
for (Verrechnet v : list) {
StatCounter sc = counter.get(v.getVerrechenbar());
if (sc == null) {
sc = new StatCounter(v.getVerrechenbar());
counter.put(v.getVerrechenbar(), sc);
}
sc.add(v.getZahl(), v.getNettoPreis(), v.getKosten());
}
monitor.worked(1);
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
}
System.out.println(Messages.PatHeuteView_servicesElexis + serviceCounter); //$NON-NLS-1$
final List<StatCounter> sums = new LinkedList<StatCounter>(counter.values());
Collections.sort(sums);
monitor.worked(20);
monitor.done();
UiDesk.asyncExec(new Runnable() {
public void run(){
FileDialog fd = new FileDialog(getSite().getShell(), SWT.SAVE);
fd.setFilterExtensions(new String[] {
"*.csv", "*.*"}); //$NON-NLS-1$ //$NON-NLS-2$
fd.setFilterNames(new String[] {
"CSV", Messages.PatHeuteView_allFiles}); //$NON-NLS-1$ //$NON-NLS-2$
fd.setFileName("elexis-stat.csv"); //$NON-NLS-1$
String fname = fd.open();
if (fname != null) {
try {
FileWriter fw = new FileWriter(fname);
fw.write(Messages.PatHeuteView_csvHeader); //$NON-NLS-1$
for (StatCounter st : sums) {
StringBuilder sb = new StringBuilder();
String code = "unknown";
String text = "unknown";
if (st.v != null) {
code = st.v.getCode();
text = st.v.getText();
}
if (text == null) {
text = ""; //$NON-NLS-1$
} else {
text = text.replaceAll(";", ","); //$NON-NLS-1$ //$NON-NLS-2$
}
if (st.v != null && st.v.getCodeSystemName() != null) {
sb.append(st.v.getCodeSystemName());
} else {
sb.append("Codesystem?");
}
sb.append("; ").append( //$NON-NLS-1$
code == null ? "" : code) //$NON-NLS-1$
.append("; ").append(text).append(";") //$NON-NLS-1$ //$NON-NLS-2$
.append(st.num).append(";").append( //$NON-NLS-1$
st.cost.getAmountAsString()).append(";").append( //$NON-NLS-1$
st.sum.getAmountAsString()).append(";").append( //$NON-NLS-1$
st.getGewinn().getAmountAsString()).append("\r\n"); //$NON-NLS-1$
fw.write(sb.toString());
}
fw.close();
} catch (Exception ex) {
ExHandler.handle(ex);
SWTHelper.showError(Messages.PatHeuteView_errorWriting, ex //$NON-NLS-1$
.getMessage());
}
}
}
});
return Status.OK_STATUS;
}
}
class KonsLoader extends AbstractDataLoaderJob {
IVerrechenbar[] lfiltered;
Set<Konsultation> corruptKons;
Set<Konsultation> missingCaseKons;
KonsLoader(final Query<Konsultation> qbe){
super(Messages.PatHeuteView_loadConsultations, qbe, new String[] {
Messages.PatHeuteView_date
}); //$NON-NLS-1$ //$NON-NLS-2$
setPriority(Job.LONG);
setUser(true);
}
@Override
public IStatus execute(final IProgressMonitor monitor){
if (CoreHub.actUser == null) {
return Status.CANCEL_STATUS;
}
corruptKons = new HashSet<Konsultation>();
missingCaseKons = new HashSet<Konsultation>();
monitor.beginTask(Messages.PatHeuteView_loadKons, 1000); //$NON-NLS-1$
qbe.clear();
qbe.add(Konsultation.DATE, Query.GREATER_OR_EQUAL,
datVon.toString(TimeTool.DATE_COMPACT));
qbe.add(Konsultation.DATE, Query.LESS_OR_EQUAL, datBis.toString(TimeTool.DATE_COMPACT));
if (CoreHub.acl.request(AccessControlDefaults.ACCOUNTING_GLOBAL) == false) {
if (CoreHub.actMandant == null) {
monitor.done();
return Status.OK_STATUS;
}
qbe.add(Konsultation.FLD_MANDATOR_ID, Query.EQUALS, CoreHub.actMandant.getId());
}
if (bOpen && !bClosed) {
qbe.add("RechnungsID", StringConstants.EMPTY, null); //$NON-NLS-1$
}
if (bClosed && !bOpen) {
qbe.add("RechnungsID", "NOT", null); //$NON-NLS-2$
}
if (!bClosed && !bOpen) {
qbe.insertFalse();
}
qbe.addPostQueryFilter(new IFilter() {
public boolean select(final Object toTest){
if (filterAction.isChecked()) {
Konsultation k = (Konsultation) toTest;
List<IVerrechenbar> lFilt = ldFilter.getAll();
for (Verrechnet v : k.getLeistungen()) {
if (lFilt.contains(v.getVerrechenbar())) {
return true;
}
}
return false;
}
return true;
}
});
@SuppressWarnings("unchecked")
List<Konsultation> list = qbe.execute();
monitor.worked(100);
numPat = 0;
sumAll = 0.0;
sumTime = 0.0;
if (list == null) {
result = new Konsultation[0];
} else {
if (accountSys != null && !accountSys.isEmpty()
&& !accountSys.equals(Messages.PatHeuteView_all)) {
List<Konsultation> konsRet = new ArrayList<Konsultation>();
for (Konsultation kons : list) {
if (kons.getFall().getAbrechnungsSystem().equals(accountSys)) {
konsRet.add(kons);
}
}
list = konsRet;
}
Konsultation[] ret = new Konsultation[list.size()];
if (filterAction.isChecked()) {
lfiltered = ldFilter.getAll().toArray(new IVerrechenbar[0]);
if (lfiltered.length == 0) {
lfiltered = null;
}
} else {
lfiltered = null;
}
int i = 0;
for (PersistentObject o : list) {
if (((Konsultation) o).getFall() == null) {
missingCaseKons.add((Konsultation) o);
}
try {
ret[i++] = (Konsultation) o;
if (lfiltered != null) {
List<Verrechnet> lstg = ((Konsultation) o).getLeistungen();
for (Verrechnet v : lstg) {
int num = v.getZahl();
Money preis = v.getEffPreis().multiply(num);
for (int j = 0; j < lfiltered.length; j++) {
if (lfiltered[j].equals(v.getVerrechenbar())) {
sumAll += preis.getCents();
sumTime += v.getVerrechenbar().getMinutes();
}
}
}
} else {
for (Verrechnet verr : ((Konsultation) o).getLeistungen()) {
sumAll +=
verr.getNettoPreis().multiply(verr.getZahl()).doubleValue();
}
sumTime += ((Konsultation) o).getMinutes();
}
monitor.worked(1);
if (monitor.isCanceled()) {
monitor.done();
result = new Konsultation[0];
return Status.CANCEL_STATUS;
}
} catch (NullPointerException np) {
corruptKons.add((Konsultation) o);
}
}
numPat = ret.length;
result = ret;
monitor.done();
}
// show message in case there are corrupt consultations
StringBuilder sb = new StringBuilder();
if (corruptKons.size() > 0) {
sb.append("Folgende Konsultationen enthalten ungültige Leistungen: \n");
for (Konsultation k : corruptKons) {
sb.append(k.getLabel() + ", " + k.getFall().getPatient().getLabel());
sb.append("\n");
}
sb.append("\n");
}
if (missingCaseKons.size() > 0) {
sb.append("Folgende Konsultationen sind keinem Fall zugewiesen: \n");
for (Konsultation k : missingCaseKons) {
sb.append(k.getLabel());
sb.append("\n");
}
}
if (sb.length() > 0) {
SWTHelper.showError("Achtung",
"Fehlerhafte Konsultation(en) vorhanden!\n" + sb.toString());
log.log("The following consultations contain invalid values...\n" + sb.toString(),
Log.ERRORS);
}
return Status.OK_STATUS;
}
@Override
public int getSize(){
return 100;
}
}
public void jobFinished(final BackgroundJob j){
if (j.isValid()) {
kons = (Konsultation[]) j.getData();
if (!CoreHub.acl.request(AccessControlDefaults.ACCOUNTING_STATS)) {
tPat.setText("Sie haben keine Rechte für diese View");
} else {
tPat.setText(Integer.toString(numPat));
tTime.setText(Double.toString(sumTime));
DecimalFormat df = new DecimalFormat("0.00"); //$NON-NLS-1$
tMoney.setText(df.format(sumAll));
if (kons.length >= 1) {
selection(kons[kons.length - 1]);
}
cv.notify(CommonViewer.Message.update);
}
} else {
kons = new Konsultation[0];
}
};
private static class StatCounter implements Comparable<StatCounter> {
IVerrechenbar v;
Money sum;
Money cost;
int num;
StatCounter(IVerrechenbar vv){
v = vv;
sum = new Money();
cost = new Money();
num = 0;
}
void add(int num, Money price, Money cost){
Money totalPrice = price.multiply(num);
Money totalCost = cost.multiply(num);
this.num += num;
sum.addMoney(totalPrice);
this.cost.addMoney(totalCost);
}
public int compareTo(StatCounter o){
String v1 = null, v2 = null;
String vc1 = null, vc2 = null;
if (v != null) {
v1 = v.getCodeSystemName();
vc1 = v.getCode();
}
IVerrechenbar iv = o.v;
if (iv != null) {
v2 = iv.getCodeSystemName();
vc2 = iv.getCode();
}
int vgroup = StringTool.compareWithNull(v1, v2);
if (vgroup != 0) {
return vgroup;
}
int vCode = StringTool.compareWithNull(vc1, vc2);
if (vCode != 0) {
return vCode;
}
return sum.getCents() - o.sum.getCents();
}
public Money getGewinn(){
Money ret = new Money(sum);
ret.subtractMoney(cost);
return ret;
}
}
private void makeActions(){
statAction = new Action(Messages.PatHeuteView_statisticsAction) { //$NON-NLS-1$
{
setToolTipText(Messages.PatHeuteView_statisticsToolTip); //$NON-NLS-1$
}
@Override
public void run(){
StatLoader loader = new StatLoader();
loader.schedule();
}
};
printAction = new Action(Messages.PatHeuteView_printList) { //$NON-NLS-1$
{
setImageDescriptor(Images.IMG_PRINTER.getImageDescriptor());
setToolTipText(Messages.PatHeuteView_printListToolTip); //$NON-NLS-1$
}
@Override
public void run(){
TerminListeDialog tld = new TerminListeDialog(getViewSite().getShell());
tld.open();
}
};
reloadAction = new Action(Messages.PatHeuteView_reloadAction) { //$NON-NLS-1$
{
setImageDescriptor(Images.IMG_REFRESH.getImageDescriptor());
setToolTipText(Messages.PatHeuteView_reloadToolTip); //$NON-NLS-1$
}
@Override
public void run(){
kons = null;
kload.schedule();
}
};
filterAction = new Action(Messages.PatHeuteView_filterAction, Action.AS_CHECK_BOX) { //$NON-NLS-1$
{
setImageDescriptor(Images.IMG_FILTER.getImageDescriptor());
setToolTipText(Messages.PatHeuteView_filterToolTip); //$NON-NLS-1$
}
@Override
public void run(){
GridData gd = (GridData) ldFilter.getLayoutData();
if (filterAction.isChecked()) {
gd.heightHint = 50;
// gd.minimumHeight=15;
} else {
gd.heightHint = 0;
}
parent.layout(true);
}
};
}
class TerminListeDialog extends TitleAreaDialog implements ICallback {
IVerrechenbar[] lfiltered;
int[] numLeistung;
Money[] perLeistung;
private TextContainer text;
public TerminListeDialog(final Shell shell){
super(shell);
}
@Override
protected Control createDialogArea(final Composite parent){
Composite ret = new Composite(parent, SWT.NONE);
text = new TextContainer(getShell());
ret.setLayout(new FillLayout());
ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
text.getPlugin().createContainer(ret, this);
text.getPlugin().showMenu(false);
text.getPlugin().showToolbar(false);
int add = 2;
if (filterAction.isChecked()) {
lfiltered = ldFilter.getAll().toArray(new IVerrechenbar[0]);
numLeistung = new int[lfiltered.length];
add += lfiltered.length;
perLeistung = new Money[lfiltered.length];
for (int i = 0; i < lfiltered.length; i++) {
perLeistung[i] = new Money();
}
}
text.createFromTemplateName(null, TT_BILLING_LIST, //$NON-NLS-1$
Brief.UNKNOWN, CoreHub.actUser, Messages.PatHeuteView_billing); //$NON-NLS-1$
String[][] table = new String[kons.length + add][];
table[0] = new String[2];
table[0][0] = Messages.PatHeuteView_consultation; //$NON-NLS-1$
table[0][1] = Messages.PatHeuteView_amountBilled; //$NON-NLS-1$
Money total = new Money();
for (int i = 0; i < kons.length; i++) {
table[i + 1] = new String[2];
Konsultation k = kons[i];
table[i + 1][0] = k.getFall().getPatient().getLabel() + "\n" //$NON-NLS-1$
+ k.getLabel();
StringBuilder sb = new StringBuilder();
List<Verrechnet> lstg = k.getLeistungen();
Money subsum = new Money();
for (Verrechnet v : lstg) {
int num = v.getZahl();
Money preis = v.getEffPreis().multiply(num);
if (lfiltered != null) {
for (int j = 0; j < lfiltered.length; j++) {
if (lfiltered[j].equals(v.getVerrechenbar())) {
numLeistung[j] += num;
perLeistung[j].addMoney(preis);
}
}
}
subsum.addMoney(preis);
sb.append(num).append(" ").append(v.getLabel()).append(" ") //$NON-NLS-1$ //$NON-NLS-2$
.append(preis.getAmountAsString()).append("\n"); //$NON-NLS-1$
}
sb.append(Messages.PatHeuteView_total).append(subsum.getAmountAsString()); //$NON-NLS-1$
total.addMoney(subsum);
table[i + 1][1] = sb.toString();
}
table[kons.length + 1] = new String[2];
table[kons.length + 1][0] = Messages.PatHeuteView_sum; //$NON-NLS-1$
table[kons.length + 1][1] = total.getAmountAsString();
if (lfiltered != null) {
for (int i = 0; i < lfiltered.length; i++) {
table[kons.length + 2 + i] = new String[2];
table[kons.length + 2 + i][0] = lfiltered[i].getCode();
StringBuilder sb = new StringBuilder();
sb.append(Messages.PatHeuteView_billedTotal).append(numLeistung[i]).append( //$NON-NLS-1$
Messages.PatHeuteView_times).append( //$NON-NLS-1$
perLeistung[i].getAmountAsString());
table[kons.length + 2 + i][1] = sb.toString();
}
}
text.getPlugin().setFont("Helvetica", SWT.NORMAL, 9); //$NON-NLS-1$
text.getPlugin().insertTable("[Liste]", //$NON-NLS-1$
ITextPlugin.FIRST_ROW_IS_HEADER, table, new int[] {
30, 70
});
return ret;
}
@Override
public void create(){
super.create();
getShell().setText(Messages.PatHeuteView_billingList); //$NON-NLS-1$
setTitle(Messages.PatHeuteView_printBillingList); //$NON-NLS-1$
setMessage(Messages.PatHeuteView_printBillingExpl); //$NON-NLS-1$
getShell().setSize(900, 700);
SWTHelper.center(Hub.plugin.getWorkbench().getActiveWorkbenchWindow().getShell(),
getShell());
}
@Override
protected void okPressed(){
super.okPressed();
}
public void save(){
// TODO Auto-generated method stub
}
public boolean saveAs(){
// TODO Auto-generated method stub
return false;
}
}
private final class DropReceiver implements PersistentObjectDropTarget.IReceiver {
public void dropped(final PersistentObject o, final DropTargetEvent ev){
if (o instanceof IVerrechenbar) {
ldFilter.add((IVerrechenbar) o);
}
}
public boolean accept(final PersistentObject o){
if (o instanceof IVerrechenbar) {
return true;
}
return false;
}
}
}