/*******************************************************************************
* 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.rechnung;
import java.util.LinkedList;
import java.util.List;
import org.eclipse.jface.action.MenuManager;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Text;
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 ch.elexis.core.constants.Preferences;
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.ui.UiDesk;
import ch.elexis.core.ui.constants.UiResourceConstants;
import ch.elexis.core.ui.dialogs.KontaktSelektor;
import ch.elexis.core.ui.events.ElexisUiEventListenerImpl;
import ch.elexis.core.ui.util.MoneyInput;
import ch.elexis.core.ui.util.NumberInput;
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.SimpleWidgetProvider;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer;
import ch.elexis.core.ui.views.FallDetailView;
import ch.elexis.data.Anwender;
import ch.elexis.data.Fall;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Mandant;
import ch.elexis.data.Patient;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Rechnung;
import ch.rgw.io.Settings;
import ch.rgw.tools.Money;
import ch.rgw.tools.Tree;
/**
* Display a listing of all bills selected after several user selectable criteria. The selected
* bills can be modified or exported.
*
* @author gerry
*
*/
public class RechnungsListeView extends ViewPart implements ElexisEventListener {
private static final String REMINDER_3 = Messages.RechnungsListeView_reminder3; //$NON-NLS-1$
private static final String REMINDER_2 = Messages.RechnungsListeView_reminder2; //$NON-NLS-1$
private static final String REMINDER_1 = Messages.RechnungsListeView_reminder1; //$NON-NLS-1$
public final static String ID = "ch.elexis.RechnungsListeView"; //$NON-NLS-1$
CommonViewer cv;
ViewerConfigurer vc;
RnActions actions;
RnContentProvider cntp;
RnControlFieldProvider cfp;
Text tPat, tRn, tSum, tOpen;
NumberInput niDaysTo1st, niDaysTo2nd, niDaysTo3rd;
MoneyInput mi1st, mi2nd, mi3rd;
SelectionListener mahnWizardListener;
FormToolkit tk = UiDesk.getToolkit();
Settings rnStellerSettings;
private ElexisEventListener eeli_mandant = new ElexisUiEventListenerImpl(Mandant.class,
ElexisEvent.EVENT_MANDATOR_CHANGED) {
@Override
public void runInUi(ElexisEvent ev){
Mandant m = (Mandant) ElexisEventDispatcher.getSelected(Mandant.class);
if (m != null) {
rnStellerSettings = CoreHub.getUserSetting(m.getRechnungssteller());
checkRnStellerSettingsValidity(m);
// cv.notify(CommonViewer.Message.update);
updateMahnAutomatic();
}
}
};
public RechnungsListeView(){
Mandant currMandant = (Mandant) ElexisEventDispatcher.getSelected(Mandant.class);
rnStellerSettings = CoreHub.getUserSetting(currMandant.getRechnungssteller());
checkRnStellerSettingsValidity(currMandant);
ElexisEventDispatcher.getInstance().addListeners(eeli_mandant);
}
private void checkRnStellerSettingsValidity(Mandant mandant){
if (rnStellerSettings == null) {
Kontakt k = null;
KontaktSelektor ksDialog =
new KontaktSelektor(UiDesk.getTopShell(), Anwender.class,
Messages.RechnungsListeView_selectRnSteller,
Messages.RechnungsListeView_selectRnStellerMsg, new String[] {
Anwender.FLD_NAME1, Anwender.FLD_NAME2
});
if (ksDialog.open() == Dialog.OK) {
if (ksDialog.getSelection() != null) {
k = (Kontakt) ksDialog.getSelection();
if (k != null) {
mandant.setRechnungssteller(k);
rnStellerSettings = CoreHub.getUserSetting(k);
}
}
}
}
if (rnStellerSettings == null) {
MessageDialog.openError(UiDesk.getTopShell(), Messages.RechnungsListeView_error,
Messages.RechnungsListeView_errorNoRnStellerSelected);
}
}
@Override
public void createPartControl(final Composite p){
p.setLayout(new GridLayout());
// SashForm sash=new SashForm(p,SWT.VERTICAL);
Composite comp = new Composite(p, SWT.NONE);
comp.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
comp.setLayout(new GridLayout());
cv = new CommonViewer();
cntp = new RnContentProvider(this, cv);
cfp = new RnControlFieldProvider();
vc =
new ViewerConfigurer(cntp, new ViewerConfigurer.TreeLabelProvider(), cfp,
new ViewerConfigurer.DefaultButtonProvider(), new SimpleWidgetProvider(
SimpleWidgetProvider.TYPE_TREE, SWT.V_SCROLL | SWT.MULTI, cv));
// rnFilter=FilterFactory.createFilter(Rechnung.class,"Rn
// Nummer","Name","Vorname","Betrag");
cv.create(vc, comp, SWT.BORDER, getViewSite());
cv.addDoubleClickListener(new DoubleClickListener() {
@Override
public void doubleClicked(PersistentObject obj, CommonViewer cv){
if (obj instanceof Patient) {
try {
ElexisEventDispatcher.fireSelectionEvent((Patient) obj);
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.showView(UiResourceConstants.PatientDetailView2_ID);
} catch (PartInitException e) {
e.printStackTrace();
}
} else if (obj instanceof Fall) {
try {
ElexisEventDispatcher.fireSelectionEvent((Fall) obj);
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.showView(FallDetailView.ID);
} catch (PartInitException e) {
e.printStackTrace();
}
} else if (obj instanceof Rechnung) {
try {
ElexisEventDispatcher.fireSelectionEvent((Rechnung) obj);
PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage()
.showView(RnDetailView.ID);
} catch (PartInitException e) {
e.printStackTrace();
}
}
}
});
Composite bottom = new Composite(comp, SWT.NONE);
RowLayout rowLayout = new RowLayout();
rowLayout.wrap = false;
rowLayout.pack = true;
rowLayout.justify = true;
rowLayout.fill = true;
rowLayout.type = SWT.HORIZONTAL;
rowLayout.marginLeft = 0;
rowLayout.marginTop = 0;
rowLayout.marginRight = 0;
rowLayout.marginBottom = 0;
rowLayout.spacing = 5;
mahnWizardListener = new SelectionAdapter() {
@Override
public void widgetSelected(final SelectionEvent e){
rnStellerSettings.set(Preferences.RNN_DAYSUNTIL1ST, niDaysTo1st.getValue());
rnStellerSettings.set(Preferences.RNN_DAYSUNTIL2ND, niDaysTo2nd.getValue());
rnStellerSettings.set(Preferences.RNN_DAYSUNTIL3RD, niDaysTo3rd.getValue());
rnStellerSettings.set(Preferences.RNN_AMOUNT1ST, mi1st.getMoney(false)
.getAmountAsString());
rnStellerSettings.set(Preferences.RNN_AMOUNT2ND, mi2nd.getMoney(false)
.getAmountAsString());
rnStellerSettings.set(Preferences.RNN_AMOUNT3RD, mi3rd.getMoney(false)
.getAmountAsString());
rnStellerSettings.flush();
}
};
bottom.setLayout(rowLayout);
Form fSum = tk.createForm(bottom);
Form fWizard = tk.createForm(bottom);
fSum.setText(Messages.RechnungsListeView_sum); //$NON-NLS-1$
fWizard.setText(Messages.RechnungsListeView_dunningAutomatics); //$NON-NLS-1$
Composite cSum = fSum.getBody();
cSum.setLayout(new GridLayout(2, false));
tk.createLabel(cSum, Messages.RechnungsListeView_patInList); //$NON-NLS-1$
tPat = tk.createText(cSum, "", SWT.BORDER | SWT.READ_ONLY); //$NON-NLS-1$
tPat.setLayoutData(new GridData(100, SWT.DEFAULT));
tk.createLabel(cSum, Messages.RechnungsListeView_accountsInList); //$NON-NLS-1$
tRn = tk.createText(cSum, "", SWT.BORDER | SWT.READ_ONLY); //$NON-NLS-1$
tRn.setLayoutData(new GridData(100, SWT.DEFAULT));
tk.createLabel(cSum, Messages.RechnungsListeView_sumInList); //$NON-NLS-1$
tSum = SWTHelper.createText(tk, cSum, 1, SWT.BORDER | SWT.READ_ONLY);
tSum.setLayoutData(new GridData(100, SWT.DEFAULT));
tk.createLabel(cSum, Messages.RechnungsListeView_paidInList); //$NON-NLS-1$
tOpen = SWTHelper.createText(tk, cSum, 1, SWT.BORDER | SWT.READ_ONLY);
tOpen.setLayoutData(new GridData(100, SWT.DEFAULT));
Composite cW = fWizard.getBody();
cW.setLayout(new GridLayout(4, true));
tk.createLabel(cW, Messages.RechnungsListeView_delayInDays); //$NON-NLS-1$
niDaysTo1st = new NumberInput(cW, REMINDER_1);
niDaysTo1st.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
niDaysTo1st.getControl().addSelectionListener(mahnWizardListener);
niDaysTo1st.setValue(rnStellerSettings.get(Preferences.RNN_DAYSUNTIL1ST, 30));
niDaysTo2nd = new NumberInput(cW, REMINDER_2);
niDaysTo2nd.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
niDaysTo2nd.getControl().addSelectionListener(mahnWizardListener);
niDaysTo2nd.setValue(rnStellerSettings.get(Preferences.RNN_DAYSUNTIL2ND, 10));
niDaysTo3rd = new NumberInput(cW, REMINDER_3);
niDaysTo3rd.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
niDaysTo3rd.getControl().addSelectionListener(mahnWizardListener);
niDaysTo3rd.setValue(rnStellerSettings.get(Preferences.RNN_DAYSUNTIL3RD, 5));
tk.createLabel(cW, Messages.RechnungsListeView_fine); //$NON-NLS-1$
mi1st = new MoneyInput(cW, REMINDER_1);
mi1st.addSelectionListener(mahnWizardListener);
mi1st.setMoney(rnStellerSettings.get(Preferences.RNN_AMOUNT1ST,
new Money().getAmountAsString()));
mi2nd = new MoneyInput(cW, REMINDER_2);
mi2nd.addSelectionListener(mahnWizardListener);
mi2nd.setMoney(rnStellerSettings.get(Preferences.RNN_AMOUNT2ND,
new Money().getAmountAsString()));
mi3rd = new MoneyInput(cW, REMINDER_3);
mi3rd.addSelectionListener(mahnWizardListener);
mi3rd.setMoney(rnStellerSettings.get(Preferences.RNN_AMOUNT3RD,
new Money().getAmountAsString()));
ElexisEventDispatcher.getInstance().addListeners(this);
cv.getViewerWidget().getControl()
.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
ViewMenus menu = new ViewMenus(getViewSite());
actions = new RnActions(this);
menu.createToolbar(actions.reloadAction, actions.mahnWizardAction, actions.rnFilterAction,
null, actions.rnExportAction);
menu.createMenu(actions.expandAllAction, actions.collapseAllAction,
actions.printListeAction, actions.addAccountExcessAction);
MenuManager mgr = new MenuManager();
mgr.setRemoveAllWhenShown(true);
mgr.addMenuListener(new RnMenuListener(this));
cv.setContextMenu(mgr);
cntp.startListening();
}
@Override
public void dispose(){
ElexisEventDispatcher.getInstance().removeListeners(this);
ElexisEventDispatcher.getInstance().removeListeners(eeli_mandant);
cntp.stopListening();
super.dispose();
}
@Override
public void setFocus(){
// TODO Auto-generated method stub
}
@SuppressWarnings("unchecked")
List<Rechnung> createList(){
IStructuredSelection sel = (IStructuredSelection) cv.getViewerWidget().getSelection();
List<Tree> at = sel.toList();
List<Rechnung> ret = new LinkedList<Rechnung>();
for (Tree<PersistentObject> t : at) {
if (t.contents instanceof Patient) {
for (Tree<PersistentObject> tp : t.getChildren()) {
for (Tree<PersistentObject> tf : tp.getChildren()) {
Rechnung rn = (Rechnung) tf.contents;
if (!ret.contains(rn)) {
ret.add(rn);
}
}
}
} else if (t.contents instanceof Fall) {
for (Tree<PersistentObject> tr : t.getChildren()) {
Rechnung rn = (Rechnung) tr.contents;
if (!ret.contains(rn)) {
ret.add(rn);
}
}
} else if (t.contents instanceof Rechnung) {
Rechnung rn = (Rechnung) t.contents;
if (!ret.contains(rn)) {
ret.add(rn);
}
}
}
return ret;
}
public void catchElexisEvent(ElexisEvent ev){
cv.notify(CommonViewer.Message.update);
}
private final ElexisEvent eetmpl = new ElexisEvent(null, Rechnung.class,
ElexisEvent.EVENT_RELOAD);
public ElexisEvent getElexisEventFilter(){
return eetmpl;
}
private void updateMahnAutomatic(){
niDaysTo1st.setValue(rnStellerSettings.get(Preferences.RNN_DAYSUNTIL1ST, 30));
niDaysTo2nd.setValue(rnStellerSettings.get(Preferences.RNN_DAYSUNTIL2ND, 10));
niDaysTo3rd.setValue(rnStellerSettings.get(Preferences.RNN_DAYSUNTIL3RD, 5));
mi1st.setMoney(rnStellerSettings.get(Preferences.RNN_AMOUNT1ST,
new Money().getAmountAsString()));
mi2nd.setMoney(rnStellerSettings.get(Preferences.RNN_AMOUNT2ND,
new Money().getAmountAsString()));
mi3rd.setMoney(rnStellerSettings.get(Preferences.RNN_AMOUNT3RD,
new Money().getAmountAsString()));
}
}