/******************************************************************************* * Copyright (c) 2008, G. Weirich * 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.buchhaltung.model; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import ch.elexis.buchhaltung.util.PatientIdFormatter; import ch.elexis.core.data.activator.CoreHub; import ch.elexis.data.Fall; import ch.elexis.data.Patient; import ch.elexis.data.Query; import ch.elexis.data.Rechnung; import ch.elexis.data.RnStatus; import ch.elexis.data.Zahlung; import ch.rgw.tools.Money; import ch.rgw.tools.TimeTool; import ch.unibe.iam.scg.archie.annotations.GetProperty; import ch.unibe.iam.scg.archie.annotations.SetProperty; import ch.unibe.iam.scg.archie.model.AbstractDataProvider; import ch.unibe.iam.scg.archie.model.SetDataException; import ch.unibe.iam.scg.archie.ui.widgets.WidgetTypes; /** * Find all bills that are payable at a given date * * @author user * */ public class OffenePostenListe extends AbstractDataProvider { private static final String OFFENE_RECHNUNGEN_PER = Messages.OffenePostenListe_OpenBillsPer; private static final String OFFENE_POSTEN = Messages.OffenePostenListe_Open; private static final String ANALYSIERE_RECHNUNGEN = Messages.OffenePostenListe_AnalyzingBills; private static final String DATENBANKABFRAGE = Messages.OffenePostenListe_DatabaseQuery; private static final String NAME = OFFENE_POSTEN; private static final String FIELD_ACTMANDATOR = "Nur aktueller Mandant"; //$NON-NLS-1$ private static final String FIELD_AUSGANGSDATUM = "Ausgangsdatum"; //$NON-NLS-1$ private static final String FIELD_STICHTAG = "Stichtag"; //$NON-NLS-1$ private TimeTool stichtag = new TimeTool(); private TimeTool startTag = new TimeTool(); private boolean bOnlyActiveMandator; public OffenePostenListe(){ super(NAME); startTag.set(TimeTool.MONTH, TimeTool.JANUARY); startTag.set(TimeTool.DAY_OF_MONTH, 1); } public void setStartTag(TimeTool starttag){ this.startTag.set(starttag); } public TimeTool getStartTag(){ return new TimeTool(startTag); } public void setStichtag(TimeTool stichtag){ this.stichtag.set(stichtag); } public TimeTool getStichtag(){ return new TimeTool(stichtag); } @GetProperty(name = FIELD_ACTMANDATOR, widgetType = WidgetTypes.BUTTON_CHECKBOX) public boolean getOnlyActiveMandator(){ return bOnlyActiveMandator; } @SetProperty(name = FIELD_ACTMANDATOR) public void setOnlyActiveMandator(boolean val){ bOnlyActiveMandator = val; } @GetProperty(name = FIELD_AUSGANGSDATUM, widgetType = WidgetTypes.TEXT_DATE) public String metaGetStarttag(){ return getStartTag().toString(TimeTool.DATE_SIMPLE); } @SetProperty(name = FIELD_AUSGANGSDATUM, index = -2) public void metaSetStarttag(String tag) throws SetDataException{ TimeTool tt = new TimeTool(tag); this.setStartTag(tt); } @GetProperty(name = FIELD_STICHTAG, widgetType = WidgetTypes.TEXT_DATE) public String metaGetStichtag(){ return getStichtag().toString(TimeTool.DATE_SIMPLE); } @SetProperty(name = FIELD_STICHTAG) public void metaSetStichtag(String stichtag) throws SetDataException{ TimeTool tt = new TimeTool(stichtag); this.setStichtag(tt); } @Override protected IStatus createContent(IProgressMonitor monitor){ int totalwork = 1000000; monitor.beginTask(OFFENE_RECHNUNGEN_PER + getStichtag().toString(TimeTool.DATE_SIMPLE), totalwork); monitor.subTask(DATENBANKABFRAGE); Query<Rechnung> qbe = new Query<Rechnung>(Rechnung.class); qbe.add("RnDatum", "<=", getStichtag().toString(TimeTool.DATE_COMPACT)); //$NON-NLS-1$ //$NON-NLS-2$ qbe.add("RnDatum", ">=", getStartTag().toString(TimeTool.DATE_COMPACT)); //$NON-NLS-1$ //$NON-NLS-2$ if (bOnlyActiveMandator) { qbe.add("MandantID", "=", CoreHub.actMandant.getId()); //$NON-NLS-1$ //$NON-NLS-2$ } List<Rechnung> rnn = qbe.execute(); monitor.worked(1000); final ArrayList<Comparable<?>[]> result = new ArrayList<Comparable<?>[]>(); int size = rnn.size(); if (size == 0) { monitor.done(); this.dataSet.setContent(result); return Status.OK_STATUS; } int step = totalwork / size; monitor.subTask(ANALYSIERE_RECHNUNGEN); TimeTool now = getStichtag(); PatientIdFormatter pif = new PatientIdFormatter(8); for (Rechnung rn : rnn) { if (monitor.isCanceled()) { return Status.CANCEL_STATUS; } Fall fall = rn.getFall(); if (fall != null) { Patient pat = fall.getPatient(); Money betrag = rn.getBetrag(); if ((pat != null) && (betrag != null) && (!betrag.isNeglectable())) { int status = rn.getStatusAtDate(now); if (RnStatus.isActive(status)) { Comparable[] row = new Comparable[this.getDataSet().getHeadings().size()]; row[0] = pif.format(pat.get("PatientNr")); //$NON-NLS-1$ row[1] = rn.getNr(); List<Zahlung> zahlungen = rn.getZahlungen(); for (Zahlung z : zahlungen) { TimeTool tt = new TimeTool(z.getDatum()); if (tt.isAfter(now)) { continue; } betrag.subtractMoney(z.getBetrag()); } row[3] = betrag.getAmountAsString(); row[2] = RnStatus.getStatusText(status); result.add(row); } } } monitor.worked(step); } this.dataSet.setContent(result); monitor.done(); return Status.OK_STATUS; } @Override protected List<String> createHeadings(){ List<String> ret = new ArrayList<String>(); ret.add(Messages.OffenePostenListe_PatientNr); ret.add(Messages.OffenePostenListe_BillNr); ret.add(Messages.OffenePostenListe_BillState); ret.add(Messages.OffenePostenListe_OpenAmount); return ret; } @Override public String getDescription(){ return OFFENE_POSTEN; } }