### Eclipse Workspace Patch 1.0
#P jverein
diff --git src/de/jost_net/JVerein/gui/action/AbrechnungslaufDetailAction.java src/de/jost_net/JVerein/gui/action/AbrechnungslaufDetailAction.java
new file mode 100644
index 0000000..a4b2842
--- /dev/null
+++ src/de/jost_net/JVerein/gui/action/AbrechnungslaufDetailAction.java
@@ -0,0 +1,48 @@
+/**********************************************************************
+ * JVerein - Mitgliederverwaltung und einfache Buchhaltung für Vereine
+ * Copyright (c) by Heiner Jostkleigrewe
+ * Copyright (c) 2015 by Thomas Hooge
+ * Main Project: heiner@jverein.dem http://www.jverein.de/
+ * Module Author: thomas@hoogi.de, http://www.hoogi.de/
+ *
+ * This file is part of JVerein.
+ *
+ * JVerein 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.
+ *
+ * JVerein 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.gui.action;
+
+import de.jost_net.JVerein.gui.view.AbrechnungslaufView;
+import de.jost_net.JVerein.rmi.Abrechnungslauf;
+import de.willuhn.jameica.gui.Action;
+import de.willuhn.jameica.gui.GUI;
+import de.willuhn.util.ApplicationException;
+
+public class AbrechnungslaufDetailAction implements Action
+{
+
+ @Override
+ public void handleAction(Object context) throws ApplicationException
+ {
+ if (context == null)
+ {
+ throw new ApplicationException("Keine Abrechnunglauf ausgewählt.");
+ }
+ if (!(context instanceof Abrechnungslauf))
+ {
+ throw new ApplicationException("Programmfehler, kein Abrechnunglauf!");
+ }
+ GUI.startView(AbrechnungslaufView.class.getName(), context);
+ }
+}
diff --git src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java
index 1449dcb..551d7cb 100644
--- src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java
+++ src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java
@@ -17,21 +17,33 @@
package de.jost_net.JVerein.gui.control;
import java.rmi.RemoteException;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Date;
import de.jost_net.JVerein.Einstellungen;
import de.jost_net.JVerein.gui.formatter.AbrechnungsmodusFormatter;
import de.jost_net.JVerein.gui.formatter.JaNeinFormatter;
import de.jost_net.JVerein.gui.menu.AbrechnungslaufMenu;
+import de.jost_net.JVerein.keys.Abrechnungsmodi;
import de.jost_net.JVerein.rmi.Abrechnungslauf;
import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ;
import de.willuhn.datasource.rmi.DBIterator;
import de.willuhn.datasource.rmi.DBService;
+import de.willuhn.datasource.rmi.ResultSetExtractor;
import de.willuhn.jameica.gui.AbstractControl;
import de.willuhn.jameica.gui.AbstractView;
+import de.willuhn.jameica.gui.GUI;
import de.willuhn.jameica.gui.Part;
+import de.willuhn.jameica.gui.formatter.CurrencyFormatter;
import de.willuhn.jameica.gui.formatter.DateFormatter;
+import de.willuhn.jameica.gui.input.Input;
+import de.willuhn.jameica.gui.input.LabelInput;
+import de.willuhn.jameica.gui.input.TextInput;
import de.willuhn.jameica.gui.parts.Column;
import de.willuhn.jameica.gui.parts.TablePart;
+import de.willuhn.logging.Logger;
+import de.willuhn.util.ApplicationException;
public class AbrechnungslaufControl extends AbstractControl
{
@@ -41,6 +53,20 @@
private Abrechnungslauf abrl;
private TablePart abrechnungslaufList;
+
+ private LabelInput datum;
+ private LabelInput abgeschlossen;
+ private LabelInput modus;
+ private LabelInput faelligkeit1;
+ private LabelInput faelligkeit2;
+ private LabelInput stichtag;
+ private LabelInput eingabedatum;
+ private LabelInput zahlungsgrund;
+ private LabelInput zusatzabrechnungen;
+ private TextInput bemerkung;
+
+ private LabelInput statistikbuchungen;
+ private LabelInput statistiklastschriften;
public AbrechnungslaufControl(AbstractView view)
{
@@ -59,9 +85,254 @@
return abrl;
}
+ public LabelInput getDatum() throws RemoteException
+ {
+ if (datum != null)
+ {
+ return datum;
+ }
+ datum = new LabelInput(
+ new JVDateFormatTTMMJJJJ().format(getAbrechnungslaeufe().getDatum())
+ );
+ datum.setName("Datum");
+ return datum;
+ }
+
+ public LabelInput getAbgeschlossen() throws RemoteException
+ {
+ if (abgeschlossen != null)
+ {
+ return abgeschlossen;
+ }
+ Boolean b = getAbrechnungslaeufe().getAbgeschlossen();
+ abgeschlossen = new LabelInput(b ? "Ja" : "Nein");
+ abgeschlossen.setName("Abgeschlossen");
+ return abgeschlossen;
+ }
+
+ public LabelInput getAbrechnungsmodus() throws RemoteException
+ {
+ if (modus != null)
+ {
+ return modus;
+ }
+ String m = Abrechnungsmodi.get(getAbrechnungslaeufe().getModus());
+ modus = new LabelInput(m);
+ modus.setName("Abrechnungsmodus");
+ return modus;
+ }
+
+ public LabelInput getFaelligkeit1() throws RemoteException
+ {
+ if (faelligkeit1 != null)
+ {
+ return faelligkeit1;
+ }
+ faelligkeit1 = new LabelInput(
+ new JVDateFormatTTMMJJJJ().format(getAbrechnungslaeufe().getFaelligkeit())
+ );
+ faelligkeit1.setName("Fälligkeit 1");
+ return faelligkeit1;
+ }
+
+ public LabelInput getFaelligkeit2() throws RemoteException
+ {
+ if (faelligkeit2 != null)
+ {
+ return faelligkeit2;
+ }
+ faelligkeit2 = new LabelInput(
+ new JVDateFormatTTMMJJJJ().format(getAbrechnungslaeufe().getFaelligkeit2())
+ );
+ faelligkeit2.setName("Fälligkeit 2");
+ return faelligkeit2;
+ }
+
+ public LabelInput getStichtag() throws RemoteException
+ {
+ if (stichtag != null)
+ {
+ return stichtag;
+ }
+ stichtag = new LabelInput(
+ new JVDateFormatTTMMJJJJ().format(getAbrechnungslaeufe().getStichtag())
+ );
+ stichtag.setName("Stichtag");
+ return stichtag;
+ }
+
+ public LabelInput getEingabedatum() throws RemoteException
+ {
+ if (eingabedatum != null)
+ {
+ return eingabedatum;
+ }
+ Date ed = getAbrechnungslaeufe().getEingabedatum();
+ // TODO ungültige Daten ausfiltern
+ eingabedatum = new LabelInput(
+ new JVDateFormatTTMMJJJJ().format(ed)
+ );
+ eingabedatum.setName("Eingabedatum");
+ return eingabedatum;
+ }
+
+ public LabelInput getZahlungsgrund() throws RemoteException
+ {
+ if (zahlungsgrund != null)
+ {
+ return zahlungsgrund;
+ }
+ zahlungsgrund = new LabelInput(getAbrechnungslaeufe().getZahlungsgrund());
+ zahlungsgrund.setName("Zahlungsgrund");
+ return zahlungsgrund;
+ }
+
+ public LabelInput getZusatzAbrechnungen() throws RemoteException
+ {
+ if (zusatzabrechnungen != null)
+ {
+ return zusatzabrechnungen;
+ }
+ String zs = "";
+ if (getAbrechnungslaeufe().getZusatzbetraege())
+ {
+ zs += "Zusatzbeträge ";
+ }
+ if (getAbrechnungslaeufe().getKursteilnehmer())
+ {
+ zs += "Kursteilnehmer ";
+ }
+ zusatzabrechnungen = new LabelInput(zs);
+ zusatzabrechnungen.setName("Weitere Abrechnungen");
+ return zusatzabrechnungen;
+ }
+
+ public Input getBemerkung() throws RemoteException
+ {
+ if (bemerkung != null)
+ {
+ return bemerkung;
+ }
+ bemerkung = new TextInput(getAbrechnungslaeufe().getBemerkung(), 80);
+ bemerkung.setName("Bemerkung");
+ return bemerkung;
+ }
+
+ public LabelInput getStatistikBuchungen() throws RemoteException
+ {
+ // Summe und Anzahl der Buchungen. Es gibt einen weiterer Datensatz
+ // wo die Buchungsart NULL ist, es handelt sich um die Gegenbuchung
+ // mit umgekehrten Vorzeichen.
+
+ if (statistikbuchungen != null)
+ {
+ return statistikbuchungen;
+ }
+
+ final class StatData
+ {
+ Double summe;
+ Integer anzahl;
+ }
+
+ ResultSetExtractor rs = new ResultSetExtractor()
+ {
+ @Override
+ public Object extract(ResultSet rs) throws SQLException
+ {
+ StatData ret = new StatData();
+ while (rs.next())
+ {
+ ret.summe = rs.getDouble(1);
+ ret.anzahl = rs.getInt(2);
+ }
+ return ret;
+ }
+ };
+
+ String sql = "SELECT SUM(betrag), COUNT(id) "
+ + "FROM buchung "
+ + "WHERE abrechnungslauf=? AND buchungsart IS NOT NULL";
+ StatData data = (StatData) Einstellungen.getDBService().execute(sql,
+ new Object[] { getAbrechnungslaeufe().getID() }, rs);
+
+ CurrencyFormatter cf = new CurrencyFormatter("EUR", Einstellungen.DECIMALFORMAT);
+ String s = String.format("Anzahl: %s; Summe %s",
+ data.anzahl.toString(), cf.format(data.summe));
+ statistikbuchungen = new LabelInput(s);
+ statistikbuchungen.setName("Buchungen");
+
+ return statistikbuchungen;
+ }
+
+ public LabelInput getStatistikLastschriften() throws RemoteException
+ {
+ // Summe und Anzahl der Lastschriften.
+
+ if (statistiklastschriften != null)
+ {
+ return statistiklastschriften;
+ }
+
+ final class StatData
+ {
+ Double summe;
+ Integer anzahl;
+ }
+
+ ResultSetExtractor rs = new ResultSetExtractor()
+ {
+ @Override
+ public Object extract(ResultSet rs) throws SQLException
+ {
+ StatData ret = new StatData();
+ while (rs.next())
+ {
+ ret.summe = rs.getDouble(1);
+ ret.anzahl = rs.getInt(2);
+ }
+ return ret;
+ }
+ };
+
+ String sql = "SELECT SUM(betrag), COUNT(id) "
+ + "FROM lastschrift "
+ + "WHERE abrechnungslauf=?";
+ StatData data = (StatData) Einstellungen.getDBService().execute(sql,
+ new Object[] { getAbrechnungslaeufe().getID() }, rs);
+
+ CurrencyFormatter cf = new CurrencyFormatter("EUR", Einstellungen.DECIMALFORMAT);
+ String s = String.format("Anzahl: %s; Summe %s",
+ data.anzahl.toString(), cf.format(data.summe));
+ statistiklastschriften = new LabelInput(s);
+ statistiklastschriften.setName("Lastschriften");
+
+ return statistiklastschriften;
+ }
+
public void handleStore()
{
- //
+ // Es kann nur die Bemerkung verändert werden
+ try
+ {
+ Abrechnungslauf al = getAbrechnungslaeufe();
+ al.setBemerkung((String) getBemerkung().getValue());
+ try
+ {
+ al.store();
+ GUI.getStatusBar().setSuccessText("Bemerkung zum Abrechnungslauf gespeichert");
+ }
+ catch (ApplicationException e)
+ {
+ GUI.getStatusBar().setErrorText(e.getMessage());
+ }
+ }
+ catch (RemoteException e)
+ {
+ String fehler = "Fehler beim Speichern des Abrechnungslaufs";
+ Logger.error(fehler, e);
+ GUI.getStatusBar().setErrorText(fehler);
+ }
}
public Part getAbrechungslaeufeList() throws RemoteException
diff --git src/de/jost_net/JVerein/gui/menu/AbrechnungslaufMenu.java src/de/jost_net/JVerein/gui/menu/AbrechnungslaufMenu.java
index f27974d..61cac13 100644
--- src/de/jost_net/JVerein/gui/menu/AbrechnungslaufMenu.java
+++ src/de/jost_net/JVerein/gui/menu/AbrechnungslaufMenu.java
@@ -21,6 +21,7 @@
import de.jost_net.JVerein.Einstellungen;
import de.jost_net.JVerein.gui.action.AbrechnungslaufAbschliessenAction;
import de.jost_net.JVerein.gui.action.AbrechnungslaufDeleteAction;
+import de.jost_net.JVerein.gui.action.AbrechnungslaufDetailAction;
import de.jost_net.JVerein.gui.action.PreNotificationAction;
import de.jost_net.JVerein.rmi.Abrechnungslauf;
import de.willuhn.jameica.gui.Action;
@@ -40,6 +41,8 @@
*/
public AbrechnungslaufMenu()
{
+ addItem(new ContextMenuItem("Bearbeiten",
+ new AbrechnungslaufDetailAction(), "edit.png"));
addItem(new AbgeschlossenDisabledItem("Pre-Notification",
new PreNotificationAction(), "document-new.png"));
addItem(new AbgeschlossenDisabledItem("löschen...",
diff --git src/de/jost_net/JVerein/gui/view/AbrechnungslaufView.java src/de/jost_net/JVerein/gui/view/AbrechnungslaufView.java
new file mode 100644
index 0000000..1bc1f0a
--- /dev/null
+++ src/de/jost_net/JVerein/gui/view/AbrechnungslaufView.java
@@ -0,0 +1,85 @@
+/**********************************************************************
+ * JVerein - Mitgliederverwaltung und einfache Buchhaltung für Vereine
+ * Copyright (c) by Heiner Jostkleigrewe
+ * Copyright (c) 2015 by Thomas Hooge
+ * Main Project: heiner@jverein.dem http://www.jverein.de/
+ * Module Author: thomas@hoogi.de, http://www.hoogi.de/
+ *
+ * This file is part of JVerein.
+ *
+ * JVerein 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.
+ *
+ * JVerein 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.gui.view;
+
+import de.jost_net.JVerein.gui.action.DokumentationAction;
+import de.jost_net.JVerein.gui.control.AbrechnungslaufControl;
+import de.willuhn.jameica.gui.AbstractView;
+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;
+
+public class AbrechnungslaufView extends AbstractView
+{
+
+ @Override
+ public void bind() throws Exception
+ {
+ GUI.getView().setTitle("Abrechnungslauf");
+
+ final AbrechnungslaufControl control = new AbrechnungslaufControl(this);
+
+ LabelGroup group = new LabelGroup(getParent(), "Detaildaten");
+ group.addInput(control.getDatum());
+ group.addInput(control.getAbgeschlossen());
+ group.addInput(control.getAbrechnungsmodus());
+ group.addInput(control.getFaelligkeit1());
+ group.addInput(control.getFaelligkeit2());
+ group.addInput(control.getStichtag());
+ group.addInput(control.getEingabedatum());
+ group.addInput(control.getZahlungsgrund());
+ group.addInput(control.getZusatzAbrechnungen());
+ group.addInput(control.getBemerkung());
+
+ group = new LabelGroup(getParent(), "Statistikdaten");
+ group.addInput(control.getStatistikBuchungen());
+ group.addInput(control.getStatistikLastschriften());
+
+ /*
+ FormTextPart text = new FormTextPart();
+ text.setText("
");
+ text.paint(getParent());
+ */
+
+ ButtonArea buttons = new ButtonArea();
+ buttons.addButton("Hilfe", new DokumentationAction(),
+ DokumentationUtil.ABRECHNUNGSLAUF, false, "help-browser.png");
+ buttons.addButton("Speichern", new Action()
+ {
+ @Override
+ public void handleAction(Object context)
+ {
+ control.handleStore();
+ }
+ }, null, true, "document-save.png");
+ buttons.paint(this.getParent());
+ }
+
+}
diff --git src/de/jost_net/JVerein/rmi/Abrechnungslauf.java src/de/jost_net/JVerein/rmi/Abrechnungslauf.java
index e8dbc45..438e431 100644
--- src/de/jost_net/JVerein/rmi/Abrechnungslauf.java
+++ src/de/jost_net/JVerein/rmi/Abrechnungslauf.java
@@ -77,4 +77,8 @@
public void setAbgeschlossen(Boolean abgeschlossen) throws RemoteException;
+ public String getBemerkung() throws RemoteException;
+
+ public void setBemerkung(String bemerkung) throws RemoteException;
+
}
diff --git src/de/jost_net/JVerein/server/AbrechnungslaufImpl.java src/de/jost_net/JVerein/server/AbrechnungslaufImpl.java
index 423c89f..560f9b9 100644
--- src/de/jost_net/JVerein/server/AbrechnungslaufImpl.java
+++ src/de/jost_net/JVerein/server/AbrechnungslaufImpl.java
@@ -272,4 +272,16 @@
setAttribute("abgeschlossen", abgeschlossen);
}
+ @Override
+ public String getBemerkung() throws RemoteException
+ {
+ return (String) getAttribute("bemerkung");
+ }
+
+ @Override
+ public void setBemerkung(String bemerkung) throws RemoteException
+ {
+ setAttribute("bemerkung", bemerkung);
+ }
+
}