From 9757972d107f3c305de5ffb066147fd971f593a7 Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 13 Dec 2024 08:25:00 +0100 Subject: [PATCH 01/52] =?UTF-8?q?Soolbuchungn=20zusammenfassen,=20Rechnung?= =?UTF-8?q?=20=C3=BCberarbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JVerein/Variable/RechnungMap.java | 72 +- .../JVerein/Variable/RechnungVar.java | 39 +- .../action/AbrechnungslaufDeleteAction.java | 9 +- .../gui/action/FormularAnzeigeAction.java | 11 - .../gui/control/AbrechnungSEPAControl.java | 73 +- .../gui/control/FormularfeldControl.java | 9 - .../gui/control/MitgliedskontoControl.java | 34 +- .../JVerein/gui/control/RechnungControl.java | 146 ++-- .../JVerein/gui/view/AbrechnungSEPAView.java | 4 + .../JVerein/gui/view/RechnungView.java | 3 +- .../gui/view/SollbuchungDetailView.java | 3 + .../jost_net/JVerein/io/AbrechnungSEPA.java | 825 +++++++++++++----- .../JVerein/io/AbrechnungSEPAParam.java | 13 + src/de/jost_net/JVerein/io/JVereinZahler.java | 64 ++ .../jost_net/JVerein/io/Rechnungsausgabe.java | 2 +- .../JVerein/io/SplitbuchungsContainer.java | 6 +- .../jost_net/JVerein/rmi/Mitgliedskonto.java | 2 + src/de/jost_net/JVerein/rmi/Rechnung.java | 12 + .../JVerein/rmi/SollbuchungPosition.java | 63 ++ .../jost_net/JVerein/server/BuchungImpl.java | 11 +- src/de/jost_net/JVerein/server/Cache.java | 3 +- .../server/DDLTool/Updates/Update0452.java | 97 ++ .../JVerein/server/MitgliedskontoImpl.java | 686 +++++++-------- .../jost_net/JVerein/server/RechnungImpl.java | 89 ++ .../server/SollbuchungPositionImpl.java | 211 +++++ 25 files changed, 1760 insertions(+), 727 deletions(-) create mode 100644 src/de/jost_net/JVerein/rmi/SollbuchungPosition.java create mode 100644 src/de/jost_net/JVerein/server/DDLTool/Updates/Update0452.java create mode 100644 src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java diff --git a/src/de/jost_net/JVerein/Variable/RechnungMap.java b/src/de/jost_net/JVerein/Variable/RechnungMap.java index 196a6fe64..6f5a6ccb9 100644 --- a/src/de/jost_net/JVerein/Variable/RechnungMap.java +++ b/src/de/jost_net/JVerein/Variable/RechnungMap.java @@ -25,12 +25,12 @@ 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 +42,7 @@ public RechnungMap() // } + @SuppressWarnings("deprecation") public Map getMap(Rechnung re, Map inMap) throws RemoteException { @@ -57,66 +58,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 +154,7 @@ public Map getMap(Rechnung re, Map inMap) Adressaufbereitung.getAdressfeld(re)); String zahlungsweg = ""; - switch (re.getMitglied().getZahlungsweg()) + switch (re.getZahlungsweg().getKey()) { case Zahlungsweg.BASISLASTSCHRIFT: { @@ -198,10 +202,8 @@ public Map getMap(Mitgliedskonto mk, Map inma) { 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()); 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/gui/action/AbrechnungslaufDeleteAction.java b/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java index a9e955242..11ed06423 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 Exeption auftritt wenn die Buchung bereits gelöscht wurde + //zB. bei Splitbuchungen + } } DBIterator mitgliedskontoIt = Einstellungen.getDBService() .createList(Mitgliedskonto.class); diff --git a/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java b/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java index 7d282a54f..f21fe019d 100644 --- a/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java +++ b/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java @@ -98,11 +98,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"); @@ -261,7 +256,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<>(); @@ -319,13 +313,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/control/AbrechnungSEPAControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java index 12854e90e..bad22ddfe 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; @@ -49,7 +52,6 @@ import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.system.Application; import de.willuhn.jameica.system.BackgroundTask; -import de.willuhn.jameica.system.OperationCanceledException; import de.willuhn.jameica.system.Settings; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; @@ -84,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); @@ -241,7 +251,52 @@ public CheckboxInput getKompakteAbbuchung() settings.getBoolean("kompakteabbuchung", false)); return kompakteabbuchung; } + + public CheckboxInput getSollbuchungenZusammenfassen() + { + if (sollbuchungenzusammenfassen != null) + { + return sollbuchungenzusammenfassen; + } + sollbuchungenzusammenfassen = new CheckboxInput( + settings.getBoolean("sollbuchungenzusammenfassen", false)); + return sollbuchungenzusammenfassen; + } + + public CheckboxInput getRechnung() + { + if (rechnung != null) + { + return rechnung; + } + rechnung = new CheckboxInput( + settings.getBoolean("rechnung", false)); + return rechnung; + } + + public FormularInput getRechnungFormular() throws RemoteException + { + if (rechnungsformular != null) + { + return rechnungsformular; + } + rechnungsformular = new FormularInput( + FormularArt.RECHNUNG, settings.getString("rechnungsformular", "")); + return rechnungsformular; + } + + public TextInput getRechnungstext() + { + if (rechnungstext != null) + { + return rechnungstext; + } + rechnungstext = new TextInput( + settings.getString("rechnungstext", "RE$rechnung_nummer")); + return rechnungstext; + } + public CheckboxInput getSEPAPrint() { if (sepaprint != null) @@ -302,6 +357,14 @@ 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", + ((Formular) rechnungsformular.getValue()).getID()); settings.setAttribute("sepaprint", (Boolean) sepaprint.getValue()); Abrechnungsausgabe aa = (Abrechnungsausgabe) this.getAbbuchungsausgabe().getValue(); settings.setAttribute("abrechnungsausgabe", aa.getKey()); @@ -409,6 +472,8 @@ private void doAbrechnung() throws ApplicationException, RemoteException } BackgroundTask t = new BackgroundTask() { + private boolean interrupt = false; + @Override public void run(ProgressMonitor monitor) throws ApplicationException { @@ -416,7 +481,7 @@ public void run(ProgressMonitor monitor) throws ApplicationException { DBTransaction.starten(); - new AbrechnungSEPA(abupar, monitor); + new AbrechnungSEPA(abupar, monitor, this); DBTransaction.commit(); monitor.setPercentComplete(100); @@ -457,13 +522,13 @@ else if (abupar.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) @Override public void interrupt() { - // + interrupt = true; } @Override public boolean isInterrupted() { - return false; + return interrupt; } }; Application.getController().start(t); diff --git a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java index ff5f15a2b..7607afaf2 100644 --- a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java +++ b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java @@ -40,7 +40,6 @@ import de.willuhn.jameica.gui.input.IntegerInput; import de.willuhn.jameica.gui.input.SelectInput; import de.willuhn.jameica.gui.input.TextInput; - import de.willuhn.logging.Logger; public class FormularfeldControl extends FormularPartControl @@ -76,14 +75,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"; diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index af8c8b42d..74114215b 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -48,6 +48,7 @@ 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; @@ -146,6 +147,8 @@ public static DIFFERENZ fromString(final String text) private boolean umwandeln; + private TablePart buchungList; + public MitgliedskontoControl(AbstractView view) { super(view); @@ -543,7 +546,7 @@ public String format(Object o) }); mitgliedskontoList.addColumn("Zahlungseingang", "istsumme", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - mitgliedskontoList.addColumn("Rechnung", "rechnung"); + mitgliedskontoList.addColumn("Rechnung", "rechnungid"); mitgliedskontoList.addColumn("Buchungsart", "buchungsart", new BuchungsartFormatter()); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) @@ -608,6 +611,35 @@ 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)); + buchungList.addColumn("Steuersatz", "steuersatz"); + buchungList.addColumn("Buchungsart", "buchungsart"); + buchungList.addColumn("Buchungsklasse","buchungsklasse"); + 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() diff --git a/src/de/jost_net/JVerein/gui/control/RechnungControl.java b/src/de/jost_net/JVerein/gui/control/RechnungControl.java index 48391d282..5f4b5ca33 100644 --- a/src/de/jost_net/JVerein/gui/control/RechnungControl.java +++ b/src/de/jost_net/JVerein/gui/control/RechnungControl.java @@ -29,6 +29,7 @@ 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.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; @@ -43,6 +44,7 @@ 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.server.RechnungNode; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.jost_net.JVerein.util.StringTool; @@ -121,6 +123,8 @@ public class RechnungControl extends DruckMailControl private TextInput personenart; + private TextInput zahlungsweg; + public enum TYP { RECHNUNG, MAHNUNG @@ -148,6 +152,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()); @@ -196,7 +205,7 @@ public void handleAction(Object context) try { saveDruckMailSettings(); - new Rechnungsausgabe(control,RechnungControl.TYP.RECHNUNG); + new Rechnungsausgabe(control, RechnungControl.TYP.RECHNUNG); } catch (Exception e) { @@ -207,7 +216,7 @@ public void handleAction(Object context) }, null, true, "walking.png"); return button; } - + public Button getStartMahnungButton(final Object currentObject) { final RechnungControl control = this; @@ -220,7 +229,7 @@ public void handleAction(Object context) try { saveDruckMailSettings(); - new Rechnungsausgabe(control,RechnungControl.TYP.MAHNUNG); + new Rechnungsausgabe(control, RechnungControl.TYP.MAHNUNG); } catch (Exception e) { @@ -276,12 +285,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"); @@ -292,8 +300,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 @@ -309,7 +317,7 @@ public GenericIterator getRechnungIterator() throws RemoteException if (ohneabbucher != null && (Boolean) ohneabbucher.getValue()) { - rechnungenIt.addFilter("mitglied.zahlungsweg <> ?", + rechnungenIt.addFilter("rechnung.zahlungsweg <> ?", Zahlungsweg.BASISLASTSCHRIFT); } @@ -323,11 +331,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") @@ -346,11 +355,12 @@ 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; } @@ -374,11 +384,11 @@ public void handleAction(Object context) throws ApplicationException // Loop über die Mitglieder GenericIterator it1 = ren.getChildren(); - Formular form = (Formular) getFormular(FormularArt.RECHNUNG).getValue(); - if(form == null) + Formular form = (Formular) getFormular(FormularArt.RECHNUNG) + .getValue(); + if (form == null) { - throw new ApplicationException( - "Kein Formular ausgewählt"); + throw new ApplicationException("Kein Formular ausgewählt"); } while (it1.hasNext()) { @@ -400,7 +410,7 @@ public void handleAction(Object context) throws ApplicationException rechnung.setOrt(mitglied.getOrt()); rechnung.setStaat(mitglied.getStaat()); rechnung.setPersonenart(mitglied.getPersonenart()); - if(!mitglied.getMandatDatum().equals(Einstellungen.NODATE)) + if (!mitglied.getMandatDatum().equals(Einstellungen.NODATE)) rechnung.setMandatDatum(mitglied.getMandatDatum()); rechnung.setMandatID(mitglied.getMandatID()); rechnung.setBIC(mitglied.getBic()); @@ -445,7 +455,7 @@ public String getInfoText(Object selection) { Rechnung[] rechnungen = null; String text = ""; - + if (selection instanceof Rechnung) { rechnungen = new Rechnung[] { (Rechnung) selection }; @@ -458,21 +468,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(); } } } @@ -483,7 +491,7 @@ else if (selection instanceof Rechnung[]) } return text; } - + private Rechnung getRechnung() { if (rechnung != null) @@ -494,7 +502,6 @@ private Rechnung getRechnung() return rechnung; } - public DateInput getRechnungsdatum() throws RemoteException { if (rechnungsDatum != null) @@ -503,7 +510,7 @@ public DateInput getRechnungsdatum() throws RemoteException } Date d = getRechnung().getDatum(); - if (d.equals( Einstellungen.NODATE )) + if (d.equals(Einstellungen.NODATE)) { d = null; } @@ -520,12 +527,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) @@ -533,7 +541,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; @@ -549,10 +558,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) @@ -560,9 +570,11 @@ 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; } @@ -695,7 +707,7 @@ public GeschlechtInput getGeschlecht() throws RemoteException geschlecht.disable(); return geschlecht; } - + public TextInput getPersonenart() throws RemoteException { if (personenart != null) @@ -703,27 +715,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) @@ -736,7 +751,7 @@ public TextInput getMandatid() throws RemoteException mandatid.disable(); return mandatid; } - + public BICInput getBic() throws RemoteException { if (bic != null) @@ -749,7 +764,7 @@ public BICInput getBic() throws RemoteException bic.disable(); return bic; } - + public IBANInput getIban() throws RemoteException { if (iban != null) @@ -757,35 +772,54 @@ 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 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"); + if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) + { + buchungList.addColumn("Buchungsklasse", "buchungsklasse"); + } 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/view/AbrechnungSEPAView.java b/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java index 2a0177945..75bd69096 100644 --- a/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java +++ b/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java @@ -56,6 +56,10 @@ public void bind() throws Exception } group.addLabelPair("Kursteilnehmer", control.getKursteilnehmer()); group.addLabelPair("Kompakte Abbuchung", control.getKompakteAbbuchung()); + group.addLabelPair("Sollbuchungen zusammenfassen", control.getSollbuchungenZusammenfassen()); + group.addLabelPair("Rechnungen 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()) diff --git a/src/de/jost_net/JVerein/gui/view/RechnungView.java b/src/de/jost_net/JVerein/gui/view/RechnungView.java index 33274a95a..3f3aab203 100644 --- a/src/de/jost_net/JVerein/gui/view/RechnungView.java +++ b/src/de/jost_net/JVerein/gui/view/RechnungView.java @@ -64,8 +64,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..f2f2f8b5a 100644 --- a/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java @@ -57,6 +57,9 @@ public void bind() throws Exception 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/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index a78f14db4..203246795 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -28,9 +28,13 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; +import java.util.Comparator; 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,23 +48,27 @@ 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; import de.jost_net.JVerein.keys.Beitragsmodel; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.SplitbuchungTyp; import de.jost_net.JVerein.keys.Zahlungsrhythmus; import de.jost_net.JVerein.keys.Zahlungsweg; 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 +93,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; @@ -94,10 +103,15 @@ public class AbrechnungSEPA private final Calendar sepagueltigkeit; private int counter = 0; + + private BackgroundTask interrupt; - public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) - throws Exception + private HashMap> zahlermap = new HashMap<>(); + + public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor, + BackgroundTask backgroundTask) throws Exception { + this.interrupt = backgroundTask; if (Einstellungen.getEinstellung().getName() == null || Einstellungen.getEinstellung().getName().length() == 0 || Einstellungen.getEinstellung().getIban() == null @@ -128,62 +142,166 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) lastschrift.setKomprimiert(param.kompakteabbuchung.booleanValue()); 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, abrl, konto, monitor); if (param.zusatzbetraege) { - abbuchenZusatzbetraege(param, lastschrift, abrl, konto, monitor); + // Zusatzbetraege Abrechnen und zahlerMap füllen + abbuchenZusatzbetraege(param, abrl, konto, 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"); - 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(); - } + Iterator>> iterator = zahlermap + .entrySet().iterator(); - ArrayList z = lastschrift.getZahler(); - // Wenn keine Buchungen vorhanden sind, wird kein File erzeugt. - if ((param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) - && !z.isEmpty()) + while (iterator.hasNext()) { - 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())); + if (interrupt.isInterrupted()) + { + throw new ApplicationException("Abrechnung abgebrochen"); + } + HashMap> spMap = new HashMap<>(); + HashMap gesamtZahlerMap = new HashMap<>(); + ArrayList zahlerList = iterator.next().getValue(); + //Nach Betrag sortieren damit auch erstettungen funktionieren + zahlerList.sort(new Comparator() + { + @Override + public int compare(JVereinZahler z1, JVereinZahler z2) + { + try + { + return z2.getBetrag().compareTo(z1.getBetrag()); + } + catch (SEPAException e) + { + return 0; + } + } + }); + for (JVereinZahler zahler : zahlerList) + { + // Sollbuchungsositionen in Map füllen + if (param.sollbuchungenzusammenfassen) + { + ArrayList spArray = spMap + .get(zahler.getZahlungsweg()); + if (spArray == null) + { + spArray = new ArrayList<>(); + spArray.add(getSollbuchungPosition(zahler)); + spMap.put(zahler.getZahlungsweg(), spArray); + } + else + { + spArray.add(getSollbuchungPosition(zahler)); + spMap.replace(zahler.getZahlungsweg(), spArray); + } + } + else + { + // Für jede Buchung eine Sollbuchung mit einer Sollbuchungsposition. + ArrayList sbArray = new ArrayList<>(); + sbArray.add(getSollbuchungPosition(zahler)); + + writeSollbuchung(zahler, sbArray, param.faelligkeit, abrl, konto, + zahler.getZahlungsweg().getKey() == Zahlungsweg.BASISLASTSCHRIFT, + param); + } + + // Bei kompakter Abbuchung Zahler zusammenfassen. + if (param.kompakteabbuchung || param.sollbuchungenzusammenfassen) + { + JVereinZahler gesamtZahler = gesamtZahlerMap + .get(zahler.getZahlungsweg()); + if (gesamtZahler == null) + { + gesamtZahler = zahler; + gesamtZahlerMap.put(zahler.getZahlungsweg(), gesamtZahler); + } + else + { + try + { + gesamtZahler.add(zahler); + } + catch (SEPAException se) + { + throw new ApplicationException( + "Ungültiger Betrag: " + zahler.getBetrag()); + } + gesamtZahlerMap.replace(zahler.getZahlungsweg(), gesamtZahler); + } + } + // Bei nicht kompakter Abbuchung Lastschriten direkt füllen. + else if (zahler.getZahlungsweg() + .getKey() == Zahlungsweg.BASISLASTSCHRIFT) + { + zahlerarray.add(zahler); + } + } + + // Bei kompakter Abbuchung erst hier die zusammengefassten Lastschriften + // hinzufügen. + JVereinZahler lsGesamtZahler = gesamtZahlerMap + .get(new Zahlungsweg(Zahlungsweg.BASISLASTSCHRIFT)); + if ((param.kompakteabbuchung || param.sollbuchungenzusammenfassen) + && lsGesamtZahler != null) + { + zahlerarray.add(lsGesamtZahler); + } + + if (param.sollbuchungenzusammenfassen) + { + // Für jeden Zahlungsweg eine Sollbuchung mit X Sollbuchungspositionen. + Iterator>> spIterator = spMap + .entrySet().iterator(); + // Wird für die verschiedenen Zahlungswege des Mitglieds durchlaufen. + while (spIterator.hasNext()) + { + Entry> entry = spIterator + .next(); + ArrayList spArray = entry.getValue(); + + JVereinZahler zahler = gesamtZahlerMap + .get((Zahlungsweg) entry.getKey()); + writeSollbuchung(zahler, spArray, param.faelligkeit, abrl, konto, + ((Zahlungsweg) entry.getKey()) + .getKey() == Zahlungsweg.BASISLASTSCHRIFT, + param); + } + } } - BigDecimal summemitgliedskonto = BigDecimal.valueOf(0); - for (Zahler za : z) + BigDecimal summelastschriften = BigDecimal.valueOf(0); + for (JVereinZahler zahler : zahlerarray) { + summelastschriften = summelastschriften.add(zahler.getBetrag()); + 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()) + switch (zahler.getPersonTyp()) { case KURSTEILNEHMER: - ls.setKursteilnehmer(Integer.parseInt(vza.getPersonId())); + ls.setKursteilnehmer(Integer.parseInt(zahler.getPersonId())); Kursteilnehmer k = (Kursteilnehmer) Einstellungen.getDBService() - .createObject(Kursteilnehmer.class, vza.getPersonId()); + .createObject(Kursteilnehmer.class, zahler.getPersonId()); ls.setPersonenart(k.getPersonenart()); ls.setAnrede(k.getAnrede()); ls.setTitel(k.getTitel()); @@ -199,11 +317,12 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) { ls.setGeschlecht(k.getGeschlecht()); } + ls.setVerwendungszweck(zahler.getVerwendungszweck()); break; case MITGLIED: - ls.setMitglied(Integer.parseInt(vza.getPersonId())); + ls.setMitglied(Integer.parseInt(zahler.getPersonId())); Mitglied m = (Mitglied) Einstellungen.getDBService() - .createObject(Mitglied.class, vza.getPersonId()); + .createObject(Mitglied.class, zahler.getPersonId()); if (m.getKtoiName() == null || m.getKtoiName().length() == 0) { ls.setPersonenart(m.getPersonenart()); @@ -234,47 +353,73 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) 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(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.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()); ls.store(); } - // Gegenbuchung für das Mitgliedskonto schreiben - if (!summemitgliedskonto.equals(BigDecimal.valueOf(0))) + // Gegenbuchung für die Sollbuchungen schreiben + if (!summelastschriften.equals(BigDecimal.valueOf(0))) + { + writeSollbuchung(null, null, param.faelligkeit, abrl, konto, true, param); + } + + // Wenn keine Lastschriften vorhanden sind, wird kein File erzeugt. + if ((param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) + && !zahlerarray.isEmpty()) { - writeMitgliedskonto(null, param.faelligkeit, "Gegenbuchung", - summemitgliedskonto.doubleValue() * -1, abrl, true, getKonto(), null, - null, null); + 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) { // Wenn keine Buchungen vorhanden sind, wird nichts an Hibiscus übergeben. - if (z.size() != 0) + if (zahlerarray.size() != 0) { - buchenHibiscus(param, z); + buchenHibiscus(param, zahlerarray); monitor.log("Hibiscus-Lastschrift erzeugt."); param.setText(String.format(", Hibiscus-Lastschrift erzeugt.")); } } + if (param.pdffileRCUR != null) { + // Nur für die PDF erstellung 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); } + monitor.log("Abrechnung durchgeführt"); } private void abrechnenMitglieder(AbrechnungSEPAParam param, - Basislastschrift lastschrift, ProgressMonitor monitor, - Abrechnungslauf abrl, Konto konto) throws Exception + Abrechnungslauf abrl, Konto konto, ProgressMonitor monitor) + throws Exception { if (param.abbuchungsmodus != Abrechnungsmodi.KEINBEITRAG) { @@ -356,10 +501,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, abrl, + konto, 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); @@ -367,24 +534,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, abrl, konto, 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( @@ -407,7 +578,7 @@ 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()); @@ -418,7 +589,7 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, if (mZahler.getZahlungstermin() != null && !mZahler.getZahlungstermin().isAbzurechnen(param.abrechnungsmonat)) { - return zahler; + return null; } } @@ -432,7 +603,7 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, catch (NullPointerException e) { throw new ApplicationException( - "Zahlungsinformationen bei " + m.getName() + ", " + m.getVorname()); + "Zahlungsinformationen bei " + Adressaufbereitung.getNameVorname(m)); } if (primaer) { @@ -444,35 +615,19 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, } if ((betr == 0d) || !checkSEPA(mZahler, monitor)) { - return zahler; + return null; } 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 @@ -488,57 +643,81 @@ 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.getBuchungsart().getID()); + } + if (bg.getBuchungsklasseId() != null) + { + zahler.setBuchungsklasseId(bg.getBuchungsklasseId().toString()); + } + zahler.setDatum(param.faelligkeit); + zahler.setMitglied(m); + if (m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) + { + zahler.setVerwendungszweck( + (primaer ? param.verwendungszweck : bg.getBezeichnung()) + " " + + m.getVorname()); + } + else if (primaer) + { + String vzweck = abrl.getZahlungsgrund(); + 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, Konto konto, ProgressMonitor monitor) + throws Exception { int count = 0; DBIterator list = Einstellungen.getDBService() .createList(Zusatzbetrag.class); 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 + if (!m.isAngemeldet(param.stichtag) + && !Einstellungen.getEinstellung().getZusatzbetragAusgetretene()) { continue; } @@ -560,15 +739,15 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, zahlungsweg = mZahler.getZahlungsweg(); } - if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT - && !checkSEPA(mZahler, monitor)) + if (!checkSEPA(mZahler, monitor)) { continue; } 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 { @@ -579,15 +758,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()); @@ -595,17 +774,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.getBuchungsart().getID()); + } + if (z.getBuchungsklasseId() != null) + { + zahler.setBuchungsklasseId(z.getBuchungsklasseId().toString()); + } + 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())) @@ -638,9 +843,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())); @@ -648,18 +850,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 @@ -678,13 +887,19 @@ 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); + zahlerarray.add(zahler); 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)); + writeSollbuchung(zahler, spArray, param.faelligkeit, abrl, konto, true, + param); + monitor.setStatusText(String.format("Kursteilnehmer %s, %s abgerechnet", kt.getName(), kt.getVorname())); monitor.setPercentComplete( @@ -695,6 +910,7 @@ private void abbuchenKursteilnehmer(AbrechnungSEPAParam param, throw new ApplicationException(kt.getName() + ": " + e.getMessage()); } } + return zahlerarray; } private void ausdruckenSEPA(final Basislastschrift lastschrift, @@ -722,7 +938,7 @@ public void run() @SuppressWarnings({ "unchecked", "rawtypes" }) private void writeSepaFile(AbrechnungSEPAParam param, - Basislastschrift lastschrift, ArrayList alle_zahler) + Basislastschrift lastschrift, ArrayList zahlerarray) throws Exception { Properties ls_properties = new Properties(); @@ -742,7 +958,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())); @@ -776,15 +992,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); @@ -844,6 +1060,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 { @@ -865,74 +1100,257 @@ 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.setSteuersatz(0d); + sp.setBuchungsartId(zahler.getBuchungsartId()); + sp.setBuchungsklasseId(zahler.getBuchungsklasseId()); + sp.setDatum(zahler.getDatum()); + sp.setZweck(zahler.getVerwendungszweckOrig()); + return sp; + } + + private void writeSollbuchung(JVereinZahler zahler, + ArrayList spArray, Date datum, Abrechnungslauf abrl, + Konto konto, boolean haben, AbrechnungSEPAParam param) + throws ApplicationException, RemoteException, SEPAException { Mitgliedskonto mk = null; - if (mitglied != null - && mitglied instanceof Mitglied) /* - * Mitglied darf dann null sein, wenn - * die Gegenbuchung geschrieben wird - */ + double summe = 0d; + String zweck = null; + Rechnung re = null; + if (spArray != null) { - Mitglied mg = (Mitglied) mitglied; + // Rechnungen nur für (Nicht-)Mitglieder unterstützt + // (nicht für Kursteilnehmer) + if (param.rechnung && zahler.getMitglied() != null) + { + Formular form = param.rechnungsformular; + if (form == null) + { + throw new ApplicationException("Kein Rechnungs-Formular ausgewählt"); + } + Mitglied mitglied = zahler.getMitglied(); + re = (Rechnung) Einstellungen.getDBService() + .createObject(Rechnung.class, null); + + re.setMitglied(Integer.parseInt(mitglied.getID())); + re.setFormular(form); + if (mitglied.getKtoiName() == null + || mitglied.getKtoiName().length() == 0) + { + re.setPersonenart(mitglied.getPersonenart()); + re.setAnrede(mitglied.getAnrede()); + re.setTitel(mitglied.getTitel()); + re.setName(mitglied.getName()); + re.setVorname(mitglied.getVorname()); + re.setStrasse(mitglied.getStrasse()); + re.setAdressierungszusatz(mitglied.getAdressierungszusatz()); + re.setPlz(mitglied.getPlz()); + re.setOrt(mitglied.getOrt()); + re.setStaat(mitglied.getStaat()); + // re.setEmail(mitglied.getEmail()); + re.setGeschlecht(mitglied.getGeschlecht()); + } + else + { + re.setPersonenart(mitglied.getKtoiPersonenart()); + re.setAnrede(mitglied.getKtoiAnrede()); + re.setTitel(mitglied.getKtoiTitel()); + re.setName(mitglied.getKtoiName()); + re.setVorname(mitglied.getKtoiVorname()); + re.setStrasse(mitglied.getKtoiStrasse()); + re.setAdressierungszusatz(mitglied.getKtoiAdressierungszusatz()); + re.setPlz(mitglied.getKtoiPlz()); + re.setOrt(mitglied.getKtoiOrt()); + re.setStaat(mitglied.getKtoiStaat()); + // re.setEmail(mitglied.getKtoiEmail()); + re.setGeschlecht(mitglied.getKtoiGeschlecht()); + } + re.setDatum(new Date()); + if (!mitglied.getMandatDatum().equals(Einstellungen.NODATE)) + { + re.setMandatDatum(mitglied.getMandatDatum()); + } + re.setMandatID(mitglied.getMandatID()); + re.setBIC(mitglied.getBic()); + re.setIBAN(mitglied.getIban()); + re.setZahlungsweg(zahler.getZahlungsweg().getKey()); + + double reSumme = 0; + for (SollbuchungPosition sp : spArray) + { + reSumme += sp.getBetrag().doubleValue(); + } + re.setBetrag(reSumme); + re.store(); + + zweck = param.rechnungstext; + boolean ohneLesefelder = !zweck.contains(Einstellungen.LESEFELD_PRE); + Map map = new AllgemeineMap().getMap(null); + map = new MitgliedMap().getMap(mitglied, 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); + } + zahler.setVerwendungszweck(zweck); + } + else + { + zweck = zahler.getVerwendungszweckOrig(); + } + mk = (Mitgliedskonto) Einstellungen.getDBService() .createObject(Mitgliedskonto.class, null); mk.setAbrechnungslauf(abrl); - if (zahlungsweg != null) + mk.setZahlungsweg(zahler.getZahlungsweg().getKey()); + + mk.setDatum(datum); + if (zahler.getMitglied() != null) { - mk.setZahlungsweg(zahlungsweg); + mk.setMitglied(zahler.getMitglied()); + zweck = getVerwendungszweckName(zahler.getMitglied(), zweck); } - else + mk.setZweck1(zweck); + mk.setBetrag(0d); + mk.store(); + + for (SollbuchungPosition sp : spArray) { - mk.setZahlungsweg(mg.getZahlungsweg()); + summe += sp.getBetrag().doubleValue(); + sp.setSollbuchung(mk.getID()); + sp.store(); } - 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.setBetrag(summe); + mk.setRechnung(re); mk.store(); } + if (haben) { 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) - : "JVerein"); - buchung.setZweck(zweck1); + IAdresse adr = null; + if (zahler != null && zahler.getPersonTyp() == JVereinZahlerTyp.MITGLIED) + { + adr = zahler.getMitglied(); + } + else if (zahler != null + && zahler.getPersonTyp() == JVereinZahlerTyp.KURSTEILNEHMER) + { + adr = (IAdresse) Einstellungen.getDBService() + .createObject(Kursteilnehmer.class, zahler.getPersonId()); + } + buchung.setName( + adr != null ? Adressaufbereitung.getNameVorname(adr) : "JVerein"); + buchung.setZweck(zahler == null ? "Gegenbuchung" : zweck); if (mk != null) { buchung.setMitgliedskonto(mk); } - if (buchungsart != null) + buchung.store(); + + if (spArray == null) { - buchung.setBuchungsartId(Long.valueOf(buchungsart.getID())); + return; + } + + if (spArray.get(0).getBuchungsartId() != null) + { + buchung.setBuchungsartId( + Long.parseLong(spArray.get(0).getBuchungsartId())); + } + if (spArray.get(0).getBuchungsklasseId() != null) + { + buchung.setBuchungsklasseId( + Long.parseLong(spArray.get(0).getBuchungsklasseId())); + } + + // Buchungen automatisch splitten + HashMap splitMap = new HashMap<>(); + for (SollbuchungPosition sp : spArray) + { + // Wenn eine Buchungsart fehlt können wir nicht automatisch splitten + if (sp.getBuchungsartId() == null) + { + splitMap = new HashMap<>(); + break; + } + String key = sp.getBuchungsartId() + "-" + + (sp.getBuchungsklasseId() != null ? sp.getBuchungsklasseId() + : ""); + Double betrag = splitMap.get(key); + if (sp.getBetrag().doubleValue() == 0) + { + continue; + } + + if (betrag == null) + { + splitMap.put(key, sp.getBetrag().doubleValue()); + } + else + { + splitMap.replace(key, betrag + sp.getBetrag().doubleValue()); + } + } + + if (splitMap.size() > 1) + { + buchung.setSplitTyp(SplitbuchungTyp.HAUPT); + buchung.store(); + + Iterator> iterator = splitMap.entrySet() + .iterator(); + SplitbuchungsContainer.init(buchung); + while (iterator.hasNext()) + { + Entry entry = iterator.next(); + + Buchung splitBuchung = (Buchung) Einstellungen.getDBService() + .createObject(Buchung.class, null); + splitBuchung.setAbrechnungslauf(abrl); + splitBuchung.setBetrag(entry.getValue()); + splitBuchung.setDatum(datum); + splitBuchung.setKonto(konto); + splitBuchung.setName(buchung.getName()); + splitBuchung.setZweck(buchung.getZweck()); + 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(buchung.getID())); + + SplitbuchungsContainer.add(splitBuchung); + } + SplitbuchungsContainer.store(); } - buchung.setBuchungsklasseId(buchungsklasseId); - buchung.store(); } } @@ -964,17 +1382,8 @@ private Konto getKonto() Einstellungen.getEinstellung().getIban(), iban.getKonto())); } - 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 + throws RemoteException, ApplicationException { if (m.getZahlungsweg() == null || m.getZahlungsweg() != Zahlungsweg.BASISLASTSCHRIFT) @@ -987,13 +1396,15 @@ private boolean checkSEPA(Mitglied m, ProgressMonitor monitor) { monitor.log(Adressaufbereitung.getNameVorname(m) + ": Letzte Lastschrift ist älter als 36 Monate."); - return false; + throw new ApplicationException(Adressaufbereitung.getNameVorname(m) + + ": Letzte Lastschrift ist älter als 36 Monate."); } 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."); } 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/JVereinZahler.java b/src/de/jost_net/JVerein/io/JVereinZahler.java index 7fd22a2c4..db1ba24f8 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 String buchungsart; + + private String 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 String getBuchungsartId() + { + return buchungsart; + } + + public void setBuchungsartId(String buchungsart) + { + this.buchungsart = buchungsart; + } + + public String getBuchungsklasseId() + { + return buchungsklasse; + } + + public void setBuchungsklasseId(String 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 7141022d5..c3108a576 100644 --- a/src/de/jost_net/JVerein/io/Rechnungsausgabe.java +++ b/src/de/jost_net/JVerein/io/Rechnungsausgabe.java @@ -197,7 +197,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/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 303b9c203..7b4c256ba 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -73,7 +73,6 @@ public static void initiate(Buchung b) { splitbuchungen = new ArrayList<>(); dependencyid = 0; - // Wenn eine gesplittete Buchung aufgerufen wird, wird die Hauptbuchung // gelesen if (b.getSplitId() != null) @@ -89,7 +88,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. @@ -294,7 +292,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())); @@ -316,7 +314,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())); diff --git a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java index 86ba4bc37..f2d3c8ee1 100644 --- a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java +++ b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java @@ -81,4 +81,6 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) public Rechnung getRechnung() throws RemoteException; public void setRechnung(Rechnung rechnung) throws RemoteException; + + public Long getRechnungId() throws RemoteException; } diff --git a/src/de/jost_net/JVerein/rmi/Rechnung.java b/src/de/jost_net/JVerein/rmi/Rechnung.java index 1129d5b88..7095bd7a1 100644 --- a/src/de/jost_net/JVerein/rmi/Rechnung.java +++ b/src/de/jost_net/JVerein/rmi/Rechnung.java @@ -21,6 +21,7 @@ import java.util.Date; import de.jost_net.JVerein.io.IAdresse; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.willuhn.datasource.rmi.DBObject; public interface Rechnung extends DBObject, IAdresse @@ -111,4 +112,15 @@ 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; } 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..9eea9a5ce --- /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 String getBuchungsartId() throws RemoteException; + + public void setBuchungsartId(String buchungsart) throws RemoteException; + + public Buchungsart getBuchungsart() throws RemoteException; + + public Buchungsklasse getBuchungsklasse() throws RemoteException; + + public String getBuchungsklasseId() throws RemoteException; + + public void setBuchungsklasseId(String 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/server/BuchungImpl.java b/src/de/jost_net/JVerein/server/BuchungImpl.java index 4ed21657e..946af50b2 100644 --- a/src/de/jost_net/JVerein/server/BuchungImpl.java +++ b/src/de/jost_net/JVerein/server/BuchungImpl.java @@ -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,7 +505,6 @@ public Mitgliedskonto getMitgliedskonto() throws RemoteException { return null; } - Cache cache = Cache.get(Mitgliedskonto.class, true); return (Mitgliedskonto) cache.get(o); } @@ -513,7 +512,7 @@ public Mitgliedskonto getMitgliedskonto() throws RemoteException @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/Update0452.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0452.java new file mode 100644 index 000000000..2978e05a8 --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0452.java @@ -0,0 +1,97 @@ +/********************************************************************** + * 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 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; + +import java.sql.Connection; + +public class Update0452 extends AbstractDDLUpdate +{ + public Update0452(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")); + + execute(addColumn("rechnung", new Column("zahlungsweg", + COLTYPE.INTEGER, 1, "0", true, false))); + } +} \ No newline at end of file diff --git a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java index 86d21df49..a08f6a922 100644 --- a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java @@ -35,70 +35,52 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -public class MitgliedskontoImpl extends AbstractDBObject implements - Mitgliedskonto -{ - - private static final long serialVersionUID = -1234L; - - private Double ist = null; - - public MitgliedskontoImpl() throws RemoteException - { - super(); - } - - @Override - protected String getTableName() - { - return "mitgliedskonto"; - } - - @Override - public String getPrimaryAttribute() - { - return "mitglied"; - } - - @Override - protected void deleteCheck() throws ApplicationException - { - try - { - if (this.getRechnung() != null) - { - throw new ApplicationException( - "Sollbuchung kann nicht gelöscht werden weil sie zu einer " - + "Rechnung gehört"); - } - } - catch (ObjectNotFoundException e) - { - // Alles ok, es gibt keine Rechnung - // Das passiert wenn sie kurz vorher gelöscht wurde aber - // die ID noch im Cache gespeichert ist - } - catch (RemoteException e) - { - Logger.error("Fehler", e); - throw new ApplicationException( - "Sollbuchung kann nicht gelöscht werden. Siehe system log"); - } - } - - @Override - protected void insertCheck() throws ApplicationException - { - try - { - if (getDatum() == null) - { - throw new ApplicationException("Datum fehlt"); - } - if (getZweck1().length() == 0) - { - throw new ApplicationException("Verwendungszweck fehlt"); - } +public class MitgliedskontoImpl extends AbstractDBObject implements Mitgliedskonto { + + private static final long serialVersionUID = -1234L; + + private Double ist = null; + + public MitgliedskontoImpl() throws RemoteException { + super(); + } + + @Override + protected String getTableName() { + return "mitgliedskonto"; + } + + @Override + public String getPrimaryAttribute() { + return "mitglied"; + } + + @Override + protected void deleteCheck() throws ApplicationException { + try { + if (this.getRechnung() != null) { + throw new ApplicationException( + "Sollbuchung kann nicht gelöscht werden weil sie zu einer " + "Rechnung gehört"); + } + } catch (ObjectNotFoundException e) { + // Alles ok, es gibt keine Rechnung + // Das passiert wenn sie kurz vorher gelöscht wurde aber + // die ID noch im Cache gespeichert ist + } catch (RemoteException e) { + Logger.error("Fehler", e); + throw new ApplicationException("Sollbuchung kann nicht gelöscht werden. Siehe system log"); + } + } + + @Override + protected void insertCheck() throws ApplicationException { + try { + if (getDatum() == null) { + throw new ApplicationException("Datum fehlt"); + } + if (getZweck1().length() == 0) { + throw new ApplicationException("Verwendungszweck fehlt"); + } if (getBetrag() == null) { String fehler = "Betrag fehlt"; @@ -106,318 +88,266 @@ protected void insertCheck() throws ApplicationException throw new ApplicationException(fehler); } - } - catch (RemoteException e) - { - String fehler = "Sollbuchung kann nicht gespeichert werden. Siehe system log"; - Logger.error(fehler, e); - throw new ApplicationException(fehler); - } - } - - @Override - protected void updateCheck() throws ApplicationException - { - insertCheck(); - } - - @Override - protected Class getForeignObject(String arg0) - { - return null; - } - - @Override - public Abrechnungslauf getAbrechnungslauf() throws RemoteException - { - 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); - return (Abrechnungslauf) cache.get(o); - } - - @Override - public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) - throws RemoteException - { - 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); - } - - @Override - public void setRechnung(Rechnung rechnung) - throws RemoteException - { - 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"); - if (o == null) - return null; - - 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")); - } - - @Override - public void setMitglied(Mitglied mitglied) throws RemoteException - { - setAttribute("mitglied", Integer.valueOf(mitglied.getID())); - } - - @Override - public Date getDatum() throws RemoteException - { - return (Date) getAttribute("datum"); - } - - @Override - public void setDatum(Date datum) throws RemoteException - { - setAttribute("datum", datum); - } - - @Override - public String getZweck1() throws RemoteException - { - return (String) getAttribute("zweck1"); - } - - @Override - public void setZweck1(String zweck1) throws RemoteException - { - setAttribute("zweck1", zweck1); - } - - @Override - public Integer getZahlungsweg() throws RemoteException - { - return (Integer) getAttribute("zahlungsweg"); - } - - @Override - 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 - { - return (Double) getAttribute("betrag"); - } - - @Override - public void setBetrag(Double d) throws RemoteException - { - setAttribute("betrag", d); - } - - @Override - public Double getIstSumme() throws RemoteException - { - if (ist != null) - { - return ist; - } - DBService service = Einstellungen.getDBService(); - String sql = "select sum(betrag) from buchung where mitgliedskonto = " - + 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 - { - if ("id-int".equals(fieldName)) - { - try - { - return Integer.valueOf(getID()); - } - catch (Exception e) - { - Logger.error("unable to parse id: " + getID()); - return getID(); - } - } - if (fieldName.equals("istsumme")) - { - return getIstSumme(); - } - if (fieldName.equals("mitglied")) - { - return getMitglied(); - } - if (fieldName.equals("abrechnungslauf")) - { - return getAbrechnungslauf(); - } - if (fieldName.equals("buchungsklasse")) - { - return getBuchungsklasse(); - } - if (fieldName.equals("buchungsart")) - { - return getBuchungsart(); - } - return super.getAttribute(fieldName); - } + } catch (RemoteException e) { + String fehler = "Sollbuchung kann nicht gespeichert werden. Siehe system log"; + Logger.error(fehler, e); + throw new ApplicationException(fehler); + } + } + + @Override + protected void updateCheck() throws ApplicationException { + insertCheck(); + } + + @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"); + if (o == null) + return null; + + if (o instanceof Abrechnungslauf) + return (Abrechnungslauf) o; + + Cache cache = Cache.get(Abrechnungslauf.class, true); + return (Abrechnungslauf) cache.get(o); + } + + @Override + public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) throws RemoteException { + setAttribute("abrechnungslauf", Integer.valueOf(abrechnungslauf.getID())); + } + + @Override + public Rechnung getRechnung() throws RemoteException { + return (Rechnung) getAttribute("rechnung"); + } + + @Override + public Long getRechnungId() throws RemoteException { + return (Long) super.getAttribute("rechnung"); + } + + @Override + public void setRechnung(Rechnung rechnung) throws RemoteException { + 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"); + if (o == null) + return null; + + 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")); + } + + @Override + public void setMitglied(Mitglied mitglied) throws RemoteException { + setAttribute("mitglied", Integer.valueOf(mitglied.getID())); + } + + @Override + public Date getDatum() throws RemoteException { + return (Date) getAttribute("datum"); + } + + @Override + public void setDatum(Date datum) throws RemoteException { + setAttribute("datum", datum); + } + + @Override + public String getZweck1() throws RemoteException { + return (String) getAttribute("zweck1"); + } + + @Override + public void setZweck1(String zweck1) throws RemoteException { + setAttribute("zweck1", zweck1); + } + + @Override + public Integer getZahlungsweg() throws RemoteException { + return (Integer) getAttribute("zahlungsweg"); + } + + @Override + 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 { + return (Double) getAttribute("betrag"); + } + + @Override + public void setBetrag(Double d) throws RemoteException { + setAttribute("betrag", d); + } + + @Override + public Double getIstSumme() throws RemoteException { + if (ist != null) { + return ist; + } + DBService service = Einstellungen.getDBService(); + String sql = "select sum(betrag) from buchung where mitgliedskonto = " + 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 { + if ("id-int".equals(fieldName)) { + try { + return Integer.valueOf(getID()); + } catch (Exception e) { + Logger.error("unable to parse id: " + getID()); + return getID(); + } + } + if (fieldName.equals("istsumme")) { + return getIstSumme(); + } + if (fieldName.equals("mitglied")) { + return getMitglied(); + } + if (fieldName.equals("abrechnungslauf")) { + return getAbrechnungslauf(); + } + if (fieldName.equals("buchungsklasse")) { + return getBuchungsklasse(); + } + if (fieldName.equals("buchungsart")) { + return getBuchungsart(); + } + if (fieldName.equals("rechnungId")) { + return getRechnungId(); + } + return super.getAttribute(fieldName); + } } diff --git a/src/de/jost_net/JVerein/server/RechnungImpl.java b/src/de/jost_net/JVerein/server/RechnungImpl.java index 3284d99d6..7fd43a392 100644 --- a/src/de/jost_net/JVerein/server/RechnungImpl.java +++ b/src/de/jost_net/JVerein/server/RechnungImpl.java @@ -17,17 +17,23 @@ 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.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; public class RechnungImpl extends AbstractDBObject implements Rechnung, IAdresse @@ -37,6 +43,7 @@ public class RechnungImpl extends AbstractDBObject implements Rechnung, IAdresse * */ private static final long serialVersionUID = -286067581211521888L; + private Double ist; public RechnungImpl() throws RemoteException { @@ -223,6 +230,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 { @@ -238,6 +275,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); } @@ -284,6 +329,37 @@ public ArrayList getMitgliedskontoList() } return mks; } + + @Override + public Mitgliedskonto getMitgliedskonto() throws RemoteException + { + DBIterator it = Einstellungen.getDBService() + .createList(Mitgliedskonto.class); + 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()) + { + sps.add((SollbuchungPosition) it.next()); + } + return sps; + } @Override public String getMandatID() throws RemoteException @@ -333,4 +409,17 @@ 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); + } } 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..1d8c2a1cc --- /dev/null +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -0,0 +1,211 @@ +/********************************************************************** + * 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); + } + + @Override + public Double getSteuerbetrag() throws RemoteException + { + Double betrag = (Double) getAttribute("betrag"); + Double steuersatz = (Double) getAttribute("steuersatz"); + if (steuersatz == null || betrag == null) + { + return betrag; + } + return betrag - betrag / (1 + steuersatz); + } + + @Override + public String getBuchungsartId() throws RemoteException + { + return (String) 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(String 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 String getBuchungsklasseId() throws RemoteException + { + return (String) super.getAttribute("buchungsklasse"); + } + + @Override + public void setBuchungsklasseId(String 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(); + } + return super.getAttribute(fieldName); + } +} From a5b19d775df534f5803780ce7de79d234258e7c9 Mon Sep 17 00:00:00 2001 From: nils Date: Thu, 26 Dec 2024 16:57:35 +0100 Subject: [PATCH 02/52] Update umbenannt --- .../DDLTool/Updates/{Update0452.java => Update0455.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/de/jost_net/JVerein/server/DDLTool/Updates/{Update0452.java => Update0455.java} (96%) diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0452.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java similarity index 96% rename from src/de/jost_net/JVerein/server/DDLTool/Updates/Update0452.java rename to src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java index 2978e05a8..cf410791d 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0452.java +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java @@ -22,9 +22,9 @@ import java.sql.Connection; -public class Update0452 extends AbstractDDLUpdate +public class Update0455 extends AbstractDDLUpdate { - public Update0452(String driver, ProgressMonitor monitor, Connection conn) + public Update0455(String driver, ProgressMonitor monitor, Connection conn) { super(driver, monitor, conn); } From 140dfb0de3ff140f70c987bf19ac832b995e293b Mon Sep 17 00:00:00 2001 From: nils Date: Thu, 26 Dec 2024 17:37:35 +0100 Subject: [PATCH 03/52] Fehler behoben --- .../gui/control/MitgliedskontoControl.java | 3 +- .../jost_net/JVerein/io/AbrechnungSEPA.java | 46 ++++++++++--------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index 74114215b..b55af2370 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -34,9 +34,9 @@ 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.BuchungsartInput.buchungsarttyp; 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; @@ -628,7 +628,6 @@ public Part getBuchungenList() throws RemoteException new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); buchungList.addColumn("Steuersatz", "steuersatz"); buchungList.addColumn("Buchungsart", "buchungsart"); - buchungList.addColumn("Buchungsklasse","buchungsklasse"); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { buchungList.addColumn("Buchungsklasse", "buchungsklasse"); diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 203246795..5b7e6e48d 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -220,7 +220,7 @@ public int compare(JVereinZahler z1, JVereinZahler z2) writeSollbuchung(zahler, sbArray, param.faelligkeit, abrl, konto, zahler.getZahlungsweg().getKey() == Zahlungsweg.BASISLASTSCHRIFT, - param); + param, null); } // Bei kompakter Abbuchung Zahler zusammenfassen. @@ -282,7 +282,7 @@ else if (zahler.getZahlungsweg() writeSollbuchung(zahler, spArray, param.faelligkeit, abrl, konto, ((Zahlungsweg) entry.getKey()) .getKey() == Zahlungsweg.BASISLASTSCHRIFT, - param); + param, null); } } } @@ -373,7 +373,8 @@ else if (zahler.getZahlungsweg() // Gegenbuchung für die Sollbuchungen schreiben if (!summelastschriften.equals(BigDecimal.valueOf(0))) { - writeSollbuchung(null, null, param.faelligkeit, abrl, konto, true, param); + writeSollbuchung(null, null, param.faelligkeit, abrl, konto, true, param, + summelastschriften.doubleValue()); } // Wenn keine Lastschriften vorhanden sind, wird kein File erzeugt. @@ -898,7 +899,7 @@ private ArrayList abbuchenKursteilnehmer( ArrayList spArray = new ArrayList<>(); spArray.add(getSollbuchungPosition(zahler)); writeSollbuchung(zahler, spArray, param.faelligkeit, abrl, konto, true, - param); + param, null); monitor.setStatusText(String.format("Kursteilnehmer %s, %s abgerechnet", kt.getName(), kt.getVorname())); @@ -1117,11 +1118,10 @@ private SollbuchungPosition getSollbuchungPosition(JVereinZahler zahler) private void writeSollbuchung(JVereinZahler zahler, ArrayList spArray, Date datum, Abrechnungslauf abrl, - Konto konto, boolean haben, AbrechnungSEPAParam param) + Konto konto, boolean haben, AbrechnungSEPAParam param, Double summe) throws ApplicationException, RemoteException, SEPAException { Mitgliedskonto mk = null; - double summe = 0d; String zweck = null; Rechnung re = null; if (spArray != null) @@ -1230,6 +1230,10 @@ private void writeSollbuchung(JVereinZahler zahler, mk.setBetrag(0d); mk.store(); + if (summe == null) + { + summe = 0d; + } for (SollbuchungPosition sp : spArray) { summe += sp.getBetrag().doubleValue(); @@ -1263,10 +1267,6 @@ else if (zahler != null buchung.setName( adr != null ? Adressaufbereitung.getNameVorname(adr) : "JVerein"); buchung.setZweck(zahler == null ? "Gegenbuchung" : zweck); - if (mk != null) - { - buchung.setMitgliedskonto(mk); - } buchung.store(); if (spArray == null) @@ -1274,17 +1274,6 @@ else if (zahler != null return; } - if (spArray.get(0).getBuchungsartId() != null) - { - buchung.setBuchungsartId( - Long.parseLong(spArray.get(0).getBuchungsartId())); - } - if (spArray.get(0).getBuchungsklasseId() != null) - { - buchung.setBuchungsklasseId( - Long.parseLong(spArray.get(0).getBuchungsklasseId())); - } - // Buchungen automatisch splitten HashMap splitMap = new HashMap<>(); for (SollbuchungPosition sp : spArray) @@ -1351,6 +1340,21 @@ else if (zahler != null } SplitbuchungsContainer.store(); } + else + { + if (spArray.get(0).getBuchungsartId() != null) + { + buchung.setBuchungsartId( + Long.parseLong(spArray.get(0).getBuchungsartId())); + } + if (spArray.get(0).getBuchungsklasseId() != null) + { + buchung.setBuchungsklasseId( + Long.parseLong(spArray.get(0).getBuchungsklasseId())); + } + buchung.setMitgliedskonto(mk); + buchung.store(); + } } } From c583df3db0233d82549ce56dbb57d179743a65bd Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 27 Dec 2024 22:12:26 +0100 Subject: [PATCH 04/52] Bei Buchung zu Sollbuchung zuordnen automatisch splitten --- .../BuchungSollbuchungZuordnungAction.java | 40 ++++--- ...genSollbuchungZuordnungVorschauDialog.java | 11 +- .../jost_net/JVerein/io/AbrechnungSEPA.java | 88 +-------------- .../JVerein/io/SplitbuchungsContainer.java | 100 ++++++++++++++++++ .../jost_net/JVerein/rmi/Mitgliedskonto.java | 4 + src/de/jost_net/JVerein/rmi/Rechnung.java | 2 - .../JVerein/server/MitgliedskontoImpl.java | 19 ++++ .../jost_net/JVerein/server/RechnungImpl.java | 16 --- 8 files changed, 156 insertions(+), 124 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java index 1e1c4ca09..0abeeb988 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java @@ -20,10 +20,12 @@ 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.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.system.OperationCanceledException; @@ -62,10 +64,6 @@ public void handleAction(Object context) throws ApplicationException { b = (Buchung[]) context; } - if (b == null) - { - return; - } if (b.length == 0) { return; @@ -102,19 +100,37 @@ 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().toString()); + } + if (buchung.getBuchungsklasseId() != null) + { + sbp.setBuchungsklasseId(buchung.getBuchungsklasseId().toString()); + } + sbp.setDatum(buchung.getDatum()); + sbp.setZweck(buchung.getZweck()); + sbp.setSollbuchung(mk.getID()); + } } - for (Buchung buchung : b) + if (b.length == 1) { - buchung.setMitgliedskonto(mk); - if (mk != null) + SplitbuchungsContainer.autoSplit(b[0], mk); + } + else + { + for (Buchung buchung : b) { - if (buchung.getBuchungsartId() == null) - buchung.setBuchungsartId(mk.getBuchungsartId()); - if (buchung.getBuchungsklasseId() == null) - buchung.setBuchungsklasseId(mk.getBuchungsklasseId()); + buchung.setMitgliedskonto(mk); + buchung.store(); } - buchung.store(); } control.getBuchungsList(); diff --git a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java index 52b8ec0d5..729727cde 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); } //Darstellung aktualisieren diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 5b7e6e48d..9639527ef 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -54,7 +54,6 @@ import de.jost_net.JVerein.keys.Abrechnungsmodi; import de.jost_net.JVerein.keys.Beitragsmodel; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; -import de.jost_net.JVerein.keys.SplitbuchungTyp; import de.jost_net.JVerein.keys.Zahlungsrhythmus; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Abrechnungslauf; @@ -1269,91 +1268,10 @@ else if (zahler != null buchung.setZweck(zahler == null ? "Gegenbuchung" : zweck); buchung.store(); - if (spArray == null) + if (spArray != null) { - return; - } - - // Buchungen automatisch splitten - HashMap splitMap = new HashMap<>(); - for (SollbuchungPosition sp : spArray) - { - // Wenn eine Buchungsart fehlt können wir nicht automatisch splitten - if (sp.getBuchungsartId() == null) - { - splitMap = new HashMap<>(); - break; - } - String key = sp.getBuchungsartId() + "-" - + (sp.getBuchungsklasseId() != null ? sp.getBuchungsklasseId() - : ""); - Double betrag = splitMap.get(key); - if (sp.getBetrag().doubleValue() == 0) - { - continue; - } - - if (betrag == null) - { - splitMap.put(key, sp.getBetrag().doubleValue()); - } - else - { - splitMap.replace(key, betrag + sp.getBetrag().doubleValue()); - } - } - - if (splitMap.size() > 1) - { - buchung.setSplitTyp(SplitbuchungTyp.HAUPT); - buchung.store(); - - Iterator> iterator = splitMap.entrySet() - .iterator(); - SplitbuchungsContainer.init(buchung); - while (iterator.hasNext()) - { - Entry entry = iterator.next(); - - Buchung splitBuchung = (Buchung) Einstellungen.getDBService() - .createObject(Buchung.class, null); - splitBuchung.setAbrechnungslauf(abrl); - splitBuchung.setBetrag(entry.getValue()); - splitBuchung.setDatum(datum); - splitBuchung.setKonto(konto); - splitBuchung.setName(buchung.getName()); - splitBuchung.setZweck(buchung.getZweck()); - 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(buchung.getID())); - - SplitbuchungsContainer.add(splitBuchung); - } - SplitbuchungsContainer.store(); - } - else - { - if (spArray.get(0).getBuchungsartId() != null) - { - buchung.setBuchungsartId( - Long.parseLong(spArray.get(0).getBuchungsartId())); - } - if (spArray.get(0).getBuchungsklasseId() != null) - { - buchung.setBuchungsklasseId( - Long.parseLong(spArray.get(0).getBuchungsklasseId())); - } - buchung.setMitgliedskonto(mk); - buchung.store(); + // Buchungen automatisch splitten + SplitbuchungsContainer.autoSplit(buchung, mk); } } } diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index b27872ae9..30d008475 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -20,12 +20,17 @@ 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.util.ApplicationException; @@ -326,6 +331,101 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) throws Re return buch; } + public static void autoSplit(Buchung buchung, Mitgliedskonto mk) + throws NumberFormatException, RemoteException, ApplicationException + { + HashMap splitMap = new HashMap<>(); + ArrayList spArray = mk.getSollbuchungPositionList(); + for (SollbuchungPosition sp : spArray) + { + // Wenn eine Buchungsart fehlt können wir nicht automatisch splitten + if (sp.getBuchungsartId() == null) + { + splitMap = new HashMap<>(); + break; + } + String key = sp.getBuchungsartId() + "-" + + (sp.getBuchungsklasseId() != null ? sp.getBuchungsklasseId() : ""); + Double betrag = splitMap.get(key); + if (sp.getBetrag().doubleValue() == 0) + { + continue; + } + + if (betrag == null) + { + splitMap.put(key, sp.getBetrag().doubleValue()); + } + else + { + splitMap.replace(key, betrag + sp.getBetrag().doubleValue()); + } + } + + // Automatisches spliten ist nur möglich wenn der Betrag von Buchung und + // Sollbuchung gleich sind + if (splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) + { + buchung.setSplitTyp(SplitbuchungTyp.HAUPT); + buchung.store(); + + Iterator> iterator = splitMap.entrySet().iterator(); + SplitbuchungsContainer.init(buchung); + 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()); + splitBuchung.setZweck(buchung.getZweck()); + 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(buchung.getID())); + + SplitbuchungsContainer.add(splitBuchung); + } + SplitbuchungsContainer.store(); + } + else if (spArray != null && spArray.size() > 0) + { + // Wenn kein automatisches Spliten möglich ist nur Buchungsart, + // Buchungsklasse und Sollbuchung zuweisen + if (spArray.get(0).getBuchungsartId() != null) + { + buchung.setBuchungsartId( + Long.parseLong(spArray.get(0).getBuchungsartId())); + } + if (spArray.get(0).getBuchungsklasseId() != null) + { + buchung.setBuchungsklasseId( + Long.parseLong(spArray.get(0).getBuchungsklasseId())); + } + buchung.setMitgliedskonto(mk); + buchung.store(); + } + else + { + // Für alte Sollbuchungen ohne Sollbuchungspositionen + buchung.setBuchungsartId(mk.getBuchungsartId()); + buchung.setBuchungsklasseId(mk.getBuchungsklasseId()); + buchung.setMitgliedskonto(mk); + buchung.store(); + } + } + public static int getAnzahl() { return anzahl; diff --git a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java index f2d3c8ee1..831c54940 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; @@ -83,4 +84,7 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) public void setRechnung(Rechnung rechnung) throws RemoteException; public Long getRechnungId() 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 7095bd7a1..bf77e82de 100644 --- a/src/de/jost_net/JVerein/rmi/Rechnung.java +++ b/src/de/jost_net/JVerein/rmi/Rechnung.java @@ -40,8 +40,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; diff --git a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java index 3849c1fe4..3ac4d55b5 100644 --- a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java @@ -19,6 +19,7 @@ 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; @@ -28,7 +29,9 @@ 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; @@ -351,4 +354,20 @@ public Object getAttribute(String fieldName) throws RemoteException { } 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()) + { + sps.add((SollbuchungPosition) it.next()); + } + return sps; + } } diff --git a/src/de/jost_net/JVerein/server/RechnungImpl.java b/src/de/jost_net/JVerein/server/RechnungImpl.java index 7fd43a392..d8a878154 100644 --- a/src/de/jost_net/JVerein/server/RechnungImpl.java +++ b/src/de/jost_net/JVerein/server/RechnungImpl.java @@ -313,22 +313,6 @@ protected Class getForeignObject(String field) } return null; } - - @Override - public ArrayList getMitgliedskontoList() - throws RemoteException - { - ArrayList mks = new ArrayList<>(); - DBIterator it = Einstellungen.getDBService() - .createList(Mitgliedskonto.class); - it.addFilter("rechnung = ?", getID()); - it.setOrder("ORDER BY datum"); - while (it.hasNext()) - { - mks.add((Mitgliedskonto) it.next()); - } - return mks; - } @Override public Mitgliedskonto getMitgliedskonto() throws RemoteException From f45adf5f585401842c036b59981f593efe83ef72 Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 27 Dec 2024 22:14:59 +0100 Subject: [PATCH 05/52] Update umbenannt --- .../DDLTool/Updates/{Update0455.java => Update0456.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/de/jost_net/JVerein/server/DDLTool/Updates/{Update0455.java => Update0456.java} (96%) diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java similarity index 96% rename from src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java rename to src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java index cf410791d..e17229225 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java @@ -22,9 +22,9 @@ import java.sql.Connection; -public class Update0455 extends AbstractDDLUpdate +public class Update0456 extends AbstractDDLUpdate { - public Update0455(String driver, ProgressMonitor monitor, Connection conn) + public Update0456(String driver, ProgressMonitor monitor, Connection conn) { super(driver, monitor, conn); } From 93eba546d6a28ee57eeed902f6b9e7cb674d2d1b Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 27 Dec 2024 22:24:34 +0100 Subject: [PATCH 06/52] ZUGFeRD an Sollbuchungspositionen angepasst --- .../JVerein/io/FormularAufbereitung.java | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/src/de/jost_net/JVerein/io/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index 8583fbf6e..973e2675d 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,28 +717,29 @@ 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(); + Double betrag = sp.getNettobetrag(); if (betrag == null || betrag == 0) { - betrag = mk.getBetrag(); + betrag = sp.getBetrag(); } - if (mk.getBetrag() < 0) + if (sp.getBetrag() < 0) { invoice.addItem(new Item( - new Product(mk.getZweck1(), "", "LS", - new BigDecimal(mk.getSteuersatz()).setScale(2, + new Product(sp.getZweck(), "", "LS", + new BigDecimal(sp.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, + invoice.addItem(new Item(new Product(sp.getZweck(), "", + "LS", // LS = pauschal + new BigDecimal(sp.getSteuersatz()).setScale(2, RoundingMode.HALF_DOWN)), new BigDecimal(betrag).setScale(2, RoundingMode.HALF_DOWN), new BigDecimal(1.0))); From eb8f6d4f2ecc5aad790511e0d563e8c192db9175 Mon Sep 17 00:00:00 2001 From: nils Date: Sat, 28 Dec 2024 23:08:10 +0100 Subject: [PATCH 07/52] Formatierung und kleine Fehler behoben --- .../BuchungSollbuchungZuordnungAction.java | 1 + .../gui/control/MitgliedskontoControl.java | 6 +- .../JVerein/gui/control/RechnungControl.java | 1 - .../JVerein/server/MitgliedskontoImpl.java | 678 ++++++++++-------- 4 files changed, 381 insertions(+), 305 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java index 0abeeb988..e30640629 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java @@ -117,6 +117,7 @@ else if (open instanceof Mitglied) sbp.setDatum(buchung.getDatum()); sbp.setZweck(buchung.getZweck()); sbp.setSollbuchung(mk.getID()); + sbp.store(); } } diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index b55af2370..472fdc2b3 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -627,10 +627,12 @@ public Part getBuchungenList() throws RemoteException buchungList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); buchungList.addColumn("Steuersatz", "steuersatz"); - buchungList.addColumn("Buchungsart", "buchungsart"); + buchungList.addColumn("Buchungsart", "buchungsart", + new BuchungsartFormatter()); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { - buchungList.addColumn("Buchungsklasse", "buchungsklasse"); + buchungList.addColumn("Buchungsklasse", "buchungsklasse", + new BuchungsklasseFormatter()); } buchungList.setRememberColWidths(true); diff --git a/src/de/jost_net/JVerein/gui/control/RechnungControl.java b/src/de/jost_net/JVerein/gui/control/RechnungControl.java index a044961e1..0b0b3c2a3 100644 --- a/src/de/jost_net/JVerein/gui/control/RechnungControl.java +++ b/src/de/jost_net/JVerein/gui/control/RechnungControl.java @@ -577,7 +577,6 @@ public DecimalInput getBetrag() throws RemoteException Einstellungen.DECIMALFORMAT); betrag.setName("Betrag"); betrag.disable(); - ; return betrag; } diff --git a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java index 3ac4d55b5..b53600dde 100644 --- a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java @@ -38,52 +38,70 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -public class MitgliedskontoImpl extends AbstractDBObject implements Mitgliedskonto { - - private static final long serialVersionUID = -1234L; - - private Double ist = null; - - public MitgliedskontoImpl() throws RemoteException { - super(); - } - - @Override - protected String getTableName() { - return "mitgliedskonto"; - } - - @Override - public String getPrimaryAttribute() { - return "mitglied"; - } - - @Override - protected void deleteCheck() throws ApplicationException { - try { - if (this.getRechnung() != null) { - throw new ApplicationException( - "Sollbuchung kann nicht gelöscht werden weil sie zu einer " + "Rechnung gehört"); - } - } catch (ObjectNotFoundException e) { - // Alles ok, es gibt keine Rechnung - // Das passiert wenn sie kurz vorher gelöscht wurde aber - // die ID noch im Cache gespeichert ist - } catch (RemoteException e) { - Logger.error("Fehler", e); - throw new ApplicationException("Sollbuchung kann nicht gelöscht werden. Siehe system log"); - } - } - - @Override - protected void insertCheck() throws ApplicationException { - try { - if (getDatum() == null) { - throw new ApplicationException("Datum fehlt"); - } - if (getZweck1().length() == 0) { - throw new ApplicationException("Verwendungszweck fehlt"); - } +public class MitgliedskontoImpl extends AbstractDBObject + implements Mitgliedskonto +{ + + private static final long serialVersionUID = -1234L; + + private Double ist = null; + + public MitgliedskontoImpl() throws RemoteException + { + super(); + } + + @Override + protected String getTableName() + { + return "mitgliedskonto"; + } + + @Override + public String getPrimaryAttribute() + { + return "mitglied"; + } + + @Override + protected void deleteCheck() throws ApplicationException + { + try + { + if (this.getRechnung() != null) + { + throw new ApplicationException( + "Sollbuchung kann nicht gelöscht werden weil sie zu einer " + + "Rechnung gehört"); + } + } + catch (ObjectNotFoundException e) + { + // Alles ok, es gibt keine Rechnung + // Das passiert wenn sie kurz vorher gelöscht wurde aber + // die ID noch im Cache gespeichert ist + } + catch (RemoteException e) + { + Logger.error("Fehler", e); + throw new ApplicationException( + "Sollbuchung kann nicht gelöscht werden. Siehe system log"); + } + } + + @Override + protected void insertCheck() throws ApplicationException + { + try + { + if (getDatum() == null) + { + throw new ApplicationException("Datum fehlt"); + } + if (getZweck1().length() == 0) + { + throw new ApplicationException("Verwendungszweck fehlt"); + } if (getBetrag() == null) { String fehler = "Betrag fehlt"; @@ -91,143 +109,243 @@ protected void insertCheck() throws ApplicationException { throw new ApplicationException(fehler); } - } catch (RemoteException e) { - String fehler = "Sollbuchung kann nicht gespeichert werden. Siehe system log"; - Logger.error(fehler, e); - throw new ApplicationException(fehler); - } - } - - @Override - protected void updateCheck() throws ApplicationException { - insertCheck(); - } - - @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"); - if (o == null) - return null; - - if (o instanceof Abrechnungslauf) - return (Abrechnungslauf) o; - - Cache cache = Cache.get(Abrechnungslauf.class, true); - return (Abrechnungslauf) cache.get(o); - } - - @Override - public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) throws RemoteException { - setAttribute("abrechnungslauf", Integer.valueOf(abrechnungslauf.getID())); - } - - @Override - public Rechnung getRechnung() throws RemoteException { - return (Rechnung) getAttribute("rechnung"); - } - - @Override - public Long getRechnungId() throws RemoteException { - return (Long) super.getAttribute("rechnung"); - } - - @Override - public void setRechnung(Rechnung rechnung) throws RemoteException { - 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"); - if (o == null) - return null; - - 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")); - } - - @Override - public void setMitglied(Mitglied mitglied) throws RemoteException { - setAttribute("mitglied", Integer.valueOf(mitglied.getID())); - } - - @Override - public Date getDatum() throws RemoteException { - return (Date) getAttribute("datum"); - } - - @Override - public void setDatum(Date datum) throws RemoteException { - setAttribute("datum", datum); - } + } + catch (RemoteException e) + { + String fehler = "Sollbuchung kann nicht gespeichert werden. Siehe system log"; + Logger.error(fehler, e); + throw new ApplicationException(fehler); + } + } + + @Override + protected void updateCheck() throws ApplicationException + { + insertCheck(); + } + + @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"); + if (o == null) + return null; + + if (o instanceof Abrechnungslauf) + return (Abrechnungslauf) o; + + Cache cache = Cache.get(Abrechnungslauf.class, true); + return (Abrechnungslauf) cache.get(o); + } + + @Override + public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) + throws RemoteException + { + setAttribute("abrechnungslauf", Integer.valueOf(abrechnungslauf.getID())); + } + + @Override + public Rechnung getRechnung() throws RemoteException + { + return (Rechnung) getAttribute("rechnung"); + } + + @Override + public Long getRechnungId() throws RemoteException + { + return (Long) super.getAttribute("rechnung"); + } + + @Override + public void setRechnung(Rechnung rechnung) throws RemoteException + { + 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"); + if (o == null) + return null; + + 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")); + } + + @Override + public void setMitglied(Mitglied mitglied) throws RemoteException + { + setAttribute("mitglied", Integer.valueOf(mitglied.getID())); + } + + @Override + public Date getDatum() throws RemoteException + { + return (Date) getAttribute("datum"); + } + + @Override + public void setDatum(Date datum) throws RemoteException + { + setAttribute("datum", datum); + } + + @Override + public String getZweck1() throws RemoteException + { + return (String) getAttribute("zweck1"); + } + + @Override + public void setZweck1(String zweck1) throws RemoteException + { + setAttribute("zweck1", zweck1); + } + + @Override + public Integer getZahlungsweg() throws RemoteException + { + return (Integer) getAttribute("zahlungsweg"); + } + + @Override + 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 @@ -235,125 +353,81 @@ public Double getBetrag() throws RemoteException return (Double) super.getAttribute("betrag"); } - @Override - public String getZweck1() throws RemoteException { - return (String) getAttribute("zweck1"); - } - - @Override - public void setZweck1(String zweck1) throws RemoteException { - setAttribute("zweck1", zweck1); - } - - @Override - public Integer getZahlungsweg() throws RemoteException { - return (Integer) getAttribute("zahlungsweg"); - } - - @Override - 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 void setBetrag(Double d) throws RemoteException { - setAttribute("betrag", d); - } - - @Override - public Double getIstSumme() throws RemoteException { - if (ist != null) { - return ist; - } - DBService service = Einstellungen.getDBService(); - String sql = "select sum(betrag) from buchung where mitgliedskonto = " + 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 { - if ("id-int".equals(fieldName)) { - try { - return Integer.valueOf(getID()); - } catch (Exception e) { - Logger.error("unable to parse id: " + getID()); - return getID(); - } - } - if (fieldName.equals("istsumme")) { - return getIstSumme(); - } - if (fieldName.equals("mitglied")) { - return getMitglied(); - } - if (fieldName.equals("abrechnungslauf")) { - return getAbrechnungslauf(); - } - if (fieldName.equals("buchungsklasse")) { - return getBuchungsklasse(); - } - if (fieldName.equals("buchungsart")) { - return getBuchungsart(); - } - if (fieldName.equals("rechnungId")) { - return getRechnungId(); - } - return super.getAttribute(fieldName); - } + @Override + public void setBetrag(Double d) throws RemoteException + { + setAttribute("betrag", d); + } + + @Override + public Double getIstSumme() throws RemoteException + { + if (ist != null) + { + return ist; + } + DBService service = Einstellungen.getDBService(); + String sql = "select sum(betrag) from buchung where mitgliedskonto = " + + 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 + { + if ("id-int".equals(fieldName)) + { + try + { + return Integer.valueOf(getID()); + } + catch (Exception e) + { + Logger.error("unable to parse id: " + getID()); + return getID(); + } + } + if (fieldName.equals("istsumme")) + { + return getIstSumme(); + } + if (fieldName.equals("mitglied")) + { + return getMitglied(); + } + if (fieldName.equals("abrechnungslauf")) + { + return getAbrechnungslauf(); + } + if (fieldName.equals("buchungsklasse")) + { + return getBuchungsklasse(); + } + if (fieldName.equals("buchungsart")) + { + return getBuchungsart(); + } + if (fieldName.equals("rechnungId")) + { + return getRechnungId(); + } + return super.getAttribute(fieldName); + } @Override public ArrayList getSollbuchungPositionList() From 306e6d4a2c49a27363a273b2dc925acddcc848dd Mon Sep 17 00:00:00 2001 From: nils Date: Sat, 28 Dec 2024 23:35:57 +0100 Subject: [PATCH 08/52] BuchungsartID und BuchungsklasseID Long stat String --- .../BuchungSollbuchungZuordnungAction.java | 4 ++-- .../JVerein/gui/control/RechnungControl.java | 8 ++++++-- src/de/jost_net/JVerein/io/AbrechnungSEPA.java | 9 +++++---- src/de/jost_net/JVerein/io/JVereinZahler.java | 12 ++++++------ .../JVerein/io/SplitbuchungsContainer.java | 16 ++++++++++++---- .../JVerein/rmi/SollbuchungPosition.java | 8 ++++---- .../JVerein/server/SollbuchungPositionImpl.java | 12 ++++++------ 7 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java index e30640629..b9a4dc33d 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java @@ -108,11 +108,11 @@ else if (open instanceof Mitglied) sbp.setBetrag(buchung.getBetrag()); if (buchung.getBuchungsartId() != null) { - sbp.setBuchungsartId(buchung.getBuchungsartId().toString()); + sbp.setBuchungsartId(buchung.getBuchungsartId()); } if (buchung.getBuchungsklasseId() != null) { - sbp.setBuchungsklasseId(buchung.getBuchungsklasseId().toString()); + sbp.setBuchungsklasseId(buchung.getBuchungsklasseId()); } sbp.setDatum(buchung.getDatum()); sbp.setZweck(buchung.getZweck()); diff --git a/src/de/jost_net/JVerein/gui/control/RechnungControl.java b/src/de/jost_net/JVerein/gui/control/RechnungControl.java index 0b0b3c2a3..2bf55e485 100644 --- a/src/de/jost_net/JVerein/gui/control/RechnungControl.java +++ b/src/de/jost_net/JVerein/gui/control/RechnungControl.java @@ -29,6 +29,8 @@ 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; @@ -812,10 +814,12 @@ public Part getBuchungenList() throws RemoteException buchungList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); buchungList.addColumn("Steuersatz", "steuersatz"); - buchungList.addColumn("Buchungsart", "buchungsart"); + buchungList.addColumn("Buchungsart", "buchungsart", + new BuchungsartFormatter()); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { - buchungList.addColumn("Buchungsklasse", "buchungsklasse"); + buchungList.addColumn("Buchungsklasse", "buchungsklasse", + new BuchungsklasseFormatter()); } buchungList.setRememberColWidths(true); diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 47903aa03..9b2e15bbc 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -648,11 +648,12 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, zahler.setZahlungsweg(new Zahlungsweg(mZahler.getZahlungsweg())); if (bg.getBuchungsart() != null) { - zahler.setBuchungsartId(bg.getBuchungsart().getID()); + zahler.setBuchungsartId(Long.parseLong(bg.getBuchungsart().getID())); } if (bg.getBuchungsklasseId() != null) { - zahler.setBuchungsklasseId(bg.getBuchungsklasseId().toString()); + zahler.setBuchungsklasseId( + Long.parseLong(bg.getBuchungsklasseId().toString())); } zahler.setDatum(param.faelligkeit); zahler.setMitglied(m); @@ -781,11 +782,11 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, zahler.setZahlungsweg(new Zahlungsweg(zahlungsweg)); if (z.getBuchungsart() != null) { - zahler.setBuchungsartId(z.getBuchungsart().getID()); + zahler.setBuchungsartId(Long.parseLong(z.getBuchungsart().getID())); } if (z.getBuchungsklasseId() != null) { - zahler.setBuchungsklasseId(z.getBuchungsklasseId().toString()); + zahler.setBuchungsklasseId(z.getBuchungsklasseId()); } zahler.setDatum(z.getFaelligkeit()); zahler.setMitglied(m); diff --git a/src/de/jost_net/JVerein/io/JVereinZahler.java b/src/de/jost_net/JVerein/io/JVereinZahler.java index db1ba24f8..4740eae3a 100644 --- a/src/de/jost_net/JVerein/io/JVereinZahler.java +++ b/src/de/jost_net/JVerein/io/JVereinZahler.java @@ -31,9 +31,9 @@ public class JVereinZahler extends Zahler private Zahlungsweg zahlungsweg; - private String buchungsart; + private Long buchungsart; - private String buchungsklasse; + private Long buchungsklasse; private Date datum; @@ -73,22 +73,22 @@ public void setZahlungsweg(Zahlungsweg zahlungsweg) this.zahlungsweg = zahlungsweg; } - public String getBuchungsartId() + public Long getBuchungsartId() { return buchungsart; } - public void setBuchungsartId(String buchungsart) + public void setBuchungsartId(Long buchungsart) { this.buchungsart = buchungsart; } - public String getBuchungsklasseId() + public Long getBuchungsklasseId() { return buchungsklasse; } - public void setBuchungsklasseId(String buchungsklasse) + public void setBuchungsklasseId(Long buchungsklasse) { this.buchungsklasse = buchungsklasse; } diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 30d008475..472ce100a 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -366,6 +366,16 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) // Sollbuchung gleich sind if (splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) { + // 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.setSplitTyp(SplitbuchungTyp.HAUPT); buchung.store(); @@ -405,13 +415,11 @@ else if (spArray != null && spArray.size() > 0) // Buchungsklasse und Sollbuchung zuweisen if (spArray.get(0).getBuchungsartId() != null) { - buchung.setBuchungsartId( - Long.parseLong(spArray.get(0).getBuchungsartId())); + buchung.setBuchungsartId(spArray.get(0).getBuchungsartId()); } if (spArray.get(0).getBuchungsklasseId() != null) { - buchung.setBuchungsklasseId( - Long.parseLong(spArray.get(0).getBuchungsklasseId())); + buchung.setBuchungsklasseId(spArray.get(0).getBuchungsklasseId()); } buchung.setMitgliedskonto(mk); buchung.store(); diff --git a/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java index 9eea9a5ce..9cc6d2dc9 100644 --- a/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java +++ b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java @@ -32,17 +32,17 @@ public interface SollbuchungPosition extends DBObject public void setSteuersatz(Double satz) throws RemoteException; - public String getBuchungsartId() throws RemoteException; + public Long getBuchungsartId() throws RemoteException; - public void setBuchungsartId(String buchungsart) throws RemoteException; + public void setBuchungsartId(Long buchungsart) throws RemoteException; public Buchungsart getBuchungsart() throws RemoteException; public Buchungsklasse getBuchungsklasse() throws RemoteException; - public String getBuchungsklasseId() throws RemoteException; + public Long getBuchungsklasseId() throws RemoteException; - public void setBuchungsklasseId(String buchungsklasse) throws RemoteException; + public void setBuchungsklasseId(Long buchungsklasse) throws RemoteException; public Date getDatum() throws RemoteException; diff --git a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java index 1d8c2a1cc..1234c66fe 100644 --- a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -107,9 +107,9 @@ public Double getSteuerbetrag() throws RemoteException } @Override - public String getBuchungsartId() throws RemoteException + public Long getBuchungsartId() throws RemoteException { - return (String) super.getAttribute("buchungsart"); + return (Long) super.getAttribute("buchungsart"); } @Override @@ -127,7 +127,7 @@ public Buchungsart getBuchungsart() throws RemoteException } @Override - public void setBuchungsartId(String buchungsart) throws RemoteException + public void setBuchungsartId(Long buchungsart) throws RemoteException { setAttribute("buchungsart", buchungsart); } @@ -147,13 +147,13 @@ public Buchungsklasse getBuchungsklasse() throws RemoteException } @Override - public String getBuchungsklasseId() throws RemoteException + public Long getBuchungsklasseId() throws RemoteException { - return (String) super.getAttribute("buchungsklasse"); + return (Long) super.getAttribute("buchungsklasse"); } @Override - public void setBuchungsklasseId(String buchungsklasse) throws RemoteException + public void setBuchungsklasseId(Long buchungsklasse) throws RemoteException { setAttribute("buchungsklasse", buchungsklasse); } From e48c8071dd6e6ab54793b14c0821d49521688b83 Mon Sep 17 00:00:00 2001 From: nils Date: Sun, 29 Dec 2024 12:07:02 +0100 Subject: [PATCH 09/52] =?UTF-8?q?getBuchungsartId()=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/jost_net/JVerein/io/AbrechnungSEPA.java | 7 +++---- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 2 -- src/de/jost_net/JVerein/rmi/Beitragsgruppe.java | 2 ++ src/de/jost_net/JVerein/rmi/Zusatzbetrag.java | 2 ++ src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java | 6 ++++++ src/de/jost_net/JVerein/server/ZusatzbetragImpl.java | 6 ++++++ 6 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 9b2e15bbc..a3b4c1e67 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -648,12 +648,11 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, zahler.setZahlungsweg(new Zahlungsweg(mZahler.getZahlungsweg())); if (bg.getBuchungsart() != null) { - zahler.setBuchungsartId(Long.parseLong(bg.getBuchungsart().getID())); + zahler.setBuchungsartId(bg.getBuchungsartId()); } if (bg.getBuchungsklasseId() != null) { - zahler.setBuchungsklasseId( - Long.parseLong(bg.getBuchungsklasseId().toString())); + zahler.setBuchungsklasseId(bg.getBuchungsklasseId()); } zahler.setDatum(param.faelligkeit); zahler.setMitglied(m); @@ -782,7 +781,7 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, zahler.setZahlungsweg(new Zahlungsweg(zahlungsweg)); if (z.getBuchungsart() != null) { - zahler.setBuchungsartId(Long.parseLong(z.getBuchungsart().getID())); + zahler.setBuchungsartId(z.getBuchungsartId()); } if (z.getBuchungsklasseId() != null) { diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 472ce100a..5651c425a 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -366,8 +366,6 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) // Sollbuchung gleich sind if (splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) { - // 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()); 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/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..c2ff72548 100644 --- a/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java +++ b/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java @@ -361,6 +361,12 @@ public Buchungsart getBuchungsart() throws RemoteException return (Buchungsart) getAttribute("buchungsart"); } + @Override + public Long getBuchungsartId() throws RemoteException + { + return (Long) super.getAttribute("buchungsart"); + } + @Override public void setArbeitseinsatzBetrag(double arbeitseinsatzBetrag) throws RemoteException 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 { From 36de9117ab58b90082502762efcb313662a05614 Mon Sep 17 00:00:00 2001 From: nils Date: Sun, 29 Dec 2024 12:25:49 +0100 Subject: [PATCH 10/52] Fehler getBuchungsartId() behoben --- .../JVerein/server/BeitragsgruppeImpl.java | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java b/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java index c2ff72548..fac6c2a5a 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,14 @@ 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 From 059c407b90925f529e2686215cc583025406f7c8 Mon Sep 17 00:00:00 2001 From: nils Date: Sun, 29 Dec 2024 12:38:21 +0100 Subject: [PATCH 11/52] =?UTF-8?q?getAttribut=20buchungsart=20hinzugef?= =?UTF-8?q?=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java b/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java index fac6c2a5a..5c7a1d9c6 100644 --- a/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java +++ b/src/de/jost_net/JVerein/server/BeitragsgruppeImpl.java @@ -390,6 +390,10 @@ public Object getAttribute(String fieldName) throws RemoteException { return getBuchungsklasse(); } + else if (fieldName.equals("buchungsart")) + { + return getBuchungsart(); + } return super.getAttribute(fieldName); } From 2cf99d3076daa42d1d6de614bc47f5e9004d3206 Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 30 Dec 2024 12:58:28 +0100 Subject: [PATCH 12/52] Beim zuordnen einer SOllbuchung zu Slitbuchung diese ersetzen --- .../JVerein/Queries/SollbuchungQuery.java | 4 +++ .../gui/control/MitgliedskontoControl.java | 14 ++++++++--- .../JVerein/io/SollbuchungExport.java | 9 ++++--- .../JVerein/io/SplitbuchungsContainer.java | 25 +++++++++++++++++-- 4 files changed, 43 insertions(+), 9 deletions(-) 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/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index 472fdc2b3..40533d042 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -563,9 +563,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(); } @@ -687,9 +690,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/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/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 5651c425a..e5ce54782 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -366,6 +366,7 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) // Sollbuchung gleich sind if (splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) { + boolean ersetzen = false; if (spArray.get(0).getBuchungsartId() != null) { buchung.setBuchungsartId(spArray.get(0).getBuchungsartId()); @@ -374,11 +375,31 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) { buchung.setBuchungsklasseId(spArray.get(0).getBuchungsklasseId()); } - buchung.setSplitTyp(SplitbuchungTyp.HAUPT); + if (buchung.getSplitTyp() == null) + { + buchung.setSplitTyp(SplitbuchungTyp.HAUPT); + } + else + { + ersetzen = true; + } buchung.store(); Iterator> iterator = splitMap.entrySet().iterator(); SplitbuchungsContainer.init(buchung); + + if (ersetzen) + { + for (Buchung b : splitbuchungen) + + { + if (b.getID().equals(buchung.getID())) + { + b.setDelete(true); + break; + } + } + } while (iterator.hasNext()) { Entry entry = iterator.next(); @@ -401,7 +422,7 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) splitBuchung.setBuchungsklasseId(Long.parseLong(buchungsklasse)); } splitBuchung.setSplitTyp(SplitbuchungTyp.SPLIT); - splitBuchung.setSplitId(Long.parseLong(buchung.getID())); + splitBuchung.setSplitId(Long.parseLong(getMaster().getID())); SplitbuchungsContainer.add(splitBuchung); } From 975fbac67c528dff718825cf1d83554f5703a47b Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 30 Dec 2024 23:01:35 +0100 Subject: [PATCH 13/52] AutoSplit auch wenn Betrag nicht dem der Sollbuchung entspricht --- .../JVerein/io/SplitbuchungsContainer.java | 101 ++++++++++++++---- 1 file changed, 79 insertions(+), 22 deletions(-) diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index e5ce54782..b5f6da082 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -33,6 +33,8 @@ 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.logging.Logger; import de.willuhn.util.ApplicationException; public class SplitbuchungsContainer @@ -40,12 +42,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 @@ -63,7 +65,7 @@ public static void init(Buchung[] bl) } initiate(bl[0]); } - + public static void init(Buchung b) throws RemoteException, ApplicationException { @@ -72,7 +74,7 @@ public static void init(Buchung b) text = "Es wird eine Splitbuchung erzeugt."; initiate(b); } - + public static void initiate(Buchung b) throws RemoteException, ApplicationException { @@ -234,7 +236,7 @@ public static void store() throws RemoteException, ApplicationException throw ex; } } - + public static void handleStore() throws RemoteException, ApplicationException { for (Buchung b : get()) @@ -277,14 +279,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() @@ -307,11 +311,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()); @@ -330,10 +335,16 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) throws Re buch.setSplitTyp(SplitbuchungTyp.SPLIT); return buch; } - + public static void autoSplit(Buchung buchung, Mitgliedskonto mk) throws NumberFormatException, RemoteException, ApplicationException { + if (mk == null) + { + buchung.setMitgliedskonto(null); + buchung.store(); + return; + } HashMap splitMap = new HashMap<>(); ArrayList spArray = mk.getSollbuchungPositionList(); for (SollbuchungPosition sp : spArray) @@ -362,24 +373,54 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) } } - // Automatisches spliten ist nur möglich wenn der Betrag von Buchung und - // Sollbuchung gleich sind - if (splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) + boolean splitten = false; + if (splitMap.size() > 0 && mk.getBetrag().equals(buchung.getBetrag())) + { + splitten = true; + } + else if (splitMap.size() > 0) + { + YesNoDialog dialog = new YesNoDialog(YesNoDialog.POSITION_CENTER); + dialog.setTitle("Buchung spliten"); + dialog.setText( + "Der Betrag der Sollbuchung entspricht nicht dem der Buchung.\n" + + "Soll die Buchung trotzdem anhand der Sollbuchungs-Positionen\n" + + "gesplittet werden und eine Restbuchung erzeugt werden?"); + try + { + splitten = ((Boolean) dialog.open()).booleanValue(); + } + catch (Exception e) + { + Logger.error("Fehler beim Buchung-Sollbuchung-zuordnen-Dialog.", e); + } + } + if(splitten) { boolean ersetzen = false; - if (spArray.get(0).getBuchungsartId() != null) + if (buchung.getBuchungsartId() != null + && spArray.get(0).getBuchungsartId() != null) { buchung.setBuchungsartId(spArray.get(0).getBuchungsartId()); } - if (spArray.get(0).getBuchungsklasseId() != null) + if (buchung.getBuchungsklasseId() != null + && spArray.get(0).getBuchungsklasseId() != null) { buchung.setBuchungsklasseId(spArray.get(0).getBuchungsklasseId()); } + if (buchung.getSplitTyp() == null) { buchung.setSplitTyp(SplitbuchungTyp.HAUPT); } + // Haupt- und Gegen-Buchungen können nicht gesplittet werden + else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN + || buchung.getSplitTyp() == SplitbuchungTyp.HAUPT) + { + return; + } else + // Spitbuchungen müssen durch die neuen Buchungen ersetzt werden { ersetzen = true; } @@ -426,6 +467,22 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) SplitbuchungsContainer.add(splitBuchung); } + if (!mk.getBetrag().equals(buchung.getBetrag())) + { + Buchung splitBuchung = (Buchung) Einstellungen.getDBService() + .createObject(Buchung.class, null); + splitBuchung.setBetrag(buchung.getBetrag() - mk.getBetrag()); + splitBuchung.setDatum(buchung.getDatum()); + splitBuchung.setKonto(buchung.getKonto()); + splitBuchung.setName(buchung.getName()); + splitBuchung.setZweck(buchung.getZweck()); + splitBuchung.setSplitTyp(SplitbuchungTyp.SPLIT); + splitBuchung.setSplitId(Long.parseLong(getMaster().getID())); + splitBuchung.setBuchungsartId(buchung.getBuchungsartId()); + splitBuchung.setBuchungsklasseId(buchung.getBuchungsklasseId()); + + SplitbuchungsContainer.add(splitBuchung); + } SplitbuchungsContainer.store(); } else if (spArray != null && spArray.size() > 0) @@ -453,7 +510,7 @@ else if (spArray != null && spArray.size() > 0) } } - public static int getAnzahl() + public static int getAnzahl() { return anzahl; } From 1a665cd2e046577b584df9431cf666a2ef26f462 Mon Sep 17 00:00:00 2001 From: nils Date: Tue, 31 Dec 2024 12:52:11 +0100 Subject: [PATCH 14/52] Kleine Fehler behoben --- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 7 +++---- src/de/jost_net/JVerein/server/BuchungImpl.java | 4 ++-- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index b5f6da082..301ade1d6 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -381,7 +381,7 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) else if (splitMap.size() > 0) { YesNoDialog dialog = new YesNoDialog(YesNoDialog.POSITION_CENTER); - dialog.setTitle("Buchung spliten"); + dialog.setTitle("Buchung splitten"); dialog.setText( "Der Betrag der Sollbuchung entspricht nicht dem der Buchung.\n" + "Soll die Buchung trotzdem anhand der Sollbuchungs-Positionen\n" @@ -398,12 +398,12 @@ else if (splitMap.size() > 0) if(splitten) { boolean ersetzen = false; - if (buchung.getBuchungsartId() != null + if (buchung.getBuchungsartId() == null && spArray.get(0).getBuchungsartId() != null) { buchung.setBuchungsartId(spArray.get(0).getBuchungsartId()); } - if (buchung.getBuchungsklasseId() != null + if (buchung.getBuchungsklasseId() == null && spArray.get(0).getBuchungsklasseId() != null) { buchung.setBuchungsklasseId(spArray.get(0).getBuchungsklasseId()); @@ -424,7 +424,6 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN { ersetzen = true; } - buchung.store(); Iterator> iterator = splitMap.entrySet().iterator(); SplitbuchungsContainer.init(buchung); diff --git a/src/de/jost_net/JVerein/server/BuchungImpl.java b/src/de/jost_net/JVerein/server/BuchungImpl.java index 946af50b2..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; @@ -505,7 +505,7 @@ 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); } From f31c673f56a01c1c6285735114610e7d36236ed6 Mon Sep 17 00:00:00 2001 From: nils Date: Tue, 31 Dec 2024 13:04:22 +0100 Subject: [PATCH 15/52] =?UTF-8?q?AutoAplit=20vor=20ersetzen=20auf=20Spende?= =?UTF-8?q?nbescheinigung=20pr=C3=BCfen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JVerein/io/SplitbuchungsContainer.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 301ade1d6..ca61d8661 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -431,10 +431,31 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN if (ersetzen) { for (Buchung b : splitbuchungen) - { if (b.getID().equals(buchung.getID())) { + if (b.getSpendenbescheinigung() != null) + { + YesNoDialog dialog = new YesNoDialog(YesNoDialog.POSITION_CENTER); + dialog.setTitle("Spendenbescheinigung löschen"); + dialog.setText( + "Der Buchung ist eine Spendenbescheinigung zugeordnet.\n" + + "Wenn die Buchung der Sollbuchung zugeordnet und gesplittet wir,\n" + + "wird die Spendenbescheinigung gelöscht.\n" + + "Fortfahren und Spendenbescheinigung löschen?"); + try + { + if (!((Boolean) dialog.open()).booleanValue()) + { + return; + } + } + catch (Exception e) + { + Logger.error("Fehler beim Buchung-Sollbuchung-zuordnen-Dialog.", + e); + } + } b.setDelete(true); break; } From 9fd12ca11319aa1d7ce26bc1cc5acd64a83a2065 Mon Sep 17 00:00:00 2001 From: nils Date: Tue, 31 Dec 2024 13:25:10 +0100 Subject: [PATCH 16/52] =?UTF-8?q?Sollbuchungspositionen=20f=C3=BCr=20beste?= =?UTF-8?q?hende=20Sollbuchungen=20erstellen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JVerein/Variable/RechnungMap.java | 8 +- .../JVerein/gui/control/BuchungsControl.java | 120 ++------------ .../gui/control/MitgliedskontoControl.java | 90 ---------- .../gui/input/SollbuchungAuswahlInput.java | 155 ------------------ .../gui/view/SollbuchungDetailView.java | 6 - .../JVerein/io/AbrechnungslaufPDF.java | 15 +- .../JVerein/io/SplitbuchungsContainer.java | 8 - .../jost_net/JVerein/rmi/Mitgliedskonto.java | 26 --- .../server/DDLTool/Updates/Update0456.java | 12 +- .../JVerein/server/MitgliedskontoImpl.java | 120 -------------- 10 files changed, 40 insertions(+), 520 deletions(-) delete mode 100644 src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java diff --git a/src/de/jost_net/JVerein/Variable/RechnungMap.java b/src/de/jost_net/JVerein/Variable/RechnungMap.java index 6f5a6ccb9..d1faa5805 100644 --- a/src/de/jost_net/JVerein/Variable/RechnungMap.java +++ b/src/de/jost_net/JVerein/Variable/RechnungMap.java @@ -204,9 +204,11 @@ public Map getMap(Mitgliedskonto mk, Map inma) } map.put(RechnungVar.BUCHUNGSDATUM.getName(), mk.getDatum()); map.put(RechnungVar.ZAHLUNGSGRUND.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.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()); diff --git a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java index b21fb3ad6..20bf3a6a5 100644 --- a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java +++ b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java @@ -51,11 +51,10 @@ import de.jost_net.JVerein.gui.formatter.MitgliedskontoFormatter; import de.jost_net.JVerein.gui.formatter.ProjektFormatter; import de.jost_net.JVerein.gui.input.BuchungsartInput; +import de.jost_net.JVerein.gui.input.BuchungsartInput.buchungsarttyp; 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.input.BuchungsartInput.buchungsarttyp; import de.jost_net.JVerein.gui.menu.BuchungMenu; import de.jost_net.JVerein.gui.menu.SplitBuchungMenu; import de.jost_net.JVerein.gui.parts.BuchungListTablePart; @@ -67,17 +66,15 @@ import de.jost_net.JVerein.io.BuchungsjournalPDF; import de.jost_net.JVerein.io.SplitbuchungsContainer; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; -import de.jost_net.JVerein.keys.ArtBuchungsart; import de.jost_net.JVerein.keys.AbstractInputAuswahl; +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; } @@ -1043,54 +1003,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/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index 40533d042..b322ff8b1 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -33,9 +33,6 @@ 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.BuchungsartInput.buchungsarttyp; -import de.jost_net.JVerein.gui.input.BuchungsklasseInput; import de.jost_net.JVerein.gui.input.MitgliedInput; import de.jost_net.JVerein.gui.menu.MitgliedskontoMenu; import de.jost_net.JVerein.gui.parts.SollbuchungListTablePart; @@ -44,8 +41,6 @@ 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; @@ -120,10 +115,6 @@ public static DIFFERENZ fromString(final String text) private DecimalInput betrag; - private AbstractInput buchungsart; - - private SelectInput buchungsklasse; - private AbstractInput mitglied; private Mitgliedskonto mkto; @@ -261,68 +252,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()) @@ -401,25 +330,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"); } 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/view/SollbuchungDetailView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java index f2f2f8b5a..4d620a5c7 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; @@ -51,11 +50,6 @@ public void bind() throws Exception 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()); diff --git a/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java b/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java index a4851793f..ee13ca504 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java +++ b/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java @@ -55,10 +55,11 @@ 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("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 +77,10 @@ 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.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/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index ca61d8661..8f50f660b 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -520,14 +520,6 @@ else if (spArray != null && spArray.size() > 0) buchung.setMitgliedskonto(mk); buchung.store(); } - else - { - // Für alte Sollbuchungen ohne Sollbuchungspositionen - buchung.setBuchungsartId(mk.getBuchungsartId()); - buchung.setBuchungsklasseId(mk.getBuchungsklasseId()); - buchung.setMitgliedskonto(mk); - buchung.store(); - } } public static int getAnzahl() diff --git a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java index 831c54940..c1408729e 100644 --- a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java +++ b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java @@ -47,38 +47,12 @@ 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; diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java index e17229225..c6ac0a7f2 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java @@ -13,6 +13,8 @@ **********************************************************************/ 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; @@ -20,8 +22,6 @@ import de.willuhn.util.ApplicationException; import de.willuhn.util.ProgressMonitor; -import java.sql.Connection; - public class Update0456 extends AbstractDDLUpdate { public Update0456(String driver, ProgressMonitor monitor, Connection conn) @@ -91,6 +91,14 @@ public void run() throws ApplicationException "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 Abwertskompabilitä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 b53600dde..395144f4b 100644 --- a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java @@ -24,8 +24,6 @@ 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; @@ -176,65 +174,6 @@ public void setRechnung(Rechnung rechnung) throws RemoteException 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 { @@ -296,57 +235,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 { @@ -414,14 +302,6 @@ public Object getAttribute(String fieldName) throws RemoteException { return getAbrechnungslauf(); } - if (fieldName.equals("buchungsklasse")) - { - return getBuchungsklasse(); - } - if (fieldName.equals("buchungsart")) - { - return getBuchungsart(); - } if (fieldName.equals("rechnungId")) { return getRechnungId(); From 18d20565eaf53c58ecfad67f43db54c81e83cf65 Mon Sep 17 00:00:00 2001 From: nils Date: Wed, 1 Jan 2025 14:53:24 +0100 Subject: [PATCH 17/52] Buchungsart und Klasse in Sollbuchugnslisteentfernt Splitten nur bei >1 Splitbuchungen --- .../gui/control/MitgliedskontoControl.java | 16 ---------------- .../JVerein/gui/view/SollbuchungDetailView.java | 2 +- .../JVerein/io/SplitbuchungsContainer.java | 4 ++-- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index b322ff8b1..106fa0fbb 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -30,8 +30,6 @@ 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.MitgliedInput; import de.jost_net.JVerein.gui.menu.MitgliedskontoMenu; @@ -457,13 +455,6 @@ public String format(Object o) mitgliedskontoList.addColumn("Zahlungseingang", "istsumme", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); mitgliedskontoList.addColumn("Rechnung", "rechnungid"); - 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); @@ -540,13 +531,6 @@ public Part getBuchungenList() throws RemoteException buchungList.addColumn("Betrag", "betrag", 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); diff --git a/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java index 4d620a5c7..cbc65fa11 100644 --- a/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java @@ -46,7 +46,7 @@ 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()); diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 8f50f660b..d707bbec6 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -374,11 +374,11 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) } boolean splitten = false; - if (splitMap.size() > 0 && mk.getBetrag().equals(buchung.getBetrag())) + if (splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) { splitten = true; } - else if (splitMap.size() > 0) + else if (splitMap.size() > 1) { YesNoDialog dialog = new YesNoDialog(YesNoDialog.POSITION_CENTER); dialog.setTitle("Buchung splitten"); From 2b6f2a05ce6d461488830ab8eb883c202fd9af61 Mon Sep 17 00:00:00 2001 From: nils Date: Wed, 1 Jan 2025 15:29:58 +0100 Subject: [PATCH 18/52] Zweck von Soll und Istbuchung angepasst --- src/de/jost_net/JVerein/io/AbrechnungSEPA.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index a3b4c1e67..5dc2cbdcb 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -1211,7 +1211,19 @@ private void writeSollbuchung(JVereinZahler zahler, } else { - zweck = zahler.getVerwendungszweckOrig(); + 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 = (Mitgliedskonto) Einstellungen.getDBService() @@ -1223,7 +1235,6 @@ private void writeSollbuchung(JVereinZahler zahler, if (zahler.getMitglied() != null) { mk.setMitglied(zahler.getMitglied()); - zweck = getVerwendungszweckName(zahler.getMitglied(), zweck); } mk.setZweck1(zweck); mk.setBetrag(0d); From 5ac5bcff4f606ac89bc736abf9b046203c978ff9 Mon Sep 17 00:00:00 2001 From: nils Date: Wed, 1 Jan 2025 16:19:13 +0100 Subject: [PATCH 19/52] Auto SollbuchungZuordnen auch anhand von Verwendungszweck (ZB. Rechnungsnummer) --- .../BuchungenSollbuchungZuordnungDialog.java | 43 +++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java index 7ea5e7e8d..84016b76c 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 = null; + 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,32 @@ 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()) + { + 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 +298,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; } From e3b09803db1bc0906a17a9508e46c0aff16a0eb1 Mon Sep 17 00:00:00 2001 From: nils Date: Wed, 1 Jan 2025 18:56:05 +0100 Subject: [PATCH 20/52] Formatierung und Rechtschreibung --- .../JVerein/gui/action/AbrechnungslaufDeleteAction.java | 4 ++-- .../JVerein/gui/control/MitgliedskontoControl.java | 3 ++- src/de/jost_net/JVerein/gui/control/RechnungControl.java | 7 ++++--- .../gui/dialogs/BuchungenSollbuchungZuordnungDialog.java | 3 ++- src/de/jost_net/JVerein/io/AbrechnungSEPA.java | 2 +- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 6 +++--- .../JVerein/server/DDLTool/Updates/Update0456.java | 2 +- 7 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java b/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java index 11ed06423..b3e498e96 100644 --- a/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java +++ b/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java @@ -208,8 +208,8 @@ else if(spendenbescheinigung && rechnung) } catch (RemoteException ignore) { - //Ignorieren, da die Exeption auftritt wenn die Buchung bereits gelöscht wurde - //zB. bei Splitbuchungen + // Ignorieren, da die Exception auftritt, wenn die Buchung bereits + // gelöscht wurde, z. B. bei Splitbuchungen. } } DBIterator mitgliedskontoIt = Einstellungen.getDBService() diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index 106fa0fbb..90e9503f1 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -521,7 +521,8 @@ public Part getBuchungenList() throws RemoteException { return buchungList; } - DBIterator sps = Einstellungen.getDBService().createList(SollbuchungPosition.class); + DBIterator sps = Einstellungen.getDBService() + .createList(SollbuchungPosition.class); sps.addFilter( "sollbuchung = ?", getMitgliedskonto().getID()); buchungList = new TablePart(sps, null); diff --git a/src/de/jost_net/JVerein/gui/control/RechnungControl.java b/src/de/jost_net/JVerein/gui/control/RechnungControl.java index 2bf55e485..599058458 100644 --- a/src/de/jost_net/JVerein/gui/control/RechnungControl.java +++ b/src/de/jost_net/JVerein/gui/control/RechnungControl.java @@ -801,10 +801,11 @@ public Part getBuchungenList() throws RemoteException { return buchungList; } - DBIterator sps = Einstellungen.getDBService().createList(SollbuchungPosition.class); + DBIterator sps = Einstellungen.getDBService() + .createList(SollbuchungPosition.class); sps.join("mitgliedskonto"); - sps.addFilter( "mitgliedskonto.id = sollbuchungposition.sollbuchung"); - sps.addFilter("mitgliedskonto.rechnung = ?",getRechnung().getID()); + sps.addFilter("mitgliedskonto.id = sollbuchungposition.sollbuchung"); + sps.addFilter("mitgliedskonto.rechnung = ?", getRechnung().getID()); sps.setOrder("order by sollbuchungposition.datum"); buchungList = new TablePart(sps, null); diff --git a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java index 84016b76c..6a0b37b9a 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungDialog.java @@ -79,7 +79,7 @@ public class BuchungenSollbuchungZuordnungDialog extends AbstractDialog private CheckboxInput useMemberNumber = null; private CheckboxInput useName = null; - private CheckboxInput useZweck = null; + private CheckboxInput useZweck; private Settings settings = null; @@ -260,6 +260,7 @@ 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(); diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 5dc2cbdcb..8a78cc884 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -400,7 +400,7 @@ else if (zahler.getZahlungsweg() if (param.pdffileRCUR != null) { - // Nur für die PDF erstellung müssen die Zahler in der Lastschrift + // Nur für die PDF-Erzeugung müssen die Zahler in der Lastschrift // enthalten sein for (JVereinZahler z : zahlerarray) { diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index d707bbec6..a3d3f0017 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -384,8 +384,8 @@ else if (splitMap.size() > 1) dialog.setTitle("Buchung splitten"); dialog.setText( "Der Betrag der Sollbuchung entspricht nicht dem der Buchung.\n" - + "Soll die Buchung trotzdem anhand der Sollbuchungs-Positionen\n" - + "gesplittet werden und eine Restbuchung erzeugt werden?"); + + "Soll die Buchung trotzdem anhand der Sollbuchungspositionen\n" + + "gesplittet und eine Restbuchung erzeugt werden?"); try { splitten = ((Boolean) dialog.open()).booleanValue(); @@ -395,7 +395,7 @@ else if (splitMap.size() > 1) Logger.error("Fehler beim Buchung-Sollbuchung-zuordnen-Dialog.", e); } } - if(splitten) + if (splitten) { boolean ersetzen = false; if (buchung.getBuchungsartId() == null diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java index c6ac0a7f2..3651d00b0 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java @@ -94,7 +94,7 @@ public void run() throws ApplicationException // Für bestehende Sollbuchungen Sollbuchungpositionen erstellen // Vorerst bleiben in der Tabelle Mitgliedskonto die Spalten // buchungsart, buchungsklasse, steuersatz, nettobetrag, steuerbetrag - // bestehen damit eine Abwertskompabilität besteht + // 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;"); From 3d471def23e4a01ffe698f598f666eee009d312d Mon Sep 17 00:00:00 2001 From: nils Date: Wed, 1 Jan 2025 22:52:26 +0100 Subject: [PATCH 21/52] Abrechnunglauf PDF Steuer entfernt --- src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java b/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java index ee13ca504..042e0fbb1 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java +++ b/src/de/jost_net/JVerein/io/AbrechnungslaufPDF.java @@ -55,11 +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, @@ -77,10 +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()), From d3ce0400ab6e616663d6e0557d27e522ee1f3787 Mon Sep 17 00:00:00 2001 From: nils Date: Thu, 2 Jan 2025 20:32:59 +0100 Subject: [PATCH 22/52] =?UTF-8?q?MitglieskontoExport=20=C3=BCberarbeitet?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JVerein/Variable/RechnungMap.java | 26 ---------- .../JVerein/Variable/SollbuchungMap.java | 52 +++++++++++++++++++ .../JVerein/Variable/SollbuchungVar.java | 38 ++++++++++++++ .../gui/control/MitgliedskontoControl.java | 5 ++ .../JVerein/io/SollbuchungExportCSV.java | 6 +-- 5 files changed, 98 insertions(+), 29 deletions(-) create mode 100644 src/de/jost_net/JVerein/Variable/SollbuchungMap.java create mode 100644 src/de/jost_net/JVerein/Variable/SollbuchungVar.java diff --git a/src/de/jost_net/JVerein/Variable/RechnungMap.java b/src/de/jost_net/JVerein/Variable/RechnungMap.java index d1faa5805..a7e344c74 100644 --- a/src/de/jost_net/JVerein/Variable/RechnungMap.java +++ b/src/de/jost_net/JVerein/Variable/RechnungMap.java @@ -28,7 +28,6 @@ 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; @@ -189,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.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/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/Variable/SollbuchungVar.java b/src/de/jost_net/JVerein/Variable/SollbuchungVar.java new file mode 100644 index 000000000..89d0e0b91 --- /dev/null +++ b/src/de/jost_net/JVerein/Variable/SollbuchungVar.java @@ -0,0 +1,38 @@ +/********************************************************************** + * 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; + +public enum SollbuchungVar +{ + ZAHLUNGSGRUND("sollbuchung_zahlungsgrund"), // + BUCHUNGSDATUM("sollbuchung_buchungsdatum"), + BETRAG("sollbuchung_betrag"), // + IST("sollbuchung_ist"), // + DIFFERENZ("sollbuchung_differenz"); + + private String name; + + SollbuchungVar(String name) + { + this.name = name; + } + + public String getName() + { + return name; + } +} diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index 90e9503f1..be5df265e 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -532,6 +532,11 @@ public Part getBuchungenList() throws RemoteException buchungList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); buchungList.addColumn("Steuersatz", "steuersatz"); + buchungList.addColumn("Buchungsart", "buchungsart"); + if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) + { + buchungList.addColumn("Buchungsklasse", "buchungsklasse"); + } buchungList.setRememberColWidths(true); buchungList.setRememberOrder(true); 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())); From 25c686dae6597bcee4207d7d88125765d6028105 Mon Sep 17 00:00:00 2001 From: nils Date: Wed, 1 Jan 2025 22:32:29 +0100 Subject: [PATCH 23/52] Zweck der Splitbuchung aus Positionen bestimmen --- .../JVerein/io/SplitbuchungsContainer.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index a3d3f0017..842d7b696 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -34,6 +34,7 @@ import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.dialogs.YesNoDialog; +import de.willuhn.jameica.system.Settings; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; @@ -346,6 +347,7 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) return; } HashMap splitMap = new HashMap<>(); + HashMap splitZweckMap = new HashMap<>(); ArrayList spArray = mk.getSollbuchungPositionList(); for (SollbuchungPosition sp : spArray) { @@ -366,10 +368,14 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) if (betrag == null) { splitMap.put(key, sp.getBetrag().doubleValue()); + splitZweckMap.put(key, sp.getZweck() + " " + sp.getBetrag()); } else { splitMap.replace(key, betrag + sp.getBetrag().doubleValue()); + String zweck = splitZweckMap.get(key); + splitZweckMap.replace(key, + zweck + ", " + sp.getZweck() + " " + sp.getBetrag()); } } @@ -461,6 +467,8 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN } } } + boolean splitPositionZweck = new Settings(SplitbuchungsContainer.class) + .getBoolean("splitPositionZweck", true); while (iterator.hasNext()) { Entry entry = iterator.next(); @@ -471,7 +479,14 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN splitBuchung.setDatum(buchung.getDatum()); splitBuchung.setKonto(buchung.getKonto()); splitBuchung.setName(buchung.getName()); - splitBuchung.setZweck(buchung.getZweck()); + 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("-")); From 48e1f2947e8bbd37a822d525d56d2fa479c6ea98 Mon Sep 17 00:00:00 2001 From: nils Date: Thu, 2 Jan 2025 21:16:57 +0100 Subject: [PATCH 24/52] FormularfeldView deprecated RechnungVar ausblenden --- .../jost_net/JVerein/gui/control/FormularfeldControl.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java index 7607afaf2..4f26d51af 100644 --- a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java +++ b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java @@ -242,7 +242,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()); + } } } From 2ca87bccb10f086b8c7e985d8cec5b49a49c6cbc Mon Sep 17 00:00:00 2001 From: nils Date: Sun, 5 Jan 2025 14:09:30 +0100 Subject: [PATCH 25/52] Manuelles erstellen von Rechnungen --- .../gui/action/RechnungAutoNeuAction.java | 33 -- .../JVerein/gui/action/RechnungNeuAction.java | 100 +++++ .../gui/action/SollbuchungRechnungAction.java | 31 +- .../gui/control/MitgliedskontoControl.java | 2 +- .../JVerein/gui/control/RechnungControl.java | 132 ------- .../gui/dialogs/FormularAuswahlDialog.java | 73 ++++ .../JVerein/gui/menu/SollbuchungMenu.java | 68 +++- .../JVerein/gui/view/RechnungAutoNeuView.java | 69 ---- .../JVerein/gui/view/RechnungListeView.java | 4 - .../jost_net/JVerein/io/AbrechnungSEPA.java | 118 ++---- .../jost_net/JVerein/rmi/Mitgliedskonto.java | 2 - src/de/jost_net/JVerein/rmi/Rechnung.java | 4 + .../JVerein/server/MitgliedskontoImpl.java | 10 - .../jost_net/JVerein/server/RechnungImpl.java | 56 ++- .../jost_net/JVerein/server/RechnungNode.java | 357 ------------------ 15 files changed, 353 insertions(+), 706 deletions(-) delete mode 100644 src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java create mode 100644 src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java create mode 100644 src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java delete mode 100644 src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java delete mode 100644 src/de/jost_net/JVerein/server/RechnungNode.java diff --git a/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java b/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java deleted file mode 100644 index d44b26633..000000000 --- a/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java +++ /dev/null @@ -1,33 +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.action; - -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 -{ - - @Override - public void handleAction(Object context) throws ApplicationException - { - GUI.startView(RechnungAutoNeuView.class.getName(), null); - } - -} 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..002c79d7a --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java @@ -0,0 +1,100 @@ +/********************************************************************** + * 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 + + " Sollbuchunge enthalten bereits Rechnungen."); + } + else { + 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/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index be5df265e..632563c50 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -454,7 +454,7 @@ public String format(Object o) }); mitgliedskontoList.addColumn("Zahlungseingang", "istsumme", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - mitgliedskontoList.addColumn("Rechnung", "rechnungid"); + mitgliedskontoList.addColumn("Rechnung", "rechnung"); mitgliedskontoList.setContextMenu(menu); mitgliedskontoList.setRememberColWidths(true); mitgliedskontoList.setRememberOrder(true); diff --git a/src/de/jost_net/JVerein/gui/control/RechnungControl.java b/src/de/jost_net/JVerein/gui/control/RechnungControl.java index 599058458..8346538b5 100644 --- a/src/de/jost_net/JVerein/gui/control/RechnungControl.java +++ b/src/de/jost_net/JVerein/gui/control/RechnungControl.java @@ -20,11 +20,7 @@ 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; @@ -42,12 +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.rmi.SollbuchungPosition; -import de.jost_net.JVerein.server.RechnungNode; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.jost_net.JVerein.util.StringTool; import de.willuhn.datasource.GenericIterator; @@ -61,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; @@ -170,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; @@ -260,11 +220,6 @@ public void TabRefresh() } rechnungList.sort(); } - else if (rechnungTree != null) - { - rechnungTree.removeAll(); - rechnungTree.setList(Arrays.asList(new RechnungNode(this))); - } } catch (RemoteException e1) { @@ -368,93 +323,6 @@ public Object extract(ResultSet rs) 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; - } - @Override public String getInfoText(Object selection) { 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..fd4b98e86 --- /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 für das für die\n" + + "Rechnungen verwendet werden soll auswählen.", + true); + formular = new FormularInput(FormularArt.RECHNUNG); + group.addLabelPair("Formular", formular); + + ButtonArea buttons = new ButtonArea(); + buttons.addButton("Rechnungen 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/menu/SollbuchungMenu.java b/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java index 304e58c56..835cbef62 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 @@ -93,4 +92,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/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/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 8a78cc884..b66388410 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -1125,6 +1125,34 @@ private void writeSollbuchung(JVereinZahler zahler, Rechnung re = null; if (spArray != null) { + mk = (Mitgliedskonto) Einstellungen.getDBService() + .createObject(Mitgliedskonto.class, null); + mk.setAbrechnungslauf(abrl); + mk.setZahlungsweg(zahler.getZahlungsweg().getKey()); + + mk.setDatum(datum); + if (zahler.getMitglied() != null) + { + mk.setMitglied(zahler.getMitglied()); + } + // Zweck wird später gefüllt, es muss aber schon was drin stehen damit + // gespeichert werden kann + mk.setZweck1(" "); + mk.setBetrag(0d); + mk.store(); + + if (summe == null) + { + summe = 0d; + } + for (SollbuchungPosition sp : spArray) + { + summe += sp.getBetrag().doubleValue(); + sp.setSollbuchung(mk.getID()); + sp.store(); + } + mk.setBetrag(summe); + // Rechnungen nur für (Nicht-)Mitglieder unterstützt // (nicht für Kursteilnehmer) if (param.rechnung && zahler.getMitglied() != null) @@ -1134,65 +1162,19 @@ private void writeSollbuchung(JVereinZahler zahler, { throw new ApplicationException("Kein Rechnungs-Formular ausgewählt"); } - Mitglied mitglied = zahler.getMitglied(); + re = (Rechnung) Einstellungen.getDBService() .createObject(Rechnung.class, null); - re.setMitglied(Integer.parseInt(mitglied.getID())); re.setFormular(form); - if (mitglied.getKtoiName() == null - || mitglied.getKtoiName().length() == 0) - { - re.setPersonenart(mitglied.getPersonenart()); - re.setAnrede(mitglied.getAnrede()); - re.setTitel(mitglied.getTitel()); - re.setName(mitglied.getName()); - re.setVorname(mitglied.getVorname()); - re.setStrasse(mitglied.getStrasse()); - re.setAdressierungszusatz(mitglied.getAdressierungszusatz()); - re.setPlz(mitglied.getPlz()); - re.setOrt(mitglied.getOrt()); - re.setStaat(mitglied.getStaat()); - // re.setEmail(mitglied.getEmail()); - re.setGeschlecht(mitglied.getGeschlecht()); - } - else - { - re.setPersonenart(mitglied.getKtoiPersonenart()); - re.setAnrede(mitglied.getKtoiAnrede()); - re.setTitel(mitglied.getKtoiTitel()); - re.setName(mitglied.getKtoiName()); - re.setVorname(mitglied.getKtoiVorname()); - re.setStrasse(mitglied.getKtoiStrasse()); - re.setAdressierungszusatz(mitglied.getKtoiAdressierungszusatz()); - re.setPlz(mitglied.getKtoiPlz()); - re.setOrt(mitglied.getKtoiOrt()); - re.setStaat(mitglied.getKtoiStaat()); - // re.setEmail(mitglied.getKtoiEmail()); - re.setGeschlecht(mitglied.getKtoiGeschlecht()); - } - re.setDatum(new Date()); - if (!mitglied.getMandatDatum().equals(Einstellungen.NODATE)) - { - re.setMandatDatum(mitglied.getMandatDatum()); - } - re.setMandatID(mitglied.getMandatID()); - re.setBIC(mitglied.getBic()); - re.setIBAN(mitglied.getIban()); - re.setZahlungsweg(zahler.getZahlungsweg().getKey()); - - double reSumme = 0; - for (SollbuchungPosition sp : spArray) - { - reSumme += sp.getBetrag().doubleValue(); - } - re.setBetrag(reSumme); + re.fill(mk); re.store(); zweck = param.rechnungstext; boolean ohneLesefelder = !zweck.contains(Einstellungen.LESEFELD_PRE); Map map = new AllgemeineMap().getMap(null); - map = new MitgliedMap().getMap(mitglied, map, ohneLesefelder); + map = new MitgliedMap().getMap(zahler.getMitglied(), map, + ohneLesefelder); map = new RechnungMap().getMap(re, map); map = new AbrechnungsParameterMap().getMap(param, map); try @@ -1208,6 +1190,10 @@ private void writeSollbuchung(JVereinZahler zahler, Logger.error("Fehler bei der Aufbereitung der Variablen", e); } zahler.setVerwendungszweck(zweck); + + mk.setZweck1(zweck); + mk.setRechnung(re); + mk.store(); } else { @@ -1224,35 +1210,9 @@ private void writeSollbuchung(JVereinZahler zahler, } zweck = zweck.substring(2); } + mk.setZweck1(zweck); + mk.store(); } - - mk = (Mitgliedskonto) Einstellungen.getDBService() - .createObject(Mitgliedskonto.class, null); - mk.setAbrechnungslauf(abrl); - mk.setZahlungsweg(zahler.getZahlungsweg().getKey()); - - mk.setDatum(datum); - if (zahler.getMitglied() != null) - { - mk.setMitglied(zahler.getMitglied()); - } - mk.setZweck1(zweck); - mk.setBetrag(0d); - mk.store(); - - if (summe == null) - { - summe = 0d; - } - for (SollbuchungPosition sp : spArray) - { - summe += sp.getBetrag().doubleValue(); - sp.setSollbuchung(mk.getID()); - sp.store(); - } - mk.setBetrag(summe); - mk.setRechnung(re); - mk.store(); } if (haben) @@ -1279,7 +1239,7 @@ else if (zahler != null buchung.setZweck(zahler == null ? "Gegenbuchung" : zweck); buchung.store(); - if (spArray != null) + if (mk != null) { // Buchungen automatisch splitten SplitbuchungsContainer.autoSplit(buchung, mk); diff --git a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java index c1408729e..143da12a6 100644 --- a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java +++ b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java @@ -57,8 +57,6 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) public void setRechnung(Rechnung rechnung) throws RemoteException; - public Long getRechnungId() 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 70ef9d765..7c8579ac9 100644 --- a/src/de/jost_net/JVerein/rmi/Rechnung.java +++ b/src/de/jost_net/JVerein/rmi/Rechnung.java @@ -23,6 +23,7 @@ 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 { @@ -32,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; diff --git a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java index 395144f4b..c2a496dfa 100644 --- a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java @@ -159,12 +159,6 @@ public Rechnung getRechnung() throws RemoteException return (Rechnung) getAttribute("rechnung"); } - @Override - public Long getRechnungId() throws RemoteException - { - return (Long) super.getAttribute("rechnung"); - } - @Override public void setRechnung(Rechnung rechnung) throws RemoteException { @@ -302,10 +296,6 @@ public Object getAttribute(String fieldName) throws RemoteException { return getAbrechnungslauf(); } - if (fieldName.equals("rechnungId")) - { - return getRechnungId(); - } return super.getAttribute(fieldName); } diff --git a/src/de/jost_net/JVerein/server/RechnungImpl.java b/src/de/jost_net/JVerein/server/RechnungImpl.java index 8f03b398b..87216ff92 100644 --- a/src/de/jost_net/JVerein/server/RechnungImpl.java +++ b/src/de/jost_net/JVerein/server/RechnungImpl.java @@ -24,8 +24,8 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.io.IAdresse; -import de.jost_net.JVerein.keys.Zahlungsweg; 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; @@ -36,6 +36,7 @@ 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 { @@ -353,6 +354,59 @@ public ArrayList getSollbuchungPositionList() 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 public String getMandatID() 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; - } -} From e95e6d8cf0326049b08f134b11808916381c8a68 Mon Sep 17 00:00:00 2001 From: nils Date: Sun, 5 Jan 2025 15:34:47 +0100 Subject: [PATCH 26/52] Automatisch Felder diablen wenn keine Abrechnung mit Rechnung --- .../gui/control/AbrechnungSEPAControl.java | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java index bad22ddfe..b632c007d 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java @@ -260,6 +260,7 @@ public CheckboxInput getSollbuchungenZusammenfassen() } sollbuchungenzusammenfassen = new CheckboxInput( settings.getBoolean("sollbuchungenzusammenfassen", false)); + sollbuchungenzusammenfassen.addListener(new ZusammenfassenListener()); return sollbuchungenzusammenfassen; } @@ -272,6 +273,7 @@ public CheckboxInput getRechnung() } rechnung = new CheckboxInput( settings.getBoolean("rechnung", false)); + rechnung.addListener(new RechnungListener()); return rechnung; } @@ -283,6 +285,7 @@ public FormularInput getRechnungFormular() throws RemoteException } rechnungsformular = new FormularInput( FormularArt.RECHNUNG, settings.getString("rechnungsformular", "")); + rechnungsformular.setEnabled(settings.getBoolean("rechnung", false)); return rechnungsformular; } @@ -294,6 +297,7 @@ public TextInput getRechnungstext() } rechnungstext = new TextInput( settings.getString("rechnungstext", "RE$rechnung_nummer")); + rechnungstext.setEnabled(settings.getBoolean("rechnung", false)); return rechnungstext; } @@ -534,4 +538,44 @@ public boolean isInterrupted() 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); + } + } + } } From cc4699a0defe66e20fe0042962d60a218ff00753 Mon Sep 17 00:00:00 2001 From: nils Date: Sun, 5 Jan 2025 22:59:43 +0100 Subject: [PATCH 27/52] =?UTF-8?q?Abrechnung=20=C3=BCberarbeitet.=20Sollbuc?= =?UTF-8?q?hungen=20nach=20Mitglied=20getrennt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jost_net/JVerein/io/AbrechnungSEPA.java | 579 +++++++++--------- 1 file changed, 282 insertions(+), 297 deletions(-) diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index b66388410..65bbdfe0b 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -28,7 +28,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; -import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.Iterator; @@ -102,7 +101,7 @@ public class AbrechnungSEPA private final Calendar sepagueltigkeit; private int counter = 0; - + private BackgroundTask interrupt; private HashMap> zahlermap = new HashMap<>(); @@ -110,7 +109,7 @@ public class AbrechnungSEPA public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor, BackgroundTask backgroundTask) throws Exception { - this.interrupt = backgroundTask; + interrupt = backgroundTask; if (Einstellungen.getEinstellung().getName() == null || Einstellungen.getEinstellung().getName().length() == 0 || Einstellungen.getEinstellung().getIban() == null @@ -124,7 +123,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."); } @@ -138,7 +139,7 @@ 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"); @@ -147,12 +148,12 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor, ArrayList zahlerarray = new ArrayList<>(); // Mitglieder Abrechnen und zahlerMap füllen - abrechnenMitglieder(param, abrl, konto, monitor); + abrechnenMitglieder(param, monitor); if (param.zusatzbetraege) { // Zusatzbetraege Abrechnen und zahlerMap füllen - abbuchenZusatzbetraege(param, abrl, konto, monitor); + abbuchenZusatzbetraege(param, abrl, monitor); } if (param.kursteilnehmer) @@ -162,217 +163,150 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor, zahlerarray = abbuchenKursteilnehmer(param, abrl, konto, monitor); } - monitor.log(counter + " abgerechnete Fälle"); - Iterator>> iterator = zahlermap .entrySet().iterator(); + 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"); } - HashMap> spMap = new HashMap<>(); - HashMap gesamtZahlerMap = new HashMap<>(); ArrayList zahlerList = iterator.next().getValue(); - //Nach Betrag sortieren damit auch erstettungen funktionieren - zahlerList.sort(new Comparator() - { - @Override - public int compare(JVereinZahler z1, JVereinZahler z2) + + // Nach Mitglied und Betrag sortieren damit auch erstattungen + // funktionieren und bei Vollzahler erst die Positionen des Vollzahler + // eingetragen werden + zahlerList.sort((z1, z2) -> { + try { - try - { + if (z1.getMitglied().equals(z2.getMitglied())) return z2.getBetrag().compareTo(z1.getBetrag()); - } - catch (SEPAException e) - { - return 0; - } + else + return z1.getPersonId().equals(z1.getMitglied().getID()) ? -1 : 1; + } + catch (SEPAException | RemoteException e) + { + return 0; } }); - for (JVereinZahler zahler : zahlerList) + + ArrayList verwendungszwecke = new ArrayList<>(); + if (!param.sollbuchungenzusammenfassen) { - // Sollbuchungsositionen in Map füllen - if (param.sollbuchungenzusammenfassen) + for (JVereinZahler zahler : zahlerList) { - ArrayList spArray = spMap - .get(zahler.getZahlungsweg()); - if (spArray == null) - { - spArray = new ArrayList<>(); - spArray.add(getSollbuchungPosition(zahler)); - spMap.put(zahler.getZahlungsweg(), spArray); - } - else + // 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) { - spArray.add(getSollbuchungPosition(zahler)); - spMap.replace(zahler.getZahlungsweg(), spArray); + zahlerarray.add(zahler); } } - else + } + else + { + // Pro Zahlungsweg und Mitglied eine Sollbuchung + HashMap> spMap = new HashMap<>(); + HashMap mitgliedMap = new HashMap<>(); + for (JVereinZahler zahler : zahlerList) { - // Für jede Buchung eine Sollbuchung mit einer Sollbuchungsposition. - ArrayList sbArray = new ArrayList<>(); - sbArray.add(getSollbuchungPosition(zahler)); + mitgliedMap.put(zahler.getMitglied().getID(), zahler.getMitglied()); - writeSollbuchung(zahler, sbArray, param.faelligkeit, abrl, konto, - zahler.getZahlungsweg().getKey() == Zahlungsweg.BASISLASTSCHRIFT, - param, null); + String key = zahler.getZahlungsweg().getKey() + + zahler.getMitglied().getID(); + ArrayList spArray = spMap.getOrDefault(key, + new ArrayList<>()); + + spArray.add(getSollbuchungPosition(zahler)); + spMap.put(key, spArray); } - // Bei kompakter Abbuchung Zahler zusammenfassen. - if (param.kompakteabbuchung || param.sollbuchungenzusammenfassen) + for (Entry> entry : spMap + .entrySet()) { - JVereinZahler gesamtZahler = gesamtZahlerMap - .get(zahler.getZahlungsweg()); - if (gesamtZahler == null) - { - gesamtZahler = zahler; - gesamtZahlerMap.put(zahler.getZahlungsweg(), gesamtZahler); - } - else + // 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) { - try + if (!zahler.getMitglied().getID().equals(zahler.getPersonId())) { - gesamtZahler.add(zahler); + zahler.setVerwendungszweck(zahler.getVerwendungszweck() + " " + + zahler.getMitglied().getVorname()); } - catch (SEPAException se) + if (gesamtZahler == null) { - throw new ApplicationException( - "Ungültiger Betrag: " + zahler.getBetrag()); + gesamtZahler = zahler; + } + else + { + try + { + gesamtZahler.add(zahler); + } + catch (SEPAException se) + { + throw new ApplicationException( + "Ungültiger Betrag: " + zahler.getBetrag()); + } } - gesamtZahlerMap.replace(zahler.getZahlungsweg(), gesamtZahler); } } - // Bei nicht kompakter Abbuchung Lastschriten direkt füllen. - else if (zahler.getZahlungsweg() - .getKey() == Zahlungsweg.BASISLASTSCHRIFT) + if (gesamtZahler != null) { - zahlerarray.add(zahler); - } - } - - // Bei kompakter Abbuchung erst hier die zusammengefassten Lastschriften - // hinzufügen. - JVereinZahler lsGesamtZahler = gesamtZahlerMap - .get(new Zahlungsweg(Zahlungsweg.BASISLASTSCHRIFT)); - if ((param.kompakteabbuchung || param.sollbuchungenzusammenfassen) - && lsGesamtZahler != null) - { - zahlerarray.add(lsGesamtZahler); - } - - if (param.sollbuchungenzusammenfassen) - { - // Für jeden Zahlungsweg eine Sollbuchung mit X Sollbuchungspositionen. - Iterator>> spIterator = spMap - .entrySet().iterator(); - // Wird für die verschiedenen Zahlungswege des Mitglieds durchlaufen. - while (spIterator.hasNext()) - { - Entry> entry = spIterator - .next(); - ArrayList spArray = entry.getValue(); - - JVereinZahler zahler = gesamtZahlerMap - .get((Zahlungsweg) entry.getKey()); - writeSollbuchung(zahler, spArray, param.faelligkeit, abrl, konto, - ((Zahlungsweg) entry.getKey()) - .getKey() == Zahlungsweg.BASISLASTSCHRIFT, - param, null); + if (param.rechnung && verwendungszwecke.size() > 0) + { + gesamtZahler + .setVerwendungszweck(String.join(", ", verwendungszwecke)); + } + zahlerarray.add(gesamtZahler); } } } + // Lastschriften erstellen + 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 = (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()); + Lastschrift ls = getLastschrift(zahler, abrl); ls.store(); } // Gegenbuchung für die Sollbuchungen schreiben if (!summelastschriften.equals(BigDecimal.valueOf(0))) { - writeSollbuchung(null, null, param.faelligkeit, abrl, konto, true, param, + writeSollbuchung(Zahlungsweg.BASISLASTSCHRIFT, null, null, + param.faelligkeit, abrl, konto, param, summelastschriften.doubleValue()); } @@ -387,15 +321,13 @@ else if (zahler.getZahlungsweg() param.sepafileRCUR.getAbsolutePath())); } - if (param.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) + // Wenn keine Buchungen vorhanden sind, wird nichts an Hibiscus übergeben. + if ((param.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) + && (zahlerarray.size() != 0)) { - // Wenn keine Buchungen vorhanden sind, wird nichts an Hibiscus übergeben. - if (zahlerarray.size() != 0) - { - buchenHibiscus(param, zahlerarray); - monitor.log("Hibiscus-Lastschrift erzeugt."); - param.setText(String.format(", Hibiscus-Lastschrift erzeugt.")); - } + buchenHibiscus(param, zahlerarray); + monitor.log("Hibiscus-Lastschrift erzeugt."); + param.setText(String.format(", Hibiscus-Lastschrift erzeugt.")); } if (param.pdffileRCUR != null) @@ -414,11 +346,11 @@ else if (zahler.getZahlungsweg() ausdruckenSEPA(lastschrift, param.pdffileRCUR); } - monitor.log("Abrechnung durchgeführt"); + monitor.setStatusText(counter + " abgerechnete Fälle"); } private void abrechnenMitglieder(AbrechnungSEPAParam param, - Abrechnungslauf abrl, Konto konto, ProgressMonitor monitor) + ProgressMonitor monitor) throws Exception { if (param.abbuchungsmodus != Abrechnungsmodi.KEINBEITRAG) @@ -430,23 +362,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) @@ -455,43 +387,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)); } } @@ -507,8 +439,8 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, } Mitglied m = list.next(); - JVereinZahler zahler = abrechnungMitgliederSub(param, monitor, abrl, - konto, m, m.getBeitragsgruppe(), true); + JVereinZahler zahler = abrechnungMitgliederSub(param, monitor, m, + m.getBeitragsgruppe(), true); if (zahler != null) { @@ -535,7 +467,7 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, { SekundaereBeitragsgruppe sb = sekundaer.next(); JVereinZahler zahlerSekundaer = abrechnungMitgliederSub(param, - monitor, abrl, konto, m, sb.getBeitragsgruppe(), false); + monitor, m, sb.getBeitragsgruppe(), false); if (zahlerSekundaer != null) { ArrayList zlist = zahlermap.get( @@ -565,7 +497,7 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, } private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, - ProgressMonitor monitor, Abrechnungslauf abrl, Konto konto, Mitglied m, + ProgressMonitor monitor, Mitglied m, Beitragsgruppe bg, boolean primaer) throws RemoteException, ApplicationException { @@ -583,14 +515,12 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, 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 null; - } + return null; } try @@ -605,13 +535,10 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, throw new ApplicationException( "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)) { @@ -656,15 +583,9 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, } zahler.setDatum(param.faelligkeit); zahler.setMitglied(m); - if (m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) - { - zahler.setVerwendungszweck( - (primaer ? param.verwendungszweck : bg.getBezeichnung()) + " " - + m.getVorname()); - } - else if (primaer) + if (primaer) { - String vzweck = abrl.getZahlungsgrund(); + String vzweck = getVerwendungszweck(param); boolean ohneLesefelder = !vzweck.contains(Einstellungen.LESEFELD_PRE); Map map = new AllgemeineMap().getMap(null); map = new MitgliedMap().getMap(m, map, ohneLesefelder); @@ -700,12 +621,14 @@ else if (primaer) @SuppressWarnings({ "rawtypes", "unchecked" }) private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, - Abrechnungslauf abrl, Konto konto, ProgressMonitor monitor) - throws Exception + 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()) @@ -716,11 +639,6 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, if (z.isAktiv(param.stichtag)) { Mitglied m = z.getMitglied(); - if (!m.isAngemeldet(param.stichtag) - && !Einstellungen.getEinstellung().getZusatzbetragAusgetretene()) - { - continue; - } Mitglied mZahler = m; if (m.getZahlungsweg() != null && m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) @@ -868,7 +786,7 @@ private ArrayList abbuchenKursteilnehmer( { throw new ApplicationException("Abrechnung abgebrochen"); } - + counter++; Kursteilnehmer kt = list.next(); try @@ -891,14 +809,15 @@ private ArrayList abbuchenKursteilnehmer( .setVerwendungszweck(getVerwendungszweckName(kt, kt.getVZweck1())); zahler.setZahlungsweg(new Zahlungsweg(Zahlungsweg.BASISLASTSCHRIFT)); zahler.setDatum(param.faelligkeit); - zahlerarray.add(zahler); kt.setAbbudatum(param.faelligkeit); kt.store(); ArrayList spArray = new ArrayList<>(); spArray.add(getSollbuchungPosition(zahler)); - writeSollbuchung(zahler, spArray, param.faelligkeit, abrl, konto, true, - param, null); + 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())); @@ -917,21 +836,15 @@ 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)); } }); } @@ -1115,9 +1028,93 @@ private SollbuchungPosition getSollbuchungPosition(JVereinZahler zahler) return sp; } - private void writeSollbuchung(JVereinZahler zahler, + 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, boolean haben, AbrechnungSEPAParam param, Double summe) + Konto konto, AbrechnungSEPAParam param, Double summe) throws ApplicationException, RemoteException, SEPAException { Mitgliedskonto mk = null; @@ -1128,12 +1125,12 @@ private void writeSollbuchung(JVereinZahler zahler, mk = (Mitgliedskonto) Einstellungen.getDBService() .createObject(Mitgliedskonto.class, null); mk.setAbrechnungslauf(abrl); - mk.setZahlungsweg(zahler.getZahlungsweg().getKey()); + mk.setZahlungsweg(zahlungsweg); mk.setDatum(datum); - if (zahler.getMitglied() != null) + if (adress instanceof Mitglied) { - mk.setMitglied(zahler.getMitglied()); + mk.setMitglied((Mitglied) adress); } // Zweck wird später gefüllt, es muss aber schon was drin stehen damit // gespeichert werden kann @@ -1141,21 +1138,18 @@ private void writeSollbuchung(JVereinZahler zahler, mk.setBetrag(0d); mk.store(); - if (summe == null) - { - summe = 0d; - } + summe = 0d; for (SollbuchungPosition sp : spArray) { - summe += sp.getBetrag().doubleValue(); + 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 && zahler.getMitglied() != null) + if (param.rechnung && adress instanceof Mitglied) { Formular form = param.rechnungsformular; if (form == null) @@ -1169,33 +1163,34 @@ private void writeSollbuchung(JVereinZahler zahler, re.setFormular(form); re.fill(mk); re.store(); + mk.setRechnung(re); - zweck = param.rechnungstext; - boolean ohneLesefelder = !zweck.contains(Einstellungen.LESEFELD_PRE); - Map map = new AllgemeineMap().getMap(null); - map = new MitgliedMap().getMap(zahler.getMitglied(), map, - ohneLesefelder); - map = new RechnungMap().getMap(re, map); - map = new AbrechnungsParameterMap().getMap(param, map); - try + if (param.rechnungstext.trim().length() > 0) { - zweck = VelocityTool.eval(map, zweck); - if (zweck.length() >= 140) + 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 = zweck.substring(0, 136) + "..."; + 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); } - } - catch (IOException e) - { - Logger.error("Fehler bei der Aufbereitung der Variablen", e); - } - zahler.setVerwendungszweck(zweck); - mk.setZweck1(zweck); - mk.setRechnung(re); - mk.store(); + mk.setZweck1(zweck); + } } - else + if (zweck == null) { if (spArray.size() == 1) { @@ -1211,11 +1206,11 @@ private void writeSollbuchung(JVereinZahler zahler, zweck = zweck.substring(2); } mk.setZweck1(zweck); - mk.store(); } + mk.store(); } - if (haben) + if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT) { Buchung buchung = (Buchung) Einstellungen.getDBService() .createObject(Buchung.class, null); @@ -1223,20 +1218,9 @@ private void writeSollbuchung(JVereinZahler zahler, buchung.setBetrag(summe); buchung.setDatum(datum); buchung.setKonto(konto); - IAdresse adr = null; - if (zahler != null && zahler.getPersonTyp() == JVereinZahlerTyp.MITGLIED) - { - adr = zahler.getMitglied(); - } - else if (zahler != null - && zahler.getPersonTyp() == JVereinZahlerTyp.KURSTEILNEHMER) - { - adr = (IAdresse) Einstellungen.getDBService() - .createObject(Kursteilnehmer.class, zahler.getPersonId()); - } - buchung.setName( - adr != null ? Adressaufbereitung.getNameVorname(adr) : "JVerein"); - buchung.setZweck(zahler == null ? "Gegenbuchung" : zweck); + buchung.setName(adress != null ? Adressaufbereitung.getNameVorname(adress) + : "JVerein"); + buchung.setZweck(adress == null ? "Gegenbuchung" : zweck); buchung.store(); if (mk != null) @@ -1245,6 +1229,7 @@ else if (zahler != null SplitbuchungsContainer.autoSplit(buchung, mk); } } + return zweck; } /** From 36daafde58d6598c562af14f60c6ec81e49ad47a Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 6 Jan 2025 13:42:51 +0100 Subject: [PATCH 28/52] ersetzen von Splitbucuhgen bei Spendenbescheinigung verhindern --- .../gui/dialogs/FormularAuswahlDialog.java | 4 +- .../JVerein/io/SplitbuchungsContainer.java | 52 ++++++------------- .../server/DDLTool/Updates/Update0456.java | 2 +- 3 files changed, 20 insertions(+), 38 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java b/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java index fd4b98e86..d043e3c69 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java @@ -51,8 +51,8 @@ protected void paint(Composite parent) throws Exception { LabelGroup group = new LabelGroup(parent, ""); group.addText( - "Bitte Formular für das für die\n" - + "Rechnungen verwendet werden soll auswählen.", + "Bitte Formular, das für die\n" + + "Rechnungen verwendet werden soll, auswählen.", true); formular = new FormularInput(FormularArt.RECHNUNG); group.addLabelPair("Formular", formular); diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 842d7b696..13dfe5e18 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -359,24 +359,16 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) } String key = sp.getBuchungsartId() + "-" + (sp.getBuchungsklasseId() != null ? sp.getBuchungsklasseId() : ""); - Double betrag = splitMap.get(key); + Double betrag = splitMap.getOrDefault(key, 0d); if (sp.getBetrag().doubleValue() == 0) { continue; } - if (betrag == null) - { - splitMap.put(key, sp.getBetrag().doubleValue()); - splitZweckMap.put(key, sp.getZweck() + " " + sp.getBetrag()); - } - else - { - splitMap.replace(key, betrag + sp.getBetrag().doubleValue()); - String zweck = splitZweckMap.get(key); - splitZweckMap.replace(key, - zweck + ", " + sp.getZweck() + " " + sp.getBetrag()); - } + splitMap.put(key, betrag + sp.getBetrag().doubleValue()); + String zweck = splitZweckMap.get(key); + splitZweckMap.put(key, + zweck + ", " + sp.getZweck() + " " + sp.getBetrag()); } boolean splitten = false; @@ -401,6 +393,7 @@ else if (splitMap.size() > 1) Logger.error("Fehler beim Buchung-Sollbuchung-zuordnen-Dialog.", e); } } + if (splitten) { boolean ersetzen = false; @@ -419,7 +412,8 @@ else if (splitMap.size() > 1) { buchung.setSplitTyp(SplitbuchungTyp.HAUPT); } - // Haupt- und Gegen-Buchungen können nicht gesplittet werden + // Haupt- und Gegen-Buchungen können nicht gesplittet werden. + // Das Zuweisen zu einer Sollbuchung macht keinen sinn, daher abbrechen. else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN || buchung.getSplitTyp() == SplitbuchungTyp.HAUPT) { @@ -431,7 +425,6 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN ersetzen = true; } - Iterator> iterator = splitMap.entrySet().iterator(); SplitbuchungsContainer.init(buchung); if (ersetzen) @@ -442,33 +435,22 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN { if (b.getSpendenbescheinigung() != null) { - YesNoDialog dialog = new YesNoDialog(YesNoDialog.POSITION_CENTER); - dialog.setTitle("Spendenbescheinigung löschen"); - dialog.setText( - "Der Buchung ist eine Spendenbescheinigung zugeordnet.\n" - + "Wenn die Buchung der Sollbuchung zugeordnet und gesplittet wir,\n" - + "wird die Spendenbescheinigung gelöscht.\n" - + "Fortfahren und Spendenbescheinigung löschen?"); - try - { - if (!((Boolean) dialog.open()).booleanValue()) - { - return; - } - } - catch (Exception e) - { - Logger.error("Fehler beim Buchung-Sollbuchung-zuordnen-Dialog.", - e); - } + Logger.error( + "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu spliten nicht möglich."); + splitten = false; + break; } b.setDelete(true); break; } } } + } + if (splitten) + { boolean splitPositionZweck = new Settings(SplitbuchungsContainer.class) .getBoolean("splitPositionZweck", true); + Iterator> iterator = splitMap.entrySet().iterator(); while (iterator.hasNext()) { Entry entry = iterator.next(); @@ -479,7 +461,7 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN splitBuchung.setDatum(buchung.getDatum()); splitBuchung.setKonto(buchung.getKonto()); splitBuchung.setName(buchung.getName()); - if(splitPositionZweck) + if (splitPositionZweck) { splitBuchung.setZweck(splitZweckMap.get(entry.getKey())); } diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java index 3651d00b0..9f8a9a2e1 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java @@ -102,4 +102,4 @@ public void run() throws ApplicationException execute(addColumn("rechnung", new Column("zahlungsweg", COLTYPE.INTEGER, 1, "0", true, false))); } -} \ No newline at end of file +} From 586aa4c1d4f4fbb1e8b2cc1f50a972b20c14a82f Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 6 Jan 2025 16:37:22 +0100 Subject: [PATCH 29/52] AbrechnungsControl Zusammenfassen disablen bei disablen von kompakt --- .../gui/control/AbrechnungSEPAControl.java | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java index b632c007d..f24ebde4f 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java @@ -249,6 +249,7 @@ public CheckboxInput getKompakteAbbuchung() } kompakteabbuchung = new CheckboxInput( settings.getBoolean("kompakteabbuchung", false)); + kompakteabbuchung.addListener(new KompaktListener()); return kompakteabbuchung; } @@ -578,4 +579,25 @@ public void handleEvent(Event event) } } } + + 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); + } + } + } } From c2275f2bac235204aad5f9bb49247cff026d2d88 Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 6 Jan 2025 17:00:18 +0100 Subject: [PATCH 30/52] Mitgliedname auch ohne kompakte Abbuchung. Splitbuchung Zweck korrigiert --- src/de/jost_net/JVerein/io/AbrechnungSEPA.java | 5 +++++ .../jost_net/JVerein/io/SplitbuchungsContainer.java | 11 +++++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 65bbdfe0b..68b965435 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -212,6 +212,11 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor, if (!param.kompakteabbuchung && zahler.getZahlungsweg() .getKey() == Zahlungsweg.BASISLASTSCHRIFT) { + if (!zahler.getMitglied().getID().equals(zahler.getPersonId())) + { + zahler.setVerwendungszweck(zahler.getVerwendungszweck() + " " + + zahler.getMitglied().getVorname()); + } zahlerarray.add(zahler); } } diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 13dfe5e18..1dcfe2a03 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -367,8 +367,15 @@ public static void autoSplit(Buchung buchung, Mitgliedskonto mk) splitMap.put(key, betrag + sp.getBetrag().doubleValue()); String zweck = splitZweckMap.get(key); - splitZweckMap.put(key, - zweck + ", " + sp.getZweck() + " " + sp.getBetrag()); + if (zweck == null) + { + zweck = sp.getZweck() + " " + sp.getBetrag(); + } + else + { + zweck = zweck + ", " + sp.getZweck() + " " + sp.getBetrag(); + } + splitZweckMap.put(key, zweck); } boolean splitten = false; From a32bf064afbb7b1fba11f12fb5944d16e4b3b51a Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 6 Jan 2025 18:13:42 +0100 Subject: [PATCH 31/52] Action Fehler behoben, texte korrigiert --- .../action/SollbuchungRechnungMailAction.java | 44 +++++++++++++++++++ .../gui/dialogs/FormularAuswahlDialog.java | 4 +- .../JVerein/gui/navigation/MyExtension.java | 18 ++++---- 3 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 src/de/jost_net/JVerein/gui/action/SollbuchungRechnungMailAction.java 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/dialogs/FormularAuswahlDialog.java b/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java index d043e3c69..3ea382521 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/FormularAuswahlDialog.java @@ -52,13 +52,13 @@ protected void paint(Composite parent) throws Exception LabelGroup group = new LabelGroup(parent, ""); group.addText( "Bitte Formular, das für die\n" - + "Rechnungen verwendet werden soll, auswählen.", + + "Rechnung(en) verwendet werden soll, auswählen.", true); formular = new FormularInput(FormularArt.RECHNUNG); group.addLabelPair("Formular", formular); ButtonArea buttons = new ButtonArea(); - buttons.addButton("Rechnungen erstellen", context -> { + buttons.addButton("Rechnung(en) erstellen", context -> { if (formular.getValue() == null) { return; 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", From 82e2b2ca8a1ad4dd9746a80293b7b93d1b693264 Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 6 Jan 2025 21:01:51 +0100 Subject: [PATCH 32/52] AbrechnungslaufView Sollbuchungen statt Buchungen. Komentare Abrechnung --- .../gui/control/AbrechnungSEPAControl.java | 1 - .../gui/control/AbrechnungslaufControl.java | 27 +++++++------------ .../JVerein/gui/view/AbrechnungSEPAView.java | 8 +++--- 3 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java index f24ebde4f..e0ff2f618 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java @@ -158,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; } 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/view/AbrechnungSEPAView.java b/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java index 75bd69096..4375d4118 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", @@ -57,7 +57,7 @@ public void bind() throws Exception group.addLabelPair("Kursteilnehmer", control.getKursteilnehmer()); group.addLabelPair("Kompakte Abbuchung", control.getKompakteAbbuchung()); group.addLabelPair("Sollbuchungen zusammenfassen", control.getSollbuchungenZusammenfassen()); - group.addLabelPair("Rechnungen erstellen", control.getRechnung()); + group.addLabelPair("Rechnungen erstellen²", control.getRechnung()); group.addLabelPair("Rechnung Formular", control.getRechnungFormular()); group.addLabelPair("Rechnung Text", control.getRechnungstext()); group.addLabelPair("SEPA-Datei drucken", control.getSEPAPrint()); @@ -69,7 +69,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(); From 2914c5c3242a6ae6e8d99ad59b7cd6d35601c453 Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 6 Jan 2025 21:22:10 +0100 Subject: [PATCH 33/52] Kleine Fehler behoben --- .../JVerein/gui/action/RechnungNeuAction.java | 2 +- .../JVerein/gui/view/AbrechnungSEPAView.java | 8 +- .../jost_net/JVerein/io/AbrechnungSEPA.java | 117 +++++++++--------- 3 files changed, 64 insertions(+), 63 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java index 002c79d7a..b2bab1e42 100644 --- a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java @@ -82,7 +82,7 @@ else if (context instanceof Mitgliedskonto[]) if (erstellt == 0) { GUI.getStatusBar().setErrorText("Keine Rechnung erstellt, alle " + skip - + " Sollbuchunge enthalten bereits Rechnungen."); + + " Sollbuchungen enthalten bereits Rechnungen."); } else { GUI.getStatusBar().setSuccessText(erstellt + " Rechnung(en) erstellt" diff --git a/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java b/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java index 4375d4118..55a4701de 100644 --- a/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java +++ b/src/de/jost_net/JVerein/gui/view/AbrechnungSEPAView.java @@ -55,9 +55,11 @@ public void bind() throws Exception control.getZusatzbetrag().setEnabled(false); } group.addLabelPair("Kursteilnehmer", control.getKursteilnehmer()); - group.addLabelPair("Kompakte Abbuchung", control.getKompakteAbbuchung()); - group.addLabelPair("Sollbuchungen zusammenfassen", control.getSollbuchungenZusammenfassen()); - group.addLabelPair("Rechnungen erstellen²", control.getRechnung()); + 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()); diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 68b965435..266f74dcc 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -294,69 +294,67 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor, } } - // Lastschriften erstellen - monitor.setStatusText("Lastschriften erstellen"); - count = 0; - BigDecimal summelastschriften = BigDecimal.valueOf(0); - for (JVereinZahler zahler : zahlerarray) + if (zahlerarray.size() > 0) { - 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()); - } + 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(); + } - // Wenn keine Lastschriften vorhanden sind, wird kein File erzeugt. - if ((param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) - && !zahlerarray.isEmpty()) - { - 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())); - } + // 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 Buchungen vorhanden sind, wird nichts an Hibiscus übergeben. - if ((param.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) - && (zahlerarray.size() != 0)) - { - buchenHibiscus(param, zahlerarray); - monitor.log("Hibiscus-Lastschrift erzeugt."); - param.setText(String.format(", Hibiscus-Lastschrift erzeugt.")); - } + // Wenn keine Lastschriften vorhanden sind, wird kein File erzeugt. + if (param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) + { + 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.pdffileRCUR != null) - { - // Nur für die PDF-Erzeugung müssen die Zahler in der Lastschrift - // enthalten sein - for (JVereinZahler z : zahlerarray) + if (param.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) { - lastschrift.add(z); + buchenHibiscus(param, zahlerarray); + monitor.log("Hibiscus-Lastschrift erzeugt."); + param.setText(String.format(", Hibiscus-Lastschrift erzeugt.")); } - // 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) + { + // 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); + } } monitor.setStatusText(counter + " abgerechnete Fälle"); } private void abrechnenMitglieder(AbrechnungSEPAParam param, - ProgressMonitor monitor) - throws Exception + ProgressMonitor monitor) throws Exception { if (param.abbuchungsmodus != Abrechnungsmodi.KEINBEITRAG) { @@ -502,8 +500,7 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, } private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, - ProgressMonitor monitor, Mitglied m, - Beitragsgruppe bg, boolean primaer) + ProgressMonitor monitor, Mitglied m, Beitragsgruppe bg, boolean primaer) throws RemoteException, ApplicationException { Double betr = 0d; @@ -545,10 +542,12 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, { betr = m.getIndividuellerBeitrag(); } - if ((betr == 0d) || !checkSEPA(mZahler, monitor)) + if (betr == 0d) { return null; } + checkSEPA(mZahler, monitor); + counter++; try @@ -662,10 +661,11 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, zahlungsweg = mZahler.getZahlungsweg(); } - if (!checkSEPA(mZahler, monitor)) + if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT) { - continue; + checkSEPA(mZahler, monitor); } + counter++; String vzweck = z.getBuchungstext(); boolean ohneLesefelder = !vzweck.contains(Einstellungen.LESEFELD_PRE); @@ -1265,13 +1265,13 @@ private Konto getKonto() Einstellungen.getEinstellung().getIban(), iban.getKonto())); } - private boolean checkSEPA(Mitglied m, ProgressMonitor monitor) + private void checkSEPA(Mitglied m, ProgressMonitor monitor) throws RemoteException, ApplicationException { if (m.getZahlungsweg() == null || m.getZahlungsweg() != Zahlungsweg.BASISLASTSCHRIFT) { - return true; + return; } Date letzte_lastschrift = m.getLetzteLastschrift(); if (letzte_lastschrift != null @@ -1289,7 +1289,6 @@ private boolean checkSEPA(Mitglied m, ProgressMonitor monitor) throw new ApplicationException(Adressaufbereitung.getNameVorname(m) + ": Kein Mandat-Datum vorhanden."); } - return true; } } From 2a06a91d397bfa8a2058fc473d9efae9b42577ea Mon Sep 17 00:00:00 2001 From: nils Date: Tue, 7 Jan 2025 17:04:50 +0100 Subject: [PATCH 34/52] Sollbuchung manuell erstellen verhindern. Kleine Korrekturen --- .../jost_net/JVerein/gui/action/RechnungNeuAction.java | 1 + .../JVerein/gui/control/MitgliedskontoControl.java | 3 ++- .../jost_net/JVerein/gui/menu/MitgliedskontoMenu.java | 10 +++++----- .../JVerein/gui/view/SollbuchungListeView.java | 7 ++++--- src/de/jost_net/JVerein/io/FormularAufbereitung.java | 3 ++- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java index b2bab1e42..4c93ac4a3 100644 --- a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java @@ -83,6 +83,7 @@ else if (context instanceof Mitgliedskonto[]) { GUI.getStatusBar().setErrorText("Keine Rechnung erstellt, alle " + skip + " Sollbuchungen enthalten bereits Rechnungen."); + GUI.getCurrentView().reload(); } else { GUI.getStatusBar().setSuccessText(erstellt + " Rechnung(en) erstellt" diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index 632563c50..8c4837316 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -531,7 +531,8 @@ public Part getBuchungenList() throws RemoteException buchungList.addColumn("Zweck", "zweck"); buchungList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - buchungList.addColumn("Steuersatz", "steuersatz"); + // TODO Steuer muss überrbeitet werden + // buchungList.addColumn("Steuersatz", "steuersatz"); buchungList.addColumn("Buchungsart", "buchungsart"); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { diff --git a/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java b/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java index 594160e81..6c4d13e56 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 SOllbucuhgen 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/view/SollbuchungListeView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java index be22211f1..c0e721ae2 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 Sollbucuhgen 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/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index 973e2675d..3a4499484 100644 --- a/src/de/jost_net/JVerein/io/FormularAufbereitung.java +++ b/src/de/jost_net/JVerein/io/FormularAufbereitung.java @@ -730,7 +730,8 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException { invoice.addItem(new Item( new Product(sp.getZweck(), "", "LS", - new BigDecimal(sp.getSteuersatz()).setScale(2, + new BigDecimal(sp.getBuchungsart() == null ? 0 + : sp.getBuchungsart().getSteuersatz()).setScale(2, RoundingMode.HALF_DOWN)), new BigDecimal(betrag * -1).setScale(2, RoundingMode.HALF_DOWN), new BigDecimal(-1.0))); From ea0fca3123c1c1055c58769e3225923829f0b977 Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 10 Jan 2025 07:28:48 +0100 Subject: [PATCH 35/52] Steuer bei Sollbuchungen richtig zuordnen.Einstellungen QR gruppieren --- .../JVerein/gui/action/RechnungNeuAction.java | 2 +- .../JVerein/gui/control/BuchungsControl.java | 3 ++- .../gui/view/EinstellungenRechnungenView.java | 25 +++++++++++-------- .../jost_net/JVerein/io/AbrechnungSEPA.java | 9 ++++++- .../JVerein/io/FormularAufbereitung.java | 3 +-- 5 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java index 4c93ac4a3..25cb0f155 100644 --- a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java @@ -83,11 +83,11 @@ else if (context instanceof Mitgliedskonto[]) { GUI.getStatusBar().setErrorText("Keine Rechnung erstellt, alle " + skip + " Sollbuchungen enthalten bereits Rechnungen."); - GUI.getCurrentView().reload(); } else { GUI.getStatusBar().setSuccessText(erstellt + " Rechnung(en) erstellt" + (skip > 0 ? ", " + skip + " vorhandene übersprungen." : ".")); + GUI.getCurrentView().reload(); } } catch (Exception e) diff --git a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java index c62aa079c..37ec083a1 100644 --- a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java +++ b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java @@ -965,10 +965,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); diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java index 38d673d34..57088bb6d 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java @@ -22,6 +22,7 @@ import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; +import de.willuhn.jameica.gui.util.LabelGroup; import de.willuhn.jameica.gui.util.ScrolledContainer; public class EinstellungenRechnungenView extends AbstractView @@ -40,21 +41,23 @@ 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("Kantenlänge QR-Code", control.getQRCodeSizeInMm()); - cont.addLabelPair("Verwendungszweck", control.getQRCodeVerwendungszweck()); - cont.addLabelPair("Verwendungszweck hinzufügen", + cont.addLabelPair("Länge Rechnungsnummer", control.getZaehlerLaenge()); + + LabelGroup group = new LabelGroup(getParent(), "QR-Code"); + group.addLabelPair("Kantenlänge QR-Code", control.getQRCodeSizeInMm()); + group.addLabelPair("Verwendungszweck", control.getQRCodeVerwendungszweck()); + group.addLabelPair("Verwendungszweck hinzufügen", control.getQRCodePrintVerwendungszweck()); - cont.addLabelPair("Bei einzelner Position Verwendungszweck ersetzen", + group.addLabelPair("Bei einzelner Position Verwendungszweck ersetzen", control.getQRCodeSingle()); - cont.addLabelPair("Rechnungsdatum in QR-Code", control.getQRCodeReDa()); - cont.addLabelPair("Rechnungsnummer in QR-Code", control.getQRCodeReNr()); - cont.addLabelPair("Mitgliedsnummer in QR-Code", + group.addLabelPair("Rechnungsdatum in QR-Code", control.getQRCodeReDa()); + group.addLabelPair("Rechnungsnummer in QR-Code", control.getQRCodeReNr()); + group.addLabelPair("Mitgliedsnummer in QR-Code", control.getQRCodeMemberNr()); - cont.addLabelPair("Information an Mitglied in QR-Code", + group.addLabelPair("Information an Mitglied in QR-Code", control.getQRCodeInfoToMember()); - cont.addLabelPair("Texte in QR-Code kürzen", control.getQRCodeKuerzen()); - cont.addLabelPair("Beschreibungstext für QR-Code", + group.addLabelPair("Texte in QR-Code kürzen", control.getQRCodeKuerzen()); + group.addLabelPair("Beschreibungstext für QR-Code", control.getQRCodeIntro()); ButtonArea buttons = new ButtonArea(); diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 266f74dcc..472e507ee 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -1025,8 +1025,15 @@ private SollbuchungPosition getSollbuchungPosition(JVereinZahler zahler) SollbuchungPosition sp = Einstellungen.getDBService() .createObject(SollbuchungPosition.class, null); sp.setBetrag(zahler.getBetrag().doubleValue()); - sp.setSteuersatz(0d); 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()); diff --git a/src/de/jost_net/JVerein/io/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index 3a4499484..973e2675d 100644 --- a/src/de/jost_net/JVerein/io/FormularAufbereitung.java +++ b/src/de/jost_net/JVerein/io/FormularAufbereitung.java @@ -730,8 +730,7 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException { invoice.addItem(new Item( new Product(sp.getZweck(), "", "LS", - new BigDecimal(sp.getBuchungsart() == null ? 0 - : sp.getBuchungsart().getSteuersatz()).setScale(2, + new BigDecimal(sp.getSteuersatz()).setScale(2, RoundingMode.HALF_DOWN)), new BigDecimal(betrag * -1).setScale(2, RoundingMode.HALF_DOWN), new BigDecimal(-1.0))); From 000e1dd86f23c9cf87a91c7c11017936545c30c5 Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 10 Jan 2025 07:30:25 +0100 Subject: [PATCH 36/52] Bucung mehreren SOllbuchungenzuordnen --- .../BuchungSollbuchungZuordnungAction.java | 82 ++++- ...genSollbuchungZuordnungVorschauDialog.java | 2 +- .../gui/dialogs/SollbuchungAuswahlDialog.java | 4 +- .../jost_net/JVerein/io/AbrechnungSEPA.java | 2 +- .../JVerein/io/SplitbuchungsContainer.java | 305 ++++++++++-------- 5 files changed, 248 insertions(+), 147 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java index b9a4dc33d..850e1bfb2 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java @@ -21,6 +21,7 @@ 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; @@ -28,6 +29,7 @@ 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; @@ -121,16 +123,86 @@ else if (open instanceof Mitglied) } } - if (b.length == 1) + if (open instanceof Mitgliedskonto[]) { - SplitbuchungsContainer.autoSplit(b[0], mk); + if (b.length > 1) + { + throw new ApplicationException( + "Mehrere Buchungen mehreren Sollbuchungen zuordnen nicht möglich!"); + } + + 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."); + } } else { - for (Buchung buchung : b) + if (b.length == 1) + { + SplitbuchungsContainer.autoSplit(b[0], mk, false); + } + else { - buchung.setMitgliedskonto(mk); - buchung.store(); + for (Buchung buchung : b) + { + buchung.setMitgliedskonto(mk); + buchung.store(); + } } } control.getBuchungsList(); diff --git a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java index 729727cde..fccdac5e6 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java @@ -130,7 +130,7 @@ protected void persistAssignment() throws ApplicationException { Mitgliedskonto mk = dao.getMitgliedskonto(); Buchung buchung = dao.getBuchung(); - SplitbuchungsContainer.autoSplit(buchung, mk); + SplitbuchungsContainer.autoSplit(buchung, mk, false); } //Darstellung aktualisieren 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/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 472e507ee..b3f06f37f 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -1238,7 +1238,7 @@ private String writeSollbuchung(int zahlungsweg, IAdresse adress, if (mk != null) { // Buchungen automatisch splitten - SplitbuchungsContainer.autoSplit(buchung, mk); + SplitbuchungsContainer.autoSplit(buchung, mk, false); } } return zweck; diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 1dcfe2a03..570ab4731 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -34,6 +34,7 @@ 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; @@ -337,179 +338,206 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) return buch; } - public static void autoSplit(Buchung buchung, Mitgliedskonto mk) + /** + * 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; + return null; } + HashMap splitMap = new HashMap<>(); HashMap splitZweckMap = new HashMap<>(); ArrayList spArray = mk.getSollbuchungPositionList(); - for (SollbuchungPosition sp : spArray) + try { - // Wenn eine Buchungsart fehlt können wir nicht automatisch splitten - if (sp.getBuchungsartId() == null) - { - splitMap = new HashMap<>(); - break; - } - 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 + for (SollbuchungPosition sp : spArray) { - zweck = zweck + ", " + sp.getZweck() + " " + sp.getBetrag(); - } - splitZweckMap.put(key, zweck); - } + // 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; + } - boolean splitten = false; - if (splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) - { - 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?"); - try - { - splitten = ((Boolean) dialog.open()).booleanValue(); - } - catch (Exception e) - { - Logger.error("Fehler beim Buchung-Sollbuchung-zuordnen-Dialog.", e); + 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 (splitten) - { - boolean ersetzen = false; - if (buchung.getBuchungsartId() == null - && spArray.get(0).getBuchungsartId() != null) + if ((splitMap.size() > 1 && mk.getBetrag().equals(buchung.getBetrag())) + || immerSplitten) { - buchung.setBuchungsartId(spArray.get(0).getBuchungsartId()); + splitten = true; } - if (buchung.getBuchungsklasseId() == null - && spArray.get(0).getBuchungsklasseId() != null) + else if (splitMap.size() > 1) { - buchung.setBuchungsklasseId(spArray.get(0).getBuchungsklasseId()); + 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); - } - // Haupt- und Gegen-Buchungen können nicht gesplittet werden. - // Das Zuweisen zu einer Sollbuchung macht keinen sinn, daher abbrechen. - else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN - || buchung.getSplitTyp() == SplitbuchungTyp.HAUPT) - { - return; - } - else - // Spitbuchungen müssen durch die neuen Buchungen ersetzt werden - { - ersetzen = true; - } + if (buchung.getSplitTyp() == null) + { + buchung.setSplitTyp(SplitbuchungTyp.HAUPT); + buchung.setMitgliedskontoID(null); + } + // Haupt- und Gegen-Buchungen können nicht gesplittet werden. + // Das Zuweisen zu einer Sollbuchung macht keinen sinn, daher abbrechen. + else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN + || buchung.getSplitTyp() == SplitbuchungTyp.HAUPT) + { + return null; + } + else + { + // Spitbuchungen müssen durch die neuen Buchungen ersetzt werden + ersetzen = true; + } - SplitbuchungsContainer.init(buchung); + SplitbuchungsContainer.init(buchung); - if (ersetzen) - { - for (Buchung b : splitbuchungen) + if (ersetzen) { - if (b.getID().equals(buchung.getID())) + for (Buchung b : splitbuchungen) { - if (b.getSpendenbescheinigung() != null) + if (b.getID().equals(buchung.getID())) { - Logger.error( - "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu spliten nicht möglich."); - splitten = false; + if (b.getSpendenbescheinigung() != null) + { + Logger.error( + "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu spliten nicht möglich."); + throw new ApplicationException( + "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu spliten nicht möglich."); + } + b.setDelete(true); break; } - b.setDelete(true); - break; } } - } - } - if (splitten) - { - 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 + + boolean splitPositionZweck = new Settings(SplitbuchungsContainer.class) + .getBoolean("splitPositionZweck", true); + Iterator> iterator = splitMap.entrySet() + .iterator(); + while (iterator.hasNext()) { - splitBuchung.setZweck(mk.getZweck1()); + 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); } - 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) + if (!mk.getBetrag().equals(buchung.getBetrag())) { - splitBuchung.setBuchungsklasseId(Long.parseLong(buchungsklasse)); + 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); } - splitBuchung.setSplitTyp(SplitbuchungTyp.SPLIT); - splitBuchung.setSplitId(Long.parseLong(getMaster().getID())); - - SplitbuchungsContainer.add(splitBuchung); + SplitbuchungsContainer.store(); } - if (!mk.getBetrag().equals(buchung.getBetrag())) - { - Buchung splitBuchung = (Buchung) Einstellungen.getDBService() - .createObject(Buchung.class, null); - splitBuchung.setBetrag(buchung.getBetrag() - mk.getBetrag()); - splitBuchung.setDatum(buchung.getDatum()); - splitBuchung.setKonto(buchung.getKonto()); - splitBuchung.setName(buchung.getName()); - splitBuchung.setZweck(buchung.getZweck()); - splitBuchung.setSplitTyp(SplitbuchungTyp.SPLIT); - splitBuchung.setSplitId(Long.parseLong(getMaster().getID())); - splitBuchung.setBuchungsartId(buchung.getBuchungsartId()); - splitBuchung.setBuchungsklasseId(buchung.getBuchungsklasseId()); - - SplitbuchungsContainer.add(splitBuchung); - } - SplitbuchungsContainer.store(); } - else if (spArray != null && spArray.size() > 0) + catch (OperationCanceledException oce) + { + splitten = false; + } + catch (Exception e) + { + splitten = false; + 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 @@ -524,6 +552,7 @@ else if (spArray != null && spArray.size() > 0) buchung.setMitgliedskonto(mk); buchung.store(); } + return restBuchung; } public static int getAnzahl() From 64bac658c9ed908935f8bccc8ba29abe6fa6dec3 Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 10 Jan 2025 23:13:43 +0100 Subject: [PATCH 37/52] Rechtschreibung --- .../jost_net/JVerein/gui/menu/MitgliedskontoMenu.java | 2 +- .../JVerein/gui/view/SollbuchungListeView.java | 2 +- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 10 +++++----- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java b/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java index 6c4d13e56..9768edb9c 100755 --- a/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java @@ -45,7 +45,7 @@ public class MitgliedskontoMenu extends ContextMenu */ public MitgliedskontoMenu() { - // TODO Das mauelle erstellen von SOllbucuhgen muss überarbeitet werden + // TODO Das mauelle erstellen von Sollbuchungen muss überarbeitet werden // addItem(new MitgliedItem("Neue Sollbuchung", // new SollbuchungNeuAction(), "document-new.png")); addItem(new SollItem("Sollbuchung bearbeiten", diff --git a/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java index c0e721ae2..a64fce131 100644 --- a/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java +++ b/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java @@ -78,7 +78,7 @@ public void bind() throws Exception buttons.addButton(new Button("Export", new SollbuchungExportAction(EXPORT_TYP.MITGLIEDSKONTO), control, false, "document-save.png")); - // TODO das Bearbeiten der Sollbucuhgen muss noch überarbeitet werden + // 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/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 570ab4731..47551399f 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -339,7 +339,7 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) } /** - * Splittet eine Buchung anhand der in der SOllbuchung enthaltenen + * Splittet eine Buchung anhand der in der Sollbuchung enthaltenen * Sollbuchungspositionen * * @param Buchung @@ -348,8 +348,8 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) * 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 + * @return Wenn die Beträge von Sollbuchung und Buchung verschieden sind, wird + * die erzeugte Rest-Buchung zurückgegeben, sonst null */ public static Buchung autoSplit(Buchung buchung, Mitgliedskonto mk, boolean immerSplitten) @@ -460,9 +460,9 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN if (b.getSpendenbescheinigung() != null) { Logger.error( - "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu spliten nicht möglich."); + "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu splitten nicht möglich."); throw new ApplicationException( - "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu spliten nicht möglich."); + "Splitbuchung ist einer Spendenbescheinigung zugeordnet, neu splitten nicht möglich."); } b.setDelete(true); break; From 3adf0f7f1e5c4c720ccc54c5fdb02e966038afd8 Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 10 Jan 2025 23:23:15 +0100 Subject: [PATCH 38/52] =?UTF-8?q?QR-Code=20Gruppierung=20ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gui/view/EinstellungenRechnungenView.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java index 57088bb6d..0c9b55360 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java @@ -22,7 +22,6 @@ import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; -import de.willuhn.jameica.gui.util.LabelGroup; import de.willuhn.jameica.gui.util.ScrolledContainer; public class EinstellungenRechnungenView extends AbstractView @@ -43,21 +42,21 @@ public void bind() throws Exception cont.addLabelPair("Text Bar", control.getRechnungTextBar()); cont.addLabelPair("Länge Rechnungsnummer", control.getZaehlerLaenge()); - LabelGroup group = new LabelGroup(getParent(), "QR-Code"); - group.addLabelPair("Kantenlänge QR-Code", control.getQRCodeSizeInMm()); - group.addLabelPair("Verwendungszweck", control.getQRCodeVerwendungszweck()); - group.addLabelPair("Verwendungszweck hinzufügen", + cont.addHeadline("QR-Code"); + cont.addLabelPair("Kantenlänge QR-Code", control.getQRCodeSizeInMm()); + cont.addLabelPair("Verwendungszweck", control.getQRCodeVerwendungszweck()); + cont.addLabelPair("Verwendungszweck hinzufügen", control.getQRCodePrintVerwendungszweck()); - group.addLabelPair("Bei einzelner Position Verwendungszweck ersetzen", + cont.addLabelPair("Bei einzelner Position Verwendungszweck ersetzen", control.getQRCodeSingle()); - group.addLabelPair("Rechnungsdatum in QR-Code", control.getQRCodeReDa()); - group.addLabelPair("Rechnungsnummer in QR-Code", control.getQRCodeReNr()); - group.addLabelPair("Mitgliedsnummer in QR-Code", + cont.addLabelPair("Rechnungsdatum in QR-Code", control.getQRCodeReDa()); + cont.addLabelPair("Rechnungsnummer in QR-Code", control.getQRCodeReNr()); + cont.addLabelPair("Mitgliedsnummer in QR-Code", control.getQRCodeMemberNr()); - group.addLabelPair("Information an Mitglied in QR-Code", + cont.addLabelPair("Information an Mitglied in QR-Code", control.getQRCodeInfoToMember()); - group.addLabelPair("Texte in QR-Code kürzen", control.getQRCodeKuerzen()); - group.addLabelPair("Beschreibungstext für QR-Code", + cont.addLabelPair("Texte in QR-Code kürzen", control.getQRCodeKuerzen()); + cont.addLabelPair("Beschreibungstext für QR-Code", control.getQRCodeIntro()); ButtonArea buttons = new ButtonArea(); From 94781fa933c81acc12039e815a461bf61d71f947 Mon Sep 17 00:00:00 2001 From: Nils Date: Sat, 11 Jan 2025 00:16:45 +0100 Subject: [PATCH 39/52] Javadoc --- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 47551399f..94e3516e1 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -340,16 +340,16 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) /** * Splittet eine Buchung anhand der in der Sollbuchung enthaltenen - * Sollbuchungspositionen + * Sollbuchungspositionen. * * @param Buchung - * die zu splittende Buchung. + * die zu splittende Buchung * @param Mitgliedskonto - * die Sollbuchung die der Buchung zugewiesen werden soll + * 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 Rest-Buchung zurückgegeben, sonst null + * die erzeugte Restbuchung zurückgegeben, sonst null. */ public static Buchung autoSplit(Buchung buchung, Mitgliedskonto mk, boolean immerSplitten) From 5fec33f036d094516a01b2ea644227d664e3db02 Mon Sep 17 00:00:00 2001 From: nils Date: Sat, 11 Jan 2025 18:47:50 +0100 Subject: [PATCH 40/52] Fehler Steuerberechnung behoben. Kleiner Fehler korrigiert --- src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java | 2 +- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 5 ++++- src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java | 6 +++--- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java index 25cb0f155..0c85bc9e3 100644 --- a/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/RechnungNeuAction.java @@ -85,9 +85,9 @@ else if (context instanceof Mitgliedskonto[]) + " Sollbuchungen enthalten bereits Rechnungen."); } else { + GUI.getCurrentView().reload(); GUI.getStatusBar().setSuccessText(erstellt + " Rechnung(en) erstellt" + (skip > 0 ? ", " + skip + " vorhandene übersprungen." : ".")); - GUI.getCurrentView().reload(); } } catch (Exception e) diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 94e3516e1..8d8f5dfa6 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -533,7 +533,10 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN catch (Exception e) { splitten = false; - splitbuchungen.clear(); + if (splitbuchungen != null) + { + splitbuchungen.clear(); + } GUI.getStatusBar().setErrorText( "Fehler beim Autosplit, ordne Buchung Sollbuchung ohne splitten zu."); } diff --git a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java index 1234c66fe..c8f04cda6 100644 --- a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -91,7 +91,7 @@ public Double getNettobetrag() throws RemoteException { return betrag; } - return betrag / (1 + steuersatz); + return betrag / (1 + steuersatz / 100); } @Override @@ -101,9 +101,9 @@ public Double getSteuerbetrag() throws RemoteException Double steuersatz = (Double) getAttribute("steuersatz"); if (steuersatz == null || betrag == null) { - return betrag; + return 0d; } - return betrag - betrag / (1 + steuersatz); + return betrag - betrag / (1 + steuersatz / 100); } @Override From 63d161ab55f70ca50b0ff95ad55ba8a3cecf3174 Mon Sep 17 00:00:00 2001 From: nils Date: Tue, 14 Jan 2025 07:57:55 +0100 Subject: [PATCH 41/52] =?UTF-8?q?Nettobetrag=20und=20Steuerbetrag=20zu=20B?= =?UTF-8?q?igDecimal=20ge=C3=A4ndert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/jost_net/JVerein/Variable/RechnungMap.java | 4 ++-- .../jost_net/JVerein/io/FormularAufbereitung.java | 10 +++------- .../jost_net/JVerein/rmi/SollbuchungPosition.java | 5 +++-- .../JVerein/server/SollbuchungPositionImpl.java | 13 +++++++------ 4 files changed, 15 insertions(+), 17 deletions(-) diff --git a/src/de/jost_net/JVerein/Variable/RechnungMap.java b/src/de/jost_net/JVerein/Variable/RechnungMap.java index a7e344c74..9802b1894 100644 --- a/src/de/jost_net/JVerein/Variable/RechnungMap.java +++ b/src/de/jost_net/JVerein/Variable/RechnungMap.java @@ -69,10 +69,10 @@ public Map getMap(Rechnung re, Map inMap) { buchungDatum.add(sp.getDatum()); zweck.add(sp.getZweck()); - nettobetrag.add(Double.valueOf(sp.getNettobetrag())); + nettobetrag.add(sp.getNettobetrag().doubleValue()); steuersatz.add( "(" + formatter.format(Double.valueOf(sp.getSteuersatz())) + ")"); - steuerbetrag.add(Double.valueOf(sp.getSteuerbetrag())); + steuerbetrag.add(sp.getSteuerbetrag().doubleValue()); betrag.add(sp.getBetrag()); summe += sp.getBetrag(); } diff --git a/src/de/jost_net/JVerein/io/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index 973e2675d..624538050 100644 --- a/src/de/jost_net/JVerein/io/FormularAufbereitung.java +++ b/src/de/jost_net/JVerein/io/FormularAufbereitung.java @@ -721,18 +721,14 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException for (SollbuchungPosition sp : re.getMitgliedskonto() .getSollbuchungPositionList()) { - Double betrag = sp.getNettobetrag(); - if (betrag == null || betrag == 0) - { - betrag = sp.getBetrag(); - } + BigDecimal betrag = sp.getNettobetrag(); if (sp.getBetrag() < 0) { invoice.addItem(new Item( new Product(sp.getZweck(), "", "LS", new BigDecimal(sp.getSteuersatz()).setScale(2, RoundingMode.HALF_DOWN)), - new BigDecimal(betrag * -1).setScale(2, RoundingMode.HALF_DOWN), + betrag.multiply(new BigDecimal(-1)), new BigDecimal(-1.0))); } else @@ -741,7 +737,7 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException "LS", // LS = pauschal new BigDecimal(sp.getSteuersatz()).setScale(2, RoundingMode.HALF_DOWN)), - new BigDecimal(betrag).setScale(2, RoundingMode.HALF_DOWN), + betrag, new BigDecimal(1.0))); } } diff --git a/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java index 9cc6d2dc9..c78741780 100644 --- a/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java +++ b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java @@ -16,6 +16,7 @@ **********************************************************************/ package de.jost_net.JVerein.rmi; +import java.math.BigDecimal; import java.rmi.RemoteException; import java.util.Date; @@ -56,8 +57,8 @@ public interface SollbuchungPosition extends DBObject public String getZweck() throws RemoteException; - public Double getNettobetrag() throws RemoteException; + public BigDecimal getNettobetrag() throws RemoteException; - public Double getSteuerbetrag() throws RemoteException; + public BigDecimal getSteuerbetrag() throws RemoteException; } diff --git a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java index c8f04cda6..88cddf730 100644 --- a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -16,6 +16,7 @@ **********************************************************************/ package de.jost_net.JVerein.server; +import java.math.BigDecimal; import java.rmi.RemoteException; import java.util.Date; @@ -83,27 +84,27 @@ public void setSteuersatz(Double satz) throws RemoteException } @Override - public Double getNettobetrag() throws RemoteException + public BigDecimal getNettobetrag() throws RemoteException { Double betrag = (Double) getAttribute("betrag"); Double steuersatz = (Double) getAttribute("steuersatz"); if (steuersatz == null || betrag == null) { - return betrag; + return new BigDecimal(betrag); } - return betrag / (1 + steuersatz / 100); + return new BigDecimal(betrag / (1 + steuersatz / 100)); } @Override - public Double getSteuerbetrag() throws RemoteException + public BigDecimal getSteuerbetrag() throws RemoteException { Double betrag = (Double) getAttribute("betrag"); Double steuersatz = (Double) getAttribute("steuersatz"); if (steuersatz == null || betrag == null) { - return 0d; + return new BigDecimal(0); } - return betrag - betrag / (1 + steuersatz / 100); + return new BigDecimal(betrag - betrag / (1 + steuersatz / 100)); } @Override From 0b60f64bccb3aaee902978a78270af418f0cb3eb Mon Sep 17 00:00:00 2001 From: nils Date: Tue, 14 Jan 2025 08:29:32 +0100 Subject: [PATCH 42/52] AutoBpplit bei Feher und immerSlitten abbrechen --- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 8d8f5dfa6..a9ff999ad 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -532,6 +532,10 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN } catch (Exception e) { + if (immerSplitten) + { + throw new ApplicationException("Fehler beim Splitten: ", e); + } splitten = false; if (splitbuchungen != null) { From c51b59a09cfaa5b0f0560979de7e46d6aa414380 Mon Sep 17 00:00:00 2001 From: nils Date: Tue, 14 Jan 2025 14:50:25 +0100 Subject: [PATCH 43/52] Errorhandling --- .../gui/action/BuchungSollbuchungZuordnungAction.java | 10 +++++++++- src/de/jost_net/JVerein/io/SplitbuchungsContainer.java | 6 +++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java index 850e1bfb2..51585483a 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java @@ -130,6 +130,13 @@ else if (open instanceof Mitglied) 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; @@ -187,7 +194,8 @@ else if (open instanceof Mitglied) { b[0].transactionRollback(); Logger.error("Fehler", e); - throw new ApplicationException("Fehler beim Splitten der Buchung."); + throw new ApplicationException( + "Fehler beim Splitten der Buchung: " + e.getLocalizedMessage()); } } else diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index a9ff999ad..e652eec50 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -437,11 +437,11 @@ else if (splitMap.size() > 1) buchung.setMitgliedskontoID(null); } // Haupt- und Gegen-Buchungen können nicht gesplittet werden. - // Das Zuweisen zu einer Sollbuchung macht keinen sinn, daher abbrechen. else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN || buchung.getSplitTyp() == SplitbuchungTyp.HAUPT) { - return null; + throw new ApplicationException( + "Splitten von Haupt und Gegenbuchung nicht möglich."); } else { @@ -534,7 +534,7 @@ else if (buchung.getSplitTyp() == SplitbuchungTyp.GEGEN { if (immerSplitten) { - throw new ApplicationException("Fehler beim Splitten: ", e); + throw new ApplicationException(e.getLocalizedMessage()); } splitten = false; if (splitbuchungen != null) From 6e3d808117b2cf9670faaea551e99576655f2c7e Mon Sep 17 00:00:00 2001 From: nils Date: Wed, 15 Jan 2025 13:00:12 +0100 Subject: [PATCH 44/52] NPE bei Abrechnungslauf wenn kein Rechnungsformular vorhanden ist behoben --- src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java index e0ff2f618..4f37a9d5f 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java @@ -368,7 +368,8 @@ private void doAbrechnung() throws ApplicationException, RemoteException settings.setAttribute("rechnungstext", (String) rechnungstext.getValue()); settings.setAttribute("rechnungsformular", - ((Formular) rechnungsformular.getValue()).getID()); + 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()); From 8553176d8881346ebe39f5d4b88d9bb961f23175 Mon Sep 17 00:00:00 2001 From: nils Date: Thu, 16 Jan 2025 07:25:15 +0100 Subject: [PATCH 45/52] =?UTF-8?q?Fehler=20Filterung=20Zusatzbetr=C3=A4ge?= =?UTF-8?q?=20behoben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/de/jost_net/JVerein/io/AbrechnungSEPA.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index b3f06f37f..62c31a304 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -632,7 +632,7 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, .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); + list.addFilter("(endedatum is null or endedatum >= ?)", param.stichtag); while (list.hasNext()) { if (interrupt.isInterrupted()) From 01a474352ddecdeb5a6a3945e0d21ffbd2d4b960 Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 17 Jan 2025 07:36:24 +0100 Subject: [PATCH 46/52] =?UTF-8?q?Revert=20"Nettobetrag=20und=20Steuerbetra?= =?UTF-8?q?g=20zu=20BigDecimal=20ge=C3=A4ndert"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit 63d161ab55f70ca50b0ff95ad55ba8a3cecf3174. --- src/de/jost_net/JVerein/Variable/RechnungMap.java | 4 ++-- .../jost_net/JVerein/io/FormularAufbereitung.java | 10 +++++++--- .../jost_net/JVerein/rmi/SollbuchungPosition.java | 5 ++--- .../JVerein/server/SollbuchungPositionImpl.java | 13 ++++++------- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/de/jost_net/JVerein/Variable/RechnungMap.java b/src/de/jost_net/JVerein/Variable/RechnungMap.java index 9802b1894..a7e344c74 100644 --- a/src/de/jost_net/JVerein/Variable/RechnungMap.java +++ b/src/de/jost_net/JVerein/Variable/RechnungMap.java @@ -69,10 +69,10 @@ public Map getMap(Rechnung re, Map inMap) { buchungDatum.add(sp.getDatum()); zweck.add(sp.getZweck()); - nettobetrag.add(sp.getNettobetrag().doubleValue()); + nettobetrag.add(Double.valueOf(sp.getNettobetrag())); steuersatz.add( "(" + formatter.format(Double.valueOf(sp.getSteuersatz())) + ")"); - steuerbetrag.add(sp.getSteuerbetrag().doubleValue()); + steuerbetrag.add(Double.valueOf(sp.getSteuerbetrag())); betrag.add(sp.getBetrag()); summe += sp.getBetrag(); } diff --git a/src/de/jost_net/JVerein/io/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index 624538050..973e2675d 100644 --- a/src/de/jost_net/JVerein/io/FormularAufbereitung.java +++ b/src/de/jost_net/JVerein/io/FormularAufbereitung.java @@ -721,14 +721,18 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException for (SollbuchungPosition sp : re.getMitgliedskonto() .getSollbuchungPositionList()) { - BigDecimal betrag = sp.getNettobetrag(); + Double betrag = sp.getNettobetrag(); + if (betrag == null || betrag == 0) + { + betrag = sp.getBetrag(); + } if (sp.getBetrag() < 0) { invoice.addItem(new Item( new Product(sp.getZweck(), "", "LS", new BigDecimal(sp.getSteuersatz()).setScale(2, RoundingMode.HALF_DOWN)), - betrag.multiply(new BigDecimal(-1)), + new BigDecimal(betrag * -1).setScale(2, RoundingMode.HALF_DOWN), new BigDecimal(-1.0))); } else @@ -737,7 +741,7 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException "LS", // LS = pauschal new BigDecimal(sp.getSteuersatz()).setScale(2, RoundingMode.HALF_DOWN)), - betrag, + new BigDecimal(betrag).setScale(2, RoundingMode.HALF_DOWN), new BigDecimal(1.0))); } } diff --git a/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java index c78741780..9cc6d2dc9 100644 --- a/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java +++ b/src/de/jost_net/JVerein/rmi/SollbuchungPosition.java @@ -16,7 +16,6 @@ **********************************************************************/ package de.jost_net.JVerein.rmi; -import java.math.BigDecimal; import java.rmi.RemoteException; import java.util.Date; @@ -57,8 +56,8 @@ public interface SollbuchungPosition extends DBObject public String getZweck() throws RemoteException; - public BigDecimal getNettobetrag() throws RemoteException; + public Double getNettobetrag() throws RemoteException; - public BigDecimal getSteuerbetrag() throws RemoteException; + public Double getSteuerbetrag() throws RemoteException; } diff --git a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java index 88cddf730..c8f04cda6 100644 --- a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -16,7 +16,6 @@ **********************************************************************/ package de.jost_net.JVerein.server; -import java.math.BigDecimal; import java.rmi.RemoteException; import java.util.Date; @@ -84,27 +83,27 @@ public void setSteuersatz(Double satz) throws RemoteException } @Override - public BigDecimal getNettobetrag() throws RemoteException + public Double getNettobetrag() throws RemoteException { Double betrag = (Double) getAttribute("betrag"); Double steuersatz = (Double) getAttribute("steuersatz"); if (steuersatz == null || betrag == null) { - return new BigDecimal(betrag); + return betrag; } - return new BigDecimal(betrag / (1 + steuersatz / 100)); + return betrag / (1 + steuersatz / 100); } @Override - public BigDecimal getSteuerbetrag() throws RemoteException + public Double getSteuerbetrag() throws RemoteException { Double betrag = (Double) getAttribute("betrag"); Double steuersatz = (Double) getAttribute("steuersatz"); if (steuersatz == null || betrag == null) { - return new BigDecimal(0); + return 0d; } - return new BigDecimal(betrag - betrag / (1 + steuersatz / 100)); + return betrag - betrag / (1 + steuersatz / 100); } @Override From 45d5caf77540c0b757f2c7d71c29ffa3bc29393e Mon Sep 17 00:00:00 2001 From: nils Date: Fri, 17 Jan 2025 21:12:41 +0100 Subject: [PATCH 47/52] Berechnung Steuer --- .../JVerein/io/FormularAufbereitung.java | 29 ++++--------------- .../server/SollbuchungPositionImpl.java | 2 +- 2 files changed, 7 insertions(+), 24 deletions(-) diff --git a/src/de/jost_net/JVerein/io/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index 973e2675d..dc42f7058 100644 --- a/src/de/jost_net/JVerein/io/FormularAufbereitung.java +++ b/src/de/jost_net/JVerein/io/FormularAufbereitung.java @@ -721,29 +721,12 @@ public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException for (SollbuchungPosition sp : re.getMitgliedskonto() .getSollbuchungPositionList()) { - Double betrag = sp.getNettobetrag(); - if (betrag == null || betrag == 0) - { - betrag = sp.getBetrag(); - } - if (sp.getBetrag() < 0) - { - invoice.addItem(new Item( - new Product(sp.getZweck(), "", "LS", - new BigDecimal(sp.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(sp.getZweck(), "", - "LS", // LS = pauschal - new BigDecimal(sp.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/server/SollbuchungPositionImpl.java b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java index c8f04cda6..8c6a24f29 100644 --- a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -103,7 +103,7 @@ public Double getSteuerbetrag() throws RemoteException { return 0d; } - return betrag - betrag / (1 + steuersatz / 100); + return betrag * steuersatz / (100 + steuersatz); } @Override From ba155f4d1f8e5ae10a203566a13ad266f00fe7de Mon Sep 17 00:00:00 2001 From: nils Date: Sat, 18 Jan 2025 11:45:36 +0100 Subject: [PATCH 48/52] MergeKonflikt falsch behoben --- src/de/jost_net/JVerein/io/AbrechnungSEPA.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index 7098e391f..5f26797db 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -1294,12 +1294,13 @@ private void 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; } } From c9bf6a1a01d016e70a22e9e5a87bf03b121668ce Mon Sep 17 00:00:00 2001 From: tolot27 Date: Sat, 18 Jan 2025 19:31:51 +0100 Subject: [PATCH 49/52] =?UTF-8?q?Versionsnummer=20von=20DB=20Update=20Scri?= =?UTF-8?q?pt=20erh=C3=B6ht?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DDLTool/Updates/{Update0456.java => Update0457.java} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename src/de/jost_net/JVerein/server/DDLTool/Updates/{Update0456.java => Update0457.java} (97%) diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0457.java similarity index 97% rename from src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java rename to src/de/jost_net/JVerein/server/DDLTool/Updates/Update0457.java index 9f8a9a2e1..0db05039b 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0456.java +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0457.java @@ -22,9 +22,9 @@ import de.willuhn.util.ApplicationException; import de.willuhn.util.ProgressMonitor; -public class Update0456 extends AbstractDDLUpdate +public class Update0457 extends AbstractDDLUpdate { - public Update0456(String driver, ProgressMonitor monitor, Connection conn) + public Update0457(String driver, ProgressMonitor monitor, Connection conn) { super(driver, monitor, conn); } From 0ddf516a5285a795f00aa691c8b808ce78074e53 Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 20 Jan 2025 17:01:15 +0100 Subject: [PATCH 50/52] =?UTF-8?q?Steuerspalten=20aus=20AbrechnunggslaufSol?= =?UTF-8?q?lbuchungView=20entfernt,=20Men=C3=BC=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AbrechnungslaufBuchungenControl.java | 20 ++++--------------- .../JVerein/gui/menu/SollbuchungMenu.java | 4 ++++ 2 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java index 59cfa514c..0603e9198 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java @@ -27,6 +27,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.action.MitgliedDetailAction; 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; @@ -159,22 +160,8 @@ public Part getSollbuchungsList() throws RemoteException 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/menu/SollbuchungMenu.java b/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java index 835cbef62..1794350db 100644 --- a/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java @@ -76,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) From 0d9a4f9592631394749b8ffedef2e1261689e582 Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 20 Jan 2025 17:09:23 +0100 Subject: [PATCH 51/52] =?UTF-8?q?Doppelklick=20Sollbuchung=20statt=20Mitgl?= =?UTF-8?q?eid=20=C3=B6ffnen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JVerein/gui/control/AbrechnungslaufBuchungenControl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java index 0603e9198..41eabd77c 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java @@ -25,7 +25,7 @@ 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; @@ -154,7 +154,7 @@ 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())); From 7be3c2146f19daebd4b469781132f814356c105e Mon Sep 17 00:00:00 2001 From: nils Date: Mon, 20 Jan 2025 17:30:53 +0100 Subject: [PATCH 52/52] =?UTF-8?q?SollbuchungView=20Netto=20und=20Steuerbet?= =?UTF-8?q?rag=20Spalten=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JVerein/gui/control/MitgliedskontoControl.java | 10 ++++++++-- .../JVerein/server/SollbuchungPositionImpl.java | 8 ++++++++ 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index 8c4837316..b9083700e 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -531,8 +531,14 @@ public Part getBuchungenList() throws RemoteException buchungList.addColumn("Zweck", "zweck"); buchungList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); - // TODO Steuer muss überrbeitet werden - // buchungList.addColumn("Steuersatz", "steuersatz"); + 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()) { diff --git a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java index 8c6a24f29..e63b8c72f 100644 --- a/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java +++ b/src/de/jost_net/JVerein/server/SollbuchungPositionImpl.java @@ -206,6 +206,14 @@ 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); } }