/*******************************************************************************
* 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
* D. Lutz - show records in a table
*
*******************************************************************************/
package ch.elexis.base.ch.ebanking.esr;
import java.text.DecimalFormat;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.viewers.ITableColorProvider;
import org.eclipse.jface.viewers.ITableLabelProvider;
import org.eclipse.jface.viewers.LabelProvider;
import org.eclipse.jface.viewers.StructuredViewer;
import org.eclipse.jface.viewers.TableViewer;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.part.ViewPart;
import ch.elexis.admin.AccessControlDefaults;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.ui.UiDesk;
import ch.elexis.core.ui.actions.AbstractDataLoaderJob;
import ch.elexis.core.ui.actions.FlatDataLoader;
import ch.elexis.core.ui.actions.GlobalEventDispatcher;
import ch.elexis.core.ui.actions.IActivationListener;
import ch.elexis.core.ui.actions.PersistentObjectLoader.QueryFilter;
import ch.elexis.core.ui.util.ViewMenus;
import ch.elexis.core.ui.util.viewers.CommonViewer;
import ch.elexis.core.ui.util.viewers.DefaultControlFieldProvider;
import ch.elexis.core.ui.util.viewers.SimpleWidgetProvider;
import ch.elexis.core.ui.util.viewers.ViewerConfigurer;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.elexis.data.Rechnung;
import ch.rgw.tools.StringTool;
import ch.rgw.tools.TimeTool;
public class ESRView2 extends ViewPart implements IActivationListener {
public static final String ID = "ch.elexis.banking.ESRView2"; //$NON-NLS-1$
private static final String JOB_NAME = "ESR-Loader2"; //$NON-NLS-1$
private static final int DATUM_INDEX = 0;
private static final int RN_NUMMER_INDEX = 1;
private static final int BETRAG_INDEX = 2;
private static final int EINGELESEN_INDEX = 3;
private static final int VERRECHNET_INDEX = 4;
private static final int GUTGESCHRIEBEN_INDEX = 5;
private static final int PATIENT_INDEX = 6;
private static final int BUCHUNG_INDEX = 7;
private static final int DATEI_INDEX = 8;
private static final String[] COLUMN_TEXTS = {
Messages.ESRView2_date, // DATUM_INDEX
Messages.ESRView2_billNumber, // RN_NUMMER_INDEX
Messages.ESRView2_amount, // BETRAG
Messages.ESRView2_readDate, // EINGELESEN_INDEX
Messages.ESRView2_accountedDate, // VERRECHNET_INDEX
Messages.ESRView2_addedDate, // GUTGESCHRIEBEN_INDEX
Messages.ESRView2_patient, // PATIENT_INDEX
Messages.ESRView2_booking, // BUCHUNG_INDEX
Messages.ESRView2_file, // DATEI_INDEX
};
private static final int[] COLUMN_WIDTHS = {
60, // DATUM_INDEX
50, // RN_NUMMER_INDEX
50, // BETRAG
80, // EINGELESEN_INDEX
80, // VERRECHNET_INDEX
80, // GUTGESCHRIEBEN_INDEX
150, // PATIENT_INDEX
80, // BUCHUNG_INDEX
80, // DATEI_INDEX
};
CommonViewer cv;
ViewerConfigurer vc;
// ESRLoader esrloader;
FlatDataLoader fdl;
Query<ESRRecord> qbe;
// private Action loadESRFile;
private ViewMenus menus;
private ESRSelectionListener esrl;
public ESRView2(){
// Hub.acl.grantForSelf(DISPLAY_ESR);
}
@Override
public void dispose(){
// Hub.acl.revokeFromSelf(DISPLAY_ESR);
GlobalEventDispatcher.removeActivationListener(this, getViewSite().getPart());
}
@Override
public void createPartControl(Composite parent){
parent.setLayout(new GridLayout());
cv = new CommonViewer();
qbe = new Query<ESRRecord>(ESRRecord.class);
fdl = new FlatDataLoader(cv, qbe);
/*
* esrloader = (ESRLoader) JobPool.getJobPool().getJob(JOB_NAME); if (esrloader == null) {
* esrloader = new ESRLoader(qbe); JobPool.getJobPool().addJob(esrloader); }
*/
fdl.addQueryFilter(new QueryFilter() {
public void apply(Query<? extends PersistentObject> qbe){
if (CoreHub.acl.request(AccessControlDefaults.ACCOUNTING_GLOBAL) == false) {
if (CoreHub.actMandant != null) {
qbe.startGroup();
qbe.add(ESRRecord.MANDANT_ID, Query.EQUALS, CoreHub.actMandant.getId());
qbe.or();
qbe.add(ESRRecord.MANDANT_ID, StringConstants.EMPTY, null);
qbe.add(ESRRecord.FLD_REJECT_CODE, Query.NOT_EQUAL, StringConstants.ZERO);
qbe.endGroup();
qbe.and();
} else {
qbe.insertFalse();
}
}
}
});
vc =
new ViewerConfigurer(fdl, new ESRLabelProvider(), new DefaultControlFieldProvider(cv,
new String[] {
"Datum" //$NON-NLS-1$
}), new ViewerConfigurer.DefaultButtonProvider(), new SimpleWidgetProvider(
SimpleWidgetProvider.TYPE_LAZYLIST, SWT.NONE, cv));
cv.create(vc, parent, SWT.None, getViewSite());
createColumns(cv.getViewerWidget());
// JobPool.getJobPool().activate(JOB_NAME, Job.SHORT);
makeActions();
menus = new ViewMenus(getViewSite());
menus.createToolbar(/* loadESRFile */);
menus.createMenu(/* loadESRFile */);
esrl = new ESRSelectionListener();
cv.addDoubleClickListener(new CommonViewer.DoubleClickListener() {
public void doubleClicked(PersistentObject obj, CommonViewer cv){
ESRRecordDialog erd =
new ESRRecordDialog(getViewSite().getShell(), (ESRRecord) obj);
if (erd.open() == Dialog.OK) {
cv.notify(CommonViewer.Message.update);
}
}
});
GlobalEventDispatcher.addActivationListener(this, getViewSite().getPart());
}
private void createColumns(StructuredViewer viewer){
if (!(viewer instanceof TableViewer)) {
// no valid viewer, don't create columns
return;
}
TableViewer tableViewer = (TableViewer) viewer;
Table table = tableViewer.getTable();
table.setHeaderVisible(true);
table.setLinesVisible(true);
for (int i = 0; i < COLUMN_TEXTS.length; i++) {
TableColumn column = new TableColumn(table, SWT.LEFT);
column.setText(COLUMN_TEXTS[i]);
column.setWidth(COLUMN_WIDTHS[i]);
}
}
@Override
public void setFocus(){
// TODO Auto-generated method stub
}
class ESRLabelProvider extends LabelProvider implements ITableLabelProvider,
ITableColorProvider {
DecimalFormat df = new DecimalFormat("###0.00"); //$NON-NLS-1$
public Image getColumnImage(Object element, int columnIndex){
// TODO Auto-generated method stub
return null;
}
public String getColumnText(Object element, int columnIndex){
String text = ""; //$NON-NLS-1$
if (element instanceof ESRRecord) {
ESRRecord rec = (ESRRecord) element;
if (rec.getTyp().equals(ESRRecord.MODE.Summenrecord)) {
switch (columnIndex) {
case DATUM_INDEX:
text = rec.get("Datum"); //$NON-NLS-1$
break;
case RN_NUMMER_INDEX:
text = "Summe"; //$NON-NLS-1$
break;
case BETRAG_INDEX:
text = rec.getBetrag().getAmountAsString();
break;
case DATEI_INDEX:
text = rec.getFile();
break;
}
} else {
switch (columnIndex) {
case DATUM_INDEX:
text = rec.get("Datum"); //$NON-NLS-1$
break;
case RN_NUMMER_INDEX:
Rechnung rn = rec.getRechnung();
if (rn != null) {
text = rn.getNr();
}
break;
case BETRAG_INDEX:
text = rec.getBetrag().getAmountAsString();
break;
case EINGELESEN_INDEX:
text = rec.getEinlesedatatum();
break;
case VERRECHNET_INDEX:
text = rec.getVerarbeitungsdatum();
break;
case GUTGESCHRIEBEN_INDEX:
text = rec.getValuta();
break;
case PATIENT_INDEX:
text = rec.getPatient().getLabel();
break;
case BUCHUNG_INDEX:
String dat = rec.getGebucht();
if (StringTool.isNothing(dat)) {
text = Messages.ESRView2_notbooked;
} else {
text = new TimeTool(dat).toString(TimeTool.DATE_GER);
}
break;
case DATEI_INDEX:
text = rec.getFile();
break;
}
}
}
return text;
}
public Color getForeground(Object element, int columnIndex){
return UiDesk.getColor(UiDesk.COL_BLACK);
}
public Color getBackground(Object element, int columnIndex){
if (element instanceof ESRRecord) {
ESRRecord rec = (ESRRecord) element;
if (rec.getTyp().equals(ESRRecord.MODE.Summenrecord)) {
return UiDesk.getColor(UiDesk.COL_GREEN);
}
String buch = rec.getGebucht();
if (rec.getRejectCode().equals(ESRRecord.REJECT.OK)) {
if (StringTool.isNothing(buch)) {
return UiDesk.getColor(UiDesk.COL_GREY);
}
return UiDesk.getColor(UiDesk.COL_WHITE);
}
return UiDesk.getColor(UiDesk.COL_RED);
}
return UiDesk.getColor(UiDesk.COL_SKYBLUE);
}
}
class ESRLoader extends AbstractDataLoaderJob {
// public static final int ORDER_RNNUMMER = 1;
// public static final int ORDER_
Query<ESRRecord> qbe;
ESRLoader(Query<ESRRecord> qbe){
super(JOB_NAME, qbe, new String[] {
"Datum" //$NON-NLS-1$
});
this.qbe = qbe;
}
@Override
public IStatus execute(IProgressMonitor monitor){
monitor.beginTask(Messages.ESRView2_loadingESR, SWT.INDETERMINATE);
qbe.clear();
vc.getControlFieldProvider().setQuery(qbe);
qbe.orderBy(true, new String[] {
"Datum", "Gebucht" //$NON-NLS-1$ //$NON-NLS-2$
});
List<ESRRecord> list = qbe.execute();
result = list.toArray();
monitor.done();
return Status.OK_STATUS;
}
@Override
public int getSize(){
return PersistentObject.getConnection().queryInt("SELECT COUNT(0) FROM ESRRECORDS"); //$NON-NLS-1$
}
}
private void makeActions(){
/*
* loadESRFile=new Action("ESR-Datei einlesen"){ {
* setToolTipText("Auswahl einer von der Bank heruntergeladenen ESR-Datei zum Einlesen");
* setImageDescriptor(Desk.theImageRegistry.getDescriptor(Desk.IMG_IMPORT)); }
*
* @Override public void run(){ FileDialog fld=new
* FileDialog(getViewSite().getShell(),SWT.OPEN); fld.setText("ESR Datei auswählen"); String
* filename=fld.open(); if(filename!=null){ ESRFile esrf=new ESRFile();
* Result<List<ESRRecord>> result=esrf.read(filename); if(result.isOK()){ for(ESRRecord
* rec:result.get()){ if(rec.getRejectCode().equals(ESRRecord.REJECT.OK)){
* if(rec.getTyp().equals(ESRRecord.MODE.Summenrecord)){
* Hub.log.log("ESR eingelesen. Summe "+rec.getBetrag(), Log.INFOS); }else if(
* (rec.getTyp().equals(ESRRecord.MODE.Storno_edv)) ||
* (rec.getTyp().equals(ESRRecord.MODE.Storno_Schalter))){ Rechnung rn=rec.getRechnung();
* Money zahlung=rec.getBetrag().negate(); rn.addZahlung(zahlung,
* "Storno für rn "+rn.getNr()+" / "+rec.getPatient().getPatCode()); rec.setGebucht(null);
* }else{ Rechnung rn=rec.getRechnung(); if(rn.getStatus()==RnStatus.BEZAHLT){
* if(MessageDialog.openConfirm(getViewSite().getShell(), "Rechnung schon bezahlt",
* "Rechnung "+rn.getNr()+" ist bereits bezahlt. Trotzdem buchen?")==false){ continue; } }
* Money zahlung=rec.getBetrag(); Money offen=rn.getOffenerBetrag();
* if(zahlung.isMoreThan(offen)){ if(MessageDialog.openConfirm(getViewSite().getShell(),
* "Betrag zu hoch", "Die Zahlung für Rechnung "
* +rn.getNr()+" übersteigt den offenen Betrag. Trotzdem buchen?")==false){ continue; } }
*
* rn.addZahlung(zahlung, "VESR für rn "+rn.getNr()+" / "+rec.getPatient().getPatCode());
* rec.setGebucht(null); } } } }else{ result.display("Fehler beim ESR-Einlesen:"); } }
* JobPool.getJobPool().activate(JOB_NAME, Job.SHORT);
* //cv.notify(CommonViewer.Message.update); } };
*/
}
public void activation(boolean mode){
// TODO Auto-generated method stub
}
public void visible(boolean mode){
esrl.activate(mode);
}
}