Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feature gegenbuchung #138

Merged
merged 18 commits into from
Feb 8, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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)
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Führt das Setzen des Projekts nicht dazu, dass sich die beiden Buchungen im Projektsaldo annullieren? Mir fällt gerade kein Szenario ein, in dem man das will.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also bei mir heben sich Umbuchungen auch im normalen Buchungsklassen Saldo gegenseitig auf. Dafür sind es ja Umbuchungen und keine Einnahmen oder Ausgaben. Und ich erlaube ja die Aktion nur bei Umbuchungen.
Z. B. Eine Umbuchung von Geld vom Girokonto auf ein Anlagekonto muss sich aufheben weil das weder Einnahmen noch Ausgaben sind. Der Geldbestand bleibt ja gleich.
Oder wenn ich eine Einzahlung für eine Kaution habe ist das auch keine Einnahme sondern ich mache eine Gegenbuchung im Kautionskonto. Ich habe mehr Geld auf dem Girokonto aber gleichzeitig mehr Schulden.
Wenn die Buchungen jetzt einem Projekt zugeordnet sind sollte das doch innerhalb des Projektes genauso sein nehme ich mal an.

Copy link

@MSchmalzl MSchmalzl Feb 7, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hier stimme ich @JohannMaierhofer zu.

Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Warum sollte die Umbuchung dann überhaupt einem Projekt zugeordnet werden?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich denke, das hängt dann davon ab ob man auch an anderen Stellen die Buchungen als Teil des Projekts sehen möchte z.B. in den Buchungslisten.
Für das Feature ist das aber egal.
Entweder ist eine Buchung nicht Teil eines Projektes und dann wird auch nichts mit kopiert.
Oder es ist Teil eines Projektes und dann wird es halt mit kopiert. Sollte dann aus irgendeinem Grund das Projekt nicht in der Gegenbuchung gewünscht sein, dann kann man es ja vor dem abspeichern immer noch rauslöschen. Aber das Behalten dürfte in dem Fall wohl der Standard sein.

Copy link

@MSchmalzl MSchmalzl Feb 8, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ich ordne Umbuchungen auch immer einem Projekt zu -zumindest wenn sie zu einem Projekt gehören.

Es ist aber wie schon richtig beschrieben jedem selbst überlassen ob er das macht oder nicht.

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)
NicoB77 marked this conversation as resolved.
Show resolved Hide resolved
{
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
Loading