Skip to content

Commit

Permalink
Feature gegenbuchung (#138)
Browse files Browse the repository at this point in the history
* Zwischenstand

* Feature Gegenbuchung

* kleine Optimierung

* Auch Mitgliedskonto entfernen

* Resolve comments

* Use DISTINCT

* Kommentare gelöst

Habe auch die anderen Stellen aus Feature #104 vereinfacht um doppelte Einträge bei der Datenbank Abfrage zu verhindern.

* Remove Sub-Select

* Change Update Version 429 to 430

* konto aus query entfernt

* Fertige Buchungsartabfrage

* Fix Sort und Formatter

* Fix Filter in Combo Box

* Neue Buchung bei Action

* Verbessere Buchungsart Eingabe

* Update Schleife

* Update Schleife in KontoKontrol

* Entferne Dateien die nicht zum Feature gehören
  • Loading branch information
JohannMaierhofer committed Feb 8, 2024
1 parent ffdf8ad commit 5115f3a
Show file tree
Hide file tree
Showing 7 changed files with 376 additions and 1 deletion.
85 changes: 85 additions & 0 deletions src/de/jost_net/JVerein/gui/action/BuchungGegenbuchungAction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
/**********************************************************************
* Copyright (c) by Heiner Jostkleigrewe
* This program is free software: you can redistribute it and/or modify it under the terms of the
* GNU General Public License as published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
* even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See
* the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with this program. If not,
* see <http://www.gnu.org/licenses/>.
*
* heiner@jverein.de
* www.jverein.de
**********************************************************************/
package de.jost_net.JVerein.gui.action;

import de.jost_net.JVerein.Einstellungen;
import de.jost_net.JVerein.gui.dialogs.KontoAuswahlDialog;
import de.jost_net.JVerein.gui.view.BuchungView;
import de.jost_net.JVerein.rmi.Buchung;
import de.jost_net.JVerein.rmi.Konto;
import de.willuhn.datasource.rmi.DBIterator;
import de.willuhn.datasource.rmi.DBService;
import de.willuhn.jameica.gui.Action;
import de.willuhn.jameica.gui.GUI;
import de.willuhn.jameica.system.OperationCanceledException;
import de.willuhn.util.ApplicationException;

public class BuchungGegenbuchungAction implements Action
{

@Override
public void handleAction(Object context) throws ApplicationException
{

if (context == null || !(context instanceof Buchung))
{
throw new ApplicationException("Keine Buchung ausgewählt");
}
Buchung b = (Buchung) context;
Konto konto = null;
try
{
final DBService service = Einstellungen.getDBService();
DBIterator<Konto> konten = service.createList(Konto.class);
konten.addFilter("buchungsart = ?", b.getBuchungsartId());
if (konten.size() > 0)
{
konto = (Konto) konten.next();
}
if (konto == null)
{
KontoAuswahlDialog d = new KontoAuswahlDialog(
KontoAuswahlDialog.POSITION_CENTER, false, false, true);
konto = (Konto) d.open();
}
if (konto != null)
{
Buchung bu = (Buchung) Einstellungen.getDBService().createObject(Buchung.class,
null);
bu.setKonto(konto);
bu.setName(b.getName());
bu.setBetrag(-b.getBetrag());
bu.setZweck(b.getZweck());
bu.setDatum(b.getDatum());
if (b.getBuchungsart() != null)
bu.setBuchungsart(b.getBuchungsartId());
if (b.getProjekt() != null)
bu.setProjektID(b.getProjektID());

GUI.startView(new BuchungView(), bu);
}
}
catch (OperationCanceledException oce)
{
throw oce;
}
catch (Exception e)
{
GUI.getStatusBar().setErrorText("Fehler bei der Gegenbuchung.");
}
}
}
175 changes: 174 additions & 1 deletion src/de/jost_net/JVerein/gui/control/KontoControl.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,31 +17,43 @@
package de.jost_net.JVerein.gui.control;

import java.rmi.RemoteException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;

import de.jost_net.JVerein.Einstellungen;
import de.jost_net.JVerein.gui.action.KontoAction;
import de.jost_net.JVerein.gui.formatter.BuchungsartFormatter;
import de.jost_net.JVerein.gui.input.KontoInput;
import de.jost_net.JVerein.gui.menu.KontoMenu;
import de.jost_net.JVerein.keys.BuchungsartSort;
import de.jost_net.JVerein.keys.ArtBuchungsart;
import de.jost_net.JVerein.rmi.Buchungsart;
import de.jost_net.JVerein.rmi.Konto;
import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ;
import de.willuhn.datasource.rmi.DBIterator;
import de.willuhn.datasource.rmi.DBService;
import de.willuhn.datasource.rmi.ObjectNotFoundException;
import de.willuhn.datasource.rmi.ResultSetExtractor;
import de.willuhn.jameica.gui.AbstractControl;
import de.willuhn.jameica.gui.AbstractView;
import de.willuhn.jameica.gui.GUI;
import de.willuhn.jameica.gui.Part;
import de.willuhn.jameica.gui.formatter.DateFormatter;
import de.willuhn.jameica.gui.formatter.Formatter;
import de.willuhn.jameica.gui.input.DateInput;
import de.willuhn.jameica.gui.input.Input;
import de.willuhn.jameica.gui.input.SelectInput;
import de.willuhn.jameica.gui.input.TextInput;
import de.willuhn.jameica.gui.parts.Column;
import de.willuhn.jameica.gui.parts.TablePart;
import de.willuhn.jameica.gui.parts.table.FeatureSummary;
import de.willuhn.jameica.hbci.Settings;
import de.willuhn.logging.Logger;
import de.willuhn.util.ApplicationException;
//import de.jost_net.JVerein.keys.ArtBuchungsart;

public class KontoControl extends AbstractControl
{
Expand All @@ -61,6 +73,10 @@ public class KontoControl extends AbstractControl
private SelectInput hibiscusid;

private Konto konto;

private SelectInput buchungsart;

private int unterdrueckunglaenge = 0;

public KontoControl(AbstractView view)
{
Expand Down Expand Up @@ -166,6 +182,7 @@ public void handleStore()
k.setBezeichnung((String) getBezeichnung().getValue());
k.setEroeffnung((Date) getEroeffnung().getValue());
k.setAufloesung((Date) getAufloesung().getValue());
k.setBuchungsart(getSelectedBuchungsArtId());
if (getHibiscusId().getValue() == null)
{
k.setHibiscusId(-1);
Expand Down Expand Up @@ -227,10 +244,12 @@ public String format(Object o)
new DateFormatter(new JVDateFormatTTMMJJJJ()));
kontenList.addColumn("Konto-Auflösung", "aufloesung",
new DateFormatter(new JVDateFormatTTMMJJJJ()));
kontenList.addColumn("Gegenbuchung-Buchungsart", "buchungsart",
new BuchungsartFormatter());
kontenList.setRememberColWidths(true);
kontenList.setContextMenu(new KontoMenu());
kontenList.setRememberOrder(true);
kontenList.setSummary(true);
kontenList.addFeature(new FeatureSummary());
return kontenList;
}

Expand All @@ -246,4 +265,158 @@ public void refreshTable() throws RemoteException
}
}

public Input getBuchungsart() throws RemoteException
{
if (buchungsart != null)
{
return buchungsart;
}
ArrayList<Buchungsart> liste = new ArrayList<>();
unterdrueckunglaenge = Einstellungen.getEinstellung().getUnterdrueckungLaenge();
final DBService service = Einstellungen.getDBService();

ResultSetExtractor rs = new ResultSetExtractor()
{
@Override
public Object extract(ResultSet rs) throws RemoteException, SQLException
{
ArrayList<Buchungsart> list = new ArrayList<Buchungsart>();
while (rs.next())
{
list.add(
(Buchungsart) service.createObject(Buchungsart.class, rs.getString(1)));
}
return list;
}
};
if (unterdrueckunglaenge > 0)
{
Calendar cal = Calendar.getInstance();
Date db = cal.getTime();
cal.add(Calendar.MONTH, - unterdrueckunglaenge);
Date dv = cal.getTime();
String sql = "SELECT DISTINCT ba.* FROM buchungsart ba ";
sql += "LEFT JOIN konto k ON k.buchungsart = ba.id, buchung bu ";
if (konto.getBuchungsart() == null)
{
sql += "WHERE (k.buchungsart IS NULL) ";
}
else
{
sql += "WHERE (k.buchungsart IS NULL OR k.buchungsart = ?) ";
}
sql += "AND ba.id IS NOT NULL AND ba.id = bu.buchungsart ";
sql += "AND bu.datum >= ? AND bu.datum <= ? ";
sql += "AND ba.art = ? ";
if (Einstellungen.getEinstellung()
.getBuchungsartSort() == BuchungsartSort.NACH_NUMMER)
{
sql += "ORDER BY nummer";
}
else
{
sql += "ORDER BY bezeichnung";
}

if (konto.getBuchungsart() == null)
{
@SuppressWarnings("unchecked")
ArrayList<Buchungsart> ergebnis = (ArrayList<Buchungsart>) service.execute(sql,
new Object[] { dv, db, ArtBuchungsart.UMBUCHUNG }, rs);
addToList(liste, ergebnis);
}
else
{
@SuppressWarnings("unchecked")
ArrayList<Buchungsart> ergebnis = (ArrayList<Buchungsart>) service.execute(sql,
new Object[] { konto.getBuchungsartId(), dv, db, ArtBuchungsart.UMBUCHUNG }, rs);
addToList(liste, ergebnis);
}
}
else
{
String sql = "SELECT DISTINCT ba.* FROM buchungsart ba ";
sql += "LEFT JOIN konto k ON k.buchungsart = ba.id ";
if (konto.getBuchungsart() == null)
{
sql += "WHERE (k.buchungsart IS NULL) ";
}
else
{
sql += "WHERE (k.buchungsart IS NULL OR k.buchungsart = ?) ";
}
sql += "AND ba.art = ? ";
if (Einstellungen.getEinstellung()
.getBuchungsartSort() == BuchungsartSort.NACH_NUMMER)
{
sql += "ORDER BY nummer";
}
else
{
sql += "ORDER BY bezeichnung";
}

if (konto.getBuchungsart() == null)
{
@SuppressWarnings("unchecked")
ArrayList<Buchungsart> ergebnis = (ArrayList<Buchungsart>) service.execute(sql,
new Object[] { ArtBuchungsart.UMBUCHUNG }, rs);
addToList(liste, ergebnis);
}
else
{
@SuppressWarnings("unchecked")
ArrayList<Buchungsart> ergebnis = (ArrayList<Buchungsart>) service.execute(sql,
new Object[] { konto.getBuchungsartId(), ArtBuchungsart.UMBUCHUNG }, rs);
addToList(liste, ergebnis);
}
}

Buchungsart b = konto.getBuchungsart();
buchungsart = new SelectInput(liste, b);
buchungsart.setPleaseChoose("Bitte wählen...");

switch (Einstellungen.getEinstellung().getBuchungsartSort())
{
case BuchungsartSort.NACH_NUMMER:
buchungsart.setAttribute("nrbezeichnung");
break;
case BuchungsartSort.NACH_BEZEICHNUNG_NR:
buchungsart.setAttribute("bezeichnungnr");
break;
default:
buchungsart.setAttribute("bezeichnung");
break;
}

return buchungsart;
}

private Long getSelectedBuchungsArtId() throws ApplicationException
{
try
{
Buchungsart buchungsArt = (Buchungsart) getBuchungsart().getValue();
if (null == buchungsArt)
return null;
Long id = Long.valueOf(buchungsArt.getID());
return id;
}
catch (RemoteException ex)
{
final String meldung = "Gewählte Buchungsart kann nicht ermittelt werden";
Logger.error(meldung, ex);
throw new ApplicationException(meldung, ex);
}
}

private void addToList(ArrayList<Buchungsart> liste, ArrayList<Buchungsart> ergebnis)
{
int size = ergebnis.size();
for (int i = 0; i < size; i++)
{
liste.add(ergebnis.get(i));
}
}

}
39 changes: 39 additions & 0 deletions src/de/jost_net/JVerein/gui/menu/BuchungMenu.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,16 @@
import de.jost_net.JVerein.gui.action.BuchungBuchungsartZuordnungAction;
import de.jost_net.JVerein.gui.action.BuchungDeleteAction;
import de.jost_net.JVerein.gui.action.BuchungDuplizierenAction;
import de.jost_net.JVerein.gui.action.BuchungGegenbuchungAction;
import de.jost_net.JVerein.gui.action.BuchungKontoauszugZuordnungAction;
import de.jost_net.JVerein.gui.action.BuchungMitgliedskontoZuordnungAction;
import de.jost_net.JVerein.gui.action.BuchungNeuAction;
import de.jost_net.JVerein.gui.action.BuchungProjektZuordnungAction;
import de.jost_net.JVerein.gui.action.SplitBuchungAction;
import de.jost_net.JVerein.gui.control.BuchungsControl;
import de.jost_net.JVerein.rmi.Buchung;
import de.jost_net.JVerein.keys.ArtBuchungsart;
import de.jost_net.JVerein.keys.SplitbuchungTyp;
import de.willuhn.jameica.gui.Action;
import de.willuhn.jameica.gui.parts.CheckedContextMenuItem;
import de.willuhn.jameica.gui.parts.CheckedSingleContextMenuItem;
Expand All @@ -53,6 +56,8 @@ public BuchungMenu(BuchungsControl control)
new BuchungAction(false), "text-x-generic.png"));
addItem(new SingleBuchungItem("Duplizieren", new BuchungDuplizierenAction(),
"edit-copy.png"));
addItem(new SingleGegenBuchungItem("Gegenbuchung", new BuchungGegenbuchungAction(),
"edit-copy.png"));
addItem(new SingleBuchungItem("Splitbuchung", new SplitBuchungAction(),
"edit-copy.png"));
addItem(new CheckedContextMenuItem("Buchungsart zuordnen",
Expand Down Expand Up @@ -128,4 +133,38 @@ public boolean isEnabledFor(Object o)
return false;
}
}

private static class SingleGegenBuchungItem extends CheckedSingleContextMenuItem
{
private SingleGegenBuchungItem(String text, Action action, String icon)
{
super(text, action, icon);
}

@Override
public boolean isEnabledFor(Object o)
{
if (o instanceof Buchung)
{
Buchung b = (Buchung) o;
try
{
if ((b.getSplitId() != null) && (b.getSplitTyp() != SplitbuchungTyp.SPLIT))
{
return false;
}
if (b.getBuchungsart() != null)
{
return b.getBuchungsart().getArt() == ArtBuchungsart.UMBUCHUNG;
}
}
catch (RemoteException e)
{
Logger.error("Fehler", e);
}
}
return false;
}
}

}
1 change: 1 addition & 0 deletions src/de/jost_net/JVerein/gui/view/KontoView.java
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public void bind() throws Exception
group.addLabelPair("Konto-Eröffnung", control.getEroeffnung());
group.addLabelPair("Konto-Auflösung", control.getAufloesung());
group.addLabelPair("Hibiscus-Konto", control.getHibiscusId());
group.addLabelPair("Gegenbuchung-Buchungsart", control.getBuchungsart());

ButtonArea buttons = new ButtonArea();
buttons.addButton("Hilfe", new DokumentationAction(),
Expand Down

0 comments on commit 5115f3a

Please sign in to comment.