Skip to content

Commit

Permalink
Feature automatische Verbuchung von Steuern (#66)
Browse files Browse the repository at this point in the history
* neue Felder für Buchungsart: Steuer und Buchungsart, auf welche die Steuer gebucht werden soll, kann jetzt angegeben werden

* - Steuer wird nun automatisch anhand von Buchungsart verbucht
- zusätzlich gibt es nun eine DependecyId in der Buchung, welche abhängige Buchungen in einer Splitbuchung anzeigt (über die DB Id ist dies nicht möglich, weil der erst generiert wird, wenn alles gespeichert wird)

* Auswertung Steuern in BuchungsklasseSaldo

* Fix: Exceptions and allow saving

- Allow saving Buchungsart without "Steuer Buchungsart"
- Show "Steuer Buchungsart" in Dropdown even if spenden is NULL in DB
- Fix exception in BuchungsklasseSaldoList
- Reduce SQL queries in BuchungsklasseSaldoList
- Remove unused imports

* Multiple updates on buchungsart

Fix: SelectInput behavior
Add: New insertCheck for buchungsart
Add: Reload on completly new buchungsart entry

* Allow selecting steuersatz and buchungsart for new items

Remove: Need to save once to get an item ID
Reduce complexity in code

* Fix: Remove hasChanged test

* Fix: NullPointerException HashMap

- Fixed java.lang.NullPointerException: Cannot invoke "java.lang.Double.doubleValue()" by adding default key/value to hashmap
- Removed unused hashmap
- Fix wording

---------

Co-authored-by: VinzentRudolf <[email protected]>
Co-authored-by: Alexander Dippe <[email protected]>
  • Loading branch information
3 people authored Jan 4, 2024
1 parent 406ad0a commit 0f660d3
Show file tree
Hide file tree
Showing 19 changed files with 873 additions and 127 deletions.
29 changes: 23 additions & 6 deletions src/de/jost_net/JVerein/gui/action/BuchungDeleteAction.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import java.rmi.RemoteException;

import de.jost_net.JVerein.Messaging.BuchungMessage;
import de.jost_net.JVerein.io.SplitbuchungsContainer;
import de.jost_net.JVerein.rmi.Buchung;
import de.jost_net.JVerein.rmi.Jahresabschluss;
import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ;
Expand Down Expand Up @@ -107,16 +108,32 @@ else if (context instanceof Buchung[])
}
else if (splitbuchung)
{
bu.setDelete(true);
Application.getMessagingFactory().sendMessage(new BuchungMessage(bu));
count++;
if (bu.getDependencyId() == -1)
{
bu.setDelete(true);
Application.getMessagingFactory()
.sendMessage(new BuchungMessage(bu));
count++;
}
else
{
for (Buchung buchung_tmp : SplitbuchungsContainer.get())
{
if (buchung_tmp.getDependencyId() == bu.getDependencyId())
{
buchung_tmp.setDelete(true);
Application.getMessagingFactory()
.sendMessage(new BuchungMessage(buchung_tmp));
count++;
}
}
}
}
}
if (count > 0)
{
GUI.getStatusBar().setSuccessText(
String.format("%d Buchung" + (b.length != 1 ? "en" : "")
+ " gelöscht.", count));
GUI.getStatusBar().setSuccessText(String.format(
"%d Buchung" + (count != 1 ? "en" : "") + " gelöscht.", count));
}
else
{
Expand Down
123 changes: 104 additions & 19 deletions src/de/jost_net/JVerein/gui/control/BuchungsControl.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
package de.jost_net.JVerein.gui.control;

import java.io.File;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.rmi.RemoteException;
import java.text.ParseException;
import java.util.ArrayList;
Expand Down Expand Up @@ -55,8 +57,10 @@
import de.jost_net.JVerein.io.BuchungsjournalPDF;
import de.jost_net.JVerein.io.SplitbuchungsContainer;
import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung;
import de.jost_net.JVerein.keys.ArtBuchungsart;
import de.jost_net.JVerein.keys.BuchungsartSort;
import de.jost_net.JVerein.keys.SplitbuchungTyp;
import de.jost_net.JVerein.keys.SteuersatzBuchungsart;
import de.jost_net.JVerein.keys.Zahlungsweg;
import de.jost_net.JVerein.rmi.Buchung;
import de.jost_net.JVerein.rmi.Buchungsart;
Expand Down Expand Up @@ -164,6 +168,8 @@ public class BuchungsControl extends AbstractControl

private Buchung buchung;

private ArrayList<Buchung> dependent_buchungen;

private Button sammelueberweisungButton;

private BuchungQuery query;
Expand Down Expand Up @@ -200,6 +206,59 @@ public Buchung getBuchung() throws RemoteException
return buchung;
}

public void fillBuchung(Buchung b) throws ApplicationException, RemoteException
{
b.setBuchungsart(getSelectedBuchungsArtId());
b.setProjektID(getSelectedProjektId());
b.setKonto(getSelectedKonto());
b.setAuszugsnummer(getAuszugsnummerWert());
b.setBlattnummer(getBlattnummerWert());
b.setName((String) getName().getValue());
b.setIban((String) getIban().getValue());
if (getBetrag().getValue() != null)
{
b.setBetrag((Double) getBetrag().getValue());
}
b.setZweck((String) getZweck().getValue());
b.setDatum((Date) getDatum().getValue());
b.setArt((String) getArt().getValue());
b.setVerzicht((Boolean) getVerzicht().getValue());
b.setMitgliedskonto(getSelectedMitgliedsKonto(b));
b.setKommentar((String) getKommentar().getValue());
}

public ArrayList<Buchung> getDependentBuchungen() throws RemoteException
{
if (dependent_buchungen != null)
{
return dependent_buchungen;
}

// Falls noch nichts erzeugt wurde, neue Liste erzeugen und DependencyId setzen!
dependent_buchungen = new ArrayList<Buchung>();
if (getBuchung().getDependencyId() == -1) {
Buchung new_dependent_buchung = (Buchung) Einstellungen.getDBService()
.createObject(Buchung.class, null);
getBuchung().setDependencyId(SplitbuchungsContainer.getNewDependencyId());
new_dependent_buchung.setDependencyId(getBuchung().getDependencyId());
dependent_buchungen.add(new_dependent_buchung);
}
// Falls DependencyId vorhanden ist, alle anderen Elemente mit gleicher Id raussuchen
else {
int pos_b = SplitbuchungsContainer.get().indexOf(getBuchung());
for (Buchung b_tmp : SplitbuchungsContainer.get()) {
if (b_tmp.getDependencyId() == getBuchung().getDependencyId() &&
SplitbuchungsContainer.get().indexOf(b_tmp) != pos_b) {
dependent_buchungen.add(b_tmp);
}
}
}
if (dependent_buchungen.size() == 0) {
throw new RemoteException("Buchungen mit Id " + getBuchung().getDependencyId() + " konnten nicht gefunden werden!");
}
return dependent_buchungen;
}

public Input getID() throws RemoteException
{
if (id != null)
Expand Down Expand Up @@ -755,24 +814,7 @@ private void handleStore() throws ApplicationException
try
{
Buchung b = getBuchung();

b.setBuchungsart(getSelectedBuchungsArtId());
b.setProjektID(getSelectedProjektId());
b.setKonto(getSelectedKonto());
b.setAuszugsnummer(getAuszugsnummerWert());
b.setBlattnummer(getBlattnummerWert());
b.setName((String) getName().getValue());
b.setIban((String) getIban().getValue());
if (getBetrag().getValue() != null)
{
b.setBetrag((Double) getBetrag().getValue());
}
b.setZweck((String) getZweck().getValue());
b.setDatum((Date) getDatum().getValue());
b.setArt((String) getArt().getValue());
b.setVerzicht((Boolean) getVerzicht().getValue());
b.setMitgliedskonto(getSelectedMitgliedsKonto(b));
b.setKommentar((String) getKommentar().getValue());
fillBuchung(b);

if (b.getSpeicherung())
{
Expand All @@ -782,7 +824,50 @@ private void handleStore() throws ApplicationException
}
else
{
SplitbuchungsContainer.add(b);
Buchungsart b_art = b.getBuchungsart();
if (b_art.getSteuersatz() > 0) {
Buchung b_steuer = getDependentBuchungen().get(0);
fillBuchung(b_steuer);

BigDecimal steuer = new BigDecimal(
Double.toString(b.getBetrag() * b_art.getSteuersatz() / 100))
.setScale(2, RoundingMode.HALF_UP);
String zweck_postfix = " - " + SteuersatzBuchungsart.get(b_art.getSteuersatz());
switch (b_art.getArt()) {
case ArtBuchungsart.AUSGABE:
zweck_postfix += " VSt.";
break;
case ArtBuchungsart.EINNAHME:
zweck_postfix += " MwSt.";
break;
default:
zweck_postfix += " USt.";
break;
}

b_steuer.setBuchungsart(new Long(b_art.getSteuerBuchungsart().getID()));
b_steuer.setBetrag(steuer.doubleValue());
b_steuer.setZweck(b.getZweck() + zweck_postfix);
b_steuer.setSplitId(b.getSplitId());
b_steuer.setSplitTyp(SplitbuchungTyp.SPLIT);

SplitbuchungsContainer.add(b);
SplitbuchungsContainer.add(b_steuer);
}
else {
// Falls vorher abhängige Buchungen erzeugt wurden, nun dies aber durch ändern der Buchungsart o.ä. aufgehoben wird,
// alle abhängigen Buchungen löschen und Abhängigkeit resetten
if (b.getDependencyId() != -1) {
for (Buchung b_tmp : getDependentBuchungen()) {
b_tmp.setDependencyId(-1);
b_tmp.setDelete(true);
Application.getMessagingFactory().sendMessage(new BuchungMessage(b_tmp));
}
b.setDependencyId(-1);
}
SplitbuchungsContainer.add(b);
}

refreshSplitbuchungen();
GUI.getStatusBar().setSuccessText("Buchung übernommen");
}
Expand Down
Loading

0 comments on commit 0f660d3

Please sign in to comment.