From 22dd3d33cb8df8dac1b120ba414d8e2b867176a6 Mon Sep 17 00:00:00 2001 From: lenilsas <167138849+lenilsas@users.noreply.github.com> Date: Mon, 20 Jan 2025 20:23:13 +0100 Subject: [PATCH] =?UTF-8?q?Sollbuchungen=20zusammenfassen,=20Rechnung=20?= =?UTF-8?q?=C3=BCberarbeitet=20(#547)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Soolbuchungn zusammenfassen, Rechnung überarbeitet * Update umbenannt * Fehler behoben * Bei Buchung zu Sollbuchung zuordnen automatisch splitten * Update umbenannt * ZUGFeRD an Sollbuchungspositionen angepasst * Formatierung und kleine Fehler behoben * BuchungsartID und BuchungsklasseID Long stat String * getBuchungsartId() hinzugefügt * Fehler getBuchungsartId() behoben * getAttribut buchungsart hinzugefügt * Beim zuordnen einer SOllbuchung zu Slitbuchung diese ersetzen * AutoSplit auch wenn Betrag nicht dem der Sollbuchung entspricht * Kleine Fehler behoben * AutoAplit vor ersetzen auf Spendenbescheinigung prüfen * Sollbuchungspositionen für bestehende Sollbuchungen erstellen * Buchungsart und Klasse in Sollbuchugnslisteentfernt Splitten nur bei >1 Splitbuchungen * Zweck von Soll und Istbuchung angepasst * Auto SollbuchungZuordnen auch anhand von Verwendungszweck (ZB. Rechnungsnummer) * Formatierung und Rechtschreibung * Abrechnunglauf PDF Steuer entfernt * MitglieskontoExport überarbeitet * Zweck der Splitbuchung aus Positionen bestimmen * FormularfeldView deprecated RechnungVar ausblenden * Manuelles erstellen von Rechnungen * Automatisch Felder diablen wenn keine Abrechnung mit Rechnung * Abrechnung überarbeitet. Sollbuchungen nach Mitglied getrennt * ersetzen von Splitbucuhgen bei Spendenbescheinigung verhindern * AbrechnungsControl Zusammenfassen disablen bei disablen von kompakt * Mitgliedname auch ohne kompakte Abbuchung. Splitbuchung Zweck korrigiert * Action Fehler behoben, texte korrigiert * AbrechnungslaufView Sollbuchungen statt Buchungen. Komentare Abrechnung * Kleine Fehler behoben * Sollbuchung manuell erstellen verhindern. Kleine Korrekturen * Steuer bei Sollbuchungen richtig zuordnen.Einstellungen QR gruppieren * Bucung mehreren SOllbuchungenzuordnen * Rechtschreibung * QR-Code Gruppierung geändert * Javadoc * Fehler Steuerberechnung behoben. Kleiner Fehler korrigiert * Nettobetrag und Steuerbetrag zu BigDecimal geändert * AutoBpplit bei Feher und immerSlitten abbrechen * Errorhandling * NPE bei Abrechnungslauf wenn kein Rechnungsformular vorhanden ist behoben * Fehler Filterung Zusatzbeträge behoben * Revert "Nettobetrag und Steuerbetrag zu BigDecimal geändert" This reverts commit 63d161ab55f70ca50b0ff95ad55ba8a3cecf3174. * Berechnung Steuer * MergeKonflikt falsch behoben * Versionsnummer von DB Update Script erhöht * Steuerspalten aus AbrechnunggslaufSollbuchungView entfernt, Menü hinzugefügt * Doppelklick Sollbuchung statt Mitgleid öffnen * SollbuchungView Netto und Steuerbetrag Spalten hinzugefügt --------- Co-authored-by: nils Co-authored-by: Mathias Walter Co-authored-by: tolot27 --- .../JVerein/Queries/SollbuchungQuery.java | 4 + .../JVerein/Variable/RechnungMap.java | 96 +- .../JVerein/Variable/RechnungVar.java | 39 +- .../JVerein/Variable/SollbuchungMap.java | 52 + .../SollbuchungVar.java} | 25 +- .../action/AbrechnungslaufDeleteAction.java | 9 +- .../BuchungSollbuchungZuordnungAction.java | 121 ++- .../gui/action/FormularAnzeigeAction.java | 11 - .../JVerein/gui/action/RechnungNeuAction.java | 101 ++ .../gui/action/SollbuchungRechnungAction.java | 31 +- .../action/SollbuchungRechnungMailAction.java | 44 + .../gui/control/AbrechnungSEPAControl.java | 140 ++- .../AbrechnungslaufBuchungenControl.java | 24 +- .../gui/control/AbrechnungslaufControl.java | 27 +- .../JVerein/gui/control/BuchungsControl.java | 119 +-- .../gui/control/FormularfeldControl.java | 14 +- .../gui/control/MitgliedskontoControl.java | 152 +-- .../JVerein/gui/control/RechnungControl.java | 274 ++--- .../BuchungenSollbuchungZuordnungDialog.java | 44 +- ...genSollbuchungZuordnungVorschauDialog.java | 11 +- .../gui/dialogs/FormularAuswahlDialog.java | 73 ++ .../gui/dialogs/SollbuchungAuswahlDialog.java | 4 +- .../gui/input/SollbuchungAuswahlInput.java | 155 --- .../JVerein/gui/menu/MitgliedskontoMenu.java | 10 +- .../JVerein/gui/menu/SollbuchungMenu.java | 72 +- .../JVerein/gui/navigation/MyExtension.java | 18 +- .../JVerein/gui/view/AbrechnungSEPAView.java | 14 +- .../gui/view/EinstellungenRechnungenView.java | 4 +- .../JVerein/gui/view/RechnungAutoNeuView.java | 69 -- .../JVerein/gui/view/RechnungListeView.java | 4 - .../JVerein/gui/view/RechnungView.java | 3 +- .../gui/view/SollbuchungDetailView.java | 11 +- .../gui/view/SollbuchungListeView.java | 7 +- .../jost_net/JVerein/io/AbrechnungSEPA.java | 967 ++++++++++++------ .../JVerein/io/AbrechnungSEPAParam.java | 13 + .../JVerein/io/AbrechnungslaufPDF.java | 8 +- .../JVerein/io/FormularAufbereitung.java | 59 +- src/de/jost_net/JVerein/io/JVereinZahler.java | 64 ++ .../jost_net/JVerein/io/Rechnungsausgabe.java | 2 +- .../JVerein/io/SollbuchungExport.java | 9 +- .../JVerein/io/SollbuchungExportCSV.java | 6 +- .../JVerein/io/SplitbuchungsContainer.java | 276 ++++- .../jost_net/JVerein/rmi/Beitragsgruppe.java | 2 + .../jost_net/JVerein/rmi/Mitgliedskonto.java | 30 +- src/de/jost_net/JVerein/rmi/Rechnung.java | 18 +- .../JVerein/rmi/SollbuchungPosition.java | 63 ++ src/de/jost_net/JVerein/rmi/Zusatzbetrag.java | 2 + .../JVerein/server/BeitragsgruppeImpl.java | 29 +- .../jost_net/JVerein/server/BuchungImpl.java | 15 +- src/de/jost_net/JVerein/server/Cache.java | 3 +- .../server/DDLTool/Updates/Update0457.java | 105 ++ .../JVerein/server/MitgliedskontoImpl.java | 188 +--- .../jost_net/JVerein/server/RechnungImpl.java | 141 ++- .../jost_net/JVerein/server/RechnungNode.java | 357 ------- .../server/SollbuchungPositionImpl.java | 219 ++++ .../JVerein/server/ZusatzbetragImpl.java | 6 + 56 files changed, 2567 insertions(+), 1797 deletions(-) create mode 100644 src/de/jost_net/JVerein/Variable/SollbuchungMap.java rename src/de/jost_net/JVerein/{gui/action/RechnungAutoNeuAction.java => Variable/SollbuchungVar.java} (68%) create mode 100644 src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java create mode 100644 src/de/jost_net/JVerein/gui/action/SollbuchungRechnungMailAction.java create mode 100644 src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java delete mode 100644 src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java delete mode 100644 src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java create mode 100644 src/de/jost_net/JVerein/rmi/SollbuchungPosition.java create mode 100644 src/de/jost_net/JVerein/server/DDLTool/Updates/Update0457.java delete mode 100644 src/de/jost_net/JVerein/server/RechnungNode.java create mode 100644 src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java diff --git a/src/de/jost_net/JVerein/Queries/SollbuchungQuery.java b/src/de/jost_net/JVerein/Queries/SollbuchungQuery.java index e1477a9ae..e1b8b8581 100644 --- a/src/de/jost_net/JVerein/Queries/SollbuchungQuery.java +++ b/src/de/jost_net/JVerein/Queries/SollbuchungQuery.java @@ -346,6 +346,10 @@ public Object extract(ResultSet rs) } }); + if (ids.size() == 0) + { + return null; + } DBIterator list = Einstellungen.getDBService() .createList(Mitgliedskonto.class); list.addFilter("id in (" + StringUtils.join(ids, ",") + ")"); diff --git a/src/de/jost_net/JVerein/Variable/RechnungMap.java b/src/de/jost_net/JVerein/Variable/RechnungMap.java index 196a6fe64..a7e344c74 100644 --- a/src/de/jost_net/JVerein/Variable/RechnungMap.java +++ b/src/de/jost_net/JVerein/Variable/RechnungMap.java @@ -25,12 +25,11 @@ import java.util.Map; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.FormularfeldControl; import de.jost_net.JVerein.io.VelocityTool; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.Zahlungsweg; -import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Rechnung; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.jost_net.JVerein.util.StringTool; import de.willuhn.jameica.gui.formatter.CurrencyFormatter; @@ -42,6 +41,7 @@ public RechnungMap() // } + @SuppressWarnings("deprecation") public Map getMap(Rechnung re, Map inMap) throws RemoteException { @@ -57,66 +57,69 @@ public Map getMap(Rechnung re, Map inMap) ArrayList buchungDatum = new ArrayList<>(); ArrayList zweck = new ArrayList<>(); - ArrayList zweck1 = new ArrayList<>(); ArrayList nettobetrag = new ArrayList<>(); ArrayList steuersatz = new ArrayList<>(); ArrayList steuerbetrag = new ArrayList<>(); ArrayList betrag = new ArrayList<>(); - ArrayList ist = new ArrayList<>(); - ArrayList differenz = new ArrayList<>(); DecimalFormat format = new DecimalFormat("0"); CurrencyFormatter formatter = new CurrencyFormatter("%", format); double summe = 0; - double saldo = 0; - double suist = 0; - for (Mitgliedskonto mkto : re.getMitgliedskontoList()) + for (SollbuchungPosition sp : re.getSollbuchungPositionList()) { - buchungDatum.add(mkto.getDatum()); - zweck.add(mkto.getZweck1()); - zweck1.add(mkto.getZweck1()); - nettobetrag.add(Double.valueOf(mkto.getNettobetrag())); + buchungDatum.add(sp.getDatum()); + zweck.add(sp.getZweck()); + nettobetrag.add(Double.valueOf(sp.getNettobetrag())); steuersatz.add( - "(" + formatter.format(Double.valueOf(mkto.getSteuersatz())) + ")"); - steuerbetrag.add(Double.valueOf(mkto.getSteuerbetrag())); - betrag.add(Double.valueOf(mkto.getBetrag())); - ist.add(mkto.getIstSumme()); - suist += mkto.getIstSumme(); - differenz.add(mkto.getBetrag() - mkto.getIstSumme()); - summe += mkto.getBetrag(); - saldo += mkto.getBetrag() - mkto.getIstSumme(); + "(" + formatter.format(Double.valueOf(sp.getSteuersatz())) + ")"); + steuerbetrag.add(Double.valueOf(sp.getSteuerbetrag())); + betrag.add(sp.getBetrag()); + summe += sp.getBetrag(); } if (buchungDatum.size() > 1) { if (Einstellungen.getEinstellung().getOptiert()) { - zweck1.add("Rechnungsbetrag inkl. USt."); zweck.add("Rechnungsbetrag inkl. USt."); } else { - zweck1.add("Summe"); zweck.add("Summe"); } betrag.add(summe); - differenz.add(saldo); - ist.add(suist); } - map.put(FormularfeldControl.BUCHUNGSDATUM, buchungDatum.toArray()); - map.put(FormularfeldControl.ZAHLUNGSGRUND, zweck.toArray()); - map.put(FormularfeldControl.ZAHLUNGSGRUND1, zweck1.toArray()); - map.put(FormularfeldControl.BETRAG, betrag.toArray()); map.put(RechnungVar.BUCHUNGSDATUM.getName(), buchungDatum.toArray()); + map.put(RechnungVar.MK_BUCHUNGSDATUM.getName(), buchungDatum.toArray()); map.put(RechnungVar.ZAHLUNGSGRUND.getName(), zweck.toArray()); - map.put(RechnungVar.ZAHLUNGSGRUND1.getName(), zweck1.toArray()); + map.put(RechnungVar.MK_ZAHLUNGSGRUND.getName(), zweck.toArray()); + map.put(RechnungVar.ZAHLUNGSGRUND1.getName(), zweck.toArray()); + map.put(RechnungVar.ZAHLUNGSGRUND2.getName(), ""); map.put(RechnungVar.NETTOBETRAG.getName(), nettobetrag.toArray()); + map.put(RechnungVar.MK_NETTOBETRAG.getName(), nettobetrag.toArray()); map.put(RechnungVar.STEUERSATZ.getName(), steuersatz.toArray()); + map.put(RechnungVar.MK_STEUERSATZ.getName(), steuersatz.toArray()); map.put(RechnungVar.STEUERBETRAG.getName(), steuerbetrag.toArray()); + map.put(RechnungVar.MK_STEUERBETRAG.getName(), steuerbetrag.toArray()); map.put(RechnungVar.BETRAG.getName(), betrag.toArray()); - map.put(RechnungVar.IST.getName(), ist.toArray()); - map.put(RechnungVar.DIFFERENZ.getName(), differenz.toArray()); - map.put(RechnungVar.STAND.getName(), Double.valueOf(-1 * saldo)); - map.put(RechnungVar.SUMME_OFFEN.getName(), Double.valueOf(saldo)); + map.put(RechnungVar.MK_BETRAG.getName(), betrag.toArray()); + + Double ist = 0d; + if (re.getMitgliedskonto() != null) + { + ist = re.getMitgliedskonto().getIstSumme(); + } + map.put(RechnungVar.IST.getName(), ist); + map.put(RechnungVar.MK_SUMME_OFFEN.getName(), summe - ist); + map.put(RechnungVar.SUMME_OFFEN.getName(), summe - ist); + map.put(RechnungVar.MK_STAND.getName(), ist - summe); + map.put(RechnungVar.STAND.getName(), ist - summe); + + // Deise Felder gibt es nicht mehr in der Form, damit bei alten + // Rechnungs-Formularen nicht der Variablennamen steht hier trotzdem + // hinzufügen + map.put(RechnungVar.DIFFERENZ.getName(), ""); + map.put(RechnungVar.MK_IST.getName(), ""); + map.put(RechnungVar.QRCODE_INTRO.getName(), Einstellungen.getEinstellung().getQRCodeIntro()); @@ -150,7 +153,7 @@ public Map getMap(Rechnung re, Map inMap) Adressaufbereitung.getAdressfeld(re)); String zahlungsweg = ""; - switch (re.getMitglied().getZahlungsweg()) + switch (re.getZahlungsweg().getKey()) { case Zahlungsweg.BASISLASTSCHRIFT: { @@ -185,29 +188,4 @@ public Map getMap(Rechnung re, Map inMap) return map; } - - public Map getMap(Mitgliedskonto mk, Map inma) - throws RemoteException - { - Map map = null; - if (inma == null) - { - map = new HashMap<>(); - } - else - { - map = inma; - } - - map.put(RechnungVar.BUCHUNGSDATUM.getName(), mk.getDatum()); - map.put(RechnungVar.ZAHLUNGSGRUND.getName(), mk.getZweck1()); - map.put(RechnungVar.ZAHLUNGSGRUND1.getName(), mk.getZweck1()); - map.put(RechnungVar.NETTOBETRAG.getName(), mk.getNettobetrag()); - map.put(RechnungVar.STEUERSATZ.getName(), mk.getSteuersatz()); - map.put(RechnungVar.STEUERBETRAG.getName(), mk.getSteuerbetrag()); - map.put(RechnungVar.BETRAG.getName(), mk.getBetrag()); - map.put(RechnungVar.IST.getName(), mk.getIstSumme()); - map.put(RechnungVar.DIFFERENZ.getName(), mk.getBetrag() - mk.getIstSumme()); - return map; - } } diff --git a/src/de/jost_net/JVerein/Variable/RechnungVar.java b/src/de/jost_net/JVerein/Variable/RechnungVar.java index 946ab8777..01b266045 100644 --- a/src/de/jost_net/JVerein/Variable/RechnungVar.java +++ b/src/de/jost_net/JVerein/Variable/RechnungVar.java @@ -18,18 +18,39 @@ public enum RechnungVar { - ZAHLUNGSGRUND("mitgliedskonto_zahlungsgrund"), // + @Deprecated + MK_ZAHLUNGSGRUND("mitgliedskonto_zahlungsgrund"), // + ZAHLUNGSGRUND("rechnung_zahlungsgrund"), // + @Deprecated ZAHLUNGSGRUND1("mitgliedskonto_zahlungsgrund1"), // + @Deprecated ZAHLUNGSGRUND2("mitgliedskonto_zahlungsgrund2"), // - BUCHUNGSDATUM("mitgliedskonto_buchungsdatum"), // - NETTOBETRAG("mitgliedskonto_nettobetrag"), // - STEUERSATZ("mitgliedskonto_steuersatz"), // - STEUERBETRAG("mitgliedskonto_steuerbetrag"), // - BETRAG("mitgliedskonto_betrag"), // - IST("mitgliedskonto_ist"), // + @Deprecated + MK_BUCHUNGSDATUM("mitgliedskonto_buchungsdatum"), // + BUCHUNGSDATUM("rechnung_buchungsdatum"), // + @Deprecated + MK_NETTOBETRAG("mitgliedskonto_nettobetrag"), // + NETTOBETRAG("rechnung_nettobetrag"), // + @Deprecated + MK_STEUERSATZ("mitgliedskonto_steuersatz"), // + STEUERSATZ("rechnung_steuersatz"), // + @Deprecated + MK_STEUERBETRAG("mitgliedskonto_steuerbetrag"), // + STEUERBETRAG("rechnung_steuerbetrag"), // + @Deprecated + MK_BETRAG("mitgliedskonto_betrag"), // + BETRAG("rechnung_betrag"), // + @Deprecated + MK_IST("mitgliedskonto_ist"), // + IST("rechnung_ist"), // + @Deprecated DIFFERENZ("mitgliedskonto_differenz"), // - STAND("mitgliedskonto_stand"), // - SUMME_OFFEN("mitgliedskonto_summe_offen"), // + @Deprecated + MK_STAND("mitgliedskonto_stand"), // + STAND("rechnung_stand"), // + @Deprecated + MK_SUMME_OFFEN("mitgliedskonto_summe_offen"), // + SUMME_OFFEN("rechnung_summe_offen"), // QRCODE_SUMME("qrcode_summe"), // QRCODE_INTRO("qrcode_intro"), DATUM("rechnung_datum"), diff --git a/src/de/jost_net/JVerein/Variable/SollbuchungMap.java b/src/de/jost_net/JVerein/Variable/SollbuchungMap.java new file mode 100644 index 000000000..af332cf74 --- /dev/null +++ b/src/de/jost_net/JVerein/Variable/SollbuchungMap.java @@ -0,0 +1,52 @@ +/********************************************************************** + * 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 . + * + * heiner@jverein.de + * www.jverein.de + **********************************************************************/ +package de.jost_net.JVerein.Variable; + +import java.rmi.RemoteException; +import java.util.HashMap; +import java.util.Map; + +import de.jost_net.JVerein.rmi.Mitgliedskonto; + +public class SollbuchungMap +{ + + public SollbuchungMap() + { + } + + public Map getMap(Mitgliedskonto mk, Map inma) + throws RemoteException + { + Map map = null; + if (inma == null) + { + map = new HashMap<>(); + } + else + { + map = inma; + } + map.put(SollbuchungVar.BUCHUNGSDATUM.getName(), mk.getDatum()); + map.put(SollbuchungVar.ZAHLUNGSGRUND.getName(), mk.getZweck1()); + map.put(SollbuchungVar.BETRAG.getName(), mk.getBetrag()); + map.put(SollbuchungVar.IST.getName(), mk.getIstSumme()); + map.put(SollbuchungVar.DIFFERENZ.getName(), + mk.getBetrag() - mk.getIstSumme()); + return map; + } +} diff --git a/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java b/src/de/jost_net/JVerein/Variable/SollbuchungVar.java similarity index 68% rename from src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java rename to src/de/jost_net/JVerein/Variable/SollbuchungVar.java index d44b26633..89d0e0b91 100644 --- a/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java +++ b/src/de/jost_net/JVerein/Variable/SollbuchungVar.java @@ -14,20 +14,25 @@ * heiner@jverein.de * www.jverein.de **********************************************************************/ -package de.jost_net.JVerein.gui.action; +package de.jost_net.JVerein.Variable; -import de.jost_net.JVerein.gui.view.RechnungAutoNeuView; -import de.willuhn.jameica.gui.Action; -import de.willuhn.jameica.gui.GUI; -import de.willuhn.util.ApplicationException; - -public class RechnungAutoNeuAction implements Action +public enum SollbuchungVar { + ZAHLUNGSGRUND("sollbuchung_zahlungsgrund"), // + BUCHUNGSDATUM("sollbuchung_buchungsdatum"), + BETRAG("sollbuchung_betrag"), // + IST("sollbuchung_ist"), // + DIFFERENZ("sollbuchung_differenz"); + + private String name; - @Override - public void handleAction(Object context) throws ApplicationException + SollbuchungVar(String name) { - GUI.startView(RechnungAutoNeuView.class.getName(), null); + this.name = name; } + public String getName() + { + return name; + } } diff --git a/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java b/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java index a9e955242..b3e498e96 100644 --- a/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java +++ b/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java @@ -203,7 +203,14 @@ else if(spendenbescheinigung && rechnung) Buchung bu = it.next(); if (bu.getSpendenbescheinigung() != null) bu.getSpendenbescheinigung().delete(); - bu.delete(); + try { + bu.delete(); + } + catch (RemoteException ignore) + { + // Ignorieren, da die Exception auftritt, wenn die Buchung bereits + // gelöscht wurde, z. B. bei Splitbuchungen. + } } DBIterator mitgliedskontoIt = Einstellungen.getDBService() .createList(Mitgliedskonto.class); diff --git a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java index 1e1c4ca09..51585483a 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java @@ -20,12 +20,16 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.control.BuchungsControl; import de.jost_net.JVerein.gui.dialogs.SollbuchungAuswahlDialog; +import de.jost_net.JVerein.io.SplitbuchungsContainer; +import de.jost_net.JVerein.keys.SplitbuchungTyp; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.dialogs.YesNoDialog; import de.willuhn.jameica.system.OperationCanceledException; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; @@ -62,10 +66,6 @@ public void handleAction(Object context) throws ApplicationException { b = (Buchung[]) context; } - if (b == null) - { - return; - } if (b.length == 0) { return; @@ -102,19 +102,116 @@ else if (open instanceof Mitglied) mk.setZahlungsweg(Zahlungsweg.ÜBERWEISUNG); mk.setZweck1(b[0].getZweck()); mk.store(); + + for (Buchung buchung : b) + { + SollbuchungPosition sbp = (SollbuchungPosition) Einstellungen + .getDBService().createObject(SollbuchungPosition.class, null); + sbp.setBetrag(buchung.getBetrag()); + if (buchung.getBuchungsartId() != null) + { + sbp.setBuchungsartId(buchung.getBuchungsartId()); + } + if (buchung.getBuchungsklasseId() != null) + { + sbp.setBuchungsklasseId(buchung.getBuchungsklasseId()); + } + sbp.setDatum(buchung.getDatum()); + sbp.setZweck(buchung.getZweck()); + sbp.setSollbuchung(mk.getID()); + sbp.store(); + } } - for (Buchung buchung : b) + if (open instanceof Mitgliedskonto[]) + { + if (b.length > 1) + { + throw new ApplicationException( + "Mehrere Buchungen mehreren Sollbuchungen zuordnen nicht möglich!"); + } + if (b[0].getSplitTyp() != null + && (b[0].getSplitTyp() == SplitbuchungTyp.GEGEN + || b[0].getSplitTyp() == SplitbuchungTyp.HAUPT)) + { + throw new ApplicationException( + "Haupt- oder Gegen-Buchungen können nicht mehreren Sollbuchungen zugeordnet werden!"); + } + + b[0].transactionBegin(); + Mitgliedskonto[] mks = (Mitgliedskonto[]) open; + mk = mks[0]; + Buchung buchung = b[0]; + + double summe = 0d; + for (Mitgliedskonto m : mks) + { + summe += m.getBetrag(); + } + if (buchung.getBetrag() != summe) + { + YesNoDialog dialog = new YesNoDialog(YesNoDialog.POSITION_CENTER); + dialog.setTitle("Buchung splitten"); + dialog.setText( + "Die Summe der Sollbuchungen entspricht nicht dem Betrag der Buchung.\n" + + "Soll die Buchung trotzdem anhand der Sollbuchungspositionen\n" + + "gesplittet und eine Restbuchung erzeugt werden?"); + if (!((Boolean) dialog.open()).booleanValue()) + { + throw new OperationCanceledException(); + } + } + try + { + for (Mitgliedskonto m : mks) + { + if (buchung == null) + { + // Wenn keine Restbuchung existiert muss eine neue erstellt + // werden + buchung = (Buchung) Einstellungen.getDBService() + .createObject(Buchung.class, null); + + buchung.setBetrag(0); + buchung.setDatum(b[0].getDatum()); + buchung.setKonto(b[0].getKonto()); + buchung.setName(b[0].getName()); + buchung.setZweck(b[0].getZweck()); + buchung.setSplitTyp(SplitbuchungTyp.SPLIT); + buchung.setSplitId(b[0].getSplitId()); + buchung.setBuchungsartId(b[0].getBuchungsartId()); + buchung.setBuchungsklasseId(b[0].getBuchungsklasseId()); + + SplitbuchungsContainer.init(b[0]); + SplitbuchungsContainer.add(buchung); + SplitbuchungsContainer.store(); + } + buchung = SplitbuchungsContainer.autoSplit(buchung, m, true); + } + b[0].transactionCommit(); + } + catch (Exception e) + { + b[0].transactionRollback(); + Logger.error("Fehler", e); + throw new ApplicationException( + "Fehler beim Splitten der Buchung: " + e.getLocalizedMessage()); + } + } + else { - buchung.setMitgliedskonto(mk); - if (mk != null) + if (b.length == 1) + { + SplitbuchungsContainer.autoSplit(b[0], mk, false); + } + else { - if (buchung.getBuchungsartId() == null) - buchung.setBuchungsartId(mk.getBuchungsartId()); - if (buchung.getBuchungsklasseId() == null) - buchung.setBuchungsklasseId(mk.getBuchungsklasseId()); + for (Buchung buchung : b) + { + buchung.setMitgliedskonto(mk); + buchung.store(); + } } - buchung.store(); } control.getBuchungsList(); diff --git a/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java b/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java index 719d27b2d..02c3a17c9 100644 --- a/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java +++ b/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java @@ -99,11 +99,6 @@ public void handleAction(Object context) throws ApplicationException map.put(AllgemeineVar.ZAEHLER.getName(), formular.getZaehler()); map.put(FormularfeldControl.EMPFAENGER, "Herr\nDr. Willi Wichtig\nTestgasse 1\n12345 Testenhausen"); - map.put(FormularfeldControl.BUCHUNGSDATUM, new Date()); - map.put(FormularfeldControl.ZAHLUNGSGRUND, - "Zahlungsgrund1 Zahlungsgrund2"); - map.put(FormularfeldControl.ZAHLUNGSGRUND1, "Zahlungsgrund 1"); - map.put(FormularfeldControl.BETRAG, Double.valueOf(1234.96 + 15.0)); map.put("Betrag in Worten", GermanNumber.toString(1234 + 15)); map.put(FormularfeldControl.ID, "444"); map.put(FormularfeldControl.EXTERNEMITGLIEDSNUMMER, "9999"); @@ -262,7 +257,6 @@ public void handleAction(Object context) throws ApplicationException map.put(SpendenbescheinigungVar.UNTERLAGENWERTERMITTUNG.getName(), "Geeignete Unterlagen, die zur Wertermittlung gedient haben, z. B. Rechnung, Gutachten, liegen vor."); - map.put(FormularfeldControl.BUCHUNGSDATUM, new Date()); // Mitgliedskonto ArrayList buda = new ArrayList<>(); @@ -320,13 +314,8 @@ public void handleAction(Object context) throws ApplicationException differenz.add(239.99d); ist.add(10d); - map.put(FormularfeldControl.BUCHUNGSDATUM, buda.toArray()); - map.put(FormularfeldControl.ZAHLUNGSGRUND, zg.toArray()); - map.put(FormularfeldControl.ZAHLUNGSGRUND1, zg1.toArray()); - map.put(FormularfeldControl.BETRAG, betrag.toArray()); map.put(RechnungVar.BUCHUNGSDATUM.getName(), buda.toArray()); map.put(RechnungVar.ZAHLUNGSGRUND.getName(), zg.toArray()); - map.put(RechnungVar.ZAHLUNGSGRUND1.getName(), zg1.toArray()); map.put(RechnungVar.NETTOBETRAG.getName(), nettobetrag.toArray()); map.put(RechnungVar.STEUERSATZ.getName(), steuersatz.toArray()); map.put(RechnungVar.STEUERBETRAG.getName(), steuerbetrag.toArray()); diff --git a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java new file mode 100644 index 000000000..0c85bc9e3 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java @@ -0,0 +1,101 @@ +/********************************************************************** + * 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 . + * + * 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.FormularAuswahlDialog; +import de.jost_net.JVerein.rmi.Formular; +import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.Rechnung; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.parts.TablePart; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class RechnungNeuAction implements Action +{ + @Override + public void handleAction(Object context) throws ApplicationException + { + Mitgliedskonto[] mks; + if (context instanceof TablePart) + { + TablePart tp = (TablePart) context; + context = tp.getSelection(); + } + if (context instanceof Mitgliedskonto) + { + mks = new Mitgliedskonto[] { (Mitgliedskonto) context }; + } + else if (context instanceof Mitgliedskonto[]) + { + mks = (Mitgliedskonto[]) context; + } + else + { + throw new ApplicationException("Keine Sollbuchung ausgewählt"); + } + + try + { + FormularAuswahlDialog dialog = new FormularAuswahlDialog(); + Formular formular = dialog.open(); + if (formular == null) + { + return; + } + int erstellt = 0; + int skip = 0; + for (Mitgliedskonto mk : mks) + { + if (mk.getRechnung() != null) + { + skip++; + continue; + } + Rechnung rechnung = (Rechnung) Einstellungen.getDBService() + .createObject(Rechnung.class, null); + + rechnung.setFormular(formular); + rechnung.fill(mk); + rechnung.store(); + + mk.setRechnung(rechnung); + mk.store(); + erstellt++; + } + if (erstellt == 0) + { + GUI.getStatusBar().setErrorText("Keine Rechnung erstellt, alle " + skip + + " Sollbuchungen enthalten bereits Rechnungen."); + } + else { + GUI.getCurrentView().reload(); + GUI.getStatusBar().setSuccessText(erstellt + " Rechnung(en) erstellt" + + (skip > 0 ? ", " + skip + " vorhandene übersprungen." : ".")); + } + } + catch (Exception e) + { + String fehler = "Fehler beim erstellen der Rechnung"; + GUI.getStatusBar().setErrorText(fehler); + Logger.error(fehler, e); + return; + } + } +} diff --git a/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungAction.java index aa985f65e..d670da87d 100644 --- a/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungAction.java @@ -16,29 +16,36 @@ **********************************************************************/ package de.jost_net.JVerein.gui.action; -import de.jost_net.JVerein.gui.view.RechnungMailView; +import java.rmi.RemoteException; + +import de.jost_net.JVerein.gui.view.RechnungView; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; +import de.willuhn.util.ApplicationException; public class SollbuchungRechnungAction implements Action { @Override public void handleAction(Object context) + throws ApplicationException { - if (context != null && context instanceof Mitgliedskonto) + if (context instanceof Mitgliedskonto) { Mitgliedskonto mk = (Mitgliedskonto) context; - GUI.startView(RechnungMailView.class.getName(), mk); - } - else if (context != null && context instanceof Mitgliedskonto[]) - { - Mitgliedskonto[] mk = (Mitgliedskonto[]) context; - GUI.startView(RechnungMailView.class.getName(), mk); - } - else - { - GUI.startView(RechnungMailView.class, null); + try + { + if (mk.getRechnung() == null) + { + throw new ApplicationException( + "Keine Rechnung zu ausgewählter Sollbuchung vorhanden!"); + } + GUI.startView(RechnungView.class.getName(), mk.getRechnung()); + } + catch (RemoteException e) + { + throw new ApplicationException("Fehler beim anzeigen der Rechnung!"); + } } } } diff --git a/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungMailAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungMailAction.java new file mode 100644 index 000000000..7c7fb5077 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungMailAction.java @@ -0,0 +1,44 @@ +/********************************************************************** + * 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 . + * + * heiner@jverein.de + * www.jverein.de + **********************************************************************/ +package de.jost_net.JVerein.gui.action; + +import de.jost_net.JVerein.gui.view.RechnungMailView; +import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; + +public class SollbuchungRechnungMailAction implements Action +{ + @Override + public void handleAction(Object context) + { + if (context != null && context instanceof Mitgliedskonto) + { + Mitgliedskonto mk = (Mitgliedskonto) context; + GUI.startView(RechnungMailView.class.getName(), mk); + } + else if (context != null && context instanceof Mitgliedskonto[]) + { + Mitgliedskonto[] mk = (Mitgliedskonto[]) context; + GUI.startView(RechnungMailView.class.getName(), mk); + } + else + { + GUI.startView(RechnungMailView.class, null); + } + } +} diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java index c8126de00..4f37a9d5f 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java @@ -30,12 +30,15 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.DBTools.DBTransaction; import de.jost_net.JVerein.gui.input.AbbuchungsmodusInput; +import de.jost_net.JVerein.gui.input.FormularInput; import de.jost_net.JVerein.io.AbrechnungSEPA; import de.jost_net.JVerein.io.AbrechnungSEPAParam; import de.jost_net.JVerein.io.Bankarbeitstage; import de.jost_net.JVerein.keys.Abrechnungsausgabe; import de.jost_net.JVerein.keys.Abrechnungsmodi; +import de.jost_net.JVerein.keys.FormularArt; import de.jost_net.JVerein.keys.Monat; +import de.jost_net.JVerein.rmi.Formular; import de.jost_net.JVerein.util.Dateiname; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.jameica.gui.AbstractControl; @@ -83,6 +86,14 @@ public class AbrechnungSEPAControl extends AbstractControl private Settings settings = null; + private CheckboxInput sollbuchungenzusammenfassen; + + private CheckboxInput rechnung; + + private FormularInput rechnungsformular; + + private TextInput rechnungstext; + public AbrechnungSEPAControl(AbstractView view) { super(view); @@ -147,7 +158,6 @@ public DateInput getStichtag() this.stichtag = new DateInput(null, new JVDateFormatTTMMJJJJ()); this.stichtag.setTitle("Stichtag für die Abrechnung"); this.stichtag.setText("Bitte Stichtag für die Abrechnung wählen"); - this.stichtag.setComment("*)"); return stichtag; } @@ -238,9 +248,59 @@ public CheckboxInput getKompakteAbbuchung() } kompakteabbuchung = new CheckboxInput( settings.getBoolean("kompakteabbuchung", false)); + kompakteabbuchung.addListener(new KompaktListener()); return kompakteabbuchung; } + + public CheckboxInput getSollbuchungenZusammenfassen() + { + if (sollbuchungenzusammenfassen != null) + { + return sollbuchungenzusammenfassen; + } + sollbuchungenzusammenfassen = new CheckboxInput( + settings.getBoolean("sollbuchungenzusammenfassen", false)); + sollbuchungenzusammenfassen.addListener(new ZusammenfassenListener()); + return sollbuchungenzusammenfassen; + } + + + public CheckboxInput getRechnung() + { + if (rechnung != null) + { + return rechnung; + } + rechnung = new CheckboxInput( + settings.getBoolean("rechnung", false)); + rechnung.addListener(new RechnungListener()); + return rechnung; + } + + public FormularInput getRechnungFormular() throws RemoteException + { + if (rechnungsformular != null) + { + return rechnungsformular; + } + rechnungsformular = new FormularInput( + FormularArt.RECHNUNG, settings.getString("rechnungsformular", "")); + rechnungsformular.setEnabled(settings.getBoolean("rechnung", false)); + return rechnungsformular; + } + public TextInput getRechnungstext() + { + if (rechnungstext != null) + { + return rechnungstext; + } + rechnungstext = new TextInput( + settings.getString("rechnungstext", "RE$rechnung_nummer")); + rechnungstext.setEnabled(settings.getBoolean("rechnung", false)); + return rechnungstext; + } + public CheckboxInput getSEPAPrint() { if (sepaprint != null) @@ -301,6 +361,15 @@ private void doAbrechnung() throws ApplicationException, RemoteException (Boolean) kursteilnehmer.getValue()); settings.setAttribute("kompakteabbuchung", (Boolean) kompakteabbuchung.getValue()); + settings.setAttribute("sollbuchungenzusammenfassen", + (Boolean) sollbuchungenzusammenfassen.getValue()); + settings.setAttribute("rechnung", + (Boolean) rechnung.getValue()); + settings.setAttribute("rechnungstext", + (String) rechnungstext.getValue()); + settings.setAttribute("rechnungsformular", + rechnungsformular.getValue() == null ? null + : ((Formular) rechnungsformular.getValue()).getID()); settings.setAttribute("sepaprint", (Boolean) sepaprint.getValue()); Abrechnungsausgabe aa = (Abrechnungsausgabe) this.getAbbuchungsausgabe().getValue(); settings.setAttribute("abrechnungsausgabe", aa.getKey()); @@ -408,6 +477,8 @@ private void doAbrechnung() throws ApplicationException, RemoteException } BackgroundTask t = new BackgroundTask() { + private boolean interrupt = false; + @Override public void run(ProgressMonitor monitor) throws ApplicationException { @@ -415,7 +486,7 @@ public void run(ProgressMonitor monitor) throws ApplicationException { DBTransaction.starten(); - new AbrechnungSEPA(abupar, monitor); + new AbrechnungSEPA(abupar, monitor, this); DBTransaction.commit(); monitor.setPercentComplete(100); @@ -456,16 +527,77 @@ else if (abupar.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) @Override public void interrupt() { - // + interrupt = true; } @Override public boolean isInterrupted() { - return false; + return interrupt; } }; Application.getController().start(t); } } + + public class RechnungListener implements Listener + { + + RechnungListener() + { + } + + @Override + public void handleEvent(Event event) + { + if (event.type != SWT.Selection && event.type != SWT.FocusOut) + { + return; + } + rechnungsformular.setEnabled((boolean) rechnung.getValue()); + rechnungstext.setEnabled((boolean) rechnung.getValue()); + } + } + + public class ZusammenfassenListener implements Listener + { + + ZusammenfassenListener() + { + } + + @Override + public void handleEvent(Event event) + { + if (event.type != SWT.Selection && event.type != SWT.FocusOut) + { + return; + } + if ((boolean) sollbuchungenzusammenfassen.getValue()) + { + kompakteabbuchung.setValue(true); + } + } + } + + public class KompaktListener implements Listener + { + + KompaktListener() + { + } + + @Override + public void handleEvent(Event event) + { + if (event.type != SWT.Selection && event.type != SWT.FocusOut) + { + return; + } + if (!(boolean) kompakteabbuchung.getValue()) + { + sollbuchungenzusammenfassen.setValue(false); + } + } + } } diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java index 59cfa514c..41eabd77c 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java @@ -25,8 +25,9 @@ import org.eclipse.swt.widgets.FileDialog; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.action.MitgliedDetailAction; +import de.jost_net.JVerein.gui.action.SollbuchungEditAction; import de.jost_net.JVerein.gui.formatter.ZahlungswegFormatter; +import de.jost_net.JVerein.gui.menu.SollbuchungMenu; import de.jost_net.JVerein.io.AbrechnungslaufPDF; import de.jost_net.JVerein.rmi.Abrechnungslauf; import de.jost_net.JVerein.rmi.Mitgliedskonto; @@ -153,28 +154,14 @@ public Part getSollbuchungsList() throws RemoteException DBIterator it = getIterator((Integer) lauf.getValue()); if (SollbuchungsList == null) { - SollbuchungsList = new TablePart(it, new MitgliedDetailAction()); + SollbuchungsList = new TablePart(it, new SollbuchungEditAction()); SollbuchungsList.addColumn("Fälligkeit", "datum", new DateFormatter(new JVDateFormatTTMMJJJJ())); SollbuchungsList.addColumn("Mitglied", "mitglied"); SollbuchungsList.addColumn("Zweck", "zweck1"); - if (Einstellungen.getEinstellung().getOptiert()) - { - SollbuchungsList.addColumn("Nettobetrag", "nettobetrag", - new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - SollbuchungsList.addColumn("Steuersatz", "steuersatz", - new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - SollbuchungsList.addColumn("Steuerbetrag", "steuerbetrag", - new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - SollbuchungsList.addColumn("Bruttobetrag", "betrag", - new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - } - else - { - SollbuchungsList.addColumn("Betrag", "betrag", - new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - } + SollbuchungsList.addColumn("Betrag", "betrag", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); SollbuchungsList.addColumn("Eingang", "istsumme", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); SollbuchungsList.addColumn("Zahlungsweg", "zahlungsweg", @@ -182,6 +169,7 @@ public Part getSollbuchungsList() throws RemoteException SollbuchungsList.setRememberColWidths(true); SollbuchungsList.setRememberOrder(true); SollbuchungsList.addFeature(new FeatureSummary()); + SollbuchungsList.setContextMenu(new SollbuchungMenu()); } else { diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java index 921401355..5eefb55f6 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java @@ -226,6 +226,13 @@ public Input getBemerkung() throws RemoteException return bemerkung; } + final class StatData + { + Double summe; + + Integer anzahl; + } + public LabelInput getStatistikBuchungen() throws RemoteException { // Summe und Anzahl der Buchungen. Es gibt einen weiterer Datensatz @@ -237,13 +244,6 @@ public LabelInput getStatistikBuchungen() throws RemoteException return statistikbuchungen; } - final class StatData - { - Double summe; - - Integer anzahl; - } - ResultSetExtractor rs = new ResultSetExtractor() { @Override @@ -259,8 +259,8 @@ public Object extract(ResultSet rs) throws SQLException } }; - String sql = "SELECT SUM(betrag), COUNT(id) " + "FROM buchung " - + "WHERE abrechnungslauf=? AND (name != 'JVerein' or zweck != 'Gegenbuchung')"; + String sql = "SELECT SUM(betrag), COUNT(id) " + "FROM mitgliedskonto " + + "WHERE abrechnungslauf=?"; StatData data = (StatData) Einstellungen.getDBService().execute(sql, new Object[] { getAbrechnungslaeufe().getID() }, rs); @@ -269,7 +269,7 @@ public Object extract(ResultSet rs) throws SQLException String s = String.format("Anzahl: %s; Summe: %s", data.anzahl.toString(), cf.format(data.summe)); statistikbuchungen = new LabelInput(s); - statistikbuchungen.setName("Buchungen"); + statistikbuchungen.setName("Sollbuchungen"); return statistikbuchungen; } @@ -283,13 +283,6 @@ public LabelInput getStatistikLastschriften() throws RemoteException return statistiklastschriften; } - final class StatData - { - Double summe; - - Integer anzahl; - } - ResultSetExtractor rs = new ResultSetExtractor() { @Override diff --git a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java index 9c5473bdc..90e67d059 100644 --- a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java +++ b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java @@ -55,7 +55,6 @@ import de.jost_net.JVerein.gui.input.BuchungsklasseInput; import de.jost_net.JVerein.gui.input.IBANInput; import de.jost_net.JVerein.gui.input.KontoauswahlInput; -import de.jost_net.JVerein.gui.input.SollbuchungAuswahlInput; import de.jost_net.JVerein.gui.menu.BuchungMenu; import de.jost_net.JVerein.gui.menu.SplitBuchungMenu; import de.jost_net.JVerein.gui.parts.BuchungListTablePart; @@ -71,13 +70,11 @@ import de.jost_net.JVerein.keys.ArtBuchungsart; 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; import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Jahresabschluss; import de.jost_net.JVerein.rmi.Konto; -import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Projekt; import de.jost_net.JVerein.rmi.Spendenbescheinigung; @@ -156,7 +153,7 @@ public class BuchungsControl extends AbstractControl private Input art; - private DialogInput mitgliedskonto; + private TextInput mitgliedskonto; private TextAreaInput kommentar; @@ -281,7 +278,6 @@ public void fillBuchung(Buchung b) throws ApplicationException, RemoteException b.setDatum((Date) getDatum().getValue()); b.setArt((String) getArt().getValue()); b.setVerzicht((Boolean) getVerzicht().getValue()); - b.setMitgliedskonto(getSelectedMitgliedsKonto(b)); b.setKommentar((String) getKommentar().getValue()); } @@ -529,58 +525,22 @@ public CheckboxInput getVerzicht() throws RemoteException return verzicht; } - public DialogInput getMitgliedskonto() throws RemoteException + public TextInput getMitgliedskonto() throws RemoteException { - mitgliedskonto = new SollbuchungAuswahlInput(getBuchung()) - .getMitgliedskontoAuswahl(); - mitgliedskonto.addListener(new Listener() + + if (mitgliedskonto != null && !mitgliedskonto.getControl().isDisposed()) { + return mitgliedskonto; + } - @Override - public void handleEvent(Event event) - { - try - { - String name = (String) getName().getValue(); - String zweck1 = (String) getZweck().getValue(); - if (mitgliedskonto.getValue() != null && name.length() == 0 - && zweck1.length() == 0) - { - if (mitgliedskonto.getValue() instanceof Mitgliedskonto) - { - Mitgliedskonto mk = (Mitgliedskonto) mitgliedskonto.getValue(); - getName().setValue( - Adressaufbereitung.getNameVorname(mk.getMitglied())); - getBetrag().setValue(mk.getBetrag()); - getZweck().setValue(mk.getZweck1()); - getDatum().setValue(mk.getDatum()); - } - if (mitgliedskonto.getValue() instanceof Mitglied) - { - Mitglied m2 = (Mitglied) mitgliedskonto.getValue(); - getName().setValue(Adressaufbereitung.getNameVorname(m2)); - getDatum().setValue(new Date()); - } - } - if (mitgliedskonto.getValue() instanceof Mitgliedskonto) - { - Mitgliedskonto mk = (Mitgliedskonto) mitgliedskonto.getValue(); - if (getBuchungsart().getValue() == null) - { - getBuchungsart().setValue(mk.getBuchungsart()); - } - if (isBuchungsklasseActive() && getBuchungsklasse().getValue() == null) - { - getBuchungsklasse().setValue(mk.getBuchungsklasse()); - } - } - } - catch (RemoteException e) - { - Logger.error("Fehler", e); - } - } - }); + Mitgliedskonto mk = getBuchung().getMitgliedskonto(); + mitgliedskonto = new TextInput( + mk != null + ? Adressaufbereitung.getNameVorname(mk.getMitglied()) + ", " + + new JVDateFormatTTMMJJJJ().format(mk.getDatum()) + ", " + + Einstellungen.DECIMALFORMAT.format(mk.getBetrag()) + : ""); + mitgliedskonto.disable(); return mitgliedskonto; } @@ -1009,10 +969,11 @@ private void handleStore() throws ApplicationException break; } + b_steuer.setMitgliedskontoID(b.getMitgliedskontoID()); b_steuer.setBuchungsartId(Long.valueOf(b_art.getSteuerBuchungsart().getID())); b_steuer.setBuchungsklasseId(b_art.getBuchungsklasseId()); b_steuer.setBetrag(steuer.doubleValue()); - b_steuer.setZweck(b.getZweck() + zweck_postfix); + b_steuer.setZweck(b.getZweck() + zweck_postfix); b_steuer.setSplitId(b.getSplitId()); b_steuer.setSplitTyp(SplitbuchungTyp.SPLIT); @@ -1047,54 +1008,6 @@ private void handleStore() throws ApplicationException } } - private Mitgliedskonto getSelectedMitgliedsKonto(Buchung b) - throws ApplicationException - { - try - { - Object auswahl = mitgliedskonto.getValue(); - if (null == auswahl) - { - if (mitgliedskonto.getText().length() == 0 ) - { - // Konto wird gelöscht da "Entfernen" ausgewählt - return null; - } - else - { - // Dialog wurde ohne Auswahl geschlossen aber nicht mit "Entfernen" - return b.getMitgliedskonto(); - } - } - - if (auswahl instanceof Mitgliedskonto) - return (Mitgliedskonto) auswahl; - - if (auswahl instanceof Mitglied) - { - Mitglied mitglied = (Mitglied) auswahl; - Mitgliedskonto mk = (Mitgliedskonto) Einstellungen.getDBService() - .createObject(Mitgliedskonto.class, null); - mk.setBetrag(b.getBetrag()); - mk.setDatum(b.getDatum()); - mk.setMitglied(mitglied); - mk.setZahlungsweg(Zahlungsweg.ÜBERWEISUNG); - mk.setZweck1(b.getZweck()); - mk.store(); - mitgliedskonto.setValue(mk); - - return mk; - } - return null; - } - catch (RemoteException ex) - { - final String meldung = "Fehler beim Buchen des Mitgliedskontos."; - Logger.error(meldung, ex); - throw new ApplicationException(meldung, ex); - } - } - private Integer getBlattnummerWert() throws ApplicationException { Integer intBlatt = (Integer) getBlattnummer().getValue(); diff --git a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java index d4da98cc3..38cdec87e 100644 --- a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java +++ b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java @@ -76,14 +76,6 @@ public class FormularfeldControl extends FormularPartControl public static final String TAGESDATUMJJJJ = "Tagesdatum JJJJ"; - public static final String ZAHLUNGSGRUND = "Zahlungsgrund"; - - public static final String ZAHLUNGSGRUND1 = "Zahlungsgrund 1"; - - public static final String BUCHUNGSDATUM = "Buchungsdatum"; - - public static final String BETRAG = "Betrag"; - public static final String ZAHLUNGSWEG = "Zahlungsweg"; public static final String ID = "ID"; @@ -251,7 +243,11 @@ public SelectInput getName() throws Exception } for (RechnungVar mkv : RechnungVar.values()) { - namen.add(mkv.getName()); + if (!RechnungVar.class.getField(mkv.name()) + .isAnnotationPresent(Deprecated.class)) + { + namen.add(mkv.getName()); + } } } diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index af8c8b42d..b9083700e 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -30,13 +30,8 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.Messaging.MitgliedskontoMessage; import de.jost_net.JVerein.Queries.SollbuchungQuery; -import de.jost_net.JVerein.gui.formatter.BuchungsartFormatter; -import de.jost_net.JVerein.gui.formatter.BuchungsklasseFormatter; import de.jost_net.JVerein.gui.formatter.ZahlungswegFormatter; -import de.jost_net.JVerein.gui.input.BuchungsartInput; -import de.jost_net.JVerein.gui.input.BuchungsklasseInput; import de.jost_net.JVerein.gui.input.MitgliedInput; -import de.jost_net.JVerein.gui.input.BuchungsartInput.buchungsarttyp; import de.jost_net.JVerein.gui.menu.MitgliedskontoMenu; import de.jost_net.JVerein.gui.parts.SollbuchungListTablePart; import de.jost_net.JVerein.gui.view.BuchungView; @@ -44,10 +39,9 @@ import de.jost_net.JVerein.io.Kontoauszug; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchung; -import de.jost_net.JVerein.rmi.Buchungsart; -import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.datasource.GenericIterator; import de.willuhn.datasource.rmi.DBIterator; @@ -119,10 +113,6 @@ public static DIFFERENZ fromString(final String text) private DecimalInput betrag; - private AbstractInput buchungsart; - - private SelectInput buchungsklasse; - private AbstractInput mitglied; private Mitgliedskonto mkto; @@ -146,6 +136,8 @@ public static DIFFERENZ fromString(final String text) private boolean umwandeln; + private TablePart buchungList; + public MitgliedskontoControl(AbstractView view) { super(view); @@ -258,68 +250,6 @@ public DecimalInput getBetrag() throws RemoteException return betrag; } - public Input getBuchungsart() throws RemoteException - { - if (buchungsart != null && !buchungsart.getControl().isDisposed()) - { - return buchungsart; - } - buchungsart = new BuchungsartInput().getBuchungsartInput(buchungsart, - getMitgliedskonto().getBuchungsart(), buchungsarttyp.BUCHUNGSART, - Einstellungen.getEinstellung().getBuchungBuchungsartAuswahl()); - buchungsart.addListener(new Listener() - { - @Override - public void handleEvent(Event event) - { - try - { - Buchungsart bua = (Buchungsart) buchungsart.getValue(); - if (buchungsklasse != null && buchungsklasse.getValue() == null - && bua != null) - buchungsklasse.setValue(bua.getBuchungsklasse()); - } - catch (RemoteException e) - { - Logger.error("Fehler", e); - } - } - }); - return buchungsart; - } - - public SelectInput getBuchungsklasse() throws RemoteException - { - if (buchungsklasse != null) - { - return buchungsklasse; - } - buchungsklasse = new BuchungsklasseInput().getBuchungsklasseInput( - buchungsklasse, getMitgliedskonto().getBuchungsklasse()); - return buchungsklasse; - } - - private Long getSelectedBuchungsKlasseId() throws ApplicationException - { - try - { - if (buchungsklasse == null) - return null; - Buchungsklasse buchungsKlasse = (Buchungsklasse) getBuchungsklasse() - .getValue(); - if (null == buchungsKlasse) - return null; - Long id = Long.valueOf(buchungsKlasse.getID()); - return id; - } - catch (RemoteException ex) - { - final String meldung = "Gewählte Buchungsklasse kann nicht ermittelt werden"; - Logger.error(meldung, ex); - throw new ApplicationException(meldung, ex); - } - } - public CheckboxInput getSpezialSuche2() { if (spezialsuche2 != null && !spezialsuche2.getControl().isDisposed()) @@ -398,25 +328,6 @@ public void handleStore() mkto.setZahlungsweg(zw.getKey()); mkto.setZweck1((String) getZweck1().getValue()); - double steuersatz = 0d; - mkto.setBuchungsklasseId(getSelectedBuchungsKlasseId()); - mkto.setBuchungsart((Buchungsart) getBuchungsart().getValue()); - if (getBuchungsart().getValue() != null) - { - Buchungsart bart = mkto.getBuchungsart(); - steuersatz = bart.getSteuersatz(); - } - - // Update taxes and netto amount - mkto.setSteuersatz(steuersatz); - if (getBetrag().getValue() != null) - { - Double netto = ((Double) getBetrag().getValue() - / (1d + (steuersatz / 100d))); - mkto.setNettobetrag(netto); - mkto.setSteuerbetrag((Double) getBetrag().getValue() - netto); - } - mkto.store(); GUI.getStatusBar().setSuccessText("Sollbuchung gespeichert"); } @@ -544,13 +455,6 @@ public String format(Object o) mitgliedskontoList.addColumn("Zahlungseingang", "istsumme", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); mitgliedskontoList.addColumn("Rechnung", "rechnung"); - mitgliedskontoList.addColumn("Buchungsart", "buchungsart", - new BuchungsartFormatter()); - if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) - { - mitgliedskontoList.addColumn("Buchungsklasse", "buchungsklasse", - new BuchungsklasseFormatter()); - } mitgliedskontoList.setContextMenu(menu); mitgliedskontoList.setRememberColWidths(true); mitgliedskontoList.setRememberOrder(true); @@ -560,9 +464,12 @@ public String format(Object o) else { mitgliedskontoList.removeAll(); - while (mitgliedskonten.hasNext()) + if (mitgliedskonten != null) { - mitgliedskontoList.addItem(mitgliedskonten.next()); + while (mitgliedskonten.hasNext()) + { + mitgliedskontoList.addItem(mitgliedskonten.next()); + } } mitgliedskontoList.sort(); } @@ -608,6 +515,42 @@ private void refreshMitgliedkonto2() throws RemoteException mitgliedskontoList2.sort(); } + public Part getBuchungenList() throws RemoteException + { + if (buchungList != null) + { + return buchungList; + } + DBIterator sps = Einstellungen.getDBService() + .createList(SollbuchungPosition.class); + sps.addFilter( "sollbuchung = ?", getMitgliedskonto().getID()); + + buchungList = new TablePart(sps, null); + buchungList.addColumn("Datum", "datum", + new DateFormatter(new JVDateFormatTTMMJJJJ())); + buchungList.addColumn("Zweck", "zweck"); + buchungList.addColumn("Betrag", "betrag", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + if (Einstellungen.getEinstellung().getOptiert()) + { + buchungList.addColumn("Nettobetrag", "nettobetrag", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + buchungList.addColumn("Steuersatz", "steuersatz"); + buchungList.addColumn("Steuerbetrag", "steuerbetrag", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + } + buchungList.addColumn("Buchungsart", "buchungsart"); + if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) + { + buchungList.addColumn("Buchungsklasse", "buchungsklasse"); + } + + buchungList.setRememberColWidths(true); + buchungList.setRememberOrder(true); + buchungList.addFeature(new FeatureSummary()); + return buchungList; + } + private GenericIterator getMitgliedIterator() throws RemoteException { DBIterator mitglieder = Einstellungen.getDBService() @@ -654,9 +597,12 @@ public void refreshMitgliedkonto1() throws RemoteException GenericIterator mitgliedskonten = new SollbuchungQuery(this, umwandeln, null).get(); mitgliedskontoList.removeAll(); - while (mitgliedskonten.hasNext()) + if (mitgliedskonten != null) { - mitgliedskontoList.addItem(mitgliedskonten.next()); + while (mitgliedskonten.hasNext()) + { + mitgliedskontoList.addItem(mitgliedskonten.next()); + } } mitgliedskontoList.sort(); } diff --git a/src/de/jost_net/JVerein/gui/control/RechnungControl.java b/src/de/jost_net/JVerein/gui/control/RechnungControl.java index 8f08dc8d3..8346538b5 100644 --- a/src/de/jost_net/JVerein/gui/control/RechnungControl.java +++ b/src/de/jost_net/JVerein/gui/control/RechnungControl.java @@ -20,15 +20,14 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Date; -import java.util.List; - -import org.eclipse.swt.widgets.TreeItem; import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.action.RechnungAction; import de.jost_net.JVerein.gui.control.MitgliedskontoControl.DIFFERENZ; +import de.jost_net.JVerein.gui.formatter.BuchungsartFormatter; +import de.jost_net.JVerein.gui.formatter.BuchungsklasseFormatter; +import de.jost_net.JVerein.gui.formatter.ZahlungswegFormatter; import de.jost_net.JVerein.gui.input.BICInput; import de.jost_net.JVerein.gui.input.FormularInput; import de.jost_net.JVerein.gui.input.GeschlechtInput; @@ -39,11 +38,9 @@ import de.jost_net.JVerein.io.Rechnungsausgabe; import de.jost_net.JVerein.keys.FormularArt; import de.jost_net.JVerein.keys.Zahlungsweg; -import de.jost_net.JVerein.rmi.Formular; import de.jost_net.JVerein.rmi.Mitglied; -import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Rechnung; -import de.jost_net.JVerein.server.RechnungNode; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.jost_net.JVerein.util.StringTool; import de.willuhn.datasource.GenericIterator; @@ -57,26 +54,20 @@ import de.willuhn.jameica.gui.Part; import de.willuhn.jameica.gui.formatter.CurrencyFormatter; import de.willuhn.jameica.gui.formatter.DateFormatter; -import de.willuhn.jameica.gui.formatter.TreeFormatter; import de.willuhn.jameica.gui.input.DateInput; import de.willuhn.jameica.gui.input.DecimalInput; import de.willuhn.jameica.gui.input.TextInput; import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.TablePart; -import de.willuhn.jameica.gui.parts.TreePart; import de.willuhn.jameica.gui.parts.table.FeatureSummary; -import de.willuhn.jameica.gui.util.SWTUtil; import de.willuhn.jameica.hbci.HBCIProperties; import de.willuhn.logging.Logger; -import de.willuhn.util.ApplicationException; public class RechnungControl extends DruckMailControl { private TablePart rechnungList; - private TreePart rechnungTree; - private Rechnung rechnung; private DateInput rechnungsDatum; @@ -121,6 +112,8 @@ public class RechnungControl extends DruckMailControl private TextInput personenart; + private TextInput zahlungsweg; + private TextInput leitwegID; public enum TYP @@ -150,6 +143,11 @@ public Part getRechnungList() throws RemoteException rechnungList.addColumn("Mitglied", "mitglied"); rechnungList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + rechnungList.addColumn("Ist", "ist", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + rechnungList.addColumn("Differenz", "differenz", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + rechnungList.addColumn("Zahlungsweg", "zahlungsweg", new ZahlungswegFormatter()); rechnungList.setRememberColWidths(true); rechnungList.setContextMenu(new RechnungMenu()); @@ -159,33 +157,6 @@ public Part getRechnungList() throws RemoteException return rechnungList; } - public Part getRechnungTree() throws RemoteException - { - rechnungTree = new TreePart(new RechnungNode(this), null); - rechnungTree.setFormatter(new TreeFormatter() - { - @Override - public void format(TreeItem item) - { - RechnungNode rechnungnode = (RechnungNode) item.getData(); - try - { - if (rechnungnode.getNodeType() == RechnungNode.ROOT) - item.setImage(SWTUtil.getImage("file-invoice.png")); - if (rechnungnode.getNodeType() == RechnungNode.MITGLIED) - item.setImage(SWTUtil.getImage("user.png")); - if (rechnungnode.getNodeType() == RechnungNode.BUCHUNG) - item.setImage(SWTUtil.getImage("euro-sign.png")); - } - catch (Exception e) - { - Logger.error("Fehler beim TreeFormatter", e); - } - } - }); - return rechnungTree; - } - public Button getStartRechnungButton(final Object currentObject) { final RechnungControl control = this; @@ -198,7 +169,7 @@ public void handleAction(Object context) try { saveDruckMailSettings(); - new Rechnungsausgabe(control,RechnungControl.TYP.RECHNUNG); + new Rechnungsausgabe(control, RechnungControl.TYP.RECHNUNG); } catch (Exception e) { @@ -209,7 +180,7 @@ public void handleAction(Object context) }, null, true, "walking.png"); return button; } - + public Button getStartMahnungButton(final Object currentObject) { final RechnungControl control = this; @@ -222,7 +193,7 @@ public void handleAction(Object context) try { saveDruckMailSettings(); - new Rechnungsausgabe(control,RechnungControl.TYP.MAHNUNG); + new Rechnungsausgabe(control, RechnungControl.TYP.MAHNUNG); } catch (Exception e) { @@ -249,11 +220,6 @@ public void TabRefresh() } rechnungList.sort(); } - else if (rechnungTree != null) - { - rechnungTree.removeAll(); - rechnungTree.setList(Arrays.asList(new RechnungNode(this))); - } } catch (RemoteException e1) { @@ -278,12 +244,11 @@ public GenericIterator getRechnungIterator() throws RemoteException new Object[] { datumbis.getValue() }); } - // Wenn Filtern nach Name, Mail oder "Ohne Abbucher" JOIN mitglied + // Wenn Filtern nach Name oder Mail JOIN mitglied if ((suchname != null && suchname.getValue() != null && !((String) suchname.getValue()).isEmpty()) || (mailAuswahl != null - && (Integer) mailAuswahl.getValue() != MailAuswertungInput.ALLE) - || (ohneabbucher != null && (Boolean) ohneabbucher.getValue())) + && (Integer) mailAuswahl.getValue() != MailAuswertungInput.ALLE)) { rechnungenIt.join("mitglied"); rechnungenIt.addFilter("mitglied.id = rechnung.mitglied"); @@ -294,8 +259,8 @@ public GenericIterator getRechnungIterator() throws RemoteException { rechnungenIt.addFilter( "((lower(mitglied.name) like ?) OR (lower(mitglied.vorname) like ?))", - new Object[] { ((String) suchname.getValue()).toLowerCase() + "%", - ((String) suchname.getValue()).toLowerCase() + "%" }); + new Object[] { "%" + ((String) suchname.getValue()).toLowerCase() + "%", + "%" + ((String) suchname.getValue()).toLowerCase() + "%" }); } if (mailAuswahl != null @@ -311,7 +276,7 @@ public GenericIterator getRechnungIterator() throws RemoteException if (ohneabbucher != null && (Boolean) ohneabbucher.getValue()) { - rechnungenIt.addFilter("mitglied.zahlungsweg <> ?", + rechnungenIt.addFilter("rechnung.zahlungsweg <> ?", Zahlungsweg.BASISLASTSCHRIFT); } @@ -325,11 +290,12 @@ public GenericIterator getRechnungIterator() throws RemoteException if (getDifferenz().getValue() == DIFFERENZ.FEHLBETRAG) { sql += "having sum(buchung.betrag) < mitgliedskonto.betrag or " - + "sum(buchung.betrag) is null and mitgliedskonto.betrag > 0 "; + + "(sum(buchung.betrag) is null and mitgliedskonto.betrag > 0) "; } else { - sql += "having sum(buchung.betrag) > mitgliedskonto.betrag "; + sql += "having sum(buchung.betrag) > mitgliedskonto.betrag or " + + "(sum(buchung.betrag) is null and mitgliedskonto.betrag < 0) "; } @SuppressWarnings("unchecked") @@ -348,99 +314,13 @@ public Object extract(ResultSet rs) return list; } }); - if(diffIds.size() == 0) + if (diffIds.size() == 0) return PseudoIterator.fromArray(new GenericObject[] {}); - rechnungenIt.addFilter("rechnung.id in (" + String.join(",", diffIds) + ")"); + rechnungenIt + .addFilter("rechnung.id in (" + String.join(",", diffIds) + ")"); } - - return rechnungenIt; - } - - public Button getRechnungErstellenButton() - { - Button b = new Button("Erstellen", new Action() - { - - @SuppressWarnings("rawtypes") - @Override - public void handleAction(Object context) throws ApplicationException - { - try - { - List items = rechnungTree.getItems(); - if (items == null) - return; - - RechnungNode ren = (RechnungNode) items.get(0); - // Loop über die Mitglieder - GenericIterator it1 = ren.getChildren(); - - Formular form = (Formular) getFormular(FormularArt.RECHNUNG).getValue(); - if(form == null) - { - throw new ApplicationException( - "Kein Formular ausgewählt"); - } - while (it1.hasNext()) - { - RechnungNode sp1 = (RechnungNode) it1.next(); - Mitglied mitglied = sp1.getMitglied(); - Rechnung rechnung = (Rechnung) Einstellungen.getDBService() - .createObject(Rechnung.class, null); - rechnung.setMitglied(Integer.parseInt(mitglied.getID())); - rechnung.setFormular(form); - rechnung.setDatum(new Date()); - rechnung.setGeschlecht(mitglied.getGeschlecht()); - rechnung.setAnrede(mitglied.getAnrede()); - rechnung.setTitel(mitglied.getTitel()); - rechnung.setName(mitglied.getName()); - rechnung.setVorname(mitglied.getVorname()); - rechnung.setStrasse(mitglied.getStrasse()); - rechnung.setAdressierungszusatz(mitglied.getAdressierungszusatz()); - rechnung.setPlz(mitglied.getPlz()); - rechnung.setOrt(mitglied.getOrt()); - rechnung.setStaat(mitglied.getStaatCode()); - rechnung.setLeitwegID(mitglied.getLeitwegID()); - rechnung.setPersonenart(mitglied.getPersonenart()); - if(!mitglied.getMandatDatum().equals(Einstellungen.NODATE)) - rechnung.setMandatDatum(mitglied.getMandatDatum()); - rechnung.setMandatID(mitglied.getMandatID()); - rechnung.setBIC(mitglied.getBic()); - rechnung.setIBAN(mitglied.getIban()); - - double betrag = 0; - GenericIterator it2 = sp1.getChildren(); - while (it2.hasNext()) - { - RechnungNode re = (RechnungNode) it2.next(); - betrag += re.getBuchung().getBetrag(); - } - rechnung.setBetrag(betrag); - rechnung.store(); - - // Loop über die Buchungen eines Mitglieds - GenericIterator it3 = sp1.getChildren(); - while (it3.hasNext()) - { - RechnungNode re = (RechnungNode) it3.next(); - Mitgliedskonto b = (Mitgliedskonto) re.getBuchung(); - b.setRechnung(rechnung); - b.store(); - } - rechnungTree.removeAll(); - GUI.getStatusBar().setSuccessText("Rechnung(en) erstellt"); - } - } - catch (RemoteException e) - { - Logger.error(e.getMessage()); - throw new ApplicationException( - "Fehler bei der erstellen der Rechnungen"); - } - } - }, null, false, "document-save.png"); - return b; + return rechnungenIt; } @Override @@ -448,7 +328,7 @@ public String getInfoText(Object selection) { Rechnung[] rechnungen = null; String text = ""; - + if (selection instanceof Rechnung) { rechnungen = new Rechnung[] { (Rechnung) selection }; @@ -461,21 +341,19 @@ else if (selection instanceof Rechnung[]) { return ""; } - + try { if (rechnungen != null) { - text = "Es wurden " + rechnungen.length + - " Rechnungen ausgewählt" + text = "Es wurden " + rechnungen.length + " Rechnungen ausgewählt" + "\nFolgende Mitglieder haben keine Mailadresse:"; - for (Rechnung re: rechnungen) + for (Rechnung re : rechnungen) { Mitglied m = re.getMitglied(); - if (m != null && ( m.getEmail() == null || m.getEmail().isEmpty())) + if (m != null && (m.getEmail() == null || m.getEmail().isEmpty())) { - text = text + "\n - " + m.getName() - + ", " + m.getVorname(); + text = text + "\n - " + m.getName() + ", " + m.getVorname(); } } } @@ -486,7 +364,7 @@ else if (selection instanceof Rechnung[]) } return text; } - + private Rechnung getRechnung() { if (rechnung != null) @@ -497,7 +375,6 @@ private Rechnung getRechnung() return rechnung; } - public DateInput getRechnungsdatum() throws RemoteException { if (rechnungsDatum != null) @@ -506,7 +383,7 @@ public DateInput getRechnungsdatum() throws RemoteException } Date d = getRechnung().getDatum(); - if (d.equals( Einstellungen.NODATE )) + if (d.equals(Einstellungen.NODATE)) { d = null; } @@ -523,12 +400,13 @@ public TextInput getMitglied() throws RemoteException return mitglied; } - mitglied = new TextInput(getRechnung().getMitglied().getName()+", "+getRechnung().getMitglied().getVorname()); + mitglied = new TextInput(getRechnung().getMitglied().getName() + ", " + + getRechnung().getMitglied().getVorname()); mitglied.setName("Mitglied"); mitglied.disable(); return mitglied; } - + public FormularInput getRechnungFormular() throws RemoteException { if (rechnungFormular != null) @@ -536,7 +414,8 @@ public FormularInput getRechnungFormular() throws RemoteException return rechnungFormular; } - rechnungFormular = new FormularInput(FormularArt.RECHNUNG, getRechnung().getFormular().getID()); + rechnungFormular = new FormularInput(FormularArt.RECHNUNG, + getRechnung().getFormular().getID()); rechnungFormular.setName("Formular"); rechnungFormular.disable(); return rechnungFormular; @@ -552,10 +431,11 @@ public TextInput getNummer() throws RemoteException nummer = new TextInput(StringTool.lpad(getRechnung().getID(), Einstellungen.getEinstellung().getZaehlerLaenge(), "0")); nummer.setName("Rechnungsnummer"); - nummer.disable();; + nummer.disable(); + ; return nummer; } - + public DecimalInput getBetrag() throws RemoteException { if (betrag != null) @@ -563,9 +443,10 @@ public DecimalInput getBetrag() throws RemoteException return betrag; } - betrag = new DecimalInput(getRechnung().getBetrag(),Einstellungen.DECIMALFORMAT); + betrag = new DecimalInput(getRechnung().getBetrag(), + Einstellungen.DECIMALFORMAT); betrag.setName("Betrag"); - betrag.disable();; + betrag.disable(); return betrag; } @@ -698,7 +579,7 @@ public GeschlechtInput getGeschlecht() throws RemoteException geschlecht.disable(); return geschlecht; } - + public TextInput getPersonenart() throws RemoteException { if (personenart != null) @@ -706,27 +587,30 @@ public TextInput getPersonenart() throws RemoteException return personenart; } - personenart = new TextInput(getRechnung().getPersonenart().equalsIgnoreCase("n")?PersonenartInput.NATUERLICHE_PERSON:PersonenartInput.JURISTISCHE_PERSON); + personenart = new TextInput( + getRechnung().getPersonenart().equalsIgnoreCase("n") + ? PersonenartInput.NATUERLICHE_PERSON + : PersonenartInput.JURISTISCHE_PERSON); personenart.setName("Personenart"); personenart.disable(); return personenart; } - + public DateInput getMandatdatum() throws RemoteException { if (mandatdatum != null) { return mandatdatum; } - + Date d = getRechnung().getMandatDatum(); - - mandatdatum = new DateInput(d,new JVDateFormatTTMMJJJJ()); + + mandatdatum = new DateInput(d, new JVDateFormatTTMMJJJJ()); mandatdatum.setName("Mandatdatum"); mandatdatum.disable(); return mandatdatum; } - + public TextInput getMandatid() throws RemoteException { if (mandatid != null) @@ -739,7 +623,7 @@ public TextInput getMandatid() throws RemoteException mandatid.disable(); return mandatid; } - + public BICInput getBic() throws RemoteException { if (bic != null) @@ -752,7 +636,7 @@ public BICInput getBic() throws RemoteException bic.disable(); return bic; } - + public IBANInput getIban() throws RemoteException { if (iban != null) @@ -760,12 +644,13 @@ public IBANInput getIban() throws RemoteException return iban; } - iban = new IBANInput(HBCIProperties.formatIban(getRechnung().getIBAN()), getBic()); + iban = new IBANInput(HBCIProperties.formatIban(getRechnung().getIBAN()), + getBic()); iban.setName("IBAN"); iban.disable(); return iban; } - + public TextInput getLeitwegID() throws RemoteException { if (leitwegID != null) @@ -777,30 +662,51 @@ public TextInput getLeitwegID() throws RemoteException leitwegID.disable(); return leitwegID; } - + public Part getBuchungenList() throws RemoteException { if (buchungList != null) { return buchungList; } - DBIterator mks = Einstellungen.getDBService().createList(Mitgliedskonto.class); - mks.addFilter("rechnung = ?",getRechnung().getID()); + DBIterator sps = Einstellungen.getDBService() + .createList(SollbuchungPosition.class); + sps.join("mitgliedskonto"); + sps.addFilter("mitgliedskonto.id = sollbuchungposition.sollbuchung"); + sps.addFilter("mitgliedskonto.rechnung = ?", getRechnung().getID()); + sps.setOrder("order by sollbuchungposition.datum"); - buchungList = new TablePart(mks, null); + buchungList = new TablePart(sps, null); buchungList.addColumn("Datum", "datum", new DateFormatter(new JVDateFormatTTMMJJJJ())); - buchungList.addColumn("Abrechnungslauf", "abrechnungslauf"); - buchungList.addColumn("Name", "mitglied"); - buchungList.addColumn("Zweck", "zweck1"); + buchungList.addColumn("Zweck", "zweck"); buchungList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - buchungList.addColumn("Zahlungseingang", "istsumme", - new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + buchungList.addColumn("Steuersatz", "steuersatz"); + buchungList.addColumn("Buchungsart", "buchungsart", + new BuchungsartFormatter()); + if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) + { + buchungList.addColumn("Buchungsklasse", "buchungsklasse", + new BuchungsklasseFormatter()); + } buchungList.setRememberColWidths(true); buchungList.setRememberOrder(true); buchungList.addFeature(new FeatureSummary()); return buchungList; } + + public TextInput getZahlungsweg() throws RemoteException + { + if (zahlungsweg != null) + { + return zahlungsweg; + } + + zahlungsweg = new TextInput(getRechnung().getZahlungsweg().getText()); + zahlungsweg.setName("Zahlungsweg"); + zahlungsweg.disable(); + return zahlungsweg; + } } diff --git a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java index 7ea5e7e8d..6a0b37b9a 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java @@ -69,6 +69,8 @@ public class BuchungenSollbuchungZuordnungDialog extends AbstractDialog private static final String SETTINGS_NAME_MITGLIEDSNUMMER = SETTINGS_PREFIX + "MITGLIEDSNUMMER"; private static final String SETTINGS_NAME_VORNAME_NAME = SETTINGS_PREFIX + "VORNAME_NAME"; + private static final String SETTINGS_ZWECK = SETTINGS_PREFIX + "ZWECK"; + private static final int WINDOW_WIDTH = 620; private DateInput dateFrom = null; @@ -77,6 +79,8 @@ public class BuchungenSollbuchungZuordnungDialog extends AbstractDialog private CheckboxInput useMemberNumber = null; private CheckboxInput useName = null; + private CheckboxInput useZweck; + private Settings settings = null; /** @@ -102,6 +106,7 @@ public BuchungenSollbuchungZuordnungDialog(Date vondatum, Date bisdatum) useIban = new CheckboxInput(settings.getBoolean(SETTINGS_NAME_IBAN, true)); useMemberNumber = new CheckboxInput(settings.getBoolean(SETTINGS_NAME_MITGLIEDSNUMMER, false)); useName = new CheckboxInput(settings.getBoolean(SETTINGS_NAME_VORNAME_NAME, false)); + useZweck = new CheckboxInput(settings.getBoolean(SETTINGS_ZWECK, false)); } private DateInput createDateInput(Date date, boolean isStart) @@ -128,6 +133,7 @@ protected void paint(Composite parent) throws Exception group.addLabelPair("Nach eindeutiger IBAN", useIban); group.addLabelPair("Nach " + (Einstellungen.getEinstellung().getExterneMitgliedsnummer().booleanValue() ? "Ext. Mitgliedsnummer" : "Mitgliedsnummer"), useMemberNumber); group.addLabelPair("Nach eindeutigen Vorname und Nachname", useName); + group.addLabelPair("Nach eindeutigem Verwendungszweck", useZweck); ButtonArea buttons = new ButtonArea(); Button button = new Button("Zuordnungen suchen", new Action() @@ -167,10 +173,12 @@ private void doSearchAssignment() final boolean useIbanInput = Boolean.TRUE.equals(this.useIban.getValue()); final boolean useMemberNumberInput = Boolean.TRUE.equals(this.useMemberNumber.getValue()); final boolean useNameInput = Boolean.TRUE.equals(this.useName.getValue()); + final boolean useZweckInput = Boolean.TRUE.equals(this.useZweck.getValue()); settings.setAttribute(SETTINGS_NAME_IBAN, useIbanInput); settings.setAttribute(SETTINGS_NAME_MITGLIEDSNUMMER, useMemberNumberInput); settings.setAttribute(SETTINGS_NAME_VORNAME_NAME, useNameInput); + settings.setAttribute(SETTINGS_ZWECK, useZweckInput); BackgroundTask t = new BackgroundTask() { @@ -182,7 +190,8 @@ public void run(ProgressMonitor monitor) throws ApplicationException { boolean externeMitgliedsnummer = Boolean.TRUE.equals(Einstellungen.getEinstellung().getExterneMitgliedsnummer()); - if(!useIbanInput && !useMemberNumberInput && !useNameInput) + if (!useIbanInput && !useMemberNumberInput && !useNameInput + && !useZweckInput) { GUI.getStatusBar().setErrorText("Es wurde keine Zuordnungsart angegeben."); return; @@ -209,6 +218,8 @@ public void run(ProgressMonitor monitor) throws ApplicationException Map uniqueNames = new HashMap<>(); Set duplicateNames = new HashSet<>(); + Map uniqueZweck = new HashMap<>(); + if(useIbanInput || useMemberNumberInput || useNameInput) { DBIterator mitglieder = Einstellungen.getDBService().createList(Mitglied.class); @@ -240,11 +251,33 @@ public void run(ProgressMonitor monitor) throws ApplicationException } } } + if (useZweckInput) + { + ResultSetExtractor rs = new ResultSetExtractor() + { + @Override + public Object extract(ResultSet rs) throws SQLException, RemoteException + { + while (rs.next()) + { + // 1 = MitgliedID, 2 = Zweck1 + uniqueZweck.put(rs.getString(2), rs.getString(1)); + } + return new Object(); + } + }; + + Einstellungen.getDBService().execute( + "SELECT mitglied,zweck1 FROM mitgliedskonto WHERE mitglied IS NOT NULL " + + "GROUP BY zweck1 HAVING COUNT(zweck1) = 1", + new Object[] {}, rs); + } duplicateIbans.clear(); duplicateIds.clear(); duplicateNames.clear(); - if(uniqueIbans.isEmpty() && uniqueIds.isEmpty() && uniqueNames.isEmpty()) + if (uniqueIbans.isEmpty() && uniqueIds.isEmpty() + && uniqueNames.isEmpty() && uniqueZweck.isEmpty()) { GUI.getStatusBar().setErrorText("Es wurden keine eindeutigen Mitglieder zum Zuordnen in den gewählten Zeitraum gefunden."); return; @@ -266,7 +299,12 @@ public void run(ProgressMonitor monitor) throws ApplicationException String bookingPurpose = getBookingPurpose(buchung); if(assginMemberAccountToBooking(assignedBooking, usedMemberAccount, dateFromInput, dateUntilInput, buchung, uniqueIbans.get(buchung.getIban()), "IBAN") || assginMemberAccountToBooking(assignedBooking, usedMemberAccount, dateFromInput, dateUntilInput, buchung, uniqueIds.get(bookingPurpose), externeMitgliedsnummer ? "Ext. Mitgliedsnummer" : "Mitgliedsnummer") || - assginMemberAccountToBooking(assignedBooking, usedMemberAccount, dateFromInput, dateUntilInput, buchung, uniqueNames.get(bookingPurpose), "Vorname und Nachname")) + assginMemberAccountToBooking(assignedBooking, usedMemberAccount, + dateFromInput, dateUntilInput, buchung, + uniqueNames.get(bookingPurpose), "Vorname und Nachname") + || assginMemberAccountToBooking(assignedBooking, + usedMemberAccount, dateFromInput, dateUntilInput, buchung, + uniqueZweck.get(buchung.getZweck()), "Verwendungszweck")) { continue; } diff --git a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java index 52b8ec0d5..fccdac5e6 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java @@ -26,6 +26,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.action.BuchungsListeAction; import de.jost_net.JVerein.gui.dialogs.BuchungenSollbuchungZuordnungDialog.BookingMemberAccountEntry; +import de.jost_net.JVerein.io.SplitbuchungsContainer; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; @@ -129,15 +130,7 @@ protected void persistAssignment() throws ApplicationException { Mitgliedskonto mk = dao.getMitgliedskonto(); Buchung buchung = dao.getBuchung(); - buchung.setMitgliedskonto(dao.getMitgliedskonto()); - if (mk != null) - { - if (buchung.getBuchungsartId() == null) - buchung.setBuchungsartId(mk.getBuchungsartId()); - if (buchung.getBuchungsklasseId() == null) - buchung.setBuchungsklasseId(mk.getBuchungsklasseId()); - } - buchung.store(); + SplitbuchungsContainer.autoSplit(buchung, mk, false); } //Darstellung aktualisieren diff --git a/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java b/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java new file mode 100644 index 000000000..3ea382521 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java @@ -0,0 +1,73 @@ +/********************************************************************** + * 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 . + * + * heiner@jverein.de + * www.jverein.de + **********************************************************************/ + +package de.jost_net.JVerein.gui.dialogs; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; + +import de.jost_net.JVerein.gui.input.FormularInput; +import de.jost_net.JVerein.keys.FormularArt; +import de.jost_net.JVerein.rmi.Formular; +import de.willuhn.jameica.gui.dialogs.AbstractDialog; +import de.willuhn.jameica.gui.parts.ButtonArea; +import de.willuhn.jameica.gui.util.LabelGroup; + +public class FormularAuswahlDialog extends AbstractDialog +{ + + private FormularInput formular; + + private Formular data; + + public FormularAuswahlDialog() + { + super(SWT.CENTER); + setTitle("Formular auswählen"); + } + + @Override + protected Formular getData() throws Exception + { + return data; + } + + @Override + protected void paint(Composite parent) throws Exception + { + LabelGroup group = new LabelGroup(parent, ""); + group.addText( + "Bitte Formular, das für die\n" + + "Rechnung(en) verwendet werden soll, auswählen.", + true); + formular = new FormularInput(FormularArt.RECHNUNG); + group.addLabelPair("Formular", formular); + + ButtonArea buttons = new ButtonArea(); + buttons.addButton("Rechnung(en) erstellen", context -> { + if (formular.getValue() == null) + { + return; + } + data = (Formular) formular.getValue(); + close(); + }, null, false, "ok.png"); + buttons.addButton("Abbrechen", context -> close(), null, false, + "process-stop.png"); + buttons.paint(parent); + } +} diff --git a/src/de/jost_net/JVerein/gui/dialogs/SollbuchungAuswahlDialog.java b/src/de/jost_net/JVerein/gui/dialogs/SollbuchungAuswahlDialog.java index 957f5b630..b8d25b33f 100755 --- a/src/de/jost_net/JVerein/gui/dialogs/SollbuchungAuswahlDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/SollbuchungAuswahlDialog.java @@ -19,8 +19,8 @@ package de.jost_net.JVerein.gui.dialogs; import org.eclipse.swt.SWT; -import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionAdapter; +import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.TabFolder; @@ -193,7 +193,7 @@ public void handleAction(Object context) { Object o = mitgliedskontolist.getSelection(); - if (o instanceof Mitgliedskonto) + if (o instanceof Mitgliedskonto || o instanceof Mitgliedskonto[]) { choosen = o; abort = false; diff --git a/src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java b/src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java deleted file mode 100644 index c61b7cce1..000000000 --- a/src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java +++ /dev/null @@ -1,155 +0,0 @@ -/********************************************************************** - * 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 . - * - * heiner@jverein.de - * www.jverein.de - **********************************************************************/ -package de.jost_net.JVerein.gui.input; - -import java.rmi.RemoteException; -import java.util.Date; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - -import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.dialogs.SollbuchungAuswahlDialog; -import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; -import de.jost_net.JVerein.rmi.Buchung; -import de.jost_net.JVerein.rmi.Mitglied; -import de.jost_net.JVerein.rmi.Mitgliedskonto; -import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; -import de.willuhn.jameica.gui.GUI; -import de.willuhn.jameica.gui.input.DialogInput; -import de.willuhn.logging.Logger; - -public class SollbuchungAuswahlInput -{ - - private DialogInput mitgliedskontoAuswahl = null; - - private Buchung[] buchungen = null; - - private Mitgliedskonto konto = null; - - private Mitglied mitglied = null; - - public SollbuchungAuswahlInput(Buchung buchung) throws RemoteException - { - buchungen = new Buchung[1]; - buchungen[0] = buchung; - this.konto = buchungen[0].getMitgliedskonto(); - } - - /** - * Liefert ein Auswahlfeld fuer das Mitgliedskonto. - * - * @return Auswahl-Feld. - * @throws RemoteException - */ - public DialogInput getMitgliedskontoAuswahl() throws RemoteException - { - if (mitgliedskontoAuswahl != null - && !mitgliedskontoAuswahl.getControl().isDisposed()) - { - return mitgliedskontoAuswahl; - } - SollbuchungAuswahlDialog d = new SollbuchungAuswahlDialog( - buchungen[0]); - d.addCloseListener(new MitgliedskontoListener()); - - mitgliedskontoAuswahl = new DialogInput( - konto != null ? Adressaufbereitung.getNameVorname(konto.getMitglied()) - + ", " + new JVDateFormatTTMMJJJJ().format(konto.getDatum()) + ", " - + Einstellungen.DECIMALFORMAT.format(konto.getBetrag()) : "", d); - mitgliedskontoAuswahl.disableClientControl(); - mitgliedskontoAuswahl.setValue(buchungen[0].getMitgliedskonto()); - return mitgliedskontoAuswahl; - } - - /** - * Listener, der die Auswahl des Kontos ueberwacht und die - * Waehrungsbezeichnung hinter dem Betrag abhaengig vom ausgewaehlten Konto - * anpasst. - */ - private class MitgliedskontoListener implements Listener - { - - /** - * @see org.eclipse.swt.widgets.Listener#handleEvent(org.eclipse.swt.widgets.Event) - */ - @Override - public void handleEvent(Event event) - { - - if (event == null) - { - return; - } - - if (event.data == null) - { - try - { - if (event.detail != SWT.CANCEL) - getMitgliedskontoAuswahl().setText(""); - return; - } - catch (RemoteException er) - { - String error = "Fehler bei Auswahl des Mitgliedskontos"; - Logger.error(error, er); - GUI.getStatusBar().setErrorText(error); - } - } - try - { - String b = ""; - if (event.data instanceof Mitgliedskonto) - { - konto = (Mitgliedskonto) event.data; - b = Adressaufbereitung.getNameVorname(konto.getMitglied()) + ", " - + new JVDateFormatTTMMJJJJ().format(konto.getDatum()) + ", " - + Einstellungen.DECIMALFORMAT.format(konto.getBetrag()); - String name = buchungen[0].getName(); - String zweck1 = buchungen[0].getZweck(); - if ((name == null || name.length() == 0) - && (zweck1 == null || zweck1.length() == 0)) - { - buchungen[0].setName(Adressaufbereitung.getNameVorname(konto - .getMitglied())); - buchungen[0].setZweck(konto.getZweck1()); - buchungen[0].setBetrag(konto.getBetrag()); - buchungen[0].setDatum(new Date()); - buchungen[0].setBuchungsartId(konto.getBuchungsartId()); - buchungen[0].setBuchungsklasseId(konto.getBuchungsklasseId()); - } - } - else if (event.data instanceof Mitglied) - { - mitglied = (Mitglied) event.data; - b = Adressaufbereitung.getNameVorname(mitglied) - + ", Sollbuchung erzeugen"; - } - getMitgliedskontoAuswahl().setText(b); - } - catch (RemoteException er) - { - String error = "Fehler bei Zuordnung des Mitgliedskontos"; - Logger.error(error, er); - GUI.getStatusBar().setErrorText(error); - } - } - } -} diff --git a/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java b/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java index 594160e81..9768edb9c 100755 --- a/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java @@ -19,11 +19,10 @@ import java.rmi.RemoteException; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.action.SollbuchungEditAction; -import de.jost_net.JVerein.gui.action.SollbuchungLoeschenAction; -import de.jost_net.JVerein.gui.action.SollbuchungNeuAction; import de.jost_net.JVerein.gui.action.IstbuchungEditAction; import de.jost_net.JVerein.gui.action.IstbuchungLoesenAction; +import de.jost_net.JVerein.gui.action.SollbuchungEditAction; +import de.jost_net.JVerein.gui.action.SollbuchungLoeschenAction; import de.jost_net.JVerein.gui.action.SpendenbescheinigungAction; import de.jost_net.JVerein.gui.control.MitgliedskontoNode; import de.jost_net.JVerein.keys.Spendenart; @@ -46,8 +45,9 @@ public class MitgliedskontoMenu extends ContextMenu */ public MitgliedskontoMenu() { - addItem(new MitgliedItem("Neue Sollbuchung", - new SollbuchungNeuAction(), "document-new.png")); + // TODO Das mauelle erstellen von Sollbuchungen muss überarbeitet werden + // addItem(new MitgliedItem("Neue Sollbuchung", + // new SollbuchungNeuAction(), "document-new.png")); addItem(new SollItem("Sollbuchung bearbeiten", new SollbuchungEditAction(), "text-x-generic.png")); addItem(new SollOhneIstItem("Sollbuchung löschen", diff --git a/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java b/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java index 304e58c56..1794350db 100644 --- a/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java @@ -21,10 +21,10 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.action.MitgliedDetailAction; -import de.jost_net.JVerein.gui.action.SollbuchungMahnungAction; -import de.jost_net.JVerein.gui.action.SollbuchungRechnungAction; +import de.jost_net.JVerein.gui.action.RechnungNeuAction; import de.jost_net.JVerein.gui.action.SollbuchungEditAction; import de.jost_net.JVerein.gui.action.SollbuchungLoeschenAction; +import de.jost_net.JVerein.gui.action.SollbuchungRechnungAction; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.willuhn.datasource.rmi.DBIterator; @@ -53,11 +53,10 @@ public SollbuchungMenu() addItem(ContextMenuItem.SEPARATOR); addItem(new CheckedSingleContextMenuItem("Mitglied anzeigen", new MitgliedDetailAction(), "user-friends.png")); - /*addItem(new CheckedContextMenuItem("Rechnung erstellen", + addItem(new MitRechnungItem("Rechnung anzeigen", new SollbuchungRechnungAction(), "file-invoice.png")); - addItem(new CheckedContextMenuItem("Mahnung erstellen", - new SollbuchungMahnungAction(), "file-invoice.png")); - */ + addItem(new OhneRechnungItem("Rechnung(en) erstellen", + new RechnungNeuAction(), "file-invoice.png")); } private static class SollOhneIstItem extends CheckedContextMenuItem @@ -77,6 +76,10 @@ public boolean isEnabledFor(Object o) DBIterator it; try { + if (mk.getRechnung() != null) + { + return false; + } it = Einstellungen.getDBService().createList(Buchung.class); it.addFilter("mitgliedskonto = ?", new Object[] { mk.getID() }); if (it.size() == 0) @@ -93,4 +96,61 @@ public boolean isEnabledFor(Object o) return false; } } + + private static class OhneRechnungItem extends CheckedContextMenuItem + { + + private OhneRechnungItem(String text, Action action, String icon) + { + super(text, action, icon); + } + + @Override + public boolean isEnabledFor(Object o) + { + if (o instanceof Mitgliedskonto) + { + Mitgliedskonto mk = (Mitgliedskonto) o; + try + { + return mk.getRechnung() == null; + } + catch (RemoteException e) + { + Logger.error("Fehler", e); + } + return false; + } + // Bei mehreren Sollbuchungen zeigen wir es immer mit an + return true; + } + } + + private static class MitRechnungItem extends CheckedContextMenuItem + { + + private MitRechnungItem(String text, Action action, String icon) + { + super(text, action, icon); + } + + @Override + public boolean isEnabledFor(Object o) + { + if (o instanceof Mitgliedskonto) + { + Mitgliedskonto mk = (Mitgliedskonto) o; + try + { + return mk.getRechnung() != null; + } + catch (RemoteException e) + { + Logger.error("Fehler", e); + } + return false; + } + return false; + } + } } diff --git a/src/de/jost_net/JVerein/gui/navigation/MyExtension.java b/src/de/jost_net/JVerein/gui/navigation/MyExtension.java index f53604a6d..b521d67c7 100644 --- a/src/de/jost_net/JVerein/gui/navigation/MyExtension.java +++ b/src/de/jost_net/JVerein/gui/navigation/MyExtension.java @@ -37,10 +37,6 @@ import de.jost_net.JVerein.gui.action.AdministrationEinstellungenRechnungenAction; import de.jost_net.JVerein.gui.action.AdministrationEinstellungenSpendenbescheinigungenAction; import de.jost_net.JVerein.gui.action.AdministrationEinstellungenStatistikAction; -import de.jost_net.JVerein.gui.action.NichtMitgliedSucheAction; -import de.jost_net.JVerein.gui.action.PreNotificationAction; -import de.jost_net.JVerein.gui.action.MitgliedstypListAction; -import de.jost_net.JVerein.gui.action.MittelverwendungListeAction; import de.jost_net.JVerein.gui.action.AnfangsbestandListAction; import de.jost_net.JVerein.gui.action.AnlagenlisteAction; import de.jost_net.JVerein.gui.action.ArbeitseinsaetzeListeAction; @@ -64,10 +60,10 @@ import de.jost_net.JVerein.gui.action.FormularListeAction; import de.jost_net.JVerein.gui.action.FreieFormulareAction; import de.jost_net.JVerein.gui.action.JahresabschlussListAction; -import de.jost_net.JVerein.gui.action.KontensaldoAction; import de.jost_net.JVerein.gui.action.JubilaeenAction; import de.jost_net.JVerein.gui.action.KontenrahmenExportAction; import de.jost_net.JVerein.gui.action.KontenrahmenImportAction; +import de.jost_net.JVerein.gui.action.KontensaldoAction; import de.jost_net.JVerein.gui.action.KontoListAction; import de.jost_net.JVerein.gui.action.KontoauszugAction; import de.jost_net.JVerein.gui.action.KursteilnehmerSucheAction; @@ -79,13 +75,17 @@ import de.jost_net.JVerein.gui.action.MailVorlagenAction; import de.jost_net.JVerein.gui.action.MitgliedMigrationAction; import de.jost_net.JVerein.gui.action.MitgliedSucheAction; -import de.jost_net.JVerein.gui.action.SollbuchungListeAction; -import de.jost_net.JVerein.gui.action.SollbuchungMahnungAction; -import de.jost_net.JVerein.gui.action.SollbuchungRechnungAction; +import de.jost_net.JVerein.gui.action.MitgliedstypListAction; +import de.jost_net.JVerein.gui.action.MittelverwendungListeAction; +import de.jost_net.JVerein.gui.action.NichtMitgliedSucheAction; +import de.jost_net.JVerein.gui.action.PreNotificationAction; import de.jost_net.JVerein.gui.action.ProjektListAction; import de.jost_net.JVerein.gui.action.ProjektSaldoAction; import de.jost_net.JVerein.gui.action.QIFBuchungsImportViewAction; import de.jost_net.JVerein.gui.action.RechnungListeAction; +import de.jost_net.JVerein.gui.action.SollbuchungListeAction; +import de.jost_net.JVerein.gui.action.SollbuchungMahnungAction; +import de.jost_net.JVerein.gui.action.SollbuchungRechnungMailAction; import de.jost_net.JVerein.gui.action.SpendenbescheinigungListeAction; import de.jost_net.JVerein.gui.action.SpendenbescheinigungSendAction; import de.jost_net.JVerein.gui.action.StatistikJahrgaengeAction; @@ -261,7 +261,7 @@ public Object extract(ResultSet rs) NavigationItem mail = null; mail = new MyItem(mail, "Druck & Mail", null); mail.addChild(new MyItem(mail, "Rechnungen", - new SollbuchungRechnungAction(), "document-print.png")); + new SollbuchungRechnungMailAction(), "document-print.png")); mail.addChild(new MyItem(mail, "Mahnungen", new SollbuchungMahnungAction(), "document-print.png")); mail.addChild(new MyItem(mail, "Kontoauszüge", diff --git a/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java b/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java index 2a0177945..55a4701de 100644 --- a/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java +++ b/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java @@ -44,7 +44,7 @@ public void bind() throws Exception { group.addLabelPair("Abrechnungsmonat", control.getAbrechnungsmonat()); } - group.addLabelPair("Stichtag", control.getStichtag()); + group.addLabelPair("Stichtag¹", control.getStichtag()); group.addLabelPair("Von Eintrittsdatum", control.getVondatum()); group.addLabelPair("Bis Austrittsdatum", control.getBisdatum()); group.addLabelPair("Zahlungsgrund für Beiträge", @@ -55,7 +55,13 @@ public void bind() throws Exception control.getZusatzbetrag().setEnabled(false); } group.addLabelPair("Kursteilnehmer", control.getKursteilnehmer()); - group.addLabelPair("Kompakte Abbuchung", control.getKompakteAbbuchung()); + group.addLabelPair("Kompakte Abbuchung(en)", + control.getKompakteAbbuchung()); + group.addLabelPair("Sollbuchung(en) zusammenfassen", + control.getSollbuchungenZusammenfassen()); + group.addLabelPair("Rechnung(en) erstellen²", control.getRechnung()); + group.addLabelPair("Rechnung Formular", control.getRechnungFormular()); + group.addLabelPair("Rechnung Text", control.getRechnungstext()); group.addLabelPair("SEPA-Datei drucken", control.getSEPAPrint()); if (!Einstellungen.getEinstellung().getKursteilnehmer()) @@ -65,7 +71,9 @@ public void bind() throws Exception group.addLabelPair("Abbuchungsausgabe", control.getAbbuchungsausgabe()); group.addSeparator(); group.addText( - "*) für die Berechnung, ob ein Mitglied bereits eingetreten oder ausgetreten ist. ", + "¹) Für die Berechnung, ob ein Mitglied bereits eingetreten oder ausgetreten ist. " + + "Und für Berechnung ob Zusatzbeträge fällig sind.\n" + + "²) Es wird für jede (zusammengefasste) Sollbuchung eine separate Rechnung erstellt.", true); ButtonArea buttons = new ButtonArea(); diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java index 38d673d34..0c9b55360 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java @@ -40,7 +40,9 @@ public void bind() throws Exception cont.addLabelPair("Text Überweisung", control.getRechnungTextUeberweisung()); cont.addLabelPair("Text Bar", control.getRechnungTextBar()); - cont.addLabelPair("Zählerlänge", control.getZaehlerLaenge()); + cont.addLabelPair("Länge Rechnungsnummer", control.getZaehlerLaenge()); + + cont.addHeadline("QR-Code"); cont.addLabelPair("Kantenlänge QR-Code", control.getQRCodeSizeInMm()); cont.addLabelPair("Verwendungszweck", control.getQRCodeVerwendungszweck()); cont.addLabelPair("Verwendungszweck hinzufügen", diff --git a/src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java b/src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java deleted file mode 100644 index 2badaccd1..000000000 --- a/src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java +++ /dev/null @@ -1,69 +0,0 @@ -/********************************************************************** - * 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 . - * - * heiner@jverein.de - * www.jverein.de - **********************************************************************/ -package de.jost_net.JVerein.gui.view; - -import de.jost_net.JVerein.gui.action.DokumentationAction; -import de.jost_net.JVerein.gui.control.RechnungControl; -import de.jost_net.JVerein.keys.FormularArt; -import de.willuhn.jameica.gui.AbstractView; -import de.willuhn.jameica.gui.GUI; -import de.willuhn.jameica.gui.parts.ButtonArea; -import de.willuhn.jameica.gui.util.ColumnLayout; -import de.willuhn.jameica.gui.util.LabelGroup; -import de.willuhn.jameica.gui.util.SimpleContainer; - -public class RechnungAutoNeuView extends AbstractView -{ - - @Override - public void bind() throws Exception - { - GUI.getView().setTitle("Rechnungen automatisch erzeugen"); - - RechnungControl control = new RechnungControl( - this); - - LabelGroup group = new LabelGroup(getParent(), "Filter"); - ColumnLayout cl = new ColumnLayout(group.getComposite(), 2); - - SimpleContainer left = new SimpleContainer(cl.getComposite()); - left.addInput(control.getSuchname()); - left.addInput(control.getDifferenz()); - left.addLabelPair("Ohne Abbucher", control.getOhneAbbucher()); - - SimpleContainer right = new SimpleContainer(cl.getComposite()); - right.addInput(control.getDatumvon()); - right.addInput(control.getDatumbis()); - - LabelGroup formularGroup = new LabelGroup(getParent(), "Formular"); - formularGroup.addLabelPair("Formular", control.getFormular(FormularArt.RECHNUNG)); - - ButtonArea fbuttons = new ButtonArea(); - fbuttons.addButton(control.getResetButton()); - fbuttons.addButton(control.getSuchenButton()); - group.addButtonArea(fbuttons); - - control.getRechnungTree().paint(this.getParent()); - - ButtonArea buttons = new ButtonArea(); - buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.RECHNUNG, false, "question-circle.png"); - buttons.addButton(control.getRechnungErstellenButton()); - buttons.paint(getParent()); - } - -} diff --git a/src/de/jost_net/JVerein/gui/view/RechnungListeView.java b/src/de/jost_net/JVerein/gui/view/RechnungListeView.java index 5e3995a07..5e00f7aeb 100644 --- a/src/de/jost_net/JVerein/gui/view/RechnungListeView.java +++ b/src/de/jost_net/JVerein/gui/view/RechnungListeView.java @@ -17,7 +17,6 @@ package de.jost_net.JVerein.gui.view; import de.jost_net.JVerein.gui.action.DokumentationAction; -import de.jost_net.JVerein.gui.action.RechnungAutoNeuAction; import de.jost_net.JVerein.gui.control.RechnungControl; import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; @@ -69,9 +68,6 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.RECHNUNG, false, "question-circle.png"); - buttons.addButton("Neu (automatisch)", - new RechnungAutoNeuAction(), null, false, - "document-new.png"); buttons.paint(this.getParent()); } diff --git a/src/de/jost_net/JVerein/gui/view/RechnungView.java b/src/de/jost_net/JVerein/gui/view/RechnungView.java index b76abf469..c00b73ce9 100644 --- a/src/de/jost_net/JVerein/gui/view/RechnungView.java +++ b/src/de/jost_net/JVerein/gui/view/RechnungView.java @@ -65,8 +65,9 @@ public void bind() throws Exception rigth.addInput(control.getBic()); rigth.addInput(control.getMandatdatum()); rigth.addInput(control.getMandatid()); + rigth.addInput(control.getZahlungsweg()); - LabelGroup cont = new LabelGroup(getParent(), "Sollbuchungen", true); + LabelGroup cont = new LabelGroup(getParent(), "Rechnungspositionen", true); cont.addPart(control.getBuchungenList()); ButtonArea buttons = new ButtonArea(); diff --git a/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java index 631062333..cbc65fa11 100644 --- a/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java @@ -16,7 +16,6 @@ **********************************************************************/ package de.jost_net.JVerein.gui.view; -import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.MitgliedskontoControl; import de.jost_net.JVerein.gui.control.MitgliedskontoNode; @@ -47,16 +46,14 @@ public void bind() throws Exception (typ == MitgliedskontoNode.SOLL ? "Soll" : "Ist") + "buchung"); grBuchung.addLabelPair("Mitglied", control.getMitglied()); grBuchung.addLabelPair("Datum", control.getDatum()); - grBuchung.addLabelPair("Verwendungszweck 1", control.getZweck1()); + grBuchung.addLabelPair("Verwendungszweck", control.getZweck1()); grBuchung.addLabelPair("Zahlungsweg", control.getZahlungsweg()); control.getBetrag().setMandatory(true); grBuchung.addLabelPair("Betrag", control.getBetrag()); - grBuchung.addLabelPair("Buchungsart", control.getBuchungsart()); - if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) - { - grBuchung.addLabelPair("Buchungsklasse", control.getBuchungsklasse()); - } + LabelGroup cont = new LabelGroup(getParent(), "Sollbuchungspositionen", true); + cont.addPart(control.getBuchungenList()); + ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.MITGLIEDSKONTO_UEBERSICHT, false, diff --git a/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java index be22211f1..a64fce131 100644 --- a/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java +++ b/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java @@ -17,8 +17,8 @@ package de.jost_net.JVerein.gui.view; import de.jost_net.JVerein.gui.action.DokumentationAction; -import de.jost_net.JVerein.gui.action.SollbuchungExportAction; import de.jost_net.JVerein.gui.action.SollbuchungEditAction; +import de.jost_net.JVerein.gui.action.SollbuchungExportAction; import de.jost_net.JVerein.gui.action.SollbuchungExportAction.EXPORT_TYP; import de.jost_net.JVerein.gui.control.MitgliedskontoControl; import de.jost_net.JVerein.gui.menu.SollbuchungMenu; @@ -78,8 +78,9 @@ public void bind() throws Exception buttons.addButton(new Button("Export", new SollbuchungExportAction(EXPORT_TYP.MITGLIEDSKONTO), control, false, "document-save.png")); - buttons.addButton("Neu", new SollbuchungEditAction(), control, false, - "document-new.png"); + // TODO das Bearbeiten der Sollbuchungen muss noch überarbeitet werden + // buttons.addButton("Neu", new SollbuchungEditAction(), control, false, + // "document-new.png"); buttons.paint(this.getParent()); } } diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 0645f8dc0..f94772802 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -29,8 +29,11 @@ import java.util.Arrays; import java.util.Calendar; import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Properties; import org.apache.commons.lang.StringUtils; @@ -44,6 +47,7 @@ import de.jost_net.JVerein.Variable.AbrechnungsParameterMap; import de.jost_net.JVerein.Variable.AllgemeineMap; import de.jost_net.JVerein.Variable.MitgliedMap; +import de.jost_net.JVerein.Variable.RechnungMap; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.Abrechnungsausgabe; import de.jost_net.JVerein.keys.Abrechnungsmodi; @@ -54,13 +58,15 @@ import de.jost_net.JVerein.rmi.Abrechnungslauf; import de.jost_net.JVerein.rmi.Beitragsgruppe; import de.jost_net.JVerein.rmi.Buchung; -import de.jost_net.JVerein.rmi.Buchungsart; +import de.jost_net.JVerein.rmi.Formular; import de.jost_net.JVerein.rmi.Konto; import de.jost_net.JVerein.rmi.Kursteilnehmer; import de.jost_net.JVerein.rmi.Lastschrift; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.Rechnung; import de.jost_net.JVerein.rmi.SekundaereBeitragsgruppe; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.jost_net.JVerein.rmi.Zusatzbetrag; import de.jost_net.JVerein.rmi.ZusatzbetragAbrechnungslauf; import de.jost_net.JVerein.server.MitgliedUtils; @@ -85,6 +91,7 @@ import de.willuhn.jameica.hbci.rmi.SepaSammelLastschrift; import de.willuhn.jameica.messaging.StatusBarMessage; import de.willuhn.jameica.system.Application; +import de.willuhn.jameica.system.BackgroundTask; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; import de.willuhn.util.ProgressMonitor; @@ -93,9 +100,14 @@ public class AbrechnungSEPA { private int counter = 0; - public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) - throws Exception + private BackgroundTask interrupt; + + private HashMap> zahlermap = new HashMap<>(); + + public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor, + BackgroundTask backgroundTask) throws Exception { + interrupt = backgroundTask; if (Einstellungen.getEinstellung().getName() == null || Einstellungen.getEinstellung().getName().length() == 0 || Einstellungen.getEinstellung().getIban() == null @@ -109,7 +121,9 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) || Einstellungen.getEinstellung().getGlaeubigerID().length() == 0) { throw new ApplicationException( - "Gläubiger-ID fehlt. Gfls. unter https://extranet.bundesbank.de/scp/ oder http://www.oenb.at/idakilz/cid?lang=de beantragen und unter Administration|Einstellungen|Allgemein eintragen.\n" + "Gläubiger-ID fehlt. Gfls. unter https://extranet.bundesbank.de/scp/ oder" + + " http://www.oenb.at/idakilz/cid?lang=de beantragen und unter" + + " Administration|Einstellungen|Allgemein eintragen.\n" + "Zu Testzwecken kann DE98ZZZ09999999999 eingesetzt werden."); } @@ -121,156 +135,222 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) lastschrift .setGlaeubigerID(Einstellungen.getEinstellung().getGlaeubigerID()); lastschrift.setIBAN(Einstellungen.getEinstellung().getIban()); - lastschrift.setKomprimiert(param.kompakteabbuchung.booleanValue()); + lastschrift.setKomprimiert(param.kompakteabbuchung); lastschrift .setName(Zeichen.convert(Einstellungen.getEinstellung().getName())); + lastschrift.setMessageID(abrl.getID() + "-RCUR"); Konto konto = getKonto(); + ArrayList zahlerarray = new ArrayList<>(); - abrechnenMitglieder(param, lastschrift, monitor, abrl, konto); + // Mitglieder Abrechnen und zahlerMap füllen + abrechnenMitglieder(param, monitor); if (param.zusatzbetraege) { - abbuchenZusatzbetraege(param, lastschrift, abrl, konto, monitor); + // Zusatzbetraege Abrechnen und zahlerMap füllen + abbuchenZusatzbetraege(param, abrl, monitor); } + if (param.kursteilnehmer) { - abbuchenKursteilnehmer(param, lastschrift, abrl, konto, monitor); + // Kursteilnehmer direkt in zahlerarray da es für jeden nur eine + // Lastschrift geben kann + zahlerarray = abbuchenKursteilnehmer(param, abrl, konto, monitor); } - monitor.log(counter + " abgerechnete Fälle"); + Iterator>> iterator = zahlermap + .entrySet().iterator(); - lastschrift.setMessageID(abrl.getID() + "-RCUR"); - if (param.kompakteabbuchung || param.sepaprint) - { - // Für kompakte Abbuchung wird erst in write die Zahlerliste gefüllt. Das - // für die - // PDF-Erzeugung benötigte Datum wird auch erst in write gesetzt - File temp_file = Files.createTempFile("jv", ".xml").toFile(); - lastschrift.write(temp_file); - temp_file.delete(); - } - - ArrayList z = lastschrift.getZahler(); - // Wenn keine Buchungen vorhanden sind, wird kein File erzeugt. - if ((param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) - && !z.isEmpty()) - { - writeSepaFile(param, lastschrift, z); - monitor.log(String.format("SEPA-Datei %s geschrieben.", - param.sepafileRCUR.getAbsolutePath())); - param.setText(String.format(", SEPA-Datei %s geschrieben.", - param.sepafileRCUR.getAbsolutePath())); - } - - BigDecimal summemitgliedskonto = BigDecimal.valueOf(0); - for (Zahler za : z) - { - Lastschrift ls = (Lastschrift) Einstellungen.getDBService() - .createObject(Lastschrift.class, null); - ls.setAbrechnungslauf(Integer.parseInt(abrl.getID())); - - assert (za instanceof JVereinZahler) : "Illegaler Zahlertyp in Sepa-Abrechnung detektiert."; - - JVereinZahler vza = (JVereinZahler) za; - - switch (vza.getPersonTyp()) - { - case KURSTEILNEHMER: - ls.setKursteilnehmer(Integer.parseInt(vza.getPersonId())); - Kursteilnehmer k = (Kursteilnehmer) Einstellungen.getDBService() - .createObject(Kursteilnehmer.class, vza.getPersonId()); - ls.setPersonenart(k.getPersonenart()); - ls.setAnrede(k.getAnrede()); - ls.setTitel(k.getTitel()); - ls.setName(k.getName()); - ls.setVorname(k.getVorname()); - ls.setStrasse(k.getStrasse()); - ls.setAdressierungszusatz(k.getAdressierungszusatz()); - ls.setPlz(k.getPlz()); - ls.setOrt(k.getOrt()); - ls.setStaat(k.getStaatCode()); - ls.setEmail(k.getEmail()); - if (k.getGeschlecht() != null) + monitor.setStatusText("Sollbuchungen erstellen"); + double count = 0; + while (iterator.hasNext()) + { + monitor.setPercentComplete( + (int) (count++ / (double) zahlermap.size() * 100d)); + if (interrupt.isInterrupted()) + { + throw new ApplicationException("Abrechnung abgebrochen"); + } + ArrayList zahlerList = iterator.next().getValue(); + + // Nach Mitglied und Betrag sortieren damit auch erstattungen + // funktionieren und bei Vollzahler erst die Positionen des Vollzahler + // eingetragen werden + zahlerList.sort((z1, z2) -> { + try + { + if (z1.getMitglied().equals(z2.getMitglied())) + return z2.getBetrag().compareTo(z1.getBetrag()); + else + return z1.getPersonId().equals(z1.getMitglied().getID()) ? -1 : 1; + } + catch (SEPAException | RemoteException e) + { + return 0; + } + }); + + ArrayList verwendungszwecke = new ArrayList<>(); + if (!param.sollbuchungenzusammenfassen) + { + for (JVereinZahler zahler : zahlerList) + { + // Für jede Buchung eine Sollbuchung mit einer Sollbuchungsposition. + ArrayList spArray = new ArrayList<>(); + spArray.add(getSollbuchungPosition(zahler)); + + verwendungszwecke.add(writeSollbuchung( + zahler.getZahlungsweg().getKey(), zahler.getMitglied(), spArray, + param.faelligkeit, abrl, konto, param, null)); + + // Ohne kompakte Abbuchung zahlerarray direkt füllen + if (!param.kompakteabbuchung && zahler.getZahlungsweg() + .getKey() == Zahlungsweg.BASISLASTSCHRIFT) { - ls.setGeschlecht(k.getGeschlecht()); + if (!zahler.getMitglied().getID().equals(zahler.getPersonId())) + { + zahler.setVerwendungszweck(zahler.getVerwendungszweck() + " " + + zahler.getMitglied().getVorname()); + } + zahlerarray.add(zahler); } - break; - case MITGLIED: - ls.setMitglied(Integer.parseInt(vza.getPersonId())); - Mitglied m = (Mitglied) Einstellungen.getDBService() - .createObject(Mitglied.class, vza.getPersonId()); - if (m.getKtoiName() == null || m.getKtoiName().length() == 0) + } + } + else + { + // Pro Zahlungsweg und Mitglied eine Sollbuchung + HashMap> spMap = new HashMap<>(); + HashMap mitgliedMap = new HashMap<>(); + for (JVereinZahler zahler : zahlerList) + { + mitgliedMap.put(zahler.getMitglied().getID(), zahler.getMitglied()); + + String key = zahler.getZahlungsweg().getKey() + + zahler.getMitglied().getID(); + ArrayList spArray = spMap.getOrDefault(key, + new ArrayList<>()); + + spArray.add(getSollbuchungPosition(zahler)); + spMap.put(key, spArray); + } + + for (Entry> entry : spMap + .entrySet()) + { + // Zahlungsweg und Mitglied holen wir aus derm Key + // (ZahlungswegID MitgliedID) + verwendungszwecke.add(writeSollbuchung( + Integer.parseInt(entry.getKey().substring(0, 1)), + mitgliedMap.get(entry.getKey().substring(1)), entry.getValue(), + param.faelligkeit, abrl, konto, param, null)); + } + } + + // Bei kompakter Abbuchung Zahler zusammenfassen. + if (param.kompakteabbuchung || param.sollbuchungenzusammenfassen) + { + JVereinZahler gesamtZahler = null; + for (JVereinZahler zahler : zahlerList) + { + if (zahler.getZahlungsweg().getKey() == Zahlungsweg.BASISLASTSCHRIFT) { - ls.setPersonenart(m.getPersonenart()); - ls.setAnrede(m.getAnrede()); - ls.setTitel(m.getTitel()); - ls.setName(m.getName()); - ls.setVorname(m.getVorname()); - ls.setStrasse(m.getStrasse()); - ls.setAdressierungszusatz(m.getAdressierungszusatz()); - ls.setPlz(m.getPlz()); - ls.setOrt(m.getOrt()); - ls.setStaat(m.getStaatCode()); - ls.setEmail(m.getEmail()); - ls.setGeschlecht(m.getGeschlecht()); + if (!zahler.getMitglied().getID().equals(zahler.getPersonId())) + { + zahler.setVerwendungszweck(zahler.getVerwendungszweck() + " " + + zahler.getMitglied().getVorname()); + } + if (gesamtZahler == null) + { + gesamtZahler = zahler; + } + else + { + try + { + gesamtZahler.add(zahler); + } + catch (SEPAException se) + { + throw new ApplicationException( + "Ungültiger Betrag: " + zahler.getBetrag()); + } + } } - else + } + if (gesamtZahler != null) + { + if (param.rechnung && verwendungszwecke.size() > 0) { - ls.setPersonenart(m.getKtoiPersonenart()); - ls.setAnrede(m.getKtoiAnrede()); - ls.setTitel(m.getKtoiTitel()); - ls.setName(m.getKtoiName()); - ls.setVorname(m.getKtoiVorname()); - ls.setStrasse(m.getKtoiStrasse()); - ls.setAdressierungszusatz(m.getKtoiAdressierungszusatz()); - ls.setPlz(m.getKtoiPlz()); - ls.setOrt(m.getKtoiOrt()); - ls.setStaat(m.getKtoiStaatCode()); - ls.setEmail(m.getKtoiEmail()); - ls.setGeschlecht(m.getKtoiGeschlecht()); + gesamtZahler + .setVerwendungszweck(String.join(", ", verwendungszwecke)); } - break; - default: - assert false : "Personentyp ist nicht implementiert"; + zahlerarray.add(gesamtZahler); + } } - ls.setBetrag(za.getBetrag().doubleValue()); - summemitgliedskonto = summemitgliedskonto.add(za.getBetrag()); - ls.setBIC(za.getBic()); - ls.setIBAN(za.getIban()); - ls.setMandatDatum(za.getMandatdatum()); - ls.setMandatSequence(za.getMandatsequence().getTxt()); - ls.setMandatID(za.getMandatid()); - ls.setVerwendungszweck(za.getVerwendungszweck()); - ls.store(); } - // Gegenbuchung für das Mitgliedskonto schreiben - if (!summemitgliedskonto.equals(BigDecimal.valueOf(0))) - { - writeMitgliedskonto(null, param.faelligkeit, "Gegenbuchung", - summemitgliedskonto.doubleValue() * -1, abrl, true, getKonto(), null, - null, null); - } - if (param.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) + if (zahlerarray.size() > 0) { - // Wenn keine Buchungen vorhanden sind, wird nichts an Hibiscus übergeben. - if (z.size() != 0) + monitor.setStatusText("Lastschriften erstellen"); + count = 0; + BigDecimal summelastschriften = BigDecimal.valueOf(0); + for (JVereinZahler zahler : zahlerarray) + { + monitor.setPercentComplete( + (int) (count++ / (double) zahlerarray.size() * 100d)); + summelastschriften = summelastschriften.add(zahler.getBetrag()); + Lastschrift ls = getLastschrift(zahler, abrl); + ls.store(); + } + + // Gegenbuchung für die Sollbuchungen schreiben + if (!summelastschriften.equals(BigDecimal.valueOf(0))) + { + writeSollbuchung(Zahlungsweg.BASISLASTSCHRIFT, null, null, + param.faelligkeit, abrl, konto, param, + summelastschriften.doubleValue()); + } + + // Wenn keine Lastschriften vorhanden sind, wird kein File erzeugt. + if (param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) { - buchenHibiscus(param, z); + writeSepaFile(param, lastschrift, zahlerarray); + monitor.log(String.format("SEPA-Datei %s geschrieben.", + param.sepafileRCUR.getAbsolutePath())); + param.setText(String.format(", SEPA-Datei %s geschrieben.", + param.sepafileRCUR.getAbsolutePath())); + } + + if (param.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) + { + buchenHibiscus(param, zahlerarray); monitor.log("Hibiscus-Lastschrift erzeugt."); param.setText(String.format(", Hibiscus-Lastschrift erzeugt.")); } + + if (param.pdffileRCUR != null) + { + // Nur für die PDF-Erzeugung müssen die Zahler in der Lastschrift + // enthalten sein + for (JVereinZahler z : zahlerarray) + { + lastschrift.add(z); + } + // Das für die + // PDF-Erzeugung benötigte Datum wird erst in write gesetzt + File temp_file = Files.createTempFile("jv", ".xml").toFile(); + lastschrift.write(temp_file); + temp_file.delete(); + + ausdruckenSEPA(lastschrift, param.pdffileRCUR); + } } - if (param.pdffileRCUR != null) - { - ausdruckenSEPA(lastschrift, param.pdffileRCUR); - } + monitor.setStatusText(counter + " abgerechnete Fälle"); } private void abrechnenMitglieder(AbrechnungSEPAParam param, - Basislastschrift lastschrift, ProgressMonitor monitor, - Abrechnungslauf abrl, Konto konto) throws Exception + ProgressMonitor monitor) throws Exception { if (param.abbuchungsmodus != Abrechnungsmodi.KEINBEITRAG) { @@ -281,23 +361,23 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, // Das Mitglied muss bereits eingetreten sein list.addFilter("(eintritt <= ? or eintritt is null) ", - new Object[] { new java.sql.Date(param.stichtag.getTime()) }); + new java.sql.Date(param.stichtag.getTime())); // Das Mitglied darf noch nicht ausgetreten sein list.addFilter("(austritt is null or austritt > ?)", - new Object[] { new java.sql.Date(param.stichtag.getTime()) }); + new java.sql.Date(param.stichtag.getTime())); // Bei Abbuchungen im Laufe des Jahres werden nur die Mitglieder // berücksichtigt, die bis zu einem bestimmten Zeitpunkt ausgetreten sind. if (param.bisdatum != null) { list.addFilter("(austritt <= ?)", - new Object[] { new java.sql.Date(param.bisdatum.getTime()) }); + new java.sql.Date(param.bisdatum.getTime())); } // Bei Abbuchungen im Laufe des Jahres werden nur die Mitglieder // berücksichtigt, die ab einem bestimmten Zeitpunkt eingetreten sind. if (param.vondatum != null) { list.addFilter("eintritt >= ?", - new Object[] { new java.sql.Date(param.vondatum.getTime()) }); + new java.sql.Date(param.vondatum.getTime())); } if (Einstellungen.getEinstellung() .getBeitragsmodel() == Beitragsmodel.MONATLICH12631) @@ -306,43 +386,43 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, { list.addFilter( "(zahlungsrhytmus = ? or zahlungsrhytmus = ? or zahlungsrhytmus = ?)", - new Object[] { Integer.valueOf(Zahlungsrhythmus.HALBJAEHRLICH), - Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH), - Integer.valueOf(Zahlungsrhythmus.MONATLICH) }); + Integer.valueOf(Zahlungsrhythmus.HALBJAEHRLICH), + Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH), + Integer.valueOf(Zahlungsrhythmus.MONATLICH)); } if (param.abbuchungsmodus == Abrechnungsmodi.JAVIMO) { list.addFilter( "(zahlungsrhytmus = ? or zahlungsrhytmus = ? or zahlungsrhytmus = ?)", - new Object[] { Integer.valueOf(Zahlungsrhythmus.JAEHRLICH), - Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH), - Integer.valueOf(Zahlungsrhythmus.MONATLICH) }); + Integer.valueOf(Zahlungsrhythmus.JAEHRLICH), + Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH), + Integer.valueOf(Zahlungsrhythmus.MONATLICH)); } if (param.abbuchungsmodus == Abrechnungsmodi.VIMO) { list.addFilter("(zahlungsrhytmus = ? or zahlungsrhytmus = ?)", - new Object[] { Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH), - Integer.valueOf(Zahlungsrhythmus.MONATLICH) }); + Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH), + Integer.valueOf(Zahlungsrhythmus.MONATLICH)); } if (param.abbuchungsmodus == Abrechnungsmodi.MO) { list.addFilter("zahlungsrhytmus = ?", - new Object[] { Integer.valueOf(Zahlungsrhythmus.MONATLICH) }); + Integer.valueOf(Zahlungsrhythmus.MONATLICH)); } if (param.abbuchungsmodus == Abrechnungsmodi.VI) { - list.addFilter("zahlungsrhytmus = ?", new Object[] { - Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH) }); + list.addFilter("zahlungsrhytmus = ?", + Integer.valueOf(Zahlungsrhythmus.VIERTELJAEHRLICH)); } if (param.abbuchungsmodus == Abrechnungsmodi.HA) { list.addFilter("zahlungsrhytmus = ?", - new Object[] { Integer.valueOf(Zahlungsrhythmus.HALBJAEHRLICH) }); + Integer.valueOf(Zahlungsrhythmus.HALBJAEHRLICH)); } if (param.abbuchungsmodus == Abrechnungsmodi.JA) { list.addFilter("zahlungsrhytmus = ?", - new Object[] { Integer.valueOf(Zahlungsrhythmus.JAEHRLICH) }); + Integer.valueOf(Zahlungsrhythmus.JAEHRLICH)); } } @@ -352,10 +432,32 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, int count = 0; while (list.hasNext()) { + if (interrupt.isInterrupted()) + { + throw new ApplicationException("Abrechnung abgebrochen"); + } Mitglied m = list.next(); - JVereinZahler z = abrechnungMitgliederSub(param, monitor, abrl, konto, - m, m.getBeitragsgruppe(), true); + JVereinZahler zahler = abrechnungMitgliederSub(param, monitor, m, + m.getBeitragsgruppe(), true); + + if (zahler != null) + { + ArrayList zlist = zahlermap + .get(zahler.getPersonTyp() + zahler.getPersonId()); + if (zlist == null) + { + zlist = new ArrayList<>(); + zlist.add(zahler); + zahlermap.put(zahler.getPersonTyp() + zahler.getPersonId(), zlist); + } + else + { + zlist.add(zahler); + zahlermap.replace(zahler.getPersonTyp() + zahler.getPersonId(), + zlist); + } + } DBIterator sekundaer = Einstellungen .getDBService().createList(SekundaereBeitragsgruppe.class); @@ -363,24 +465,28 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, while (sekundaer.hasNext()) { SekundaereBeitragsgruppe sb = sekundaer.next(); - JVereinZahler z2 = abrechnungMitgliederSub(param, monitor, abrl, - konto, m, sb.getBeitragsgruppe(), false); - if (z2 != null) + JVereinZahler zahlerSekundaer = abrechnungMitgliederSub(param, + monitor, m, sb.getBeitragsgruppe(), false); + if (zahlerSekundaer != null) { - if (z != null) + ArrayList zlist = zahlermap.get( + zahlerSekundaer.getPersonTyp() + zahlerSekundaer.getPersonId()); + if (zlist == null) { - z.add(z2); + zlist = new ArrayList<>(); + zlist.add(zahlerSekundaer); + zahlermap.put(zahlerSekundaer.getPersonTyp() + + zahlerSekundaer.getPersonId(), zlist); } else { - z = z2; + zlist.add(zahlerSekundaer); + zahlermap.replace(zahlerSekundaer.getPersonTyp() + + zahlerSekundaer.getPersonId(), zlist); } } } - if (z != null) - { - lastschrift.add(z); - } + monitor.setPercentComplete( (int) ((double) count++ / (double) list.size() * 100d)); monitor.setStatusText( @@ -390,8 +496,7 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, } private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, - ProgressMonitor monitor, Abrechnungslauf abrl, Konto konto, Mitglied m, - Beitragsgruppe bg, boolean primaer) + ProgressMonitor monitor, Mitglied m, Beitragsgruppe bg, boolean primaer) throws RemoteException, ApplicationException { Double betr = 0d; @@ -403,19 +508,17 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, if (m.getZahlerID() == null) { throw new ApplicationException("Kein Vollzahler vorhanden: " - + m.getName() + ", " + m.getVorname()); + + Adressaufbereitung.getNameVorname(m)); } mZahler = Einstellungen.getDBService().createObject(Mitglied.class, m.getZahlerID().toString()); } - if (Einstellungen.getEinstellung() + if ((Einstellungen.getEinstellung() .getBeitragsmodel() == Beitragsmodel.FLEXIBEL) + && (mZahler.getZahlungstermin() != null && !mZahler.getZahlungstermin() + .isAbzurechnen(param.abrechnungsmonat))) { - if (mZahler.getZahlungstermin() != null - && !mZahler.getZahlungstermin().isAbzurechnen(param.abrechnungsmonat)) - { - return zahler; - } + return null; } try @@ -428,47 +531,30 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, catch (NullPointerException e) { throw new ApplicationException( - "Zahlungsinformationen bei " + m.getName() + ", " + m.getVorname()); + "Zahlungsinformationen bei " + Adressaufbereitung.getNameVorname(m)); } - if (primaer) + if (primaer && (Einstellungen.getEinstellung().getIndividuelleBeitraege() + && m.getIndividuellerBeitrag() != null)) { - if (Einstellungen.getEinstellung().getIndividuelleBeitraege() - && m.getIndividuellerBeitrag() != null) - { - betr = m.getIndividuellerBeitrag(); - } + betr = m.getIndividuellerBeitrag(); } - if ((betr == 0d) || !checkSEPA(mZahler, monitor)) + if (betr == 0d) { - return zahler; + return null; } + checkSEPA(mZahler, monitor); + counter++; - String vzweck = abrl.getZahlungsgrund(); - Map map = new MitgliedMap().getMap(m, null); try { - vzweck = VelocityTool.eval(map, vzweck); - } - catch (IOException e) - { - Logger.error("Fehler bei der Aufbereitung der Variablen", e); - } - - writeMitgliedskonto(m, param.faelligkeit, - primaer ? vzweck : bg.getBezeichnung(), betr, abrl, - mZahler.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT, konto, - bg.getBuchungsart(), bg.getBuchungsklasseId(), - mZahler.getZahlungsweg()); - if (mZahler.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT) - { - try + zahler = new JVereinZahler(); + zahler.setPersonId(mZahler.getID()); + zahler.setPersonTyp(JVereinZahlerTyp.MITGLIED); + zahler.setBetrag( + BigDecimal.valueOf(betr).setScale(2, RoundingMode.HALF_UP)); + if (mZahler.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT) { - zahler = new JVereinZahler(); - zahler.setPersonId(mZahler.getID()); - zahler.setPersonTyp(JVereinZahlerTyp.MITGLIED); - zahler.setBetrag( - BigDecimal.valueOf(betr).setScale(2, RoundingMode.HALF_UP)); IBAN i = new IBAN(mZahler.getIban()); // Prüfung der IBAN zahler.setIban(mZahler.getIban()); // Wenn BIC nicht vorhanden versuchen sie automatisch zu ermitteln @@ -484,60 +570,75 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, zahler.setMandatid(mZahler.getMandatID()); zahler.setMandatdatum(mZahler.getMandatDatum()); zahler.setMandatsequence(MandatSequence.RCUR); - zahler.setFaelligkeit(param.faelligkeit); - if (primaer && m.getZahlungsweg() != Zahlungsweg.VOLLZAHLER) + } + zahler.setFaelligkeit(param.faelligkeit); + zahler.setZahlungsweg(new Zahlungsweg(mZahler.getZahlungsweg())); + if (bg.getBuchungsart() != null) + { + zahler.setBuchungsartId(bg.getBuchungsartId()); + } + if (bg.getBuchungsklasseId() != null) + { + zahler.setBuchungsklasseId(bg.getBuchungsklasseId()); + } + zahler.setDatum(param.faelligkeit); + zahler.setMitglied(m); + if (primaer) + { + String vzweck = getVerwendungszweck(param); + boolean ohneLesefelder = !vzweck.contains(Einstellungen.LESEFELD_PRE); + Map map = new AllgemeineMap().getMap(null); + map = new MitgliedMap().getMap(m, map, ohneLesefelder); + map = new AbrechnungsParameterMap().getMap(param, map); + try { - String verwendungszweck = getVerwendungszweck2(mZahler) + " " - + vzweck; - if (verwendungszweck.length() >= 140) + vzweck = VelocityTool.eval(map, vzweck); + if (vzweck.length() >= 140) { - verwendungszweck = verwendungszweck.substring(0, 136) + "..."; + vzweck = vzweck.substring(0, 136) + "..."; } - zahler.setVerwendungszweck(verwendungszweck); } - else - { - zahler.setVerwendungszweck(bg.getBezeichnung()); - } - if (m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) + catch (IOException e) { - zahler.setVerwendungszweck( - zahler.getVerwendungszweck() + " " + m.getVorname()); + Logger.error("Fehler bei der Aufbereitung der Variablen", e); } - zahler.setName(mZahler.getKontoinhaber(1)); + zahler.setVerwendungszweck(vzweck); } - catch (Exception e) + else { - throw new ApplicationException( - Adressaufbereitung.getNameVorname(m) + ": " + e.getMessage()); + zahler.setVerwendungszweck(bg.getBezeichnung()); } + zahler.setName(mZahler.getKontoinhaber(1)); } + catch (Exception e) + { + throw new ApplicationException( + Adressaufbereitung.getNameVorname(m) + ": " + e.getMessage()); + } + return zahler; } + @SuppressWarnings({ "rawtypes", "unchecked" }) private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, - Basislastschrift lastschrift, Abrechnungslauf abrl, Konto konto, - ProgressMonitor monitor) - throws NumberFormatException, IOException, ApplicationException + Abrechnungslauf abrl, ProgressMonitor monitor) throws Exception { int count = 0; DBIterator list = Einstellungen.getDBService() .createList(Zusatzbetrag.class); + // etwas vorfiltern um die Ergebnise zu reduzieren + list.addFilter("(intervall != 0 or ausfuehrung is null)"); + list.addFilter("(endedatum is null or endedatum >= ?)", param.stichtag); while (list.hasNext()) { + if (interrupt.isInterrupted()) + { + throw new ApplicationException("Abrechnung abgebrochen"); + } Zusatzbetrag z = list.next(); if (z.isAktiv(param.stichtag)) { Mitglied m = z.getMitglied(); - if (m.isAngemeldet(param.stichtag) - || Einstellungen.getEinstellung().getZusatzbetragAusgetretene()) - { - // - } - else - { - continue; - } Mitglied mZahler = m; if (m.getZahlungsweg() != null && m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) @@ -556,15 +657,16 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, zahlungsweg = mZahler.getZahlungsweg(); } - if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT - && !checkSEPA(mZahler, monitor)) + if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT) { - continue; + checkSEPA(mZahler, monitor); } + counter++; String vzweck = z.getBuchungstext(); + boolean ohneLesefelder = !vzweck.contains(Einstellungen.LESEFELD_PRE); Map map = new AllgemeineMap().getMap(null); - map = new MitgliedMap().getMap(m, map); + map = new MitgliedMap().getMap(m, map, ohneLesefelder); map = new AbrechnungsParameterMap().getMap(param, map); try { @@ -575,15 +677,15 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, Logger.error("Fehler bei der Aufbereitung der Variablen", e); } - if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT) + try { - try + JVereinZahler zahler = new JVereinZahler(); + zahler.setPersonId(mZahler.getID()); + zahler.setPersonTyp(JVereinZahlerTyp.MITGLIED); + zahler.setBetrag(BigDecimal.valueOf(z.getBetrag()).setScale(2, + RoundingMode.HALF_UP)); + if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT) { - JVereinZahler zahler = new JVereinZahler(); - zahler.setPersonId(mZahler.getID()); - zahler.setPersonTyp(JVereinZahlerTyp.MITGLIED); - zahler.setBetrag(BigDecimal.valueOf(z.getBetrag()).setScale(2, - RoundingMode.HALF_UP)); new BIC(mZahler.getBic()); new IBAN(mZahler.getIban()); zahler.setBic(mZahler.getBic()); @@ -591,17 +693,43 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, zahler.setMandatid(mZahler.getMandatID()); zahler.setMandatdatum(mZahler.getMandatDatum()); zahler.setMandatsequence(MandatSequence.RCUR); - zahler.setFaelligkeit(param.faelligkeit); - zahler.setName(mZahler.getKontoinhaber(1)); - zahler.setVerwendungszweck(vzweck); - lastschrift.add(zahler); } - catch (Exception e) + zahler.setFaelligkeit(param.faelligkeit); + zahler.setName(mZahler.getKontoinhaber(1)); + zahler.setVerwendungszweck(vzweck); + zahler.setZahlungsweg(new Zahlungsweg(zahlungsweg)); + if (z.getBuchungsart() != null) + { + zahler.setBuchungsartId(z.getBuchungsartId()); + } + if (z.getBuchungsklasseId() != null) + { + zahler.setBuchungsklasseId(z.getBuchungsklasseId()); + } + zahler.setDatum(z.getFaelligkeit()); + zahler.setMitglied(m); + + ArrayList zlist = zahlermap + .get(zahler.getPersonTyp() + zahler.getPersonId()); + if (zlist == null) { - throw new ApplicationException( - Adressaufbereitung.getNameVorname(m) + ": " + e.getMessage()); + zlist = new ArrayList(); + zlist.add(zahler); + zahlermap.put(zahler.getPersonTyp() + zahler.getPersonId(), zlist); } + else + { + zlist.add(zahler); + zahlermap.replace(zahler.getPersonTyp() + zahler.getPersonId(), + zlist); + } + } + catch (Exception e) + { + throw new ApplicationException( + Adressaufbereitung.getNameVorname(m) + ": " + e.getMessage()); } + if (z.getIntervall().intValue() != IntervallZusatzzahlung.KEIN && (z.getEndedatum() == null || z.getFaelligkeit().getTime() <= z.getEndedatum().getTime())) @@ -634,9 +762,6 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, monitor.log(z.getMitglied().getName() + " " + debString + " " + e); throw e; } - writeMitgliedskonto(m, param.faelligkeit, vzweck, z.getBetrag(), abrl, - zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT, konto, - z.getBuchungsart(), z.getBuchungsklasseId(), zahlungsweg); monitor .setStatusText(String.format("Zusatzbetrag von %s, %s abgerechnet", m.getName(), m.getVorname())); @@ -644,18 +769,25 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, monitor.setPercentComplete( (int) ((double) count++ / (double) list.size() * 100d)); } + } - private void abbuchenKursteilnehmer(AbrechnungSEPAParam param, - Basislastschrift lastschrift, Abrechnungslauf abrl, Konto konto, - ProgressMonitor monitor) throws ApplicationException, IOException + private ArrayList abbuchenKursteilnehmer( + AbrechnungSEPAParam param, Abrechnungslauf abrl, Konto konto, + ProgressMonitor monitor) throws Exception { + ArrayList zahlerarray = new ArrayList<>(); int count = 0; DBIterator list = Einstellungen.getDBService() .createList(Kursteilnehmer.class); list.addFilter("abbudatum is null"); while (list.hasNext()) { + if (interrupt.isInterrupted()) + { + throw new ApplicationException("Abrechnung abgebrochen"); + } + counter++; Kursteilnehmer kt = list.next(); try @@ -674,13 +806,20 @@ private void abbuchenKursteilnehmer(AbrechnungSEPAParam param, zahler.setMandatsequence(MandatSequence.RCUR); zahler.setFaelligkeit(param.faelligkeit); zahler.setName(kt.getName()); - zahler.setVerwendungszweck(kt.getVZweck1()); - lastschrift.add(zahler); + zahler + .setVerwendungszweck(getVerwendungszweckName(kt, kt.getVZweck1())); + zahler.setZahlungsweg(new Zahlungsweg(Zahlungsweg.BASISLASTSCHRIFT)); + zahler.setDatum(param.faelligkeit); kt.setAbbudatum(param.faelligkeit); kt.store(); - writeMitgliedskonto(kt, param.faelligkeit, kt.getVZweck1(), - zahler.getBetrag().doubleValue(), abrl, true, konto, null, null, - null); + + ArrayList spArray = new ArrayList<>(); + spArray.add(getSollbuchungPosition(zahler)); + String zweck = writeSollbuchung(Zahlungsweg.BASISLASTSCHRIFT, kt, + spArray, param.faelligkeit, abrl, konto, param, null); + zahler.setVerwendungszweck(zweck); + zahlerarray.add(zahler); + monitor.setStatusText(String.format("Kursteilnehmer %s, %s abgerechnet", kt.getName(), kt.getVorname())); monitor.setPercentComplete( @@ -691,34 +830,29 @@ private void abbuchenKursteilnehmer(AbrechnungSEPAParam param, throw new ApplicationException(kt.getName() + ": " + e.getMessage()); } } + return zahlerarray; } private void ausdruckenSEPA(final Basislastschrift lastschrift, final String pdf_fn) throws IOException, DocumentException, SEPAException { new Basislastschrift2Pdf(lastschrift, pdf_fn); - GUI.getDisplay().asyncExec(new Runnable() - { - - @Override - public void run() + GUI.getDisplay().asyncExec(() -> { + try { - try - { - new Program().handleAction(new File(pdf_fn)); - } - catch (ApplicationException ae) - { - Application.getMessagingFactory().sendMessage(new StatusBarMessage( - ae.getLocalizedMessage(), StatusBarMessage.TYPE_ERROR)); - } + new Program().handleAction(new File(pdf_fn)); + } + catch (ApplicationException ae) + { + Application.getMessagingFactory().sendMessage(new StatusBarMessage( + ae.getLocalizedMessage(), StatusBarMessage.TYPE_ERROR)); } }); } @SuppressWarnings({ "unchecked", "rawtypes" }) private void writeSepaFile(AbrechnungSEPAParam param, - Basislastschrift lastschrift, ArrayList alle_zahler) + Basislastschrift lastschrift, ArrayList zahlerarray) throws Exception { Properties ls_properties = new Properties(); @@ -738,7 +872,7 @@ private void writeSepaFile(AbrechnungSEPAParam param, ls_properties.setProperty("batchbook", ""); int counter = 0; String creditorid = lastschrift.getGlaeubigerID(); - for (Zahler zahler : alle_zahler) + for (Zahler zahler : zahlerarray) { ls_properties.setProperty(SepaUtil.insertIndex("dst.bic", counter), StringUtils.trimToEmpty(zahler.getBic())); @@ -772,15 +906,15 @@ private void writeSepaFile(AbrechnungSEPAParam param, os.close(); } - private void buchenHibiscus(AbrechnungSEPAParam param, ArrayList z) - throws ApplicationException + private void buchenHibiscus(AbrechnungSEPAParam param, + ArrayList zahlerarray) throws ApplicationException { try { - SepaLastschrift[] lastschriften = new SepaLastschrift[z.size()]; + SepaLastschrift[] lastschriften = new SepaLastschrift[zahlerarray.size()]; int sli = 0; Date d = new Date(); - for (Zahler za : z) + for (Zahler za : zahlerarray) { SepaLastschrift sl = (SepaLastschrift) param.service .createObject(SepaLastschrift.class, null); @@ -840,6 +974,25 @@ private String getVerwendungszweck(AbrechnungSEPAParam param) } } + private String getVerwendungszweckName(ILastschrift adr, + String verwendungszweck) throws RemoteException + { + String id = adr.getID(); + if (adr instanceof Mitglied + && Einstellungen.getEinstellung().getExterneMitgliedsnummer()) + { + id = ((Mitglied) adr).getExterneMitgliedsnummer(); + } + String mitgliedname = id + "/" + Adressaufbereitung.getNameVorname(adr); + + verwendungszweck = mitgliedname + " " + verwendungszweck; + if (verwendungszweck.length() >= 140) + { + verwendungszweck = verwendungszweck.substring(0, 136) + "..."; + } + return verwendungszweck; + } + private Abrechnungslauf getAbrechnungslauf(AbrechnungSEPAParam param) throws RemoteException, ApplicationException { @@ -861,75 +1014,230 @@ private Abrechnungslauf getAbrechnungslauf(AbrechnungSEPAParam param) return abrl; } - private void writeMitgliedskonto(Object mitglied, Date datum, String zweck1, - double betrag, Abrechnungslauf abrl, boolean haben, Konto konto, - Buchungsart buchungsart, Long buchungsklasseId, Integer zahlungsweg) - throws ApplicationException, RemoteException + private SollbuchungPosition getSollbuchungPosition(JVereinZahler zahler) + throws RemoteException, SEPAException + { + + SollbuchungPosition sp = Einstellungen.getDBService() + .createObject(SollbuchungPosition.class, null); + sp.setBetrag(zahler.getBetrag().doubleValue()); + sp.setBuchungsartId(zahler.getBuchungsartId()); + if (zahler.getBuchungsartId() != null) + { + sp.setSteuersatz(sp.getBuchungsart().getSteuersatz()); + } + else + { + sp.setSteuersatz(0d); + } + sp.setBuchungsklasseId(zahler.getBuchungsklasseId()); + sp.setDatum(zahler.getDatum()); + sp.setZweck(zahler.getVerwendungszweckOrig()); + return sp; + } + + private Lastschrift getLastschrift(JVereinZahler zahler, Abrechnungslauf abrl) + throws RemoteException, SEPAException + { + Lastschrift ls = (Lastschrift) Einstellungen.getDBService() + .createObject(Lastschrift.class, null); + ls.setAbrechnungslauf(Integer.parseInt(abrl.getID())); + + switch (zahler.getPersonTyp()) + { + case KURSTEILNEHMER: + ls.setKursteilnehmer(Integer.parseInt(zahler.getPersonId())); + Kursteilnehmer k = (Kursteilnehmer) Einstellungen.getDBService() + .createObject(Kursteilnehmer.class, zahler.getPersonId()); + ls.setPersonenart(k.getPersonenart()); + ls.setAnrede(k.getAnrede()); + ls.setTitel(k.getTitel()); + ls.setName(k.getName()); + ls.setVorname(k.getVorname()); + ls.setStrasse(k.getStrasse()); + ls.setAdressierungszusatz(k.getAdressierungszusatz()); + ls.setPlz(k.getPlz()); + ls.setOrt(k.getOrt()); + ls.setStaat(k.getStaatCode()); + ls.setEmail(k.getEmail()); + if (k.getGeschlecht() != null) + { + ls.setGeschlecht(k.getGeschlecht()); + } + ls.setVerwendungszweck(zahler.getVerwendungszweck()); + break; + case MITGLIED: + ls.setMitglied(Integer.parseInt(zahler.getPersonId())); + Mitglied m = (Mitglied) Einstellungen.getDBService() + .createObject(Mitglied.class, zahler.getPersonId()); + if (m.getKtoiName() == null || m.getKtoiName().length() == 0) + { + ls.setPersonenart(m.getPersonenart()); + ls.setAnrede(m.getAnrede()); + ls.setTitel(m.getTitel()); + ls.setName(m.getName()); + ls.setVorname(m.getVorname()); + ls.setStrasse(m.getStrasse()); + ls.setAdressierungszusatz(m.getAdressierungszusatz()); + ls.setPlz(m.getPlz()); + ls.setOrt(m.getOrt()); + ls.setStaat(m.getStaatCode()); + ls.setEmail(m.getEmail()); + ls.setGeschlecht(m.getGeschlecht()); + } + else + { + ls.setPersonenart(m.getKtoiPersonenart()); + ls.setAnrede(m.getKtoiAnrede()); + ls.setTitel(m.getKtoiTitel()); + ls.setName(m.getKtoiName()); + ls.setVorname(m.getKtoiVorname()); + ls.setStrasse(m.getKtoiStrasse()); + ls.setAdressierungszusatz(m.getKtoiAdressierungszusatz()); + ls.setPlz(m.getKtoiPlz()); + ls.setOrt(m.getKtoiOrt()); + ls.setStaat(m.getKtoiStaatCode()); + ls.setEmail(m.getKtoiEmail()); + ls.setGeschlecht(m.getKtoiGeschlecht()); + } + String zweck = getVerwendungszweckName(m, zahler.getVerwendungszweck()); + ls.setVerwendungszweck(zweck); + zahler.setVerwendungszweck(zweck); + break; + default: + assert false : "Personentyp ist nicht implementiert"; + } + ls.setBetrag(zahler.getBetrag().doubleValue()); + ls.setBIC(zahler.getBic()); + ls.setIBAN(zahler.getIban()); + ls.setMandatDatum(zahler.getMandatdatum()); + ls.setMandatSequence(zahler.getMandatsequence().getTxt()); + ls.setMandatID(zahler.getMandatid()); + return ls; + } + + /* + * Schreibt die Sollbuchung inkl. Sollbuchungspositionen. Bei Lastschrift + * werden Istbuchungen erstellt. Ggfs. wird auch die Rechnung erstellt. + */ + private String writeSollbuchung(int zahlungsweg, IAdresse adress, + ArrayList spArray, Date datum, Abrechnungslauf abrl, + Konto konto, AbrechnungSEPAParam param, Double summe) + throws ApplicationException, RemoteException, SEPAException { Mitgliedskonto mk = null; - if (mitglied != null - && mitglied instanceof Mitglied) /* - * Mitglied darf dann null sein, wenn - * die Gegenbuchung geschrieben wird - */ + String zweck = null; + Rechnung re = null; + if (spArray != null) { - Mitglied mg = (Mitglied) mitglied; mk = (Mitgliedskonto) Einstellungen.getDBService() .createObject(Mitgliedskonto.class, null); mk.setAbrechnungslauf(abrl); - if (zahlungsweg != null) + mk.setZahlungsweg(zahlungsweg); + + mk.setDatum(datum); + if (adress instanceof Mitglied) { - mk.setZahlungsweg(zahlungsweg); + mk.setMitglied((Mitglied) adress); } - else + // Zweck wird später gefüllt, es muss aber schon was drin stehen damit + // gespeichert werden kann + mk.setZweck1(" "); + mk.setBetrag(0d); + mk.store(); + + summe = 0d; + for (SollbuchungPosition sp : spArray) { - mk.setZahlungsweg(mg.getZahlungsweg()); + summe += sp.getBetrag(); + sp.setSollbuchung(mk.getID()); + sp.store(); + } + mk.setBetrag(summe); + + // Rechnungen nur für (Nicht-)Mitglieder unterstützt + // (nicht für Kursteilnehmer) + if (param.rechnung && adress instanceof Mitglied) + { + Formular form = param.rechnungsformular; + if (form == null) + { + throw new ApplicationException("Kein Rechnungs-Formular ausgewählt"); + } + + re = (Rechnung) Einstellungen.getDBService() + .createObject(Rechnung.class, null); + + re.setFormular(form); + re.fill(mk); + re.store(); + mk.setRechnung(re); + + if (param.rechnungstext.trim().length() > 0) + { + zweck = param.rechnungstext; + boolean ohneLesefelder = !zweck.contains(Einstellungen.LESEFELD_PRE); + Map map = new AllgemeineMap().getMap(null); + map = new MitgliedMap().getMap((Mitglied) adress, map, + ohneLesefelder); + map = new RechnungMap().getMap(re, map); + map = new AbrechnungsParameterMap().getMap(param, map); + try + { + zweck = VelocityTool.eval(map, zweck); + if (zweck.length() >= 140) + { + zweck = zweck.substring(0, 136) + "..."; + } + } + catch (IOException e) + { + Logger.error("Fehler bei der Aufbereitung der Variablen", e); + } + + mk.setZweck1(zweck); + } + } + if (zweck == null) + { + if (spArray.size() == 1) + { + zweck = spArray.get(0).getZweck(); + } + else + { + zweck = ""; + for (SollbuchungPosition sp : spArray) + { + zweck += ", " + sp.getZweck() + " " + sp.getBetrag(); + } + zweck = zweck.substring(2); + } + mk.setZweck1(zweck); } - mk.setBetrag(betrag); - mk.setDatum(datum); - mk.setMitglied(mg); - mk.setZweck1(zweck1); - double steuersatz = 0d; - if (buchungsart != null) - { - mk.setBuchungsart(buchungsart); - steuersatz = buchungsart.getSteuersatz(); - } - mk.setBuchungsklasseId(buchungsklasseId); - // Set tax rate - mk.setSteuersatz(steuersatz); - // Set bill amount without taxes - double nettobetrag = (steuersatz != 0d) - ? (betrag / (1d + (steuersatz / 100d))) - : betrag; - mk.setNettobetrag(nettobetrag); - // Set tax amount - mk.setSteuerbetrag(betrag - nettobetrag); mk.store(); } - if (haben) + + if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT) { Buchung buchung = (Buchung) Einstellungen.getDBService() .createObject(Buchung.class, null); buchung.setAbrechnungslauf(abrl); - buchung.setBetrag(betrag); + buchung.setBetrag(summe); buchung.setDatum(datum); buchung.setKonto(konto); - buchung.setName(mitglied != null - ? Adressaufbereitung.getNameVorname((IAdresse) mitglied) + buchung.setName(adress != null ? Adressaufbereitung.getNameVorname(adress) : "JVerein"); - buchung.setZweck(zweck1); + buchung.setZweck(adress == null ? "Gegenbuchung" : zweck); + buchung.store(); + if (mk != null) { - buchung.setMitgliedskonto(mk); - } - if (buchungsart != null) - { - buchung.setBuchungsartId(Long.valueOf(buchungsart.getID())); + // Buchungen automatisch splitten + SplitbuchungsContainer.autoSplit(buchung, mk, false); } - buchung.setBuchungsklasseId(buchungsklasseId); - buchung.store(); } + return zweck; } private Konto getKonto() throws RemoteException, ApplicationException @@ -949,29 +1257,21 @@ private Konto getKonto() throws RemoteException, ApplicationException return k; } - private String getVerwendungszweck2(Mitglied m) throws RemoteException - { - String mitgliedname = (Einstellungen.getEinstellung() - .getExterneMitgliedsnummer() ? m.getExterneMitgliedsnummer() - : m.getID()) - + "/" + Adressaufbereitung.getNameVorname(m); - return mitgliedname; - } - - private boolean checkSEPA(Mitglied m, ProgressMonitor monitor) - throws RemoteException + private void checkSEPA(Mitglied m, ProgressMonitor monitor) + throws RemoteException, ApplicationException { if (m.getZahlungsweg() == null || m.getZahlungsweg() != Zahlungsweg.BASISLASTSCHRIFT) { - return true; + return; } // Ohne Mandat keine Lastschrift if (m.getMandatDatum() == Einstellungen.NODATE) { monitor.log(Adressaufbereitung.getNameVorname(m) + ": Kein Mandat-Datum vorhanden."); - return false; + throw new ApplicationException(Adressaufbereitung.getNameVorname(m) + + ": Kein Mandat-Datum vorhanden."); } // Bei Mandaten älter als 3 Jahre muss es eine Lastschrift // innerhalb der letzten 3 Jahre geben @@ -983,12 +1283,13 @@ private boolean checkSEPA(Mitglied m, ProgressMonitor monitor) if (letzte_lastschrift == null || letzte_lastschrift.before(sepagueltigkeit.getTime())) { - monitor.log(Adressaufbereitung.getNameVorname(m) - + ": Das Mandat-Datum ist älter als 36 Monate und es erfolgte keine Lastschrift in den letzten 36 Monaten."); - return false; + String errortext = Adressaufbereitung.getNameVorname(m) + + ": Das Mandat-Datum ist älter als 36 Monate und es" + + " erfolgte keine Lastschrift in den letzten 36 Monaten."; + monitor.log(errortext); + throw new ApplicationException(errortext); } } - return true; } } diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPAParam.java b/src/de/jost_net/JVerein/io/AbrechnungSEPAParam.java index 55ae83bf4..90b7bf3c3 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPAParam.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPAParam.java @@ -24,6 +24,7 @@ import de.jost_net.JVerein.gui.control.AbrechnungSEPAControl; import de.jost_net.JVerein.keys.Abrechnungsausgabe; import de.jost_net.JVerein.keys.Monat; +import de.jost_net.JVerein.rmi.Formular; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBService; import de.willuhn.jameica.hbci.HBCI; @@ -58,6 +59,14 @@ public class AbrechnungSEPAParam public final Boolean kursteilnehmer; public final Boolean kompakteabbuchung; + + public final boolean sollbuchungenzusammenfassen; + + public final boolean rechnung; + + public final Formular rechnungsformular; + + public final String rechnungstext; public final Boolean sepaprint; @@ -89,6 +98,10 @@ public AbrechnungSEPAParam(AbrechnungSEPAControl ac, File sepafileRCUR, SepaVers zusatzbetraege = (Boolean) ac.getZusatzbetrag().getValue(); kursteilnehmer = (Boolean) ac.getKursteilnehmer().getValue(); kompakteabbuchung = (Boolean) ac.getKompakteAbbuchung().getValue(); + sollbuchungenzusammenfassen = (Boolean) ac.getSollbuchungenZusammenfassen().getValue(); + rechnung = (Boolean) ac.getRechnung().getValue(); + rechnungsformular = (Formular) ac.getRechnungFormular().getValue(); + rechnungstext = (String) ac.getRechnungstext().getValue(); sepaprint = (Boolean) ac.getSEPAPrint().getValue(); this.pdffileRCUR = pdffileRCUR; this.sepafileRCUR = sepafileRCUR; diff --git a/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java b/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java index a4851793f..042e0fbb1 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java +++ b/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java @@ -55,10 +55,7 @@ public AbrechnungslaufPDF(DBIterator it, final File file, BaseColor.LIGHT_GRAY); reporter.addHeaderColumn("Zweck", Element.ALIGN_CENTER, 190, BaseColor.LIGHT_GRAY); - reporter.addHeaderColumn("Steuersatz", Element.ALIGN_CENTER, 60, - BaseColor.LIGHT_GRAY); - reporter.addHeaderColumn("Steuerbetrag", Element.ALIGN_CENTER, 60, - BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Betrag", Element.ALIGN_CENTER, 60, BaseColor.LIGHT_GRAY); reporter.addHeaderColumn("Eingang", Element.ALIGN_CENTER, 60, @@ -76,8 +73,7 @@ public AbrechnungslaufPDF(DBIterator it, final File file, reporter.addColumn(Adressaufbereitung.getNameVorname(mk.getMitglied()), Element.ALIGN_LEFT); reporter.addColumn(mk.getZweck1(), Element.ALIGN_LEFT); - reporter.addColumn(mk.getSteuersatz()); - reporter.addColumn(mk.getSteuerbetrag()); + reporter.addColumn(mk.getBetrag()); reporter.addColumn(mk.getIstSumme()); reporter.addColumn(Zahlungsweg.get(mk.getZahlungsweg()), diff --git a/src/de/jost_net/JVerein/io/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index 8583fbf6e..dc42f7058 100644 --- a/src/de/jost_net/JVerein/io/FormularAufbereitung.java +++ b/src/de/jost_net/JVerein/io/FormularAufbereitung.java @@ -26,7 +26,6 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.rmi.RemoteException; -import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Map; @@ -70,12 +69,14 @@ import de.jost_net.JVerein.Variable.MitgliedVar; import de.jost_net.JVerein.Variable.RechnungVar; import de.jost_net.JVerein.Variable.VarTools; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Einstellung; import de.jost_net.JVerein.rmi.Formular; import de.jost_net.JVerein.rmi.Formularfeld; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Rechnung; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.jost_net.JVerein.rmi.Spendenbescheinigung; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.jost_net.JVerein.util.StringTool; @@ -634,9 +635,11 @@ public void printAnschreiben(Spendenbescheinigung spb, String text) @SuppressWarnings("resource") public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException { - ArrayList mklist = re.getMitgliedskontoList(); - if (mklist.size() == 0) + Mitgliedskonto mk = re.getMitgliedskonto(); + if (mk == null) + { return; + } String sourcePDF = f.getAbsolutePath(); Einstellung e = Einstellungen.getEinstellung(); @@ -646,9 +649,9 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException Invoice invoice = new Invoice() // Fälligkeitsdatum - .setDueDate(mklist.get(mklist.size() - 1).getDatum()) + .setDueDate(mk.getDatum()) // Lieferdatum - .setDeliveryDate(mklist.get(mklist.size() - 1).getDatum()) + .setDeliveryDate(mk.getDatum()) // Rechnungsdatum .setIssueDate(re.getDatum()) // Rechnungsnummer @@ -663,9 +666,7 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException if (e.getUStID().length() > 0) sender.addVATID(e.getUStID()); - // TODO Zahlungsweg aus Rechnung lesen sobald implementiert - if (re.getMandatDatum() != null - && !re.getMandatDatum().equals(Einstellungen.NODATE)) + if (re.getZahlungsweg().getKey() == Zahlungsweg.BASISLASTSCHRIFT) { // Mandat sender.addDebitDetails(new DirectDebit(re.getIBAN(), re.getMandatID())); @@ -682,13 +683,9 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException if (mahnung) { - double bezahlt = 0; - for (Mitgliedskonto mk : re.getMitgliedskontoList()) - { - bezahlt += mk.getIstSumme(); - } // Bereits gezahlt - invoice.setTotalPrepaidAmount(new BigDecimal(bezahlt)); + invoice.setTotalPrepaidAmount( + new BigDecimal(re.getMitgliedskonto().getIstSumme())); } String id = re.getMitglied().getID(); @@ -720,32 +717,16 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException invoice.setReferenceNumber(re.getLeitwegID()); } - // Sollbuchungen - for (Mitgliedskonto mk : re.getMitgliedskontoList()) + // Sollbuchungspositionen + for (SollbuchungPosition sp : re.getMitgliedskonto() + .getSollbuchungPositionList()) { - Double betrag = mk.getNettobetrag(); - if (betrag == null || betrag == 0) - { - betrag = mk.getBetrag(); - } - if (mk.getBetrag() < 0) - { - invoice.addItem(new Item( - new Product(mk.getZweck1(), "", "LS", - new BigDecimal(mk.getSteuersatz()).setScale(2, - RoundingMode.HALF_DOWN)), - new BigDecimal(betrag * -1).setScale(2, RoundingMode.HALF_DOWN), - new BigDecimal(-1.0))); - } - else - { - invoice.addItem(new Item(new Product(mk.getZweck1(), "", "LS", // LS = - // pauschal - new BigDecimal(mk.getSteuersatz()).setScale(2, - RoundingMode.HALF_DOWN)), - new BigDecimal(betrag).setScale(2, RoundingMode.HALF_DOWN), - new BigDecimal(1.0))); - } + BigDecimal betrag = new BigDecimal(sp.getNettobetrag()); + invoice.addItem(new Item(new Product(sp.getZweck(), "", "LS", // LS = + // pauschal + new BigDecimal(sp.getSteuersatz()).setScale(2, RoundingMode.HALF_UP)), + betrag.abs().setScale(4, RoundingMode.HALF_UP), + new BigDecimal(betrag.signum()))); } ze.setTransaction(invoice); ze.export(f.getAbsolutePath()); diff --git a/src/de/jost_net/JVerein/io/JVereinZahler.java b/src/de/jost_net/JVerein/io/JVereinZahler.java index 7fd22a2c4..4740eae3a 100644 --- a/src/de/jost_net/JVerein/io/JVereinZahler.java +++ b/src/de/jost_net/JVerein/io/JVereinZahler.java @@ -16,6 +16,10 @@ **********************************************************************/ package de.jost_net.JVerein.io; +import java.util.Date; + +import de.jost_net.JVerein.keys.Zahlungsweg; +import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.OBanToo.SEPA.Basislastschrift.Zahler; public class JVereinZahler extends Zahler @@ -25,6 +29,16 @@ public class JVereinZahler extends Zahler private JVereinZahlerTyp personTyp; + private Zahlungsweg zahlungsweg; + + private Long buchungsart; + + private Long buchungsklasse; + + private Date datum; + + private Mitglied mitglied; + public JVereinZahler() { } @@ -49,4 +63,54 @@ public void setPersonTyp(JVereinZahlerTyp personTyp) this.personTyp = personTyp; } + public Zahlungsweg getZahlungsweg() + { + return zahlungsweg; + } + + public void setZahlungsweg(Zahlungsweg zahlungsweg) + { + this.zahlungsweg = zahlungsweg; + } + + public Long getBuchungsartId() + { + return buchungsart; + } + + public void setBuchungsartId(Long buchungsart) + { + this.buchungsart = buchungsart; + } + + public Long getBuchungsklasseId() + { + return buchungsklasse; + } + + public void setBuchungsklasseId(Long buchungsklasse) + { + this.buchungsklasse = buchungsklasse; + } + + public Date getDatum() + { + return datum; + } + + public void setDatum(Date datum) + { + this.datum = datum; + } + + public Mitglied getMitglied() + { + return mitglied; + } + + public void setMitglied(Mitglied mitglied) + { + this.mitglied = mitglied; + } + } diff --git a/src/de/jost_net/JVerein/io/Rechnungsausgabe.java b/src/de/jost_net/JVerein/io/Rechnungsausgabe.java index 889120712..f18285f39 100644 --- a/src/de/jost_net/JVerein/io/Rechnungsausgabe.java +++ b/src/de/jost_net/JVerein/io/Rechnungsausgabe.java @@ -202,7 +202,7 @@ void aufbereitenFormular(Rechnung re, FormularAufbereitung fa, if (formular == null) formular = re.getFormular(); - if (re.getMitgliedskontoList().size() == 0) + if (re.getSollbuchungPositionList().size() == 0) return; Map map = new RechnungMap().getMap(re, null); diff --git a/src/de/jost_net/JVerein/io/SollbuchungExport.java b/src/de/jost_net/JVerein/io/SollbuchungExport.java index f21288f61..360d2cdc4 100644 --- a/src/de/jost_net/JVerein/io/SollbuchungExport.java +++ b/src/de/jost_net/JVerein/io/SollbuchungExport.java @@ -76,10 +76,13 @@ public void doExport(final Object[] objects, IOFormat format, File file, startMitglied(m); GenericIterator sollbuchnungen = new SollbuchungQuery( control, false, m).get(); - while (sollbuchnungen.hasNext()) + if (sollbuchnungen != null) { - add(sollbuchnungen.next()); - monitor.log("Vorbereitung: " + Adressaufbereitung.getNameVorname(m)); + while (sollbuchnungen.hasNext()) + { + add(sollbuchnungen.next()); + monitor.log("Vorbereitung: " + Adressaufbereitung.getNameVorname(m)); + } } endeMitglied(); } diff --git a/src/de/jost_net/JVerein/io/SollbuchungExportCSV.java b/src/de/jost_net/JVerein/io/SollbuchungExportCSV.java index e7aba8047..407309d6e 100644 --- a/src/de/jost_net/JVerein/io/SollbuchungExportCSV.java +++ b/src/de/jost_net/JVerein/io/SollbuchungExportCSV.java @@ -28,7 +28,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.Variable.MitgliedMap; -import de.jost_net.JVerein.Variable.RechnungMap; +import de.jost_net.JVerein.Variable.SollbuchungMap; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; @@ -122,7 +122,7 @@ protected void close(ProgressMonitor monitor) } Map map = new MitgliedMap().getMap(m, null); - map = new RechnungMap().getMap(mk, map); + map = new SollbuchungMap().getMap(mk, map); String[] header = createHeader(map); Logger.debug("Header"); for (String s : header) @@ -137,7 +137,7 @@ protected void close(ProgressMonitor monitor) { Map mp = new MitgliedMap().getMap(mkto.getMitglied(), null); - map = new RechnungMap().getMap(mkto, mp); + map = new SollbuchungMap().getMap(mkto, mp); writer.write(map, header, processors); monitor.log( "Export: " + Adressaufbereitung.getNameVorname(mkto.getMitglied())); diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index b80aac763..e652eec50 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -20,14 +20,23 @@ import java.math.RoundingMode; import java.rmi.RemoteException; import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map.Entry; import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.DBTools.DBTransaction; import de.jost_net.JVerein.keys.SplitbuchungTyp; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Buchungsart; +import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.dialogs.YesNoDialog; +import de.willuhn.jameica.system.OperationCanceledException; +import de.willuhn.jameica.system.Settings; +import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; public class SplitbuchungsContainer @@ -35,12 +44,12 @@ public class SplitbuchungsContainer private static ArrayList splitbuchungen = null; private static int dependencyid = 0; - + private static Buchung[] buchungen = null; - + private static int anzahl = 0; - - private static String text = null; + + private static String text = null; public static void init(Buchung[] bl) throws RemoteException, ApplicationException @@ -58,7 +67,7 @@ public static void init(Buchung[] bl) } initiate(bl[0]); } - + public static void init(Buchung b) throws RemoteException, ApplicationException { @@ -67,13 +76,12 @@ public static void init(Buchung b) text = "Es wird eine Splitbuchung erzeugt."; initiate(b); } - + public static void initiate(Buchung b) throws RemoteException, ApplicationException { splitbuchungen = new ArrayList<>(); dependencyid = 0; - // Wenn eine gesplittete Buchung aufgerufen wird, wird die Hauptbuchung // gelesen if (b.getSplitId() != null) @@ -89,7 +97,6 @@ public static void initiate(Buchung b) DBIterator it = Einstellungen.getDBService() .createList(Buchung.class); it.addFilter("splitid = ?", b.getID()); - if (!it.hasNext()) { // Wenn keine Buchung gefunden wurde, gibt es auch keine Gegenbuchung. @@ -231,7 +238,7 @@ public static void store() throws RemoteException, ApplicationException throw ex; } } - + public static void handleStore() throws RemoteException, ApplicationException { for (Buchung b : get()) @@ -274,14 +281,16 @@ public static void handleStore() throws RemoteException, ApplicationException } } - public static int getNewDependencyId() { + public static int getNewDependencyId() + { return ++dependencyid; } - - public static String getText() { + + public static String getText() + { return text; } - + private static Buchung getGegenbuchung(Buchung b) throws RemoteException { Buchung buch = (Buchung) Einstellungen.getDBService() @@ -295,7 +304,7 @@ private static Buchung getGegenbuchung(Buchung b) throws RemoteException buch.setDatum(b.getDatum()); buch.setKommentar(b.getKommentar()); buch.setKonto(b.getKonto()); - buch.setMitgliedskonto(b.getMitgliedskonto()); + buch.setMitgliedskontoID(b.getMitgliedskontoID()); buch.setName(b.getName()); buch.setProjekt(b.getProjekt()); buch.setSplitId(Long.valueOf(b.getID())); @@ -304,11 +313,12 @@ private static Buchung getGegenbuchung(Buchung b) throws RemoteException buch.setSplitTyp(SplitbuchungTyp.GEGEN); return buch; } - - private static Buchung getSplitbuchung(Buchung master, Buchung origin) throws RemoteException + + private static Buchung getSplitbuchung(Buchung master, Buchung origin) + throws RemoteException { - Buchung buch = (Buchung) Einstellungen.getDBService().createObject(Buchung.class, - null); + Buchung buch = (Buchung) Einstellungen.getDBService() + .createObject(Buchung.class, null); buch.setAuszugsnummer(master.getAuszugsnummer()); buch.setBetrag(origin.getBetrag()); buch.setBlattnummer(master.getBlattnummer()); @@ -317,7 +327,7 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) throws Re buch.setDatum(master.getDatum()); buch.setKommentar(origin.getKommentar()); buch.setKonto(master.getKonto()); - buch.setMitgliedskonto(master.getMitgliedskonto()); + buch.setMitgliedskontoID(master.getMitgliedskontoID()); buch.setName(master.getName()); buch.setProjekt(master.getProjekt()); buch.setSplitId(Long.valueOf(master.getID())); @@ -327,8 +337,232 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) throws Re buch.setSplitTyp(SplitbuchungTyp.SPLIT); return buch; } - - public static int getAnzahl() + + /** + * Splittet eine Buchung anhand der in der Sollbuchung enthaltenen + * Sollbuchungspositionen. + * + * @param Buchung + * die zu splittende Buchung + * @param Mitgliedskonto + * die Sollbuchung, die der Buchung zugewiesen werden soll + * @param immerSpliten + * auch bei nur einer Sollbuchungsposition splitten + * @return Wenn die Beträge von Sollbuchung und Buchung verschieden sind, wird + * die erzeugte Restbuchung zurückgegeben, sonst null. + */ + public static Buchung autoSplit(Buchung buchung, Mitgliedskonto mk, + boolean immerSplitten) + throws NumberFormatException, RemoteException, ApplicationException + { + boolean splitten = false; + Buchung restBuchung = null; + if (mk == null) + { + buchung.setMitgliedskonto(null); + buchung.store(); + return null; + } + + HashMap splitMap = new HashMap<>(); + HashMap splitZweckMap = new HashMap<>(); + ArrayList spArray = mk.getSollbuchungPositionList(); + try + { + for (SollbuchungPosition sp : spArray) + { + // Wenn eine Buchungsart fehlt können wir nicht automatisch splitten + if (sp.getBuchungsartId() == null) + { + throw new ApplicationException( + "Es haben nicht alle Sollbuchungspositionen eine Buchungsart."); + } + String key = sp.getBuchungsartId() + "-" + + (sp.getBuchungsklasseId() != null ? sp.getBuchungsklasseId() + : ""); + Double betrag = splitMap.getOrDefault(key, 0d); + if (sp.getBetrag().doubleValue() == 0) + { + continue; + } + + splitMap.put(key, betrag + sp.getBetrag().doubleValue()); + String zweck = splitZweckMap.get(key); + if (zweck == null) + { + zweck = sp.getZweck() + " " + sp.getBetrag(); + } + else + { + zweck = zweck + ", " + sp.getZweck() + " " + sp.getBetrag(); + } + splitZweckMap.put(key, zweck); + } + + if ((splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) + || immerSplitten) + { + splitten = true; + } + else if (splitMap.size() > 1) + { + YesNoDialog dialog = new YesNoDialog(YesNoDialog.POSITION_CENTER); + dialog.setTitle("Buchung splitten"); + dialog.setText( + "Der Betrag der Sollbuchung entspricht nicht dem der Buchung.\n" + + "Soll die Buchung trotzdem anhand der Sollbuchungspositionen\n" + + "gesplittet und eine Restbuchung erzeugt werden?"); + if (!((Boolean) dialog.open()).booleanValue()) + { + throw new OperationCanceledException(); + } + } + if (splitten) + { + boolean ersetzen = false; + if (buchung.getBuchungsartId() == null + && spArray.get(0).getBuchungsartId() != null) + { + buchung.setBuchungsartId(spArray.get(0).getBuchungsartId()); + } + if (buchung.getBuchungsklasseId() == null + && spArray.get(0).getBuchungsklasseId() != null) + { + buchung.setBuchungsklasseId(spArray.get(0).getBuchungsklasseId()); + } + + if (buchung.getSplitTyp() == null) + { + buchung.setSplitTyp(SplitbuchungTyp.HAUPT); + buchung.setMitgliedskontoID(null); + } + // Haupt- und Gegen-Buchungen können nicht gesplittet werden. + else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN + || buchung.getSplitTyp() == SplitbuchungTyp.HAUPT) + { + throw new ApplicationException( + "Splitten von Haupt und Gegenbuchung nicht möglich."); + } + else + { + // Spitbuchungen müssen durch die neuen Buchungen ersetzt werden + ersetzen = true; + } + + SplitbuchungsContainer.init(buchung); + + if (ersetzen) + { + for (Buchung b : splitbuchungen) + { + if (b.getID().equals(buchung.getID())) + { + if (b.getSpendenbescheinigung() != null) + { + Logger.error( + "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu splitten nicht möglich."); + throw new ApplicationException( + "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu splitten nicht möglich."); + } + b.setDelete(true); + break; + } + } + } + + boolean splitPositionZweck = new Settings(SplitbuchungsContainer.class) + .getBoolean("splitPositionZweck", true); + Iterator> iterator = splitMap.entrySet() + .iterator(); + while (iterator.hasNext()) + { + Entry entry = iterator.next(); + + Buchung splitBuchung = (Buchung) Einstellungen.getDBService() + .createObject(Buchung.class, null); + splitBuchung.setBetrag(entry.getValue()); + splitBuchung.setDatum(buchung.getDatum()); + splitBuchung.setKonto(buchung.getKonto()); + splitBuchung.setName(buchung.getName()); + if (splitPositionZweck) + { + splitBuchung.setZweck(splitZweckMap.get(entry.getKey())); + } + else + { + splitBuchung.setZweck(mk.getZweck1()); + } + splitBuchung.setMitgliedskonto(mk); + String buchungsart = entry.getKey().substring(0, + entry.getKey().indexOf("-")); + splitBuchung.setBuchungsartId(Long.parseLong(buchungsart)); + String buchungsklasse = entry.getKey() + .substring(entry.getKey().indexOf("-") + 1); + if (buchungsklasse.length() > 0) + { + splitBuchung.setBuchungsklasseId(Long.parseLong(buchungsklasse)); + } + splitBuchung.setSplitTyp(SplitbuchungTyp.SPLIT); + splitBuchung.setSplitId(Long.parseLong(getMaster().getID())); + + SplitbuchungsContainer.add(splitBuchung); + } + if (!mk.getBetrag().equals(buchung.getBetrag())) + { + restBuchung = (Buchung) Einstellungen.getDBService() + .createObject(Buchung.class, null); + restBuchung.setBetrag(buchung.getBetrag() - mk.getBetrag()); + restBuchung.setDatum(buchung.getDatum()); + restBuchung.setKonto(buchung.getKonto()); + restBuchung.setName(buchung.getName()); + restBuchung.setZweck(buchung.getZweck()); + restBuchung.setSplitTyp(SplitbuchungTyp.SPLIT); + restBuchung.setSplitId(Long.parseLong(getMaster().getID())); + restBuchung.setBuchungsartId(buchung.getBuchungsartId()); + restBuchung.setBuchungsklasseId(buchung.getBuchungsklasseId()); + + SplitbuchungsContainer.add(restBuchung); + } + SplitbuchungsContainer.store(); + } + } + catch (OperationCanceledException oce) + { + splitten = false; + } + catch (Exception e) + { + if (immerSplitten) + { + throw new ApplicationException(e.getLocalizedMessage()); + } + splitten = false; + if (splitbuchungen != null) + { + splitbuchungen.clear(); + } + GUI.getStatusBar().setErrorText( + "Fehler beim Autosplit, ordne Buchung Sollbuchung ohne splitten zu."); + } + if (!splitten) + { + // Wenn kein automatisches Spliten möglich ist nur Buchungsart, + // Buchungsklasse und Sollbuchung zuweisen + if (spArray.get(0).getBuchungsartId() != null) + { + buchung.setBuchungsartId(spArray.get(0).getBuchungsartId()); + } + if (spArray.get(0).getBuchungsklasseId() != null) + { + buchung.setBuchungsklasseId(spArray.get(0).getBuchungsklasseId()); + } + buchung.setMitgliedskonto(mk); + buchung.store(); + } + return restBuchung; + } + + public static int getAnzahl() { return anzahl; } diff --git a/src/de/jost_net/JVerein/rmi/Beitragsgruppe.java b/src/de/jost_net/JVerein/rmi/Beitragsgruppe.java index da385c16f..82a9baa7d 100644 --- a/src/de/jost_net/JVerein/rmi/Beitragsgruppe.java +++ b/src/de/jost_net/JVerein/rmi/Beitragsgruppe.java @@ -68,6 +68,8 @@ public void setArbeitseinsatzBetrag(double arbeitseinsatzBetrag) public Buchungsart getBuchungsart() throws RemoteException; + public Long getBuchungsartId() throws RemoteException; + public void setBuchungsart(Buchungsart buchungsart) throws RemoteException; public Buchungsklasse getBuchungsklasse() throws RemoteException; diff --git a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java index 86ba4bc37..143da12a6 100644 --- a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java +++ b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java @@ -17,6 +17,7 @@ package de.jost_net.JVerein.rmi; import java.rmi.RemoteException; +import java.util.ArrayList; import java.util.Date; import de.willuhn.datasource.rmi.DBObject; @@ -46,39 +47,16 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) public void setZahlungsweg(Integer zahlungsweg) throws RemoteException; - public Double getNettobetrag() throws RemoteException; - - public void setNettobetrag(Double nettobetrag) throws RemoteException; - - public Double getSteuersatz() throws RemoteException; - - public void setSteuersatz(Double steuersatz) throws RemoteException; - - public Double getSteuerbetrag() throws RemoteException; - - public void setSteuerbetrag(Double steuerbetrag) throws RemoteException; - public void setBetrag(Double betrag) throws RemoteException; public Double getBetrag() throws RemoteException; public Double getIstSumme() throws RemoteException; - public Buchungsart getBuchungsart() throws RemoteException; - - public void setBuchungsart(Buchungsart buchungsart) throws RemoteException; - - public Long getBuchungsartId() throws RemoteException; - - public void setBuchungsartId(Long buchungsartId) throws RemoteException; - - public Buchungsklasse getBuchungsklasse() throws RemoteException; - - public Long getBuchungsklasseId() throws RemoteException; - - public void setBuchungsklasseId(Long buchungsklasseId) throws RemoteException; - public Rechnung getRechnung() throws RemoteException; public void setRechnung(Rechnung rechnung) throws RemoteException; + + ArrayList getSollbuchungPositionList() + throws RemoteException; } diff --git a/src/de/jost_net/JVerein/rmi/Rechnung.java b/src/de/jost_net/JVerein/rmi/Rechnung.java index 49caf8946..7c8579ac9 100644 --- a/src/de/jost_net/JVerein/rmi/Rechnung.java +++ b/src/de/jost_net/JVerein/rmi/Rechnung.java @@ -21,7 +21,9 @@ import java.util.Date; import de.jost_net.JVerein.io.IAdresse; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.willuhn.datasource.rmi.DBObject; +import de.willuhn.util.ApplicationException; public interface Rechnung extends DBObject, IAdresse { @@ -31,6 +33,9 @@ public interface Rechnung extends DBObject, IAdresse public void setFormular(Formular formular) throws RemoteException; + public void fill(Mitgliedskonto mk) + throws RemoteException, ApplicationException; + double getBetrag() throws RemoteException; void setBetrag(double betrag) throws RemoteException; @@ -39,8 +44,6 @@ public interface Rechnung extends DBObject, IAdresse public Date getDatum() throws RemoteException; - public ArrayList getMitgliedskontoList() throws RemoteException; - public Formular getFormular() throws RemoteException; public void setAnrede(String anrede) throws RemoteException; @@ -111,6 +114,17 @@ public void setAdressierungszusatz(String adressierungszusatz) public String getIBAN() throws RemoteException; public void setIBAN(String iban) throws RemoteException; + + public Double getIstSumme() throws RemoteException; + + public Zahlungsweg getZahlungsweg() throws RemoteException; + + public void setZahlungsweg(Integer zahlungsweg) throws RemoteException; + + public ArrayList getSollbuchungPositionList() + throws RemoteException; + + public Mitgliedskonto getMitgliedskonto() throws RemoteException; public String getLeitwegID() throws RemoteException; diff --git a/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java new file mode 100644 index 000000000..9cc6d2dc9 --- /dev/null +++ b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java @@ -0,0 +1,63 @@ +/********************************************************************** + * 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 . + * + * heiner@jverein.de + * www.jverein.de + **********************************************************************/ +package de.jost_net.JVerein.rmi; + +import java.rmi.RemoteException; +import java.util.Date; + +import de.willuhn.datasource.rmi.DBObject; + +public interface SollbuchungPosition extends DBObject +{ + + public Double getBetrag() throws RemoteException; + + public void setBetrag(Double betrag) throws RemoteException; + + public Double getSteuersatz() throws RemoteException; + + public void setSteuersatz(Double satz) throws RemoteException; + + public Long getBuchungsartId() throws RemoteException; + + public void setBuchungsartId(Long buchungsart) throws RemoteException; + + public Buchungsart getBuchungsart() throws RemoteException; + + public Buchungsklasse getBuchungsklasse() throws RemoteException; + + public Long getBuchungsklasseId() throws RemoteException; + + public void setBuchungsklasseId(Long buchungsklasse) throws RemoteException; + + public Date getDatum() throws RemoteException; + + public void setDatum(Date datum) throws RemoteException; + + public void setSollbuchung(String id) throws RemoteException; + + public Mitgliedskonto getSollbuchung() throws RemoteException; + + public void setZweck(String zweck) throws RemoteException; + + public String getZweck() throws RemoteException; + + public Double getNettobetrag() throws RemoteException; + + public Double getSteuerbetrag() throws RemoteException; + +} diff --git a/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java b/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java index f8c328ec0..979339dc6 100644 --- a/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java +++ b/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java @@ -70,6 +70,8 @@ public interface Zusatzbetrag extends DBObject public Buchungsart getBuchungsart() throws RemoteException; + public Long getBuchungsartId() throws RemoteException; + public Buchungsklasse getBuchungsklasse() throws RemoteException; public Long getBuchungsklasseId() throws RemoteException; diff --git a/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java b/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java index 31292c700..5c7a1d9c6 100644 --- a/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java +++ b/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java @@ -159,16 +159,6 @@ protected void updateCheck() throws ApplicationException insertCheck(); } - @Override - protected Class getForeignObject(String arg0) - { - if (arg0.equals("buchungsart")) - { - return Buchungsart.class; - } - return null; - } - @Override public String getBezeichnung() throws RemoteException { @@ -358,7 +348,20 @@ public void setBuchungsart(Buchungsart buchungsart) throws RemoteException @Override public Buchungsart getBuchungsart() throws RemoteException { - return (Buchungsart) getAttribute("buchungsart"); + Long l = (Long) super.getAttribute("buchungsart"); + if (l == null) + { + return null; // Keine Buchungsart zugeordnet + } + + Cache cache = Cache.get(Buchungsart.class, true); + return (Buchungsart) cache.get(l); + } + + @Override + public Long getBuchungsartId() throws RemoteException + { + return (Long) super.getAttribute("buchungsart"); } @Override @@ -387,6 +390,10 @@ public Object getAttribute(String fieldName) throws RemoteException { return getBuchungsklasse(); } + else if (fieldName.equals("buchungsart")) + { + return getBuchungsart(); + } return super.getAttribute(fieldName); } diff --git a/src/de/jost_net/JVerein/server/BuchungImpl.java b/src/de/jost_net/JVerein/server/BuchungImpl.java index 4ed21657e..1623c1c4e 100644 --- a/src/de/jost_net/JVerein/server/BuchungImpl.java +++ b/src/de/jost_net/JVerein/server/BuchungImpl.java @@ -38,9 +38,9 @@ import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.jost_net.JVerein.util.StringTool; import de.willuhn.datasource.db.AbstractDBObject; -import de.willuhn.datasource.rmi.ObjectNotFoundException; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBService; +import de.willuhn.datasource.rmi.ObjectNotFoundException; import de.willuhn.jameica.messaging.QueryMessage; import de.willuhn.jameica.system.Application; import de.willuhn.logging.Logger; @@ -442,7 +442,7 @@ public Abrechnungslauf getAbrechnungslauf() throws RemoteException @Override public Long getAbrechnungslaufID() throws RemoteException { - return Long.parseLong(getAbrechnungslauf().getID()); + return (Long) super.getAttribute("abrechnungslauf"); } @Override @@ -505,15 +505,14 @@ public Mitgliedskonto getMitgliedskonto() throws RemoteException { return null; } - - Cache cache = Cache.get(Mitgliedskonto.class, true); + Cache cache = Cache.get(Mitgliedskonto.class, false); return (Mitgliedskonto) cache.get(o); } @Override public Long getMitgliedskontoID() throws RemoteException { - return Long.parseLong(getMitgliedskonto().getID()); + return (Long) super.getAttribute("mitgliedskonto"); } @Override @@ -545,7 +544,7 @@ public Projekt getProjekt() throws RemoteException @Override public Long getProjektID() throws RemoteException { - return Long.parseLong(getProjekt().getID()); + return (Long) super.getAttribute("project"); } @Override @@ -611,10 +610,6 @@ public Map getMap(Map inma) { map = inma; } - if (this.getID() == null) - { - // - } map.put(BuchungVar.ABRECHNUNGSLAUF.getName(), (this.getAbrechnungslauf() != null ? this.getAbrechnungslauf().getDatum() diff --git a/src/de/jost_net/JVerein/server/Cache.java b/src/de/jost_net/JVerein/server/Cache.java index 3f2e6fa80..5d9d5bb32 100644 --- a/src/de/jost_net/JVerein/server/Cache.java +++ b/src/de/jost_net/JVerein/server/Cache.java @@ -92,7 +92,6 @@ static Cache get(Class type, boolean init) throws RemoteException { Cache cache = caches.get(type); - if (cache != null) { if (cache.validTo < System.currentTimeMillis()) @@ -105,7 +104,6 @@ static Cache get(Class type, boolean init) cache.touch(); // Verfallsdatum aktualisieren } } - // Cache erzeugen und mit Daten fuellen if (cache == null) { @@ -124,6 +122,7 @@ static Cache get(Class type, boolean init) } caches.put(type, cache); } + cache.touch(); // hier nötig wenn das erstellen des Caches lange gedauert hat return cache; } diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0457.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0457.java new file mode 100644 index 000000000..0db05039b --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0457.java @@ -0,0 +1,105 @@ +/********************************************************************** + * 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 . + * + **********************************************************************/ +package de.jost_net.JVerein.server.DDLTool.Updates; + +import java.sql.Connection; + +import de.jost_net.JVerein.server.DDLTool.AbstractDDLUpdate; +import de.jost_net.JVerein.server.DDLTool.Column; +import de.jost_net.JVerein.server.DDLTool.Index; +import de.jost_net.JVerein.server.DDLTool.Table; +import de.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +public class Update0457 extends AbstractDDLUpdate +{ + public Update0457(String driver, ProgressMonitor monitor, Connection conn) + { + super(driver, monitor, conn); + } + + @Override + public void run() throws ApplicationException + { + Table t = new Table("sollbuchungposition"); + Column pk = new Column("id", COLTYPE.BIGINT, 10, null, true, true); + t.add(pk); + + Column sollbuchung = new Column("sollbuchung", COLTYPE.BIGINT, 10, + null, true, false); + t.add(sollbuchung); + + Column betrag = new Column("betrag", COLTYPE.DOUBLE, 10, null, true, + false); + t.add(betrag); + + Column steuersatz = new Column("steuersatz", COLTYPE.DOUBLE, 10, null, false, + false); + t.add(steuersatz); + + Column buchungsart = new Column("buchungsart", COLTYPE.BIGINT, 10, null, false, + false); + t.add(buchungsart); + + Column buchungsklasse = new Column("buchungsklasse", COLTYPE.BIGINT, 10, null, false, + false); + t.add(buchungsklasse); + + Column datum = new Column("datum", COLTYPE.DATE, 10, null, true, + false); + t.add(datum); + + Column zweck = new Column("zweck", COLTYPE.VARCHAR, 140, null, false, + false); + t.add(zweck); + + t.setPrimaryKey(pk); + execute(this.createTable(t)); + + Index idx = new Index("ixSollbuchungposition1", false); + idx.add(sollbuchung); + execute(idx.getCreateIndex("sollbuchungposition")); + + execute(this.createForeignKey("fk_sollbuchungposition1", + "sollbuchungposition", "sollbuchung", "mitgliedskonto", "id", + "CASCADE", "NO ACTION")); + + idx = new Index("ixSollbuchungposition2", false); + idx.add(buchungsart); + execute(idx.getCreateIndex("sollbuchungposition")); + + execute(this.createForeignKey("fk_sollbuchungposition2", + "sollbuchungposition", "buchungsart", "buchungsart", "id", + "RESTRICT", "NO ACTION")); + + idx = new Index("ixSollbuchungposition3", false); + idx.add(zweck); + execute(idx.getCreateIndex("sollbuchungposition")); + + execute(this.createForeignKey("fk_sollbuchungposition3", + "sollbuchungposition", "buchungsklasse", "buchungsklasse", "id", + "RESTRICT", "NO ACTION")); + + // Für bestehende Sollbuchungen Sollbuchungpositionen erstellen + // Vorerst bleiben in der Tabelle Mitgliedskonto die Spalten + // buchungsart, buchungsklasse, steuersatz, nettobetrag, steuerbetrag + // bestehen damit eine Abwärtskompatibilität besteht + execute("INSERT INTO sollbuchungposition" + + " (sollbuchung, betrag, steuersatz, buchungsart, buchungsklasse, datum, zweck)" + + " SELECT id,betrag,steuersatz,buchungsart,buchungsklasse,datum,zweck1 FROM mitgliedskonto;"); + + execute(addColumn("rechnung", new Column("zahlungsweg", + COLTYPE.INTEGER, 1, "0", true, false))); + } +} diff --git a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java index a3ba214a4..c2a496dfa 100644 --- a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java @@ -19,24 +19,25 @@ import java.rmi.RemoteException; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Date; import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.rmi.Abrechnungslauf; -import de.jost_net.JVerein.rmi.Buchungsart; -import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Rechnung; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.willuhn.datasource.db.AbstractDBObject; +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.logging.Logger; import de.willuhn.util.ApplicationException; -public class MitgliedskontoImpl extends AbstractDBObject implements - Mitgliedskonto +public class MitgliedskontoImpl extends AbstractDBObject + implements Mitgliedskonto { private static final long serialVersionUID = -1234L; @@ -75,7 +76,7 @@ protected void deleteCheck() throws ApplicationException catch (ObjectNotFoundException e) { // Alles ok, es gibt keine Rechnung - // Das passiert wenn sie kurz vorher gelöscht wurde aber + // Das passiert wenn sie kurz vorher gelöscht wurde aber // die ID noch im Cache gespeichert ist } catch (RemoteException e) @@ -124,20 +125,24 @@ protected void updateCheck() throws ApplicationException @Override protected Class getForeignObject(String arg0) { + if (arg0.equals("rechnung")) + { + return Rechnung.class; + } return null; } @Override public Abrechnungslauf getAbrechnungslauf() throws RemoteException { - Object o = (Object) super.getAttribute("abrechnungslauf"); + Object o = (Object) super.getAttribute("abrechnungslauf"); if (o == null) return null; - - if(o instanceof Abrechnungslauf) - return (Abrechnungslauf)o; - - Cache cache = Cache.get(Abrechnungslauf.class,true); + + if (o instanceof Abrechnungslauf) + return (Abrechnungslauf) o; + + Cache cache = Cache.get(Abrechnungslauf.class, true); return (Abrechnungslauf) cache.get(o); } @@ -147,104 +152,36 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) { setAttribute("abrechnungslauf", Integer.valueOf(abrechnungslauf.getID())); } - + @Override public Rechnung getRechnung() throws RemoteException { - Object o = (Object) super.getAttribute("rechnung"); - if (o == null) - return null; - - if(o instanceof Rechnung) - return (Rechnung)o; - - Cache cache = Cache.get(Rechnung.class,true); - return (Rechnung) cache.get(o); + return (Rechnung) getAttribute("rechnung"); } @Override - public void setRechnung(Rechnung rechnung) - throws RemoteException + public void setRechnung(Rechnung rechnung) throws RemoteException { - if(rechnung != null) + if (rechnung != null) setAttribute("rechnung", Long.valueOf(rechnung.getID())); else setAttribute("rechnung", null); } - - @Override - public Buchungsart getBuchungsart() throws RemoteException - { - Long l = (Long) super.getAttribute("buchungsart"); - if (l == null) - { - return null; // Keine Buchungsart zugeordnet - } - - Cache cache = Cache.get(Buchungsart.class, true); - return (Buchungsart) cache.get(l); - } - - @Override - public void setBuchungsart(Buchungsart buchungsart) throws RemoteException - { - if (buchungsart != null) - setAttribute("buchungsart", Long.valueOf(buchungsart.getID())); - else - setAttribute("buchungsart", null); - } - - @Override - public Long getBuchungsartId() throws RemoteException - { - return (Long) super.getAttribute("buchungsart"); - } - - @Override - public void setBuchungsartId(Long buchungsartId) throws RemoteException - { - setAttribute("buchungsart", buchungsartId); - } - - @Override - public Buchungsklasse getBuchungsklasse() throws RemoteException - { - Long l = (Long) super.getAttribute("buchungsklasse"); - if (l == null) - { - return null; // Keine Buchungsklasse zugeordnet - } - - Cache cache = Cache.get(Buchungsklasse.class, true); - return (Buchungsklasse) cache.get(l); - } - - @Override - public Long getBuchungsklasseId() throws RemoteException - { - return (Long) super.getAttribute("buchungsklasse"); - } - - @Override - public void setBuchungsklasseId(Long buchungsklasseId) throws RemoteException - { - setAttribute("buchungsklasse", buchungsklasseId); - } @Override public Mitglied getMitglied() throws RemoteException { - Object o = (Object) super.getAttribute("mitglied"); + Object o = (Object) super.getAttribute("mitglied"); if (o == null) return null; - if(o instanceof Mitglied) - return (Mitglied)o; - - Cache cache = Cache.get(Mitglied.class,true); + if (o instanceof Mitglied) + return (Mitglied) o; + + Cache cache = Cache.get(Mitglied.class, true); return (Mitglied) cache.get(o); } - + public String getMitgliedId() throws RemoteException { return String.valueOf(super.getAttribute("mitglied")); @@ -292,57 +229,6 @@ public void setZahlungsweg(Integer zahlungsweg) throws RemoteException setAttribute("zahlungsweg", zahlungsweg); } - @Override - public Double getNettobetrag() throws RemoteException - { - Double d = (Double) getAttribute("nettobetrag"); - if (d == null) - { - return 0.0d; - } - return d; - } - - @Override - public void setNettobetrag(Double d) throws RemoteException - { - setAttribute("nettobetrag", d); - } - - @Override - public Double getSteuersatz() throws RemoteException - { - Double d = (Double) getAttribute("steuersatz"); - if (d == null) - { - return 0.0d; - } - return d; - } - - @Override - public void setSteuersatz(Double d) throws RemoteException - { - setAttribute("steuersatz", d); - } - - @Override - public Double getSteuerbetrag() throws RemoteException - { - Double d = (Double) getAttribute("steuerbetrag"); - if (d == null) - { - return 0.0d; - } - return d; - } - - @Override - public void setSteuerbetrag(Double d) throws RemoteException - { - setAttribute("steuerbetrag", d); - } - @Override public Double getBetrag() throws RemoteException { @@ -410,14 +296,22 @@ public Object getAttribute(String fieldName) throws RemoteException { return getAbrechnungslauf(); } - if (fieldName.equals("buchungsklasse")) - { - return getBuchungsklasse(); - } - if (fieldName.equals("buchungsart")) + return super.getAttribute(fieldName); + } + + @Override + public ArrayList getSollbuchungPositionList() + throws RemoteException + { + ArrayList sps = new ArrayList<>(); + DBIterator it = Einstellungen.getDBService() + .createList(SollbuchungPosition.class); + it.addFilter("sollbuchungposition.sollbuchung = ?", getID()); + it.setOrder("ORDER BY datum"); + while (it.hasNext()) { - return getBuchungsart(); + sps.add((SollbuchungPosition) it.next()); } - return super.getAttribute(fieldName); + return sps; } } diff --git a/src/de/jost_net/JVerein/server/RechnungImpl.java b/src/de/jost_net/JVerein/server/RechnungImpl.java index f1e5aaa7c..87216ff92 100644 --- a/src/de/jost_net/JVerein/server/RechnungImpl.java +++ b/src/de/jost_net/JVerein/server/RechnungImpl.java @@ -17,19 +17,26 @@ package de.jost_net.JVerein.server; import java.rmi.RemoteException; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.io.IAdresse; import de.jost_net.JVerein.keys.Staat; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Formular; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Rechnung; +import de.jost_net.JVerein.rmi.SollbuchungPosition; import de.willuhn.datasource.db.AbstractDBObject; import de.willuhn.datasource.rmi.DBIterator; +import de.willuhn.datasource.rmi.DBService; +import de.willuhn.datasource.rmi.ResultSetExtractor; import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; public class RechnungImpl extends AbstractDBObject implements Rechnung, IAdresse { @@ -38,6 +45,7 @@ public class RechnungImpl extends AbstractDBObject implements Rechnung, IAdresse * */ private static final long serialVersionUID = -286067581211521888L; + private Double ist; public RechnungImpl() throws RemoteException { @@ -231,6 +239,36 @@ public void setGeschlecht(String geschlecht) throws RemoteException setAttribute("geschlecht", geschlecht); } + @Override + public Double getIstSumme() throws RemoteException + { + if (ist != null) + { + return ist; + } + DBService service = Einstellungen.getDBService(); + String sql = "select sum(buchung.betrag) from buchung " + + "join mitgliedskonto on mitgliedskonto.id = buchung.mitgliedskonto " + + "where mitgliedskonto.rechnung = " + + this.getID(); + + ResultSetExtractor rs = new ResultSetExtractor() + { + + @Override + public Object extract(ResultSet rs) throws SQLException + { + if (!rs.next()) + { + return Double.valueOf(0.0d); + } + return Double.valueOf(rs.getDouble(1)); + } + }; + ist = Double.valueOf((Double) service.execute(sql, new Object[] {}, rs)); + return ist; + } + @Override public Object getAttribute(String fieldName) throws RemoteException { @@ -246,6 +284,14 @@ public Object getAttribute(String fieldName) throws RemoteException return getID(); } } + if ("ist".equals(fieldName)) + { + return getIstSumme(); + } + if ("differenz".equals(fieldName)) + { + return getBetrag() - getIstSumme(); + } return super.getAttribute(fieldName); } @@ -276,21 +322,89 @@ protected Class getForeignObject(String field) } return null; } - + @Override - public ArrayList getMitgliedskontoList() - throws RemoteException + public Mitgliedskonto getMitgliedskonto() throws RemoteException { - ArrayList mks = new ArrayList<>(); DBIterator it = Einstellungen.getDBService() .createList(Mitgliedskonto.class); - it.addFilter("rechnung = ?", getID()); + it.addFilter("mitgliedskonto.rechnung = ?", getID()); + if (it.hasNext()) + { + return it.next(); + } + return null; + } + + @Override + public ArrayList getSollbuchungPositionList() + throws RemoteException + { + ArrayList sps = new ArrayList<>(); + DBIterator it = Einstellungen.getDBService() + .createList(SollbuchungPosition.class); + it.join("mitgliedskonto"); + it.addFilter("mitgliedskonto.id = sollbuchungposition.sollbuchung"); + it.addFilter("mitgliedskonto.rechnung = ?", getID()); it.setOrder("ORDER BY datum"); while (it.hasNext()) { - mks.add((Mitgliedskonto) it.next()); + sps.add((SollbuchungPosition) it.next()); } - return mks; + return sps; + } + + @Override + public void fill(Mitgliedskonto mk) + throws RemoteException, ApplicationException + { + Mitglied mitglied = mk.getMitglied(); + + if (mitglied == null) + { + throw new ApplicationException("Sollbuchung enthält kein Mitglied."); + } + setMitglied(Integer.parseInt(mitglied.getID())); + + if (mitglied.getKtoiName() == null || mitglied.getKtoiName().length() == 0) + { + setPersonenart(mitglied.getPersonenart()); + setAnrede(mitglied.getAnrede()); + setTitel(mitglied.getTitel()); + setName(mitglied.getName()); + setVorname(mitglied.getVorname()); + setStrasse(mitglied.getStrasse()); + setAdressierungszusatz(mitglied.getAdressierungszusatz()); + setPlz(mitglied.getPlz()); + setOrt(mitglied.getOrt()); + setStaat(mitglied.getStaat()); + setGeschlecht(mitglied.getGeschlecht()); + } + else + { + setPersonenart(mitglied.getKtoiPersonenart()); + setAnrede(mitglied.getKtoiAnrede()); + setTitel(mitglied.getKtoiTitel()); + setName(mitglied.getKtoiName()); + setVorname(mitglied.getKtoiVorname()); + setStrasse(mitglied.getKtoiStrasse()); + setAdressierungszusatz(mitglied.getKtoiAdressierungszusatz()); + setPlz(mitglied.getKtoiPlz()); + setOrt(mitglied.getKtoiOrt()); + setStaat(mitglied.getKtoiStaat()); + setGeschlecht(mitglied.getKtoiGeschlecht()); + } + setDatum(new Date()); + if (!mitglied.getMandatDatum().equals(Einstellungen.NODATE)) + { + setMandatDatum(mitglied.getMandatDatum()); + } + setLeitwegID(mitglied.getLeitwegID()); + setMandatID(mitglied.getMandatID()); + setBIC(mitglied.getBic()); + setIBAN(mitglied.getIban()); + setZahlungsweg(mk.getZahlungsweg()); + setBetrag(mk.getBetrag()); } @Override @@ -341,6 +455,19 @@ public void setIBAN(String iban) throws RemoteException setAttribute("iban", iban); } + @Override + public Zahlungsweg getZahlungsweg() throws RemoteException { + if(getAttribute("zahlungsweg") == null) + { + return null; + } + return new Zahlungsweg((Integer)getAttribute("zahlungsweg")); + } + + @Override + public void setZahlungsweg(Integer zahlungsweg) throws RemoteException { + setAttribute("zahlungsweg", zahlungsweg); + } @Override public String getLeitwegID() throws RemoteException diff --git a/src/de/jost_net/JVerein/server/RechnungNode.java b/src/de/jost_net/JVerein/server/RechnungNode.java deleted file mode 100644 index 667a0530b..000000000 --- a/src/de/jost_net/JVerein/server/RechnungNode.java +++ /dev/null @@ -1,357 +0,0 @@ -/********************************************************************** - * 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 . - * - * heiner@jverein.de - * www.jverein.de - **********************************************************************/ -package de.jost_net.JVerein.server; - -import java.rmi.RemoteException; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; - -import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.FilterControl; -import de.jost_net.JVerein.gui.control.MitgliedskontoControl.DIFFERENZ; -import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; -import de.jost_net.JVerein.keys.Zahlungsweg; -import de.jost_net.JVerein.rmi.Mitglied; -import de.jost_net.JVerein.rmi.Mitgliedskonto; -import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; -import de.willuhn.datasource.GenericIterator; -import de.willuhn.datasource.GenericObject; -import de.willuhn.datasource.GenericObjectNode; -import de.willuhn.datasource.pseudo.PseudoIterator; -import de.willuhn.datasource.rmi.DBIterator; -import de.willuhn.datasource.rmi.ResultSetExtractor; - -public class RechnungNode implements GenericObjectNode -{ - private RechnungNode parent = null; - - private Mitglied mitglied = null; - - private Mitgliedskonto buchung = null; - - private ArrayList childrens; - - private boolean checked; - - public static final int NONE = 0; - - public static final int ROOT = 1; - - public static final int MITGLIED = 2; - - public static final int BUCHUNG = 3; - - private int nodetype = NONE; - - public RechnungNode(FilterControl control) throws RemoteException - { - childrens = new ArrayList<>(); - nodetype = ROOT; - - Map> mitgliedskontoMap = new HashMap<>(); - DBIterator mitgliedskontoIterator = Einstellungen - .getDBService().createList(Mitgliedskonto.class); - - mitgliedskontoIterator.addFilter("rechnung is null"); - if (control.getDatumvon().getValue() != null) - mitgliedskontoIterator.addFilter("datum >= ? ", - control.getDatumvon().getValue()); - if (control.getDatumbis().getValue() != null) - mitgliedskontoIterator.addFilter("datum <= ?", - control.getDatumbis().getValue()); - if ((Boolean) control.getOhneAbbucher().getValue()) - mitgliedskontoIterator.addFilter("zahlungsweg != ? ", - Zahlungsweg.BASISLASTSCHRIFT); - - if (control.isDifferenzAktiv() - && control.getDifferenz().getValue() != DIFFERENZ.EGAL) - { - String sql = "SELECT mitgliedskonto.id, mitgliedskonto.betrag, " - + "sum(buchung.betrag) FROM mitgliedskonto " - + "LEFT JOIN buchung on mitgliedskonto.id = buchung.mitgliedskonto " - + "group by mitgliedskonto.id "; - if (control.getDifferenz().getValue() == DIFFERENZ.FEHLBETRAG) - { - sql += "having sum(buchung.betrag) < mitgliedskonto.betrag or " - + "sum(buchung.betrag) is null and mitgliedskonto.betrag > 0 "; - } - else - { - sql += "having sum(buchung.betrag) > mitgliedskonto.betrag "; - } - - @SuppressWarnings("unchecked") - ArrayList diffIds = (ArrayList) Einstellungen - .getDBService().execute(sql, null, new ResultSetExtractor() - { - @Override - public Object extract(ResultSet rs) - throws RemoteException, SQLException - { - ArrayList list = new ArrayList<>(); - while (rs.next()) - { - list.add(rs.getString(1)); - } - return list; - } - }); - if (diffIds.size() == 0) - return; - mitgliedskontoIterator - .addFilter("id in (" + String.join(",", diffIds) + ")"); - } - - while (mitgliedskontoIterator.hasNext()) - { - Mitgliedskonto mitgliedskonto = mitgliedskontoIterator.next(); - ArrayList list = mitgliedskontoMap - .get(mitgliedskonto.getMitgliedId()); - if (list == null) - { - list = new ArrayList(); - list.add(mitgliedskonto); - mitgliedskontoMap.put(mitgliedskonto.getMitgliedId(), list); - } - else - { - list.add(mitgliedskonto); - mitgliedskontoMap.replace(mitgliedskonto.getMitgliedId(), list); - } - } - - DBIterator mitgliedterator = Einstellungen.getDBService() - .createList(Mitglied.class); - if (control.isSuchnameAktiv() - && !((String) control.getSuchname().getValue()).isEmpty()) - { - mitgliedterator.addFilter( - " (upper(name) like upper(?) or upper(vorname) like upper(?)) ", - new Object[] { control.getSuchname().getValue(), - control.getSuchname().getValue() }); - } - - while (mitgliedterator.hasNext()) - { - Mitglied m = mitgliedterator.next(); - if (mitgliedskontoMap.get(m.getID()) == null) - continue; - childrens.add(new RechnungNode(mitgliedskontoMap.get(m.getID()), m)); - } - } - - private RechnungNode(ArrayList mitgliedskontoList, - Mitglied mitglied) throws RemoteException - { - this.mitglied = mitglied; - - childrens = new ArrayList<>(); - nodetype = MITGLIED; - - if (mitgliedskontoList == null) - return; - - for (Mitgliedskonto mk : mitgliedskontoList) - { - childrens.add(new RechnungNode(mitglied, mk)); - } - } - - private RechnungNode(Mitglied mitglied, Mitgliedskonto buchung) - { - this.mitglied = mitglied; - this.buchung = buchung; - - childrens = new ArrayList<>(); - nodetype = BUCHUNG; - } - - @Override - public Object getAttribute(String name) throws RemoteException - { - switch (nodetype) - { - case ROOT: - { - return "Rechnungen"; - } - case MITGLIED: - { - @SuppressWarnings("rawtypes") - GenericIterator it1 = getChildren(); - double betrag = 0.0; - while (it1.hasNext()) - { - RechnungNode rn = (RechnungNode) it1.next(); - if (rn.getNodeType() == BUCHUNG) - { - betrag += rn.getBuchung().getBetrag(); - } - } - return Adressaufbereitung.getNameVorname(mitglied) + " (" - + Einstellungen.DECIMALFORMAT.format(betrag) + ")"; - } - case BUCHUNG: - { - return new JVDateFormatTTMMJJJJ().format(buchung.getDatum()) + ", " - + (buchung.getZweck1() != null && buchung.getZweck1().length() > 0 - ? buchung.getZweck1() - : "") - + ", " + Einstellungen.DECIMALFORMAT.format(buchung.getBetrag()); - } - } - return "bla"; - } - - public Object getObject() - { - switch (nodetype) - { - case MITGLIED: - { - return mitglied; - } - case BUCHUNG: - { - return buchung; - } - } - return null; - } - - public int getNodeType() - { - return nodetype; - } - - public Mitglied getMitglied() - { - return this.mitglied; - } - - public Mitgliedskonto getBuchung() - { - return this.buchung; - } - - public void setChecked(boolean checked) - { - this.checked = checked; - } - - public boolean isChecked() - { - return checked; - } - - @Override - public String toString() - { - String ret = ""; - try - { - if (this.nodetype == ROOT) - { - return "--> ROOT"; - } - if (this.nodetype == MITGLIED) - { - return "---> MITGLIED: " + Adressaufbereitung.getNameVorname(mitglied); - } - if (this.nodetype == BUCHUNG) - { - return "----> BUCHUNG: " + buchung.getDatum() + ";" - + buchung.getZweck1() + ";" + buchung.getBetrag(); - } - } - catch (RemoteException e) - { - ret = e.getMessage(); - } - return ret; - } - - @SuppressWarnings("rawtypes") - @Override - public GenericIterator getChildren() throws RemoteException - { - if (childrens == null) - { - return null; - } - return PseudoIterator - .fromArray(childrens.toArray(new GenericObject[childrens.size()])); - } - - public boolean removeChild(GenericObjectNode child) - { - return childrens.remove(child); - } - - @Override - public boolean hasChild(GenericObjectNode object) throws RemoteException - { - return childrens.size() > 0; - } - - @Override - public RechnungNode getParent() throws RemoteException - { - return parent; - } - - @SuppressWarnings("rawtypes") - @Override - public GenericIterator getPossibleParents() throws RemoteException - { - return null; - } - - @SuppressWarnings("rawtypes") - @Override - public GenericIterator getPath() throws RemoteException - { - return null; - } - - @Override - public String[] getAttributeNames() throws RemoteException - { - return null; - } - - @Override - public String getID() throws RemoteException - { - return null; - } - - @Override - public String getPrimaryAttribute() throws RemoteException - { - return null; - } - - @Override - public boolean equals(GenericObject other) throws RemoteException - { - return false; - } -} diff --git a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java new file mode 100644 index 000000000..e63b8c72f --- /dev/null +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -0,0 +1,219 @@ +/********************************************************************** + * 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 . + * + * heiner@jverein.de + * www.jverein.de + **********************************************************************/ +package de.jost_net.JVerein.server; + +import java.rmi.RemoteException; +import java.util.Date; + +import de.jost_net.JVerein.rmi.Buchungsart; +import de.jost_net.JVerein.rmi.Buchungsklasse; +import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.SollbuchungPosition; +import de.willuhn.datasource.db.AbstractDBObject; + +public class SollbuchungPositionImpl extends AbstractDBObject + implements SollbuchungPosition +{ + + private static final long serialVersionUID = 1L; + + public SollbuchungPositionImpl() throws RemoteException + { + super(); + } + + @Override + protected String getTableName() + { + return "sollbuchungposition"; + } + + @Override + public String getPrimaryAttribute() throws RemoteException + { + return "id"; + } + + @Override + protected Class getForeignObject(String arg0) + { + if ("sollbuchung".equals(arg0)) + { + return Mitgliedskonto.class; + } + return null; + } + + @Override + public Double getBetrag() throws RemoteException + { + return (Double) getAttribute("betrag"); + } + + @Override + public void setBetrag(Double betrag) throws RemoteException + { + setAttribute("betrag", betrag); + } + + @Override + public Double getSteuersatz() throws RemoteException + { + return (Double) getAttribute("steuersatz"); + } + + @Override + public void setSteuersatz(Double satz) throws RemoteException + { + setAttribute("steuersatz", satz); + } + + @Override + public Double getNettobetrag() throws RemoteException + { + Double betrag = (Double) getAttribute("betrag"); + Double steuersatz = (Double) getAttribute("steuersatz"); + if (steuersatz == null || betrag == null) + { + return betrag; + } + return betrag / (1 + steuersatz / 100); + } + + @Override + public Double getSteuerbetrag() throws RemoteException + { + Double betrag = (Double) getAttribute("betrag"); + Double steuersatz = (Double) getAttribute("steuersatz"); + if (steuersatz == null || betrag == null) + { + return 0d; + } + return betrag * steuersatz / (100 + steuersatz); + } + + @Override + public Long getBuchungsartId() throws RemoteException + { + return (Long) super.getAttribute("buchungsart"); + } + + @Override + public Buchungsart getBuchungsart() throws RemoteException + { + Object o = super.getAttribute("buchungsart"); + if (o == null) + return null; + + if (o instanceof Buchungsart) + return (Buchungsart) o; + + Cache cache = Cache.get(Buchungsart.class, true); + return (Buchungsart) cache.get(o); + } + + @Override + public void setBuchungsartId(Long buchungsart) throws RemoteException + { + setAttribute("buchungsart", buchungsart); + } + + @Override + public Buchungsklasse getBuchungsklasse() throws RemoteException + { + Object o = super.getAttribute("buchungsklasse"); + if (o == null) + return null; + + if (o instanceof Buchungsklasse) + return (Buchungsklasse) o; + + Cache cache = Cache.get(Buchungsklasse.class, true); + return (Buchungsklasse) cache.get(o); + } + + @Override + public Long getBuchungsklasseId() throws RemoteException + { + return (Long) super.getAttribute("buchungsklasse"); + } + + @Override + public void setBuchungsklasseId(Long buchungsklasse) throws RemoteException + { + setAttribute("buchungsklasse", buchungsklasse); + } + + @Override + public Date getDatum() throws RemoteException + { + return (Date) getAttribute("datum"); + } + + @Override + public void setDatum(Date datum) throws RemoteException + { + setAttribute("datum", datum); + } + + @Override + public void setSollbuchung(String id) throws RemoteException + { + setAttribute("sollbuchung", id); + } + + @Override + public Mitgliedskonto getSollbuchung() throws RemoteException + { + return (Mitgliedskonto) getAttribute("sollbuchung"); + } + + @Override + public void setZweck(String zweck) throws RemoteException + { + setAttribute("zweck", zweck); + } + + @Override + public String getZweck() throws RemoteException + { + return (String) getAttribute("zweck"); + } + + + @Override + public Object getAttribute(String fieldName) throws RemoteException + { + if ("buchungsart".equals(fieldName)) + { + return getBuchungsart(); + } + else if ("buchungsklasse".equals(fieldName)) + { + return getBuchungsklasse(); + } + else if ("steuerbetrag".equals(fieldName)) + { + return getSteuerbetrag(); + } + else if ("nettobetrag".equals(fieldName)) + { + return getNettobetrag(); + } + return super.getAttribute(fieldName); + } +} diff --git a/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java b/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java index 03c6f2464..a0cf6eefa 100644 --- a/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java +++ b/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java @@ -282,6 +282,12 @@ public Buchungsart getBuchungsart() throws RemoteException return (Buchungsart) cache.get(o); } + @Override + public Long getBuchungsartId() throws RemoteException + { + return (Long) super.getAttribute("buchungsart"); + } + @Override public Buchungsklasse getBuchungsklasse() throws RemoteException {