### 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("
" + + "

Statistikdaten

" + + "

Hier fehlen noch die Statistikdaten des Abrechnungslaufs.

" + + "

Anzahl Buchungen, Offene Posten, etc.

" + + "
Tst
" + + "
"); + 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); + } + }