diff --git a/.classpath b/.classpath index 8066ed5d8..647a2f837 100644 --- a/.classpath +++ b/.classpath @@ -2,7 +2,7 @@ - + @@ -28,5 +28,10 @@ + + + + + diff --git a/.github/workflows/buildcheck.yml b/.github/workflows/buildcheck.yml new file mode 100644 index 000000000..acd66ee87 --- /dev/null +++ b/.github/workflows/buildcheck.yml @@ -0,0 +1,40 @@ +# This workflow will build a Java project with Ant +# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant + +name: OpenJVerein build check + +on: + pull_request: + types: [opened, reopened, synchronize, edited] + paths: + - 'plugin.xml' + - 'build/**' + - 'lib/**' + - 'lib.src/**' + - 'src/**' +jobs: + call-reusable-workflow: + uses: ./.github/workflows/reusable-build.yml + + build-check: + needs: call-reusable-workflow + runs-on: ubuntu-latest + steps: + - name: Restore cached tags and jars + id: cache-tags-jars + uses: actions/cache@v4 + with: + path: | + ./cached-tags + jameica + hibiscus + key: ${{ runner.os }}-${{ github.repository_id }} + + - name: Checkout openjverein + uses: actions/checkout@v4 + with: + path: jverein + + - name: Build openjverein plugin + working-directory: ./ + run: ant -noinput -buildfile jverein/build/build.xml compile diff --git a/.github/workflows/nightly-builds.yml b/.github/workflows/nightly-build.yml similarity index 61% rename from .github/workflows/nightly-builds.yml rename to .github/workflows/nightly-build.yml index 5569b1bf6..1156d7691 100644 --- a/.github/workflows/nightly-builds.yml +++ b/.github/workflows/nightly-build.yml @@ -1,7 +1,7 @@ # This workflow will build a Java project with Ant # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant -name: openjverein nightly release +name: OpenJVerein nightly release on: push: @@ -11,41 +11,24 @@ on: - '**' jobs: - build: - name: Building release and upload to branch + call-reusable-workflow: + uses: ./.github/workflows/reusable-build.yml + nightly-build: + needs: call-reusable-workflow runs-on: ubuntu-latest - steps: - - name: Set up JDK 11 for x64 - uses: actions/setup-java@v3 - with: - java-version: '11' - distribution: 'temurin' - architecture: x64 - - - name: Check out jameica - uses: actions/checkout@v4 + - name: Restore cached tags and jars + id: cache-tags-jars + uses: actions/cache@v4 with: - repository: willuhn/jameica - path: jameica - - - name: Build jameica nightly - working-directory: ./ - run: ant -noinput -buildfile jameica/build/build.xml nightly - - - name: Check out hibiscus - uses: actions/checkout@v4 - with: - repository: willuhn/hibiscus - path: hibiscus - - - name: Build hibiscus nightly - working-directory: ./ - run: ant -noinput -buildfile hibiscus/build/build.xml nightly + path: | + ./cached-tags + jameica + hibiscus + key: ${{ runner.os }}-${{ github.repository_id }} - name: Checkout openjverein - id: openjverein_checkout uses: actions/checkout@v4 with: path: jverein @@ -55,7 +38,7 @@ jobs: working-directory: ./ run: | ant_output=$(ant -e -q -noinput -buildfile jverein/build/build.xml nightly) - echo $ant_output + echo ${ant_output} ssa="SELECTED_VERSION=" ssb=".zip" @@ -74,11 +57,11 @@ jobs: tmp_path=$(echo $text | sed -rn 's/^([^[:blank:]]*).*$/\1/p') echo "selected_version=${tmp_version}" >> $GITHUB_OUTPUT - echo "selected_filename=$tmp_filename" >> $GITHUB_OUTPUT - echo "selected_path=$tmp_path" >> $GITHUB_OUTPUT + echo "selected_filename=${tmp_filename}" >> $GITHUB_OUTPUT + echo "selected_path=${tmp_path}" >> $GITHUB_OUTPUT builddatetime=$(date +'%Y-%m-%d %H:%M') - echo "### Version: $tmp_version | filename: $tmp_filename | build datetime: $builddatetime" >> $GITHUB_STEP_SUMMARY + echo "### Version: ${tmp_version} | filename: ${tmp_filename} | build datetime: ${builddatetime}" >> $GITHUB_STEP_SUMMARY # Update tag - name: Tag repo @@ -95,4 +78,4 @@ jobs: prerelease: true name: Release ${{ steps.openjverein.outputs.selected_version }} files: ./jverein/${{ steps.openjverein.outputs.selected_path }} - generate_release_notes: false \ No newline at end of file + generate_release_notes: false diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b0c1482ef..a595da09e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,46 +1,29 @@ # This workflow will build a Java project with Ant # For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-java-with-ant -name: openjverein official release +name: OpenJVerein official release on: workflow_dispatch jobs: - build: - name: Building release and upload to branch + call-reusable-workflow: + uses: ./.github/workflows/reusable-build.yml + release: + needs: call-reusable-workflow runs-on: ubuntu-latest - steps: - - name: Set up JDK 11 for x64 - uses: actions/setup-java@v3 - with: - java-version: '11' - distribution: 'temurin' - architecture: x64 - - - name: Check out jameica - uses: actions/checkout@v4 + - name: Restore cached tags and jars + id: cache-tags-jars + uses: actions/cache@v4 with: - repository: willuhn/jameica - path: jameica - - - name: Build jameica nightly - working-directory: ./ - run: ant -noinput -buildfile jameica/build/build.xml nightly - - - name: Check out hibiscus - uses: actions/checkout@v4 - with: - repository: willuhn/hibiscus - path: hibiscus - - - name: Build hibiscus nightly - working-directory: ./ - run: ant -noinput -buildfile hibiscus/build/build.xml nightly + path: | + ./cached-tags + jameica + hibiscus + key: ${{ runner.os }}-${{ github.repository_id }} - name: Checkout openjverein - id: openjverein_checkout uses: actions/checkout@v4 with: path: jverein @@ -50,7 +33,7 @@ jobs: working-directory: ./ run: | ant_output=$(ant -e -q -noinput -buildfile jverein/build/build.xml) - echo $ant_output + echo ${ant_output} ssa="SELECTED_VERSION=" ssb=".zip" @@ -70,11 +53,11 @@ jobs: tmp_path=$(echo $text | sed -rn 's/^([^[:blank:]]*).*$/\1/p') echo "selected_version=${tmp_version}" >> $GITHUB_OUTPUT - echo "selected_filename=$tmp_filename" >> $GITHUB_OUTPUT - echo "selected_path=$tmp_path" >> $GITHUB_OUTPUT + echo "selected_filename=${tmp_filename}" >> $GITHUB_OUTPUT + echo "selected_path=${tmp_path}" >> $GITHUB_OUTPUT builddatetime=$(date +'%Y-%m-%d %H:%M') - echo "### Version: $tmp_version | filename: $tmp_filename | build datetime: $builddatetime" >> $GITHUB_STEP_SUMMARY + echo "### Version: ${tmp_version} | filename: ${tmp_filename} | build datetime: ${builddatetime}" >> $GITHUB_STEP_SUMMARY - name: Release uses: softprops/action-gh-release@v2 @@ -83,4 +66,4 @@ jobs: prerelease: false name: Release ${{ steps.openjverein.outputs.selected_version }} files: ./jverein/${{ steps.openjverein.outputs.selected_path }} - generate_release_notes: true \ No newline at end of file + generate_release_notes: true diff --git a/.github/workflows/reusable-build.yml b/.github/workflows/reusable-build.yml new file mode 100644 index 000000000..2b8c51311 --- /dev/null +++ b/.github/workflows/reusable-build.yml @@ -0,0 +1,97 @@ +name: Reusable build steps + +on: + workflow_call: + +jobs: + setup-java-and-cache: + runs-on: ubuntu-latest + steps: + - name: Set up JDK for x64 + uses: actions/setup-java@v4 + with: + java-version: '11' + distribution: 'temurin' + architecture: x64 + + - name: Set env + id: setenvs + run: | + jameica_tag=$(git ls-remote --refs --tags --sort="-v:refname" https://github.com/willuhn/jameica.git V_\* | head -1 | cut -f 2 | cut -d / -f 3) + echo "jameica_tag=${jameica_tag}" >> $GITHUB_ENV + hibiscus_tag=$(git ls-remote --refs --tags --sort="-v:refname" https://github.com/willuhn/hibiscus.git V_\* | head -1 | cut -f 2 | cut -d / -f 3) + echo "hibiscus_tag=${hibiscus_tag}" >> $GITHUB_ENV + echo "### jameica_tag: ${jameica_tag} | hibiscus_tag: ${hibiscus_tag}" + + - name: Restore cached tags and folders + id: cache-tags-jars + uses: actions/cache@v4 + with: + path: | + ./cached-tags + jameica + hibiscus + key: ${{ runner.os }}-${{ github.repository_id }} + + - name: Load cached tags + id: load-cache + run: | + if [ -f ./cached-tags/jameica_tag ]; then + cached_jameica_tag=$(cat ./cached-tags/jameica_tag) + echo "cached_jameica_tag=${cached_jameica_tag}" >> $GITHUB_ENV + else + echo "cached_jameica_tag=" >> $GITHUB_ENV + fi + if [ -f ./cached-tags/hibiscus_tag ]; then + cached_hibiscus_tag=$(cat ./cached-tags/hibiscus_tag) + echo "cached_hibiscus_tag=${cached_hibiscus_tag}" >> $GITHUB_ENV + else + echo "cached_hibiscus_tag=" >> $GITHUB_ENV + fi + echo "### cached_jameica_tag: ${cached_jameica_tag} | cached_hibiscus_tag: ${cached_hibiscus_tag}" + + - name: Checkout jameica + if: ${{ env.cached_jameica_tag != env.jameica_tag }} + uses: actions/checkout@v4 + with: + repository: willuhn/jameica + path: jameica + ref: ${{ env.jameica_tag }} + + - name: Build jameica jar + if: ${{ env.cached_jameica_tag != env.jameica_tag }} + working-directory: ./ + run: | + ant -noinput -buildfile jameica/build/build.xml jar + find jameica/releases/ -type f -name jameica.jar -exec cp {} jameica/releases/jameica-lib.jar \; + + - name: Checkout hibiscus + if: ${{ env.cached_hibiscus_tag != env.hibiscus_tag }} + uses: actions/checkout@v4 + with: + repository: willuhn/hibiscus + path: hibiscus + ref: ${{ env.hibiscus_tag }} + + - name: Build hibiscus jar + if: ${{ env.cached_hibiscus_tag != env.hibiscus_tag }} + working-directory: ./ + run: | + ant -noinput -buildfile hibiscus/build/build.xml jar + find hibiscus/releases/ -type f -name hibiscus.jar -exec cp {} hibiscus/releases/hibiscus-lib.jar \; + + - name: Create cache files and needed folders + run: | + mkdir -p ./cached-tags + echo "${{ env.jameica_tag }}" > ./cached-tags/jameica_tag + echo "${{ env.hibiscus_tag }}" > ./cached-tags/hibiscus_tag + + - name: Cache tags and folders + uses: actions/cache@v4 + if: always() + with: + path: | + ./cached-tags + jameica + hibiscus + key: ${{ runner.os }}-${{ github.repository_id }} diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs index 7341ab168..049e42fd3 100644 --- a/.settings/org.eclipse.jdt.core.prefs +++ b/.settings/org.eclipse.jdt.core.prefs @@ -1,11 +1,11 @@ eclipse.preferences.version=1 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7 +org.eclipse.jdt.core.compiler.codegen.targetPlatform=11 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.7 +org.eclipse.jdt.core.compiler.compliance=11 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate org.eclipse.jdt.core.compiler.problem.assertIdentifier=error org.eclipse.jdt.core.compiler.problem.enumIdentifier=error -org.eclipse.jdt.core.compiler.source=1.7 +org.eclipse.jdt.core.compiler.source=11 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 64a89fa22..980e80820 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -20,7 +20,9 @@ Das Handbuch ist im Repository https://github.com/openjverein/jverein-Book. Der Für die OpenJVerein-Entwicklung werden benötigt - Eclipse/IntelliJ IDEA -- Java 11+ (JDK) +- Java 11 (JDK) + +Es wird Java 11 (keine höhere Version) benötigt, damit die Kompatibilität zu Jameica gewährleistet ist und keine APIs verwendet werden, die in späteren Java Versionen eingeführt wurden. # Build und Test Build und Test sind hier beschrieben: https://www.willuhn.de/wiki/doku.php?id=develop:eclipse diff --git a/build/build.xml b/build/build.xml index e9595863f..c5c8df499 100644 --- a/build/build.xml +++ b/build/build.xml @@ -54,7 +54,7 @@ - + diff --git a/junit/src/de/jost_net/JVereinJUnit/io/Adressbuch/AdressaufbereitungTest.java b/junit/src/de/jost_net/JVereinJUnit/io/Adressbuch/AdressaufbereitungTest.java index 83bcd7ce6..64ae2d8d7 100644 --- a/junit/src/de/jost_net/JVereinJUnit/io/Adressbuch/AdressaufbereitungTest.java +++ b/junit/src/de/jost_net/JVereinJUnit/io/Adressbuch/AdressaufbereitungTest.java @@ -27,6 +27,7 @@ import de.jost_net.JVerein.gui.input.GeschlechtInput; import de.jost_net.JVerein.io.IAdresse; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; +import de.jost_net.JVerein.keys.Staat; @RunWith(JUnit4.class) public class AdressaufbereitungTest @@ -221,6 +222,13 @@ public String getOrt() throws RemoteException @Override public String getStaat() throws RemoteException + { + return Staat.getStaat(getStaatCode()); + } + + + @Override + public String getStaatCode() throws RemoteException { return staat; } diff --git a/lib/dom4j-2.1.4.jar b/lib/dom4j-2.1.4.jar new file mode 100644 index 000000000..0769bed92 Binary files /dev/null and b/lib/dom4j-2.1.4.jar differ diff --git a/lib/jakarta.activation-api-2.1.3.jar b/lib/jakarta.activation-api-2.1.3.jar new file mode 100644 index 000000000..0d015d542 Binary files /dev/null and b/lib/jakarta.activation-api-2.1.3.jar differ diff --git a/lib/mustang-2.16.0.jar b/lib/mustang-2.16.0.jar new file mode 100644 index 000000000..b8c0461fb Binary files /dev/null and b/lib/mustang-2.16.0.jar differ diff --git a/lib/xmpbox-3.0.3.jar b/lib/xmpbox-3.0.3.jar new file mode 100644 index 000000000..26e3029e4 Binary files /dev/null and b/lib/xmpbox-3.0.3.jar differ diff --git a/nbproject/project.xml b/nbproject/project.xml index ea1053410..ee9501578 100644 --- a/nbproject/project.xml +++ b/nbproject/project.xml @@ -83,7 +83,7 @@ auxiliary.show.customizer.message= src ${define.compilepath} releases - 1.6 + 11 diff --git a/plugin.xml b/plugin.xml index 85aab8d70..9b9d95005 100644 --- a/plugin.xml +++ b/plugin.xml @@ -1,7 +1,7 @@ + name="jverein" version="2.9.0" class="de.jost_net.JVerein.JVereinPlugin"> OpenSource-Vereinsverwaltung https://openjverein.github.io/jameica-repository/[PLUGIN_ZIP] diff --git a/src/com/schlevoigt/JVerein/gui/control/BuchungsTextKorrekturControl.java b/src/com/schlevoigt/JVerein/gui/control/BuchungsTextKorrekturControl.java index 43b71c4de..29ca862ea 100644 --- a/src/com/schlevoigt/JVerein/gui/control/BuchungsTextKorrekturControl.java +++ b/src/com/schlevoigt/JVerein/gui/control/BuchungsTextKorrekturControl.java @@ -144,6 +144,7 @@ public void refreshBuchungen() throws RemoteException { for (Buchung b : query.get()) { buchungsList.addItem(b); } + buchungsList.sort(); } private void starteKorrektur() { diff --git a/src/com/schlevoigt/JVerein/gui/view/BuchungsTexteKorrigierenView.java b/src/com/schlevoigt/JVerein/gui/view/BuchungsTexteKorrigierenView.java index 01170406d..917d7ead7 100644 --- a/src/com/schlevoigt/JVerein/gui/view/BuchungsTexteKorrigierenView.java +++ b/src/com/schlevoigt/JVerein/gui/view/BuchungsTexteKorrigierenView.java @@ -28,7 +28,7 @@ public class BuchungsTexteKorrigierenView extends AbstractView { @Override public void bind() throws Exception { - GUI.getView().setTitle("Buchungstexte korrigieren"); + GUI.getView().setTitle("Buchungskorrektur"); final BuchungsTextKorrekturControl control = new BuchungsTextKorrekturControl(this); diff --git a/src/de/jost_net/JVerein/Queries/BuchungQuery.java b/src/de/jost_net/JVerein/Queries/BuchungQuery.java index 7776802e4..b045eaf0a 100644 --- a/src/de/jost_net/JVerein/Queries/BuchungQuery.java +++ b/src/de/jost_net/JVerein/Queries/BuchungQuery.java @@ -23,6 +23,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.io.Suchbetrag; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Konto; @@ -180,7 +181,8 @@ else if (!geldkonto) { it.join("konto"); it.addFilter("konto.id = buchung.konto"); - it.addFilter("anlagenkonto = true"); + it.addFilter("kontoart = ?", + new Object[] { Kontoart.ANLAGE.getKey() }); } diff --git a/src/de/jost_net/JVerein/Queries/MitgliedQuery.java b/src/de/jost_net/JVerein/Queries/MitgliedQuery.java index 7edf1cf95..94fb909e5 100644 --- a/src/de/jost_net/JVerein/Queries/MitgliedQuery.java +++ b/src/de/jost_net/JVerein/Queries/MitgliedQuery.java @@ -55,6 +55,8 @@ public class MitgliedQuery String zusatzfeld = null; String zusatzfelder = null; + + String sort = ""; public MitgliedQuery(FilterControl control) { @@ -65,6 +67,7 @@ public MitgliedQuery(FilterControl control) public ArrayList get(int adresstyp, String sort) throws RemoteException { + this.sort = sort; zusatzfeld = control.getAdditionalparamprefix1(); zusatzfelder = control.getAdditionalparamprefix2(); @@ -72,13 +75,6 @@ public ArrayList get(int adresstyp, String sort) throws RemoteExceptio ArrayList bedingungen = new ArrayList<>(); sql = "select distinct mitglied.*, ucase(name), ucase(vorname) "; - if (sort != null && !sort.isEmpty()) - { - if (sort.equals("Geburtstagsliste")) - { - sql += ", month(geburtsdatum), day(geburtsdatum) "; - } - } sql += "from mitglied "; Settings settings = control.getSettings(); char synonym = 'a'; @@ -370,30 +366,6 @@ else if (control.getMitgliedStatus().getValue().equals("Abgemeldet")) } } - if (sort != null && !sort.isEmpty()) - { - if (sort.equals("Name, Vorname")) - { - sql += " ORDER BY ucase(name), ucase(vorname)"; - } - else if (sort.equals("Eintrittsdatum")) - { - sql += " ORDER BY eintritt"; - } - else if (sort.equals("Geburtsdatum")) - { - sql += " ORDER BY geburtsdatum"; - } - else if (sort.equals("Geburtstagsliste")) - { - sql += " ORDER BY month(geburtsdatum), day(geburtsdatum)"; - } - } - else - { - sql += " ORDER BY name, vorname"; - } - Logger.debug(sql); ResultSetExtractor rs = new ResultSetExtractor() @@ -518,6 +490,29 @@ private ArrayList getMitglieder(ArrayList ids) DBIterator list = Einstellungen.getDBService().createList(Mitglied.class); list.addFilter("id in (" + StringUtils.join(ids, ",") + ")"); + if (sort != null && !sort.isEmpty()) + { + if (sort.equals("Name, Vorname")) + { + list.setOrder("ORDER BY ucase(name), ucase(vorname)"); + } + else if (sort.equals("Eintrittsdatum")) + { + list.setOrder(" ORDER BY eintritt"); + } + else if (sort.equals("Geburtsdatum")) + { + list.setOrder("ORDER BY geburtsdatum"); + } + else if (sort.equals("Geburtstagsliste")) + { + list.setOrder("ORDER BY month(geburtsdatum), day(geburtsdatum)"); + } + } + else + { + list.setOrder("ORDER BY name, vorname"); + } @SuppressWarnings("unchecked") ArrayList mitglieder = list != null ? (ArrayList) PseudoIterator.asList(list) : null; diff --git a/src/de/jost_net/JVerein/Queries/MitgliedskontoQuery.java b/src/de/jost_net/JVerein/Queries/MitgliedskontoQuery.java deleted file mode 100644 index 71588a41b..000000000 --- a/src/de/jost_net/JVerein/Queries/MitgliedskontoQuery.java +++ /dev/null @@ -1,161 +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.Queries; - -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.gui.control.MitgliedskontoControl.DIFFERENZ; -import de.jost_net.JVerein.keys.Zahlungsweg; -import de.jost_net.JVerein.rmi.Mitglied; -import de.jost_net.JVerein.rmi.Mitgliedskonto; -import de.willuhn.datasource.rmi.DBService; -import de.willuhn.datasource.rmi.ResultSetExtractor; -import de.willuhn.logging.Logger; - -public class MitgliedskontoQuery -{ - - private Mitglied mitglied; - - protected Date vonDatum; - - protected Date bisDatum; - - protected DIFFERENZ differenz; - - protected Boolean ohneAbbucher; - - private boolean and = false; - - private String sql = ""; - - private ArrayList bedingungen = new ArrayList<>(); - - private ArrayList ergebnis; - - public MitgliedskontoQuery(Mitglied m, Date vonDatum, Date bisDatum, - DIFFERENZ differenz, Boolean ohneAbbucher) - { - this.mitglied = m; - this.vonDatum = vonDatum; - this.bisDatum = bisDatum; - this.differenz = differenz; - this.ohneAbbucher = ohneAbbucher; - } - - @SuppressWarnings("unchecked") - public ArrayList get() throws RemoteException - { - final DBService service = Einstellungen.getDBService(); - ergebnis = new ArrayList<>(); - sql = "select mitgliedskonto.*, sum(buchung.betrag) "; - sql += "from mitgliedskonto "; - sql += "left join buchung on mitgliedskonto.id = buchung.MITGLIEDSKONTO "; - - addCondition("mitgliedskonto.mitglied = ?", mitglied.getID()); - - try - { - java.sql.Date vd = new java.sql.Date(vonDatum.getTime()); - addCondition("mitgliedskonto.datum >= ? ", vd); - } - catch (NullPointerException e) - { - //Logger.info("Export Mitgliedskonto ohne 'von-Datum'"); - } - - try - { - java.sql.Date bd = new java.sql.Date(bisDatum.getTime()); - addCondition("mitgliedskonto.datum <= ? ", bd); - } - catch (NullPointerException e) - { - //Logger.info("Export Mitgliedskonto ohne 'bis-Datum'"); - } - - if (ohneAbbucher.booleanValue()) - { - addCondition("mitgliedskonto.zahlungsweg <> ? ", - Zahlungsweg.BASISLASTSCHRIFT); - } - - sql += "group by mitgliedskonto.id "; - - if (DIFFERENZ.FEHLBETRAG == differenz) - { - sql += "having sum(buchung.betrag) < mitgliedskonto.betrag or sum(buchung.betrag) is null"; - } - if (DIFFERENZ.UEBERZAHLUNG == differenz) - { - sql += "having sum(buchung.betrag) > mitgliedskonto.betrag "; - } - - // sql += "ORDER BY datum DESC"; - - Logger.debug(sql); - - ResultSetExtractor rs = new ResultSetExtractor() - { - - @Override - public Object extract(ResultSet rs) throws RemoteException, SQLException - { - ArrayList list = new ArrayList<>(); - while (rs.next()) - { - list.add((Mitgliedskonto) service.createObject(Mitgliedskonto.class, - rs.getString(1))); - } - return list; - } - }; - ergebnis = (ArrayList) service.execute(sql, - bedingungen.toArray(), rs); - return ergebnis; - } - - public int getSize() - { - return ergebnis.size(); - } - - private void addCondition(String condition) - { - if (and) - { - sql += " AND "; - } - else - { - sql += "where "; - } - and = true; - sql += condition; - } - - private void addCondition(String condition, Object obj) - { - addCondition(condition); - bedingungen.add(obj); - } -} diff --git a/src/de/jost_net/JVerein/Queries/SollbuchungQuery.java b/src/de/jost_net/JVerein/Queries/SollbuchungQuery.java new file mode 100644 index 000000000..e1477a9ae --- /dev/null +++ b/src/de/jost_net/JVerein/Queries/SollbuchungQuery.java @@ -0,0 +1,463 @@ +/********************************************************************** + * 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.Queries; + +import java.math.BigDecimal; +import java.rmi.RemoteException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.StringTokenizer; + +import org.apache.commons.lang.StringUtils; + +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.gui.input.MailAuswertungInput; +import de.jost_net.JVerein.keys.Zahlungsweg; +import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.willuhn.datasource.GenericIterator; +import de.willuhn.datasource.rmi.DBIterator; +import de.willuhn.datasource.rmi.DBService; +import de.willuhn.datasource.rmi.ResultSetExtractor; + +public class SollbuchungQuery +{ + + protected boolean umwandeln = false; + + protected Mitglied mitglied = null; + + protected FilterControl control = null; + + public SollbuchungQuery(FilterControl control, boolean umwandeln, + Mitglied mitglied) + { + this.umwandeln = umwandeln; + this.control = control; + this.mitglied = mitglied; + } + + @SuppressWarnings("unchecked") + public GenericIterator get() throws RemoteException + { + Date d1 = null; + java.sql.Date vd = null; + java.sql.Date bd = null; + if (control.isDatumvonAktiv() && control.getDatumvon() != null) + { + d1 = (Date) control.getDatumvon().getValue(); + if (d1 != null) + { + vd = new java.sql.Date(d1.getTime()); + } + } + if (control.isDatumbisAktiv() && control.getDatumbis() != null) + { + d1 = (Date) control.getDatumbis().getValue(); + if (d1 != null) + { + bd = new java.sql.Date(d1.getTime()); + } + } + + DIFFERENZ diff = DIFFERENZ.EGAL; + if (control.isDifferenzAktiv() && control.getDifferenz() != null) + { + diff = (DIFFERENZ) control.getDifferenz().getValue(); + } + + boolean kein_name = !control.isSuchnameAktiv() + || control.getSuchname().getValue() == null + || ((String) control.getSuchname().getValue()).isEmpty(); + boolean ein_name = control.isSuchnameAktiv() + && control.getSuchname().getValue() != null + && !((String) control.getSuchname().getValue()).isEmpty(); + boolean keine_email = !control.isMailauswahlAktiv() || (Integer) control + .getMailauswahl().getValue() == MailAuswertungInput.ALLE; + boolean filter_email = control.isMailauswahlAktiv() && !((Integer) control + .getMailauswahl().getValue() == MailAuswertungInput.ALLE); + + // Falls kein Name, kein Mailfilter und keine Differenz dann alles lesen + if (kein_name && keine_email && diff == DIFFERENZ.EGAL) + { + DBIterator sollbuchungen = Einstellungen.getDBService() + .createList(Mitgliedskonto.class); + if (mitglied != null) + { + sollbuchungen.addFilter("mitgliedskonto.mitglied = ?", + new Object[] { Long.valueOf(mitglied.getID()) }); + } + if (vd != null) + { + sollbuchungen.addFilter("mitgliedskonto.datum >= ? ", + new Object[] { vd }); + } + if (bd != null) + { + sollbuchungen.addFilter("mitgliedskonto.datum <= ? ", + new Object[] { bd }); + } + if (control.isOhneAbbucherAktiv() + && (Boolean) control.getOhneAbbucher().getValue()) + { + sollbuchungen.addFilter("mitgliedskonto.zahlungsweg <> ?", + Zahlungsweg.BASISLASTSCHRIFT); + } + sollbuchungen.setOrder("ORDER BY mitgliedskonto.datum desc"); + return sollbuchungen; + } + + // Falls ein Name oder Mailfilter aber keine Differenz dann alles des + // Mitglieds lesen + if ((ein_name || filter_email) && diff == DIFFERENZ.EGAL) + { + DBIterator sollbuchungen = Einstellungen.getDBService() + .createList(Mitgliedskonto.class); + if (mitglied != null) + { + sollbuchungen.addFilter("mitgliedskonto.mitglied = ?", + new Object[] { Long.valueOf(mitglied.getID()) }); + } + if ((!umwandeln && ein_name) || filter_email) + { + sollbuchungen.join("mitglied"); + sollbuchungen.addFilter("mitglied.id = mitgliedskonto.mitglied"); + } + + if (!umwandeln && ein_name) + { + // Der Name kann so verwendet werden ohne Umwandeln der Umlaute + String name = (String) control.getSuchname().getValue(); + sollbuchungen.addFilter( + "((lower(mitglied.name) like ?)" + + " OR (lower(mitglied.vorname) like ?))", + new Object[] { name.toLowerCase() + "%", + name.toLowerCase() + "%" }); + } + else if (umwandeln && ein_name) + { + // Der Name muss umgewandelt werden, es kann mehrere Matches geben + ArrayList namenids = getNamenIds( + (String) control.getSuchname().getValue()); + if (namenids != null) + { + int anzahl = namenids.size(); + String querystring = null; + + for (int i = 1; i <= anzahl; i++) + { + if (anzahl == 1) + { + querystring = "(mitgliedskonto.mitglied = ?) "; + } + else if (i == 1) + { + querystring = "((mitgliedskonto.mitglied = ?) OR "; + } + else if (i < anzahl) + { + querystring = querystring + "(mitgliedskonto.mitglied = ?) OR "; + } + else if (i == anzahl) + { + querystring = querystring + "(mitgliedskonto.mitglied = ?)) "; + } + } + sollbuchungen.addFilter(querystring, namenids.toArray()); + } + } + + if (vd != null) + { + sollbuchungen.addFilter("(mitgliedskonto.datum >= ?) ", + new Object[] { vd }); + } + if (bd != null) + { + sollbuchungen.addFilter("(mitgliedskonto.datum <= ?) ", + new Object[] { bd }); + } + if (control.isOhneAbbucherAktiv() + && (Boolean) control.getOhneAbbucher().getValue()) + { + sollbuchungen.addFilter("mitgliedskonto.zahlungsweg <> ?", + Zahlungsweg.BASISLASTSCHRIFT); + } + if (filter_email) + { + int mailauswahl = (Integer) control.getMailauswahl().getValue(); + if (mailauswahl == MailAuswertungInput.OHNE) + { + sollbuchungen.addFilter("(email is null or length(email) = 0)"); + } + if (mailauswahl == MailAuswertungInput.MIT) + { + sollbuchungen.addFilter("(email is not null and length(email) > 0)"); + } + } + sollbuchungen.setOrder("ORDER BY mitgliedskonto.datum desc"); + return sollbuchungen; + } + + // Eine Differenz ist ausgewählt + final DBService service = Einstellungen.getDBService(); + StringBuilder sql = new StringBuilder("SELECT mitgliedskonto.id, mitglied.name, mitglied.vorname, " + + "mitgliedskonto.betrag, SUM(buchung.betrag) FROM mitgliedskonto " + + "JOIN mitglied ON (mitgliedskonto.mitglied = mitglied.id) " + + "LEFT JOIN buchung ON mitgliedskonto.id = buchung.mitgliedskonto"); + StringBuilder where = new StringBuilder(); + ArrayList param = new ArrayList<>(); + if (mitglied != null) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("mitgliedskonto.mitglied = ? "); + param.add(Long.valueOf(mitglied.getID())); + } + if (control.isSuchnameAktiv() && control.getSuchname().getValue() != null + && !((String) control.getSuchname().getValue()).isEmpty() + && umwandeln == false) + { + // Der Name kann so verwendet werden ohne Umwandeln der Umlaute + String tmpSuchname = (String) control.getSuchname().getValue(); + where.append(where.length() == 0 ? "" : " AND ") + .append("((LOWER(mitglied.name) LIKE ?) OR (LOWER(mitglied.vorname) LIKE ?))"); + param.add(tmpSuchname.toLowerCase() + "%"); + param.add(tmpSuchname.toLowerCase() + "%"); + } + else if (control.isSuchnameAktiv() + && control.getSuchname().getValue() != null + && !((String) control.getSuchname().getValue()).isEmpty() + && umwandeln == true) + { + // Der Name muss umgewandelt werden, es kann mehrere Matches geben + ArrayList namenids = getNamenIds( + (String) control.getSuchname().getValue()); + if (namenids != null) + { + int count = 0; + int anzahl = namenids.size(); + for (BigDecimal id : namenids) + { + count++; + if (anzahl == 1) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("mitgliedskonto.mitglied = ?"); + } + else if (count == 1) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("(mitgliedskonto.mitglied = ?"); + } + else if (count < anzahl) + { + where.append(" OR mitgliedskonto.mitglied = ?"); + } + else if (count == anzahl) + { + where.append(" OR mitgliedskonto.mitglied = ?)"); + } + param.add(id); + } + } + } + if (vd != null) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("mitgliedskonto.datum >= ?"); + param.add(vd); + } + if (bd != null) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("mitgliedskonto.datum <= ?"); + param.add(bd); + } + if (control.isOhneAbbucherAktiv() + && (Boolean) control.getOhneAbbucher().getValue()) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("mitgliedskonto.zahlungsweg <> ?"); + param.add(Zahlungsweg.BASISLASTSCHRIFT); + } + if (filter_email) + { + int mailauswahl = (Integer) control.getMailauswahl().getValue(); + if (mailauswahl == MailAuswertungInput.OHNE) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("(email IS NULL OR LENGTH(email) = 0)"); + } + if (mailauswahl == MailAuswertungInput.MIT) + { + where.append(where.length() == 0 ? "" : " AND ") + .append("(email IS NOT NULL AND LENGTH(email) > 0)"); + } + } + + if (where.length() > 0) + { + sql.append(" WHERE ").append(where); + } + sql.append(" GROUP BY mitgliedskonto.id, mitgliedskonto.betrag"); + + if (DIFFERENZ.FEHLBETRAG == diff) + { + sql.append(" HAVING SUM(buchung.betrag) < mitgliedskonto.betrag OR " + + "(SUM(buchung.betrag) IS NULL AND mitgliedskonto.betrag > 0)"); + } + if (DIFFERENZ.UEBERZAHLUNG == diff) + { + sql.append(" HAVING SUM(buchung.betrag) > mitgliedskonto.betrag"); + } + + List ids = (List) service.execute(sql.toString(), param.toArray(), + new ResultSetExtractor() + { + @Override + public Object extract(ResultSet rs) + throws RemoteException, SQLException + { + List list = new ArrayList<>(); + while (rs.next()) + { + list.add(rs.getLong(1)); + } + return list; + } + }); + + DBIterator list = Einstellungen.getDBService() + .createList(Mitgliedskonto.class); + list.addFilter("id in (" + StringUtils.join(ids, ",") + ")"); + list.setOrder("ORDER BY mitgliedskonto.datum desc"); + return list; + } + + private ArrayList getNamenIds(final String suchname) + throws RemoteException + { + DBService service = Einstellungen.getDBService(); + String sql = "SELECT mitglied.id, mitglied.name, mitglied.vorname from mitglied"; + + @SuppressWarnings("unchecked") + ArrayList mitgliedids = (ArrayList) service + .execute(sql, new Object[] {}, new ResultSetExtractor() + { + @Override + public Object extract(ResultSet rs) + throws RemoteException, SQLException + { + ArrayList ergebnis = new ArrayList<>(); + + // In case the text search input is used, we calculate + // an "equality" score for each Mitglied entry. + // Only the entries with + // score == maxScore will be shown. + Integer maxScore = 0; + int count = 0; + String name = reduceWord(suchname); + BigDecimal mgid = null; + String nachname = null; + String vorname = null; + while (rs.next()) + { + count++; + // Nur die ids der Mitglieder speichern + mgid = rs.getBigDecimal(1); + + StringTokenizer tok = new StringTokenizer(name, " ,-"); + Integer score = 0; + nachname = reduceWord(rs.getString(2)); + vorname = reduceWord(rs.getString(3)); + while (tok.hasMoreElements()) + { + String nextToken = tok.nextToken(); + if (nextToken.length() > 2) + { + score += scoreWord(nextToken, nachname); + score += scoreWord(nextToken, vorname); + } + } + + if (maxScore < score) + { + maxScore = score; + // We found a Mitgliedskonto matching with a higher equality + // score, so we drop all previous matches, because they were + // less equal. + ergebnis.clear(); + } + else if (maxScore > score) + { + // This match is worse, so skip it. + continue; + } + ergebnis.add(mgid); + } + if (ergebnis.size() != count) + { + return ergebnis; + } + else + { + // Kein Match + return null; + } + } + }); + return mitgliedids; + } + + public Integer scoreWord(String word, String in) + { + Integer wordScore = 0; + StringTokenizer tok = new StringTokenizer(in, " ,-"); + + while (tok.hasMoreElements()) + { + String nextToken = tok.nextToken(); + + // Full match is twice worth + if (nextToken.equals(word)) + { + wordScore += 2; + } + else if (nextToken.contains(word)) + { + wordScore += 1; + } + } + + return wordScore; + } + + public String reduceWord(String word) + { + // We replace "ue" -> "u" and "ü" -> "u", because some bank institutions + // remove the dots "ü" -> "u". So we get "u" == "ü" == "ue". + return word.toLowerCase().replaceAll("ä", "a").replaceAll("ae", "a") + .replaceAll("ö", "o").replaceAll("oe", "o").replaceAll("ü", "u") + .replaceAll("ue", "u").replaceAll("ß", "s").replaceAll("ss", "s"); + } + +} diff --git a/src/de/jost_net/JVerein/Variable/AllgemeineMap.java b/src/de/jost_net/JVerein/Variable/AllgemeineMap.java index 7f0994a8b..955874c22 100644 --- a/src/de/jost_net/JVerein/Variable/AllgemeineMap.java +++ b/src/de/jost_net/JVerein/Variable/AllgemeineMap.java @@ -16,11 +16,14 @@ **********************************************************************/ package de.jost_net.JVerein.Variable; +import java.rmi.RemoteException; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.Map; +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.util.JVDateFormatJJJJ; import de.jost_net.JVerein.util.JVDateFormatMM; import de.jost_net.JVerein.util.JVDateFormatMMJJJJ; @@ -46,6 +49,7 @@ public AllgemeineMap() } public Map getMap(Map inma) + throws RemoteException { Map map = null; if (inma == null) @@ -81,6 +85,28 @@ public Map getMap(Map inma) calendar.add(Calendar.YEAR, -1); map.put(AllgemeineVar.VORJAHR.getName(), jjjj.format(calendar.getTime())); + map.put(AllgemeineVar.AKTUELLERMONAT.getName(), mmjjjj.format(new Date())); + + map.put(AllgemeineVar.NAME.getName(), + Einstellungen.getEinstellung().getName()); + map.put(AllgemeineVar.STRASSE.getName(), + Einstellungen.getEinstellung().getStrasse()); + map.put(AllgemeineVar.PLZ.getName(), + Einstellungen.getEinstellung().getPlz()); + map.put(AllgemeineVar.ORT.getName(), + Einstellungen.getEinstellung().getOrt()); + map.put(AllgemeineVar.STAAT.getName(), + Staat.getByKey(Einstellungen.getEinstellung().getStaat()).getText()); + map.put(AllgemeineVar.IBAN.getName(), + Einstellungen.getEinstellung().getIban()); + map.put(AllgemeineVar.BIC.getName(), + Einstellungen.getEinstellung().getBic()); + map.put(AllgemeineVar.GLAEUBIGER_ID.getName(), + Einstellungen.getEinstellung().getGlaeubigerID()); + map.put(AllgemeineVar.UST_ID.getName(), + Einstellungen.getEinstellung().getUStID()); + map.put(AllgemeineVar.STEUER_NR.getName(), + Einstellungen.getEinstellung().getSteuernummer()); return map; } } diff --git a/src/de/jost_net/JVerein/Variable/AllgemeineVar.java b/src/de/jost_net/JVerein/Variable/AllgemeineVar.java index a2ce90fc8..6fac295a5 100644 --- a/src/de/jost_net/JVerein/Variable/AllgemeineVar.java +++ b/src/de/jost_net/JVerein/Variable/AllgemeineVar.java @@ -30,7 +30,17 @@ public enum AllgemeineVar TAGESDATUMJJJJ("tagesdatumjjjj"), // VORMONAT("vormonat"), // VORJAHR("vorjahr"), // - ZAEHLER("zaehler"); // + ZAEHLER("zaehler"), // + NAME("verein_name"), // + STRASSE("verein_strasse"), // + PLZ("verein_name"), // + ORT("verein_ort"), // + STAAT("verein_staat"), // + IBAN("verein_iban"), // + BIC("verein_bic"), // + GLAEUBIGER_ID("verein_glaeubiger_id"), // + UST_ID("verein_ust_id"), // + STEUER_NR("verein_steuer_nr"); // private String name; diff --git a/src/de/jost_net/JVerein/Variable/LastschriftMap.java b/src/de/jost_net/JVerein/Variable/LastschriftMap.java index 9a1cd59af..3b9109b4f 100644 --- a/src/de/jost_net/JVerein/Variable/LastschriftMap.java +++ b/src/de/jost_net/JVerein/Variable/LastschriftMap.java @@ -77,7 +77,7 @@ public Map getMap(Lastschrift ls, Map inma) } map.put(LastschriftVar.ABRECHNUNGSLAUF_NR.getName(), abrl.getID()); - map.put(LastschriftVar.ABRECHUNGSLAUF_DATUM.getName(), abrl.getDatum()); + map.put(LastschriftVar.ABRECHNUNGSLAUF_DATUM.getName(), abrl.getDatum()); // Damit Pre-Notifications für mit Versionen bis 2.8.18 erstellte Abrechnungsläufe // korrekt erstellt werden, werden beide Felder verwendet. if (ls.getMandatSequence().equals("FRST")) diff --git a/src/de/jost_net/JVerein/Variable/LastschriftVar.java b/src/de/jost_net/JVerein/Variable/LastschriftVar.java index 08cf2d02e..26ca118e4 100644 --- a/src/de/jost_net/JVerein/Variable/LastschriftVar.java +++ b/src/de/jost_net/JVerein/Variable/LastschriftVar.java @@ -19,7 +19,7 @@ public enum LastschriftVar { ABRECHNUNGSLAUF_NR("lastschrift_abrechnungslauf_nr"), // - ABRECHUNGSLAUF_DATUM("lastschrift_abrechnungslauf_datum"), // + ABRECHNUNGSLAUF_DATUM("lastschrift_abrechnungslauf_datum"), // ABRECHNUNGSLAUF_FAELLIGKEIT("lastschrift_abrechnungslauf_faelligkeit"), // ANREDE_DU("lastschrift_anrede_du"), // ANREDE_FOERMLICH("lastschrift_anrede_foermlich"), // diff --git a/src/de/jost_net/JVerein/Variable/MitgliedMap.java b/src/de/jost_net/JVerein/Variable/MitgliedMap.java index 013e658e7..e88aad1a8 100644 --- a/src/de/jost_net/JVerein/Variable/MitgliedMap.java +++ b/src/de/jost_net/JVerein/Variable/MitgliedMap.java @@ -10,32 +10,24 @@ * * 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.io.IOException; -import java.rmi.RemoteException; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.input.GeschlechtInput; +import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.io.BeitragsUtil; import de.jost_net.JVerein.io.VelocityTool; -import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.Datentyp; -import de.jost_net.JVerein.keys.Zahlungstermin; import de.jost_net.JVerein.keys.Zahlungsweg; -import de.jost_net.JVerein.rmi.Beitragsgruppe; import de.jost_net.JVerein.rmi.Eigenschaft; import de.jost_net.JVerein.rmi.Eigenschaften; import de.jost_net.JVerein.rmi.Felddefinition; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Zusatzfelder; +import de.jost_net.JVerein.server.MitgliedImpl; import de.jost_net.JVerein.util.Datum; import de.jost_net.JVerein.util.LesefeldAuswerter; import de.jost_net.JVerein.util.StringTool; @@ -45,6 +37,13 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; +import java.io.IOException; +import java.rmi.RemoteException; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; +import java.util.Objects; + public class MitgliedMap { @@ -59,98 +58,49 @@ public Map getMap(Mitglied m, Map inma) return getMap(m, inma, false); } - public Map getMap(Mitglied m, Map inma, - boolean ohneLesefelder) throws RemoteException + public Map getMap(Mitglied mitglied, + Map initMap, boolean ohneLesefelder) + throws RemoteException { - Map map = null; + Map map; - if (inma == null) - { - map = new HashMap<>(); - } - else - { - map = inma; - } - if (m.getID() == null) + map = Objects.requireNonNullElseGet(initMap, HashMap::new); + if (mitglied == null || mitglied.getID() == null) { - m.setAdressierungszusatz("3. Hinterhof"); - m.setAdresstyp(1); - m.setAnrede("Herrn"); - m.setAustritt("01.04.2011"); - DBIterator it = Einstellungen.getDBService() - .createList(Beitragsgruppe.class); - Beitragsgruppe bg = (Beitragsgruppe) it.next(); - m.setBeitragsgruppe(Integer.parseInt(bg.getID())); - m.setBic("XXXXXXXXXXX"); - m.setEingabedatum(); - m.setEintritt("05.02.1999"); - m.setEmail("willi.wichtig@jverein.de"); - m.setExterneMitgliedsnummer("123456"); - m.setGeburtsdatum("02.03.1980"); - m.setGeschlecht(GeschlechtInput.MAENNLICH); - m.setHandy("0170/123456789"); - m.setIban("DE89370400440532013000"); - m.setID("1"); - m.setIndividuellerBeitrag(123.45); - m.setKtoiPersonenart("n"); - m.setKtoiAnrede("Herrn"); - m.setKtoiTitel("Dr. Dr."); - m.setKtoiName("Wichtig"); - m.setKtoiVorname("Willi"); - m.setKtoiStrasse("Bahnhofstr. 22"); - m.setAdressierungszusatz("Hinterhof bei Lieschen Müller"); - m.setPlz("12345"); - m.setOrt("Testenhausen"); - m.setKuendigung("21.02.2011"); - m.setLetzteAenderung(); - m.setName("Wichtig"); - m.setOrt("Testenhausen"); - m.setPersonenart("n"); - m.setPlz("12345"); - m.setStaat("Deutschland"); - m.setSterbetag(new Date()); - m.setStrasse("Hafengasse 124"); - m.setTelefondienstlich("123455600"); - m.setTelefonprivat("123456"); - m.setTitel("Dr."); - m.setVermerk1("Vermerk 1"); - m.setVermerk2("Vermerk 2"); - m.setVorname("Willi"); - m.setZahlungsrhythmus(12); - m.setZahlungstermin(Zahlungstermin.VIERTELJAEHRLICH1.getKey()); - m.setZahlungsweg(1); - m.setZahlungstermin(Zahlungstermin.HALBJAEHRLICH4.getKey()); + mitglied = MitgliedImpl.getDummy(); } map.put(MitgliedVar.ADRESSIERUNGSZUSATZ.getName(), - StringTool.toNotNullString(m.getAdressierungszusatz())); + StringTool.toNotNullString(mitglied.getAdressierungszusatz())); map.put(MitgliedVar.ADRESSTYP.getName(), - StringTool.toNotNullString(m.getAdresstyp().getID())); + StringTool.toNotNullString(mitglied.getAdresstyp().getID())); map.put(MitgliedVar.ANREDE.getName(), - StringTool.toNotNullString(m.getAnrede())); + StringTool.toNotNullString(mitglied.getAnrede())); map.put(MitgliedVar.ANREDE_FOERMLICH.getName(), - Adressaufbereitung.getAnredeFoermlich(m)); - map.put(MitgliedVar.ANREDE_DU.getName(), Adressaufbereitung.getAnredeDu(m)); - map.put(MitgliedVar.AUSTRITT.getName(), Datum.formatDate(m.getAustritt())); + Adressaufbereitung.getAnredeFoermlich(mitglied)); + map.put(MitgliedVar.ANREDE_DU.getName(), + Adressaufbereitung.getAnredeDu(mitglied)); + map.put(MitgliedVar.AUSTRITT.getName(), + Datum.formatDate(mitglied.getAustritt())); map.put(MitgliedVar.BEITRAGSGRUPPE_ARBEITSEINSATZ_BETRAG.getName(), - m.getBeitragsgruppe() != null - ? Einstellungen.DECIMALFORMAT - .format(m.getBeitragsgruppe().getArbeitseinsatzBetrag()) - : ""); + mitglied.getBeitragsgruppe() != null ? + Einstellungen.DECIMALFORMAT.format( + mitglied.getBeitragsgruppe().getArbeitseinsatzBetrag()) : + ""); map.put(MitgliedVar.BEITRAGSGRUPPE_ARBEITSEINSATZ_STUNDEN.getName(), - m.getBeitragsgruppe() != null - ? Einstellungen.DECIMALFORMAT - .format(m.getBeitragsgruppe().getArbeitseinsatzStunden()) - : ""); + mitglied.getBeitragsgruppe() != null ? + Einstellungen.DECIMALFORMAT.format( + mitglied.getBeitragsgruppe().getArbeitseinsatzStunden()) : + ""); try { map.put(MitgliedVar.BEITRAGSGRUPPE_BETRAG.getName(), - m.getBeitragsgruppe() != null - ? Einstellungen.DECIMALFORMAT.format(BeitragsUtil.getBeitrag( + mitglied.getBeitragsgruppe() != null ? + Einstellungen.DECIMALFORMAT.format(BeitragsUtil.getBeitrag( Einstellungen.getEinstellung().getBeitragsmodel(), - m.getZahlungstermin(), m.getZahlungsrhythmus().getKey(), - m.getBeitragsgruppe(), new Date(), m)) - : ""); + mitglied.getZahlungstermin(), + mitglied.getZahlungsrhythmus().getKey(), + mitglied.getBeitragsgruppe(), new Date(), mitglied)) : + ""); } catch (ApplicationException e) { @@ -158,109 +108,115 @@ public Map getMap(Mitglied m, Map inma, } catch (NullPointerException e) { - Logger.error("NullPointerException:" + m.getName()); + Logger.error("NullPointerException:" + mitglied.getName()); } map.put(MitgliedVar.BEITRAGSGRUPPE_BEZEICHNUNG.getName(), - m.getBeitragsgruppe() != null ? m.getBeitragsgruppe().getBezeichnung() - : ""); + mitglied.getBeitragsgruppe() != null ? + mitglied.getBeitragsgruppe().getBezeichnung() : + ""); map.put(MitgliedVar.BEITRAGSGRUPPE_ID.getName(), - m.getBeitragsgruppe() != null ? m.getBeitragsgruppe().getID() : ""); - map.put(MitgliedVar.MANDATDATUM.getName(), m.getMandatDatum()); - map.put(MitgliedVar.MANDATID.getName(), m.getMandatID()); - map.put(MitgliedVar.BIC.getName(), m.getBic()); + mitglied.getBeitragsgruppe() != null ? + mitglied.getBeitragsgruppe().getID() : + ""); + map.put(MitgliedVar.MANDATDATUM.getName(), mitglied.getMandatDatum()); + map.put(MitgliedVar.MANDATID.getName(), mitglied.getMandatID()); + map.put(MitgliedVar.BIC.getName(), mitglied.getBic()); map.put(MitgliedVar.EINGABEDATUM.getName(), - Datum.formatDate(m.getEingabedatum())); - map.put(MitgliedVar.EINTRITT.getName(), Datum.formatDate(m.getEintritt())); - map.put(MitgliedVar.EMAIL.getName(), m.getEmail()); + Datum.formatDate(mitglied.getEingabedatum())); + map.put(MitgliedVar.EINTRITT.getName(), + Datum.formatDate(mitglied.getEintritt())); + map.put(MitgliedVar.EMAIL.getName(), mitglied.getEmail()); map.put(MitgliedVar.EMPFAENGER.getName(), - Adressaufbereitung.getAdressfeld(m)); + Adressaufbereitung.getAdressfeld(mitglied)); map.put(MitgliedVar.EXTERNE_MITGLIEDSNUMMER.getName(), - m.getExterneMitgliedsnummer()); + mitglied.getExterneMitgliedsnummer()); map.put(MitgliedVar.GEBURTSDATUM.getName(), - Datum.formatDate(m.getGeburtsdatum())); - map.put(MitgliedVar.GESCHLECHT.getName(), m.getGeschlecht()); - map.put(MitgliedVar.HANDY.getName(), m.getHandy()); + Datum.formatDate(mitglied.getGeburtsdatum())); + map.put(MitgliedVar.GESCHLECHT.getName(), mitglied.getGeschlecht()); + map.put(MitgliedVar.HANDY.getName(), mitglied.getHandy()); map.put(MitgliedVar.IBANMASKIERT.getName(), - VarTools.maskieren(m.getIban())); - map.put(MitgliedVar.IBAN.getName(), m.getIban()); - map.put(MitgliedVar.ID.getName(), m.getID()); - if (m.getIndividuellerBeitrag() != null) + VarTools.maskieren(mitglied.getIban())); + map.put(MitgliedVar.IBAN.getName(), mitglied.getIban()); + map.put(MitgliedVar.ID.getName(), mitglied.getID()); + if (mitglied.getIndividuellerBeitrag() != null) { - map.put(MitgliedVar.INDIVIDUELLERBEITRAG.getName(), - Einstellungen.DECIMALFORMAT.format(m.getIndividuellerBeitrag())); + map.put(MitgliedVar.INDIVIDUELLERBEITRAG.getName(), + Einstellungen.DECIMALFORMAT.format( + mitglied.getIndividuellerBeitrag())); } else { map.put(MitgliedVar.INDIVIDUELLERBEITRAG.getName(), null); } - map.put(MitgliedVar.BANKNAME.getName(), getBankname(m)); + map.put(MitgliedVar.BANKNAME.getName(), getBankname(mitglied)); map.put(MitgliedVar.KONTOINHABER_ADRESSIERUNGSZUSATZ.getName(), - m.getKtoiAdressierungszusatz()); - map.put(MitgliedVar.KONTOINHABER_ANREDE.getName(), m.getKtoiAnrede()); - map.put(MitgliedVar.KONTOINHABER_EMAIL.getName(), m.getKtoiEmail()); - map.put(MitgliedVar.KONTOINHABER_NAME.getName(), m.getKtoiName()); - map.put(MitgliedVar.KONTOINHABER_ORT.getName(), m.getKtoiOrt()); + mitglied.getKtoiAdressierungszusatz()); + map.put(MitgliedVar.KONTOINHABER_ANREDE.getName(), + mitglied.getKtoiAnrede()); + map.put(MitgliedVar.KONTOINHABER_EMAIL.getName(), mitglied.getKtoiEmail()); + map.put(MitgliedVar.KONTOINHABER_NAME.getName(), mitglied.getKtoiName()); + map.put(MitgliedVar.KONTOINHABER_ORT.getName(), mitglied.getKtoiOrt()); map.put(MitgliedVar.KONTOINHABER_PERSONENART.getName(), - m.getKtoiPersonenart()); - map.put(MitgliedVar.KONTOINHABER_PLZ.getName(), m.getKtoiPlz()); - map.put(MitgliedVar.KONTOINHABER_STAAT.getName(), m.getKtoiStaat()); - map.put(MitgliedVar.KONTOINHABER_STRASSE.getName(), m.getKtoiStrasse()); - map.put(MitgliedVar.KONTOINHABER_TITEL.getName(), m.getKtoiTitel()); - map.put(MitgliedVar.KONTOINHABER_VORNAME.getName(), m.getKtoiVorname()); + mitglied.getKtoiPersonenart()); + map.put(MitgliedVar.KONTOINHABER_PLZ.getName(), mitglied.getKtoiPlz()); + map.put(MitgliedVar.KONTOINHABER_STAAT.getName(), mitglied.getKtoiStaat()); + map.put(MitgliedVar.KONTOINHABER_STRASSE.getName(), + mitglied.getKtoiStrasse()); + map.put(MitgliedVar.KONTOINHABER_TITEL.getName(), mitglied.getKtoiTitel()); + map.put(MitgliedVar.KONTOINHABER_VORNAME.getName(), + mitglied.getKtoiVorname()); map.put(MitgliedVar.KUENDIGUNG.getName(), - Datum.formatDate(m.getKuendigung())); + Datum.formatDate(mitglied.getKuendigung())); map.put(MitgliedVar.LETZTEAENDERUNG.getName(), - Datum.formatDate(m.getLetzteAenderung())); - map.put(MitgliedVar.NAME.getName(), m.getName()); + Datum.formatDate(mitglied.getLetzteAenderung())); + map.put(MitgliedVar.NAME.getName(), mitglied.getName()); map.put(MitgliedVar.NAMEVORNAME.getName(), - Adressaufbereitung.getNameVorname(m)); - map.put(MitgliedVar.ORT.getName(), m.getOrt()); - map.put(MitgliedVar.PERSONENART.getName(), m.getPersonenart()); - map.put(MitgliedVar.PLZ.getName(), m.getPlz()); - map.put(MitgliedVar.STAAT.getName(), m.getStaat()); + Adressaufbereitung.getNameVorname(mitglied)); + map.put(MitgliedVar.ORT.getName(), mitglied.getOrt()); + map.put(MitgliedVar.PERSONENART.getName(), mitglied.getPersonenart()); + map.put(MitgliedVar.PLZ.getName(), mitglied.getPlz()); + map.put(MitgliedVar.STAAT.getName(), mitglied.getStaat()); map.put(MitgliedVar.STERBETAG.getName(), - Datum.formatDate(m.getSterbetag())); - map.put(MitgliedVar.STRASSE.getName(), m.getStrasse()); - map.put(MitgliedVar.TELEFONDIENSTLICH.getName(), m.getTelefondienstlich()); - map.put(MitgliedVar.TELEFONPRIVAT.getName(), m.getTelefonprivat()); - map.put(MitgliedVar.TITEL.getName(), m.getTitel()); - map.put(MitgliedVar.VERMERK1.getName(), m.getVermerk1()); - map.put(MitgliedVar.VERMERK2.getName(), m.getVermerk2()); - map.put(MitgliedVar.VORNAME.getName(), m.getVorname()); + Datum.formatDate(mitglied.getSterbetag())); + map.put(MitgliedVar.STRASSE.getName(), mitglied.getStrasse()); + map.put(MitgliedVar.TELEFONDIENSTLICH.getName(), + mitglied.getTelefondienstlich()); + map.put(MitgliedVar.TELEFONPRIVAT.getName(), mitglied.getTelefonprivat()); + map.put(MitgliedVar.TITEL.getName(), mitglied.getTitel()); + map.put(MitgliedVar.VERMERK1.getName(), mitglied.getVermerk1()); + map.put(MitgliedVar.VERMERK2.getName(), mitglied.getVermerk2()); + map.put(MitgliedVar.VORNAME.getName(), mitglied.getVorname()); map.put(MitgliedVar.VORNAMENAME.getName(), - Adressaufbereitung.getVornameName(m)); - map.put(MitgliedVar.ZAHLERID.getName(), m.getZahlerID()); + Adressaufbereitung.getVornameName(mitglied)); + map.put(MitgliedVar.ZAHLERID.getName(), mitglied.getZahlerID()); map.put(MitgliedVar.ZAHLUNGSRHYTMUS.getName(), - m.getZahlungsrhythmus() + ""); + mitglied.getZahlungsrhythmus() + ""); map.put(MitgliedVar.ZAHLUNGSRHYTHMUS.getName(), - m.getZahlungsrhythmus() + ""); + mitglied.getZahlungsrhythmus() + ""); map.put(MitgliedVar.ZAHLUNGSTERMIN.getName(), - m.getZahlungstermin() != null ? m.getZahlungstermin().getText() : ""); - map.put(MitgliedVar.ZAHLUNGSWEG.getName(), m.getZahlungsweg() + ""); + mitglied.getZahlungstermin() != null ? + mitglied.getZahlungstermin().getText() : + ""); + map.put(MitgliedVar.ZAHLUNGSWEG.getName(), mitglied.getZahlungsweg() + ""); String zahlungsweg = ""; - switch (m.getZahlungsweg()) + switch (mitglied.getZahlungsweg()) { case Zahlungsweg.BASISLASTSCHRIFT: - { zahlungsweg = Einstellungen.getEinstellung().getRechnungTextAbbuchung(); - zahlungsweg = zahlungsweg.replaceAll("\\$\\{BIC\\}", m.getBic()); - zahlungsweg = zahlungsweg.replaceAll("\\$\\{IBAN\\}", m.getIban()); + zahlungsweg = zahlungsweg.replaceAll("\\$\\{BIC\\}", mitglied.getBic()); + zahlungsweg = zahlungsweg.replaceAll("\\$\\{IBAN\\}", + mitglied.getIban()); zahlungsweg = zahlungsweg.replaceAll("\\$\\{MANDATID\\}", - m.getMandatID()); + mitglied.getMandatID()); break; - } case Zahlungsweg.BARZAHLUNG: - { zahlungsweg = Einstellungen.getEinstellung().getRechnungTextBar(); break; - } case Zahlungsweg.ÜBERWEISUNG: - { zahlungsweg = Einstellungen.getEinstellung() .getRechnungTextUeberweisung(); break; - } } try { @@ -277,20 +233,19 @@ public Map getMap(Mitglied m, Map inma, .createList(Felddefinition.class); while (itfd.hasNext()) { - Felddefinition fd = (Felddefinition) itfd.next(); + Felddefinition fd = itfd.next(); DBIterator itzus = Einstellungen.getDBService() .createList(Zusatzfelder.class); - itzus.addFilter("mitglied = ? and felddefinition = ? ", - new Object[] { m.getID(), fd.getID() }); - Zusatzfelder z = null; + itzus.addFilter("mitglied = ? and felddefinition = ? ", mitglied.getID(), + fd.getID()); + Zusatzfelder z; if (itzus.hasNext()) { - z = (Zusatzfelder) itzus.next(); + z = itzus.next(); } else { - z = (Zusatzfelder) Einstellungen.getDBService() - .createObject(Zusatzfelder.class, null); + z = Einstellungen.getDBService().createObject(Zusatzfelder.class, null); } switch (fd.getDatentyp()) @@ -331,11 +286,11 @@ public Map getMap(Mitglied m, Map inma, .createList(Eigenschaft.class); while (iteig.hasNext()) { - Eigenschaft eig = (Eigenschaft) iteig.next(); + Eigenschaft eig = iteig.next(); DBIterator iteigm = Einstellungen.getDBService() .createList(Eigenschaften.class); - iteigm.addFilter("mitglied = ? and eigenschaft = ?", - new Object[] { m.getID(), eig.getID() }); + iteigm.addFilter("mitglied = ? and eigenschaft = ?", mitglied.getID(), + eig.getID()); String val = ""; if (iteigm.size() > 0) { @@ -344,9 +299,9 @@ public Map getMap(Mitglied m, Map inma, map.put("mitglied_eigenschaft_" + eig.getBezeichnung(), val); } - for (String varname : m.getVariablen().keySet()) + for (String varname : mitglied.getVariablen().keySet()) { - map.put(varname, m.getVariablen().get(varname)); + map.put(varname, mitglied.getVariablen().get(varname)); } if (!ohneLesefelder) diff --git a/src/de/jost_net/JVerein/Variable/MitgliedskontoMap.java b/src/de/jost_net/JVerein/Variable/MitgliedskontoMap.java deleted file mode 100644 index 5e9e84d2a..000000000 --- a/src/de/jost_net/JVerein/Variable/MitgliedskontoMap.java +++ /dev/null @@ -1,143 +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.Variable; - -import java.rmi.RemoteException; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; - -import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.FormularfeldControl; -import de.jost_net.JVerein.rmi.Mitgliedskonto; -import de.willuhn.jameica.gui.formatter.CurrencyFormatter; - -public class MitgliedskontoMap -{ - - public MitgliedskontoMap() - { - // - } - - public Map getMap(ArrayList mk, - Map inma) throws RemoteException - { - Map map = null; - if (inma == null) - { - map = new HashMap<>(); - } - else - { - map = inma; - } - - ArrayList buda = new ArrayList<>(); - ArrayList zg = new ArrayList<>(); - ArrayList zg1 = 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 : mk) - { - buda.add(mkto.getDatum()); - zg.add(mkto.getZweck1()); - zg1.add(mkto.getZweck1()); - nettobetrag.add(Double.valueOf(mkto.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(); - } - if (buda.size() > 1) - { - if (Einstellungen.getEinstellung().getOptiert()) - { - zg1.add("Rechnungsbetrag inkl. USt."); - zg.add("Rechnungsbetrag inkl. USt."); - } - else - { - zg1.add("Summe"); - zg.add("Summe"); - } - betrag.add(summe); - differenz.add(saldo); - ist.add(suist); - } - 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(MitgliedskontoVar.BUCHUNGSDATUM.getName(), buda.toArray()); - map.put(MitgliedskontoVar.ZAHLUNGSGRUND.getName(), zg.toArray()); - map.put(MitgliedskontoVar.ZAHLUNGSGRUND1.getName(), zg1.toArray()); - map.put(MitgliedskontoVar.NETTOBETRAG.getName(), nettobetrag.toArray()); - map.put(MitgliedskontoVar.STEUERSATZ.getName(), steuersatz.toArray()); - map.put(MitgliedskontoVar.STEUERBETRAG.getName(), steuerbetrag.toArray()); - map.put(MitgliedskontoVar.BETRAG.getName(), betrag.toArray()); - map.put(MitgliedskontoVar.IST.getName(), ist.toArray()); - map.put(MitgliedskontoVar.DIFFERENZ.getName(), differenz.toArray()); - map.put(MitgliedskontoVar.STAND.getName(), Double.valueOf(-1 * saldo)); - map.put(MitgliedskontoVar.SUMME_OFFEN.getName(), Double.valueOf(saldo)); - map.put(MitgliedskontoVar.QRCODE_INTRO.getName(), - Einstellungen.getEinstellung().getQRCodeIntro()); - 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(MitgliedskontoVar.BUCHUNGSDATUM.getName(), mk.getDatum()); - map.put(MitgliedskontoVar.ZAHLUNGSGRUND.getName(), mk.getZweck1()); - map.put(MitgliedskontoVar.ZAHLUNGSGRUND1.getName(), mk.getZweck1()); - map.put(MitgliedskontoVar.NETTOBETRAG.getName(), mk.getNettobetrag()); - map.put(MitgliedskontoVar.STEUERSATZ.getName(), mk.getSteuersatz()); - map.put(MitgliedskontoVar.STEUERBETRAG.getName(), mk.getSteuerbetrag()); - map.put(MitgliedskontoVar.BETRAG.getName(), mk.getBetrag()); - map.put(MitgliedskontoVar.IST.getName(), mk.getIstSumme()); - map.put(MitgliedskontoVar.DIFFERENZ.getName(), - mk.getBetrag() - mk.getIstSumme()); - return map; - } -} diff --git a/src/de/jost_net/JVerein/Variable/RechnungMap.java b/src/de/jost_net/JVerein/Variable/RechnungMap.java new file mode 100644 index 000000000..196a6fe64 --- /dev/null +++ b/src/de/jost_net/JVerein/Variable/RechnungMap.java @@ -0,0 +1,213 @@ +/********************************************************************** + * 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.io.IOException; +import java.rmi.RemoteException; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +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.util.StringTool; +import de.willuhn.jameica.gui.formatter.CurrencyFormatter; + +public class RechnungMap +{ + + public RechnungMap() + { + // + } + + public Map getMap(Rechnung re, Map inMap) + throws RemoteException + { + Map map = null; + if (inMap == null) + { + map = new HashMap<>(); + } + else + { + 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()) + { + buchungDatum.add(mkto.getDatum()); + zweck.add(mkto.getZweck1()); + zweck1.add(mkto.getZweck1()); + nettobetrag.add(Double.valueOf(mkto.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(); + } + 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.ZAHLUNGSGRUND.getName(), zweck.toArray()); + map.put(RechnungVar.ZAHLUNGSGRUND1.getName(), zweck1.toArray()); + map.put(RechnungVar.NETTOBETRAG.getName(), nettobetrag.toArray()); + map.put(RechnungVar.STEUERSATZ.getName(), steuersatz.toArray()); + map.put(RechnungVar.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.QRCODE_INTRO.getName(), + Einstellungen.getEinstellung().getQRCodeIntro()); + + map.put(RechnungVar.DATUM.getName(), re.getDatum()); + map.put(RechnungVar.NUMMER.getName(), StringTool.lpad(re.getID(), + Einstellungen.getEinstellung().getZaehlerLaenge(), "0")); + + map.put(RechnungVar.PERSONENART.getName(), re.getPersonenart()); + map.put(RechnungVar.GESCHLECHT.getName(), re.getGeschlecht()); + map.put(RechnungVar.ANREDE.getName(), re.getAnrede()); + map.put(RechnungVar.ANREDE_DU.getName(), + Adressaufbereitung.getAnredeDu(re)); + map.put(RechnungVar.ANREDE_DU.getName(), + Adressaufbereitung.getAnredeFoermlich(re)); + map.put(RechnungVar.TITEL.getName(), re.getTitel()); + map.put(RechnungVar.NAME.getName(), re.getName()); + map.put(RechnungVar.VORNAME.getName(), re.getVorname()); + map.put(RechnungVar.STRASSE.getName(), re.getStrasse()); + map.put(RechnungVar.ADRESSIERUNGSZUSATZ.getName(), + re.getAdressierungszusatz()); + map.put(RechnungVar.PLZ.getName(), re.getPlz()); + map.put(RechnungVar.ORT.getName(), re.getOrt()); + map.put(RechnungVar.STAAT.getName(), re.getStaat()); + map.put(RechnungVar.MANDATID.getName(), re.getMandatID()); + map.put(RechnungVar.MANDATDATUM.getName(), re.getMandatDatum()); + map.put(RechnungVar.BIC.getName(), re.getBIC()); + map.put(RechnungVar.IBAN.getName(), re.getIBAN()); + map.put(RechnungVar.IBANMASKIERT.getName(), + VarTools.maskieren(re.getIBAN())); + map.put(RechnungVar.EMPFAENGER.getName(), + Adressaufbereitung.getAdressfeld(re)); + + String zahlungsweg = ""; + switch (re.getMitglied().getZahlungsweg()) + { + case Zahlungsweg.BASISLASTSCHRIFT: + { + zahlungsweg = Einstellungen.getEinstellung().getRechnungTextAbbuchung(); + zahlungsweg = zahlungsweg.replaceAll("\\$\\{BIC\\}", re.getBIC()); + zahlungsweg = zahlungsweg.replaceAll("\\$\\{IBAN\\}", re.getIBAN()); + zahlungsweg = zahlungsweg.replaceAll("\\$\\{MANDATID\\}", + re.getMandatID()); + break; + } + case Zahlungsweg.BARZAHLUNG: + { + zahlungsweg = Einstellungen.getEinstellung().getRechnungTextBar(); + break; + } + case Zahlungsweg.ÜBERWEISUNG: + { + zahlungsweg = Einstellungen.getEinstellung() + .getRechnungTextUeberweisung(); + break; + } + } + try + { + zahlungsweg = VelocityTool.eval(map, zahlungsweg); + } + catch (IOException e) + { + e.printStackTrace(); + } + map.put(RechnungVar.ZAHLUNGSWEGTEXT.getName(), zahlungsweg); + + return map; + } + + public Map getMap(Mitgliedskonto mk, Map inma) + throws RemoteException + { + Map map = null; + if (inma == null) + { + map = new HashMap<>(); + } + else + { + map = inma; + } + + map.put(RechnungVar.BUCHUNGSDATUM.getName(), mk.getDatum()); + map.put(RechnungVar.ZAHLUNGSGRUND.getName(), mk.getZweck1()); + map.put(RechnungVar.ZAHLUNGSGRUND1.getName(), mk.getZweck1()); + map.put(RechnungVar.NETTOBETRAG.getName(), mk.getNettobetrag()); + map.put(RechnungVar.STEUERSATZ.getName(), mk.getSteuersatz()); + map.put(RechnungVar.STEUERBETRAG.getName(), mk.getSteuerbetrag()); + map.put(RechnungVar.BETRAG.getName(), mk.getBetrag()); + map.put(RechnungVar.IST.getName(), mk.getIstSumme()); + map.put(RechnungVar.DIFFERENZ.getName(), mk.getBetrag() - mk.getIstSumme()); + return map; + } +} diff --git a/src/de/jost_net/JVerein/Variable/MitgliedskontoVar.java b/src/de/jost_net/JVerein/Variable/RechnungVar.java similarity index 65% rename from src/de/jost_net/JVerein/Variable/MitgliedskontoVar.java rename to src/de/jost_net/JVerein/Variable/RechnungVar.java index c635a8858..946ab8777 100644 --- a/src/de/jost_net/JVerein/Variable/MitgliedskontoVar.java +++ b/src/de/jost_net/JVerein/Variable/RechnungVar.java @@ -16,7 +16,7 @@ **********************************************************************/ package de.jost_net.JVerein.Variable; -public enum MitgliedskontoVar +public enum RechnungVar { ZAHLUNGSGRUND("mitgliedskonto_zahlungsgrund"), // ZAHLUNGSGRUND1("mitgliedskonto_zahlungsgrund1"), // @@ -31,11 +31,33 @@ public enum MitgliedskontoVar STAND("mitgliedskonto_stand"), // SUMME_OFFEN("mitgliedskonto_summe_offen"), // QRCODE_SUMME("qrcode_summe"), // - QRCODE_INTRO("qrcode_intro"); + QRCODE_INTRO("qrcode_intro"), + DATUM("rechnung_datum"), + NUMMER("rechnung_nummer"), + ANREDE("rechnung_anrede"), + TITEL("rechnung_titel"), + NAME("rechnung_name"), + VORNAME("rechnung_vorname"), + STRASSE("rechnung_strasse"), + ADRESSIERUNGSZUSATZ("rechnung_adressierungszusatz"), + PLZ("rechnung_plz"), + ORT("rechnung_ort"), + STAAT("rechnung_staat"), + GESCHLECHT("rechnung_geschlecht"), + ANREDE_DU("rechnung_anrede_du"), // + ANREDE_FOERMLICH("rechnung_anrede_foermlich"), // + PERSONENART("rechnung_personenart"), // + MANDATID("rechnung_mandatid"), // + MANDATDATUM("rechnung_mandatdatum"), // + BIC("rechnung_bic"), // + IBAN("rechnung_iban"), // + IBANMASKIERT("rechnung_ibanmaskiert"), // + EMPFAENGER("rechnung_empfaenger"), + ZAHLUNGSWEGTEXT("rechnung_zahlungsweg_text"); private String name; - MitgliedskontoVar(String name) + RechnungVar(String name) { this.name = name; } diff --git a/src/de/jost_net/JVerein/Variable/SpendenbescheinigungMap.java b/src/de/jost_net/JVerein/Variable/SpendenbescheinigungMap.java new file mode 100644 index 000000000..51c53168a --- /dev/null +++ b/src/de/jost_net/JVerein/Variable/SpendenbescheinigungMap.java @@ -0,0 +1,411 @@ +/********************************************************************** + * Copyright (c) by Heiner Jostkleigrewe + * spb 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. + * + * spb 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 spb program. If not, + * see . + * + * heiner@jverein.de + * www.jverein.de + **********************************************************************/ +package de.jost_net.JVerein.Variable; + +import java.io.IOException; +import java.rmi.RemoteException; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; +import java.util.HashMap; +import java.util.Map; + +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.keys.HerkunftSpende; +import de.jost_net.JVerein.keys.Spendenart; +import de.jost_net.JVerein.rmi.Buchung; +import de.jost_net.JVerein.rmi.Spendenbescheinigung; +import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; +import de.jost_net.JVerein.util.StringTool; +import de.willuhn.logging.Logger; +import jonelo.NumericalChameleon.SpokenNumbers.GermanNumber; + +public class SpendenbescheinigungMap +{ + + public SpendenbescheinigungMap() + { + // + } + + public Map getMap(Spendenbescheinigung spb, Map inMap) + throws RemoteException + { + Map map = null; + final String newLineStr = "\n"; + if (inMap == null) + { + map = new HashMap<>(); + } + else + { + map = inMap; + } + if (spb.getID() == null) + { + spb.setBescheinigungsdatum(new Date()); + spb.setBetrag(1234.56); + spb.setBezeichnungSachzuwendung("Buch"); + spb.setErsatzAufwendungen(false); + spb.setHerkunftSpende(1); + spb.setSpendedatum(new Date()); + spb.setSpendenart(Spendenart.GELDSPENDE); + spb.setUnterlagenWertermittlung(true); + spb.setZeile1("Herr"); + spb.setZeile2("Dr. Willi Wichtig"); + spb.setZeile3("Hinterm Bahnhof 1"); + spb.setZeile4("12345 Testenhausen"); + spb.setZeile5(null); + spb.setZeile6(null); + spb.setZeile7(null); + } + String empfaenger = spb.getZeile1() + newLineStr + spb.getZeile2() + newLineStr + + spb.getZeile3() + newLineStr + spb.getZeile4() + newLineStr + spb.getZeile5() + + newLineStr + spb.getZeile6() + newLineStr + spb.getZeile7() + newLineStr; + map.put(SpendenbescheinigungVar.EMPFAENGER.getName(), empfaenger); + String anrede = (spb.getZeile1().length() > 0) ? spb.getZeile1() + " " + spb.getZeile2() : spb.getZeile2(); + map.put(SpendenbescheinigungVar.ANREDE.getName(), anrede); + map.put(SpendenbescheinigungVar.ZEILE1.getName(), spb.getZeile1()); + map.put(SpendenbescheinigungVar.ZEILE2.getName(), spb.getZeile2()); + map.put(SpendenbescheinigungVar.ZEILE3.getName(), spb.getZeile3()); + map.put(SpendenbescheinigungVar.ZEILE4.getName(), spb.getZeile4()); + map.put(SpendenbescheinigungVar.ZEILE5.getName(), spb.getZeile5()); + map.put(SpendenbescheinigungVar.ZEILE6.getName(), spb.getZeile6()); + map.put(SpendenbescheinigungVar.ZEILE7.getName(), spb.getZeile7()); + Double dWert = spb.getBetrag(); + // Hier keinen String, sondern ein Double-Objekt in die Map stellen, + // damit eine rechtsbündige Ausrichtung des Betrages in der Formular- + // aufbereitung.getString() erfolgt. + // Dies ist der Zustand vor Version 2.0 + // map.put(SpendenbescheinigungVar.BETRAG.getName(), + // Einstellungen.DECIMALFORMAT.format(spb.getBetrag())); + map.put(SpendenbescheinigungVar.BETRAG.getName(), dWert); + try + { + String betraginworten = GermanNumber.toString(dWert.longValue()); + map.put(SpendenbescheinigungVar.BETRAGINWORTEN.getName(), + "-" + betraginworten + "-"); + } + catch (Exception e) + { + Logger.error("Fehler", e); + throw new RemoteException( + "Fehler bei der Aufbereitung des Betrages in Worten"); + } + // Calendar für Alt/Neu + GregorianCalendar gc = new GregorianCalendar(); + gc.setTime(spb.getBescheinigungsdatum()); + + String bescheinigungsdatum = new JVDateFormatTTMMJJJJ() + .format(spb.getBescheinigungsdatum()); + map.put(SpendenbescheinigungVar.BESCHEINIGUNGDATUM.getName(), + bescheinigungsdatum); + switch (spb.getSpendenart()) + { + case Spendenart.GELDSPENDE: + String art = "Geldzuwendungen"; + if (Einstellungen.getEinstellung().getMitgliedsbetraege()) + { + art += "/Mitgliedsbeitrag"; + } + map.put(SpendenbescheinigungVar.SPENDEART.getName(), art); + break; + case Spendenart.SACHSPENDE: + map.put(SpendenbescheinigungVar.SPENDEART.getName(), "Sachzuwendungen"); + break; + } + String spendedatum = new JVDateFormatTTMMJJJJ().format(spb.getSpendedatum()); + boolean printBuchungsart = Einstellungen.getEinstellung() + .getSpendenbescheinigungPrintBuchungsart(); + map.put(SpendenbescheinigungVar.BEZEICHNUNGSACHZUWENDUNG.getName(), + spb.getBezeichnungSachzuwendung()); + map.put(SpendenbescheinigungVar.UNTERLAGENWERTERMITTUNG.getName(), + spb.getUnterlagenWertermittlung() + ? "Geeignete Unterlagen, die zur Wertermittlung gedient haben, z. B. Rechnung, Gutachten, liegen vor." + : ""); + // Unterscheidung bis 2012 / ab 2013 + if (gc.get(GregorianCalendar.YEAR) <= 2012) + { + map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), + HerkunftSpende.get(spb.getHerkunftSpende())); + map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN.getName(), + (spb.getErsatzAufwendungen() ? "X" : "")); + } + else + { + // ab 2013 + switch (spb.getHerkunftSpende()) + { + case HerkunftSpende.BETRIEBSVERMOEGEN: + map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), + "Die Sachzuwendung stammt nach den Angaben des Zuwendenden aus dem Betriebsvermögen und ist" + + newLineStr + + "mit dem Entnahmewert (ggf. mit dem niedrigeren gemeinen Wert) bewertet."); + break; + case HerkunftSpende.PRIVATVERMOEGEN: + map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), + "Die Sachzuwendung stammt nach den Angaben des Zuwendenden aus dem Privatvermögen."); + break; + case HerkunftSpende.KEINEANGABEN: + map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), + "Der Zuwendende hat trotz Aufforderung keine Angaben zur Herkunft der Sachzuwendung gemacht."); + break; + } + map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN.getName(), + (spb.getErsatzAufwendungen() ? "Ja" : "Nein")); + map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN_JA.getName(), + (spb.getErsatzAufwendungen() ? "X" : " ")); + map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN_NEIN.getName(), + (spb.getErsatzAufwendungen() ? " " : "X")); + } + + // bei Sammelbestätigungen ein Zeitraum und "siehe Anlage" + if (spb.getBuchungen() != null && spb.getBuchungen().size() > 1) + { + String zeitraumende = new JVDateFormatTTMMJJJJ().format(spb.getZeitraumBis()); + map.put(SpendenbescheinigungVar.SPENDEDATUM.getName(), "s. Anlage"); + map.put(SpendenbescheinigungVar.SPENDENZEITRAUM.getName(), + String.format("%s bis %s", spendedatum, zeitraumende)); + StringBuilder bl = new StringBuilder(); + StringBuilder bl_daten = new StringBuilder(); + StringBuilder bl_art = new StringBuilder(); + StringBuilder bl_verzicht = new StringBuilder(); + StringBuilder bl_betrag = new StringBuilder(); + if (gc.get(GregorianCalendar.YEAR) <= 2012) + { + bl.append(StringTool.rpad("Datum", 10)); + bl.append(" "); + bl.append(StringTool.rpad(StringTool.lpad("Betrag", 8), 11)); + bl.append(" "); + bl.append("Verwendung"); + bl.append(newLineStr); + + bl.append("----------"); + bl.append(" "); + bl.append("-----------"); + bl.append(" "); + bl.append("-----------------------------------------"); + bl.append(newLineStr); + for (Buchung b : spb.getBuchungen()) + { + bl.append(new JVDateFormatTTMMJJJJ().format(b.getDatum())); + bl.append(" "); + String str = Einstellungen.DECIMALFORMAT.format(b.getBetrag()); + bl.append(StringTool.lpad(str, 11)); + bl.append(" "); + if (printBuchungsart) + { + bl.append(b.getBuchungsart().getBezeichnung()); + } + else + { + bl.append(b.getZweck()); + } + bl.append(" "); + bl.append((b.getVerzicht() ? "(b)" : "(a)")); + bl.append(newLineStr); + } + bl.append(newLineStr); + bl.append("----------"); + bl.append(" "); + bl.append("-----------"); + bl.append(" "); + bl.append("-----------------------------------------"); + bl.append(newLineStr); + bl.append(StringTool.rpad("Summe:", 10)); + bl.append(" "); + String str = Einstellungen.DECIMALFORMAT.format(spb.getBetrag()); + bl.append(StringTool.lpad(str, 11)); + bl.append(newLineStr); + bl.append(newLineStr); + bl.append(newLineStr); + bl.append("Legende:"); + bl.append(newLineStr); + bl.append( + "(a): Es handelt sich nicht um den Verzicht auf Erstattung von Aufwendungen"); + bl.append(newLineStr); + bl.append( + "(b): Es handelt sich um den Verzicht auf Erstattung von Aufwendungen"); + bl.append(newLineStr); + } + else + { + final int colDatumLen = 10; + final int colArtLen = 27; + final int colVerzichtLen = 17; + final int colBetragLen = 11; + bl.append(StringTool.rpad(" ", colDatumLen)); + bl.append(" "); + bl.append(StringTool.rpad(" ", colArtLen)); + bl.append(" "); + bl.append(StringTool.rpad("Verzicht auf", colVerzichtLen)); + bl.append(" "); + bl.append(StringTool.rpad(" ", colBetragLen)); + bl.append(newLineStr); + + bl.append(StringTool.rpad("Datum der ", colDatumLen)); + bl.append(" "); + bl.append(StringTool.rpad("Art der", colArtLen)); + bl.append(" "); + bl.append(StringTool.rpad("die Erstattung", colVerzichtLen)); + bl.append(" "); + bl.append(StringTool.rpad(" ", colBetragLen)); + bl.append(newLineStr); + + bl.append(StringTool.rpad("Zuwendung", colDatumLen)); + bl.append(" "); + bl.append(StringTool.rpad("Zuwendung", colArtLen)); + bl.append(" "); + bl.append(StringTool.rpad("von Aufwendungen", colVerzichtLen)); + bl.append(" "); + bl.append(StringTool.rpad(StringTool.lpad("Betrag", 8), colBetragLen)); + bl.append(newLineStr); + + bl.append(StringTool.rpad("-", colDatumLen, "-")); + bl.append(" "); + bl.append(StringTool.rpad("-", colArtLen, "-")); + bl.append(" "); + bl.append(StringTool.rpad("-", colVerzichtLen, "-")); + bl.append(" "); + bl.append(StringTool.rpad("-", colBetragLen, "-")); + bl.append(newLineStr); + + for (Buchung b : spb.getBuchungen()) + { + bl.append(StringTool.rpad( + new JVDateFormatTTMMJJJJ().format(b.getDatum()), colDatumLen)); + bl_daten.append(new JVDateFormatTTMMJJJJ().format(b.getDatum())); + bl_daten.append(newLineStr); + bl.append(" "); + if (printBuchungsart) + { + bl.append(StringTool.rpad(b.getBuchungsart().getBezeichnung(), + colArtLen)); + bl_art.append(b.getBuchungsart().getBezeichnung()); + bl_art.append(newLineStr); + } + else + { + bl.append(StringTool.rpad(b.getZweck(), colArtLen)); + } + bl.append(" "); + if (b.getVerzicht().booleanValue()) + { + bl.append(StringTool.rpad( + StringTool.lpad("ja", colVerzichtLen / 2 - 2), colVerzichtLen)); + bl_verzicht.append("ja"); + } + else + { + bl.append( + StringTool.rpad(StringTool.lpad("nein", colVerzichtLen / 2 - 2), + colVerzichtLen)); + bl_verzicht.append("nein"); + } + bl_verzicht.append(newLineStr); + bl.append(" "); + String str = Einstellungen.DECIMALFORMAT.format(b.getBetrag()); + bl.append(StringTool.lpad(str, colBetragLen)); + bl_betrag.append(StringTool.lpad(str, colBetragLen)); + bl_betrag.append(newLineStr); + bl.append(newLineStr); + } + + bl.append(StringTool.rpad("-", colDatumLen, "-")); + bl.append(" "); + bl.append(StringTool.rpad("-", colArtLen, "-")); + bl.append(" "); + bl.append(StringTool.rpad("-", colVerzichtLen, "-")); + bl.append(" "); + bl.append(StringTool.rpad("-", colBetragLen, "-")); + bl.append(newLineStr); + // bl.append(StringTool.rpad("-", + // colDatumLen+2+colArtLen+2+colVerzichtLen, "-")); + // bl.append(" "); + // bl.append(StringTool.rpad("-", colBetragLen, "-")); + // bl.append(newLineStr); + + bl.append(StringTool.rpad("Gesamtsumme:", + colDatumLen + 2 + colArtLen + 2 + colVerzichtLen)); + bl.append(" "); + String str = Einstellungen.DECIMALFORMAT.format(spb.getBetrag()); + bl.append(StringTool.lpad(str, colBetragLen)); + bl.append(newLineStr); + } + map.put(SpendenbescheinigungVar.BUCHUNGSLISTE.getName(), bl.toString()); + map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_DATEN.getName(), bl_daten.toString()); + map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_ART.getName(), bl_art.toString()); + map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_VERZICHT.getName(), bl_verzicht.toString()); + map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_BETRAG.getName(), bl_betrag.toString()); + } + else + { + map.put(SpendenbescheinigungVar.SPENDEDATUM.getName(), spendedatum); + } + + map.put(SpendenbescheinigungVar.FINANZAMT.getName(), + Einstellungen.getEinstellung().getFinanzamt()); + map.put(SpendenbescheinigungVar.STEUER_NR.getName(), + Einstellungen.getEinstellung().getSteuernummer()); + String bescheiddatum = new JVDateFormatTTMMJJJJ() + .format(Einstellungen.getEinstellung().getBescheiddatum()); + map.put(SpendenbescheinigungVar.DATUM_BESCHEID.getName(), bescheiddatum); + Calendar cal = Calendar.getInstance(); + cal.setTime(Einstellungen.getEinstellung().getVeranlagungVon()); + String start = "" + cal.get(Calendar.YEAR); + cal.setTime(Einstellungen.getEinstellung().getVeranlagungBis()); + map.put(SpendenbescheinigungVar.VERANLAGUNGSZEITRAUM.getName(), String + .format("%s bis %s", start, "" + cal.get(Calendar.YEAR))); + map.put(SpendenbescheinigungVar.ZWECK.getName(), + Einstellungen.getEinstellung().getBeguenstigterzweck()); + + if (spb.isEchteGeldspende() + && Einstellungen.getEinstellung().getUnterschriftdrucken() + && Einstellungen.getEinstellung().getUnterschrift() != null) + { + Image i; + try + { + i = Image.getInstance(Einstellungen.getEinstellung().getUnterschrift()); + int width = 400; + int height = 55; + float w = i.getWidth() / width; + float h = i.getHeight() / height; + if (w > h) + { + h = i.getHeight() / w; + w = width; + } + else + { + w = i.getWidth() / h; + h = height; + } + i.scaleToFit(w, h); + map.put(SpendenbescheinigungVar.UNTERSCHRIFT.getName(), i); + } + catch (BadElementException | IOException e) + { + // Dann drucken wir halt keine Unterschrift + } + } + return map; + } +} diff --git a/src/de/jost_net/JVerein/Variable/SpendenbescheinigungVar.java b/src/de/jost_net/JVerein/Variable/SpendenbescheinigungVar.java index b719aded6..44f1b6c48 100644 --- a/src/de/jost_net/JVerein/Variable/SpendenbescheinigungVar.java +++ b/src/de/jost_net/JVerein/Variable/SpendenbescheinigungVar.java @@ -36,6 +36,12 @@ public enum SpendenbescheinigungVar { BEZEICHNUNGSACHZUWENDUNG("spendenbescheinigung_bezeichnungsachzuwendung"), // HERKUNFTSACHZUWENDUNG("spendenbescheinigung_herkunftsachzuwendung"), // UNTERLAGENWERTERMITTUNG("spendenbescheinigung_unterlagenwertermittlung"), // + FINANZAMT("spendenbescheinigung_finanzamt"), // + STEUER_NR("spendenbescheinigung_steuer_nummmer"), // + DATUM_BESCHEID("spendenbescheinigung_datum_bescheid"), // + VERANLAGUNGSZEITRAUM("spendenbescheinigung_veranlagungszeitraum"), // + ZWECK("spendenbescheinigung_beguenstigter_zweck"), // + UNTERSCHRIFT("spendenbescheinigung_unterschrift"), // ZEILE1("spendenbescheinigung_zeile1"), // ZEILE2("spendenbescheinigung_zeile2"), // ZEILE3("spendenbescheinigung_zeile3"), // diff --git a/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java b/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java index 83888f444..a9e955242 100644 --- a/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java +++ b/src/de/jost_net/JVerein/gui/action/AbrechnungslaufDeleteAction.java @@ -26,6 +26,7 @@ import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Kursteilnehmer; import de.jost_net.JVerein.rmi.Lastschrift; +import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Zusatzbetrag; import de.jost_net.JVerein.rmi.ZusatzbetragAbrechnungslauf; import de.willuhn.datasource.rmi.DBIterator; @@ -66,10 +67,10 @@ public void handleAction(Object context) throws ApplicationException } // Prüfe, ob einer der erzeugten Buchungen bereits abgeschlossen ist - final DBService service1 = Einstellungen.getDBService(); + final DBService service = Einstellungen.getDBService(); String sql1 = "SELECT jahresabschluss.bis from jahresabschluss " + "order by jahresabschluss.bis desc"; - Date bis = (Date) service1.execute(sql1, + Date bis = (Date) service.execute(sql1, new Object[] { }, new ResultSetExtractor() { @Override @@ -87,10 +88,9 @@ public Object extract(ResultSet rs) // Es gibt Jahresabschlüsse und bis ist das letzte Datum { // Check ob eine Buchung des Abrechnungslaufen vor dem bis Datum liegt - DBService service2 = Einstellungen.getDBService(); String sql2 = "SELECT DISTINCT buchung.id from buchung " + "WHERE (abrechnungslauf = ? and datum <= ?) "; - boolean abgeschlossen = (boolean) service2.execute(sql2, + boolean abgeschlossen = (boolean) service.execute(sql2, new Object[] { abrl.getID(), bis }, new ResultSetExtractor() { @Override @@ -113,10 +113,9 @@ public Object extract(ResultSet rs) // Check ob einer der Buchungen des Abrechnungslaufs // eine Spendenbescheinigung zugeordnet ist - DBService service3 = Einstellungen.getDBService(); String sql3 = "SELECT DISTINCT buchung.id from buchung " + "WHERE (abrechnungslauf = ? and spendenbescheinigung IS NOT NULL) "; - boolean spendenbescheinigung = (boolean) service3.execute(sql3, + boolean spendenbescheinigung = (boolean) service.execute(sql3, new Object[] { abrl.getID() }, new ResultSetExtractor() { @Override @@ -131,18 +130,52 @@ public Object extract(ResultSet rs) } }); + // Check ob einer der Buchungen des Abrechnungslaufs + // einer Rechnung zugeordnet ist + String sql4 = "SELECT DISTINCT mitgliedskonto.id from mitgliedskonto " + + "WHERE (abrechnungslauf = ? and rechnung IS NOT NULL) "; + boolean rechnung = (boolean) service.execute(sql4, + new Object[] { abrl.getID() }, new ResultSetExtractor() + { + @Override + public Object extract(ResultSet rs) + throws RemoteException, SQLException + { + if (rs.next()) + { + return true; + } + return false; + } + }); + String text = ""; - if (!spendenbescheinigung) + if (!spendenbescheinigung && !rechnung) { text = "Wollen Sie diesen Abrechnungslauf wirklich löschen?"; } - else + else if(!spendenbescheinigung && rechnung) + { + text = "Der Abrechnungslauf enthält Sollbuchungen denen eine " + + "Rechnung zugeordnet ist.\n" + + "Sie können nur zusammen gelöscht werden.\n" + + "Abrechnungslauf und Rechnungen löschen?"; + } + else if(spendenbescheinigung && !rechnung) { text = "Der Abrechnungslauf enthält Buchungen denen eine " + "Spendenbescheinigung zugeordnet ist.\n" + "Sie können nur zusammen gelöscht werden.\n" + "Abrechnungslauf und Spendenbescheinigungen löschen?"; } + else if(spendenbescheinigung && rechnung) + { + text = "Der Abrechnungslauf enthält Buchungen denen eine " + + "Spendenbescheinigung zugeordnet ist\n" + + "und Sollbuchungen denen eine Rechnung zugeordnet ist.\n" + + "Sie können nur zusammen gelöscht werden.\n" + + "Abrechnungslauf, Spendenbescheinigungen und Rechnungen löschen?"; + } YesNoDialog d = new YesNoDialog(YesNoDialog.POSITION_CENTER); d.setTitle(String.format("Abrechnungslauf %s löschen", abrl.getID())); @@ -172,6 +205,16 @@ public Object extract(ResultSet rs) bu.getSpendenbescheinigung().delete(); bu.delete(); } + DBIterator mitgliedskontoIt = Einstellungen.getDBService() + .createList(Mitgliedskonto.class); + mitgliedskontoIt.addFilter("abrechnungslauf = ?", new Object[] { abrl.getID() }); + while (mitgliedskontoIt.hasNext()) + { + Mitgliedskonto mk = mitgliedskontoIt.next(); + if (mk.getRechnung() != null) + mk.getRechnung().delete(); + mk.delete(); + } it = Einstellungen.getDBService() .createList(ZusatzbetragAbrechnungslauf.class); it.addFilter("abrechnungslauf = ?", abrl.getID()); @@ -181,7 +224,15 @@ public Object extract(ResultSet rs) .next(); Zusatzbetrag z = (Zusatzbetrag) Einstellungen.getDBService() .createObject(Zusatzbetrag.class, za.getZusatzbetrag().getID()); - z.vorherigeFaelligkeit(); + try + { + z.vorherigeFaelligkeit(); + } + catch (RemoteException e) + { + //Ignorieren, da die Exeption auftritt wenn das Fälligkeitsdatum + //nicht weiter zurückgesetzt werden kann + } z.setAusfuehrung(za.getLetzteAusfuehrung()); z.store(); } diff --git a/src/de/jost_net/JVerein/gui/action/AnfangsbestandNeuAction.java b/src/de/jost_net/JVerein/gui/action/AnfangsbestandNeuAction.java index a33e8de5a..fb4a8274a 100644 --- a/src/de/jost_net/JVerein/gui/action/AnfangsbestandNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/AnfangsbestandNeuAction.java @@ -19,7 +19,7 @@ import java.rmi.RemoteException; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.gui.dialogs.KontoAuswahlDialog; import de.jost_net.JVerein.gui.view.AnfangsbestandView; import de.jost_net.JVerein.rmi.Anfangsbestand; @@ -49,7 +49,7 @@ public void handleAction(Object context) throws ApplicationException else { KontoAuswahlDialog d = new KontoAuswahlDialog( - KontoAuswahlDialog.POSITION_CENTER, false, false, true, Kontenart.ALLE); + KontoAuswahlDialog.POSITION_CENTER, false, false, true, Kontenfilter.ALLE); try { context = d.open(); diff --git a/src/de/jost_net/JVerein/gui/action/AnlagenkontoNeuAction.java b/src/de/jost_net/JVerein/gui/action/AnlagenkontoNeuAction.java index e30cafcd3..4dc2d49d6 100644 --- a/src/de/jost_net/JVerein/gui/action/AnlagenkontoNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/AnlagenkontoNeuAction.java @@ -65,7 +65,7 @@ public void handleAction(Object context) throws ApplicationException bu.setZweck(buchung.getZweck()); bu.setDatum(buchung.getDatum()); if (buchung.getBuchungsart() != null) - bu.setBuchungsart(buchung.getBuchungsartId()); + bu.setBuchungsartId(buchung.getBuchungsartId()); if (buchung.getProjekt() != null) bu.setProjektID(buchung.getProjektID()); bu.setKommentar(buchung.getKommentar()); diff --git a/src/de/jost_net/JVerein/gui/action/BuchungBuchungsartZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungBuchungsartZuordnungAction.java index ea267a583..51a441a4d 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungBuchungsartZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungBuchungsartZuordnungAction.java @@ -72,7 +72,7 @@ public void handleAction(Object context) throws ApplicationException { return; } - + BuchungsartZuordnungDialog baz = new BuchungsartZuordnungDialog( BuchungsartZuordnungDialog.POSITION_MOUSE); baz.open(); @@ -85,7 +85,7 @@ public void handleAction(Object context) throws ApplicationException { for (Buchung buchung : b) { - buchung.setBuchungsart(null); + buchung.setBuchungsartId(null); buchung.setBuchungsklasseId(null); buchung.store(); } @@ -102,9 +102,9 @@ public void handleAction(Object context) throws ApplicationException } else { - buchung.setBuchungsart(Long.valueOf(ba.getID())); + buchung.setBuchungsartId(Long.valueOf(ba.getID())); if (bk != null) - buchung.setBuchungsklasseId(Long.valueOf(bk.getID())); + buchung.setBuchungsklasseId(Long.valueOf(bk.getID())); else buchung.setBuchungsklasseId(null); buchung.store(); @@ -133,10 +133,15 @@ public void handleAction(Object context) throws ApplicationException { throw oce; } + catch (ApplicationException e) + { + GUI.getStatusBar().setErrorText(e.getLocalizedMessage()); + } catch (Exception e) { Logger.error("Fehler", e); - GUI.getStatusBar().setErrorText("Fehler bei der Zuordnung der Buchungsart"); + GUI.getStatusBar().setErrorText("Fehler bei der Zuordnung der Buchungsart: " + + e.getLocalizedMessage()); } } } diff --git a/src/de/jost_net/JVerein/gui/action/BuchungDeleteAction.java b/src/de/jost_net/JVerein/gui/action/BuchungDeleteAction.java index 80bf00714..7411922ef 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungDeleteAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungDeleteAction.java @@ -22,6 +22,7 @@ import de.jost_net.JVerein.io.SplitbuchungsContainer; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Jahresabschluss; +import de.jost_net.JVerein.rmi.Spendenbescheinigung; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; @@ -136,6 +137,12 @@ else if (context instanceof Buchung[]) "Buchung wurde bereits am %s von %s abgeschlossen.", new JVDateFormatTTMMJJJJ().format(ja.getDatum()), ja.getName())); } + Spendenbescheinigung spb = bu.getSpendenbescheinigung(); + if(spb != null) + { + throw new ApplicationException( + "Buchung kann nicht bearbeitet werden. Sie ist einer Spendenbescheinigung zugeordnet."); + } if (bu.getSplitId() == null) { if (bu.getSpendenbescheinigung() != null) @@ -177,6 +184,10 @@ else if (splitbuchung) GUI.getStatusBar().setErrorText("Keine Buchung gelöscht"); } } + catch (ApplicationException e) + { + GUI.getStatusBar().setErrorText(e.getLocalizedMessage()); + } catch (RemoteException e) { String fehler = "Fehler beim Löschen der Buchung."; diff --git a/src/de/jost_net/JVerein/gui/action/BuchungDuplizierenAction.java b/src/de/jost_net/JVerein/gui/action/BuchungDuplizierenAction.java index 0102747a0..c5b6526ef 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungDuplizierenAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungDuplizierenAction.java @@ -47,7 +47,7 @@ public void handleAction(Object context) throws ApplicationException bu.setArt(b.getArt()); bu.setKommentar(b.getKommentar()); if (b.getBuchungsart() != null) - bu.setBuchungsart(b.getBuchungsartId()); + bu.setBuchungsartId(b.getBuchungsartId()); if (b.getBuchungsklasse() != null) bu.setBuchungsklasseId(b.getBuchungsklasseId()); if (b.getProjekt() != null) diff --git a/src/de/jost_net/JVerein/gui/action/BuchungGegenbuchungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungGegenbuchungAction.java index b8c1a68b1..7eb72a664 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungGegenbuchungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungGegenbuchungAction.java @@ -17,7 +17,7 @@ package de.jost_net.JVerein.gui.action; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.gui.dialogs.KontoAuswahlDialog; import de.jost_net.JVerein.gui.view.BuchungView; import de.jost_net.JVerein.rmi.Buchung; @@ -54,7 +54,7 @@ public void handleAction(Object context) throws ApplicationException if (konto == null) { KontoAuswahlDialog d = new KontoAuswahlDialog( - KontoAuswahlDialog.POSITION_CENTER, false, false, true, Kontenart.ALLE); + KontoAuswahlDialog.POSITION_CENTER, false, false, true, Kontenfilter.ALLE); konto = (Konto) d.open(); } if (konto != null) @@ -67,7 +67,7 @@ public void handleAction(Object context) throws ApplicationException bu.setZweck(b.getZweck()); bu.setDatum(b.getDatum()); if (b.getBuchungsart() != null) - bu.setBuchungsart(b.getBuchungsartId()); + bu.setBuchungsartId(b.getBuchungsartId()); if (b.getBuchungsklasse() != null) bu.setBuchungsklasseId(b.getBuchungsklasseId()); if (b.getProjekt() != null) diff --git a/src/de/jost_net/JVerein/gui/action/BuchungKontoauszugZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungKontoauszugZuordnungAction.java index 033a53b34..7bc0db233 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungKontoauszugZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungKontoauszugZuordnungAction.java @@ -113,6 +113,10 @@ public void handleAction(Object context) throws ApplicationException { throw oce; } + catch (ApplicationException e) + { + GUI.getStatusBar().setErrorText(e.getLocalizedMessage()); + } catch (Exception e) { Logger.error("Fehler", e); diff --git a/src/de/jost_net/JVerein/gui/action/BuchungNeuAction.java b/src/de/jost_net/JVerein/gui/action/BuchungNeuAction.java index 0db920534..4553d9335 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungNeuAction.java @@ -22,6 +22,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.control.BuchungsControl; import de.jost_net.JVerein.gui.view.BuchungView; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Konto; import de.willuhn.datasource.rmi.ObjectNotFoundException; @@ -49,9 +50,9 @@ public void handleAction(Object context) Konto konto = (Konto) control.getSuchKonto().getValue(); if (null != konto) { - if (konto.getAnlagenkonto()) + if (konto.getKontoArt() == Kontoart.ANLAGE) { - buch.setBuchungsart(konto.getAfaartId()); + buch.setBuchungsartId(konto.getAfaartId()); } buch.setDatum(new Date()); buch.setKonto(konto); @@ -67,9 +68,9 @@ public void handleAction(Object context) k = (Konto) Einstellungen.getDBService().createObject(Konto.class, kontoid); if (null != k) { - if (k.getAnlagenkonto()) + if (k.getKontoArt() == Kontoart.ANLAGE) { - buch.setBuchungsart(k.getAfaartId()); + buch.setBuchungsartId(k.getAfaartId()); } buch.setDatum(new Date()); buch.setKonto(k); diff --git a/src/de/jost_net/JVerein/gui/action/BuchungProjektZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungProjektZuordnungAction.java index 8cfb34a73..d5d66d258 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungProjektZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungProjektZuordnungAction.java @@ -119,6 +119,10 @@ public void handleAction(Object context) throws ApplicationException { throw oce; } + catch (ApplicationException e) + { + GUI.getStatusBar().setErrorText(e.getLocalizedMessage()); + } catch (Exception e) { Logger.error("Fehler", e); diff --git a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java index a0044f081..1e1c4ca09 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungSollbuchungZuordnungAction.java @@ -107,6 +107,13 @@ else if (open instanceof Mitglied) for (Buchung buchung : b) { buchung.setMitgliedskonto(mk); + if (mk != null) + { + if (buchung.getBuchungsartId() == null) + buchung.setBuchungsartId(mk.getBuchungsartId()); + if (buchung.getBuchungsklasseId() == null) + buchung.setBuchungsklasseId(mk.getBuchungsklasseId()); + } buchung.store(); } control.getBuchungsList(); diff --git a/src/de/jost_net/JVerein/gui/action/BuchungsuebernahmeAction.java b/src/de/jost_net/JVerein/gui/action/BuchungsuebernahmeAction.java index 204215bea..e136564b7 100644 --- a/src/de/jost_net/JVerein/gui/action/BuchungsuebernahmeAction.java +++ b/src/de/jost_net/JVerein/gui/action/BuchungsuebernahmeAction.java @@ -16,15 +16,41 @@ **********************************************************************/ package de.jost_net.JVerein.gui.action; -import de.jost_net.JVerein.gui.view.BuchungsuebernahmeView; +import de.jost_net.JVerein.gui.dialogs.BuchungsuebernahmeDialog; +import de.jost_net.JVerein.io.Buchungsuebernahme; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.system.OperationCanceledException; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; public class BuchungsuebernahmeAction implements Action { @Override - public void handleAction(Object context) + public void handleAction(Object context) throws ApplicationException { - GUI.startView(BuchungsuebernahmeView.class.getName(), null); + + try + { + BuchungsuebernahmeDialog d = new BuchungsuebernahmeDialog(BuchungsuebernahmeDialog.POSITION_CENTER); + if (d.open()) + { + new Buchungsuebernahme(); + } + } + catch (OperationCanceledException oce) + { + return; + } + catch (ApplicationException ae) + { + throw ae; + } + catch (Exception e) + { + Logger.error("Error while importing from Hibiscus", e); + GUI.getStatusBar().setErrorText("Fehler beim Importieren von Hibiscus Buchungen"); + } } + } diff --git a/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java b/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java index 0d47e8bc2..719d27b2d 100644 --- a/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java +++ b/src/de/jost_net/JVerein/gui/action/FormularAnzeigeAction.java @@ -29,7 +29,8 @@ import de.jost_net.JVerein.Variable.AllgemeineVar; import de.jost_net.JVerein.Variable.LastschriftMap; import de.jost_net.JVerein.Variable.MitgliedMap; -import de.jost_net.JVerein.Variable.MitgliedskontoVar; +import de.jost_net.JVerein.Variable.RechnungVar; +import de.jost_net.JVerein.Variable.SpendenbescheinigungMap; import de.jost_net.JVerein.Variable.SpendenbescheinigungVar; import de.jost_net.JVerein.gui.control.FormularfeldControl; import de.jost_net.JVerein.gui.input.GeschlechtInput; @@ -137,7 +138,7 @@ public void handleAction(Object context) throws ApplicationException Spendenbescheinigung spb = (Spendenbescheinigung) Einstellungen .getDBService().createObject(Spendenbescheinigung.class, null); - map = spb.getMap(map); + map = new SpendenbescheinigungMap().getMap(spb, map); map.put(SpendenbescheinigungVar.SPENDEDATUM.getName(), "15.12.2008"); map.put("Buchungsdatum", new Date()); map.put(SpendenbescheinigungVar.BESCHEINIGUNGDATUM.getName(), @@ -323,19 +324,19 @@ public void handleAction(Object context) throws ApplicationException map.put(FormularfeldControl.ZAHLUNGSGRUND, zg.toArray()); map.put(FormularfeldControl.ZAHLUNGSGRUND1, zg1.toArray()); map.put(FormularfeldControl.BETRAG, betrag.toArray()); - map.put(MitgliedskontoVar.BUCHUNGSDATUM.getName(), buda.toArray()); - map.put(MitgliedskontoVar.ZAHLUNGSGRUND.getName(), zg.toArray()); - map.put(MitgliedskontoVar.ZAHLUNGSGRUND1.getName(), zg1.toArray()); - map.put(MitgliedskontoVar.NETTOBETRAG.getName(), nettobetrag.toArray()); - map.put(MitgliedskontoVar.STEUERSATZ.getName(), steuersatz.toArray()); - map.put(MitgliedskontoVar.STEUERBETRAG.getName(), steuerbetrag.toArray()); - map.put(MitgliedskontoVar.BETRAG.getName(), betrag.toArray()); - map.put(MitgliedskontoVar.IST.getName(), ist.toArray()); - map.put(MitgliedskontoVar.DIFFERENZ.getName(), differenz.toArray()); - map.put(MitgliedskontoVar.SUMME_OFFEN.getName(), 700); - map.put(MitgliedskontoVar.QRCODE_INTRO.getName(), + 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()); + map.put(RechnungVar.BETRAG.getName(), betrag.toArray()); + map.put(RechnungVar.IST.getName(), ist.toArray()); + map.put(RechnungVar.DIFFERENZ.getName(), differenz.toArray()); + map.put(RechnungVar.SUMME_OFFEN.getName(), 700); + map.put(RechnungVar.QRCODE_INTRO.getName(), Einstellungen.getEinstellung().getQRCodeIntro()); - FormularAufbereitung fab = new FormularAufbereitung(file); + FormularAufbereitung fab = new FormularAufbereitung(file, false); fab.writeForm(formular, map); fab.showFormular(); } diff --git a/src/de/jost_net/JVerein/gui/action/FormularExportAction.java b/src/de/jost_net/JVerein/gui/action/FormularExportAction.java new file mode 100644 index 000000000..72d2caca9 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/FormularExportAction.java @@ -0,0 +1,59 @@ +/********************************************************************** + * 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.dialogs.ExportDialog; +import de.jost_net.JVerein.gui.view.DokumentationUtil; +import de.jost_net.JVerein.rmi.Formular; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.system.OperationCanceledException; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class FormularExportAction implements Action +{ + + /** + * @see de.willuhn.jameica.gui.Action#handleAction(java.lang.Object) + */ + @Override + public void handleAction(Object context) throws ApplicationException + { + try + { + ExportDialog d = new ExportDialog(new Object[] { context }, + Formular.class, DokumentationUtil.FORMULARE); + d.open(); + } + catch (OperationCanceledException oce) + { + Logger.info(oce.getMessage()); + return; + } + catch (ApplicationException ae) + { + throw ae; + } + catch (Exception e) + { + Logger.error("Fehler", e); + GUI.getStatusBar() + .setErrorText("Fehler beim exportieren des Formulars"); + } + } +} diff --git a/src/de/jost_net/JVerein/gui/action/FormularImportAction.java b/src/de/jost_net/JVerein/gui/action/FormularImportAction.java new file mode 100644 index 000000000..2491e67ec --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/FormularImportAction.java @@ -0,0 +1,59 @@ +/********************************************************************** + * 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.dialogs.ImportDialog; +import de.jost_net.JVerein.gui.view.DokumentationUtil; +import de.jost_net.JVerein.rmi.Formular; +import de.willuhn.datasource.GenericObject; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.system.OperationCanceledException; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class FormularImportAction implements Action +{ + + /** + * @see de.willuhn.jameica.gui.Action#handleAction(java.lang.Object) + */ + @Override + public void handleAction(Object context) throws ApplicationException + { + try + { + ImportDialog d = new ImportDialog((GenericObject) context, + Formular.class, true, DokumentationUtil.FORMULARE); + d.open(); + } + catch (OperationCanceledException oce) + { + Logger.info(oce.getMessage()); + return; + } + catch (ApplicationException ae) + { + throw ae; + } + catch (Exception e) + { + Logger.error("Fehler", e); + GUI.getStatusBar().setErrorText("Fehler beim importieren des Formulars"); + } + } +} diff --git a/src/de/jost_net/JVerein/gui/action/FreiesFormularAction.java b/src/de/jost_net/JVerein/gui/action/FreiesFormularAction.java index 1798c9808..afceb6230 100644 --- a/src/de/jost_net/JVerein/gui/action/FreiesFormularAction.java +++ b/src/de/jost_net/JVerein/gui/action/FreiesFormularAction.java @@ -112,7 +112,7 @@ private void generiereFreiesFormular(Mitglied[] m) throws Exception final File file = new File(s); settings.setAttribute("lastdir", file.getParent()); - FormularAufbereitung fa = new FormularAufbereitung(file); + FormularAufbereitung fa = new FormularAufbereitung(file, false); for (Mitglied mi : m) { Formular fo = (Formular) Einstellungen.getDBService().createObject( @@ -120,6 +120,7 @@ private void generiereFreiesFormular(Mitglied[] m) throws Exception Map map = new MitgliedMap().getMap(mi, null); map = new AllgemeineMap().getMap(map); fa.writeForm(fo, map); + fo.store(); } fa.showFormular(); diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoIstbuchungEditAction.java b/src/de/jost_net/JVerein/gui/action/IstbuchungEditAction.java similarity index 96% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoIstbuchungEditAction.java rename to src/de/jost_net/JVerein/gui/action/IstbuchungEditAction.java index 655a47e48..6bc08500c 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoIstbuchungEditAction.java +++ b/src/de/jost_net/JVerein/gui/action/IstbuchungEditAction.java @@ -26,7 +26,7 @@ import de.willuhn.jameica.gui.GUI; import de.willuhn.util.ApplicationException; -public class MitgliedskontoIstbuchungEditAction implements Action +public class IstbuchungEditAction implements Action { @Override diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoIstbuchungLoesenAction.java b/src/de/jost_net/JVerein/gui/action/IstbuchungLoesenAction.java similarity index 97% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoIstbuchungLoesenAction.java rename to src/de/jost_net/JVerein/gui/action/IstbuchungLoesenAction.java index 5422dd86f..95f9eac26 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoIstbuchungLoesenAction.java +++ b/src/de/jost_net/JVerein/gui/action/IstbuchungLoesenAction.java @@ -29,7 +29,7 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -public class MitgliedskontoIstbuchungLoesenAction implements Action +public class IstbuchungLoesenAction implements Action { @Override diff --git a/src/de/jost_net/JVerein/gui/action/KursteilnehmerWirdMitgliedAction.java b/src/de/jost_net/JVerein/gui/action/KursteilnehmerWirdMitgliedAction.java index cd60d69c3..ba870589c 100644 --- a/src/de/jost_net/JVerein/gui/action/KursteilnehmerWirdMitgliedAction.java +++ b/src/de/jost_net/JVerein/gui/action/KursteilnehmerWirdMitgliedAction.java @@ -51,7 +51,7 @@ public void handleAction(Object context) throws ApplicationException m.setOrt(k.getOrt()); m.setPersonenart(PersonenartInput.NATUERLICHE_PERSON.substring(0, 1)); m.setPlz(k.getPlz()); - m.setStaat(k.getStaat()); + m.setStaat(k.getStaatCode()); m.setStrasse(k.getStrasse()); m.setTitel(k.getTitel()); m.setVorname(k.getVorname()); diff --git a/src/de/jost_net/JVerein/gui/action/MahnungSendAction.java b/src/de/jost_net/JVerein/gui/action/MahnungSendAction.java new file mode 100644 index 000000000..0faf49399 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/MahnungSendAction.java @@ -0,0 +1,30 @@ +/********************************************************************** + * 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.MahnungMailView; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; + +public class MahnungSendAction implements Action +{ + @Override + public void handleAction(Object context) + { + GUI.startView(MahnungMailView.class.getName(), context); + } +} diff --git a/src/de/jost_net/JVerein/gui/action/MailVorschauAction.java b/src/de/jost_net/JVerein/gui/action/MailVorschauAction.java new file mode 100644 index 000000000..fa2a61e09 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/MailVorschauAction.java @@ -0,0 +1,74 @@ +/********************************************************************** + * 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.control.MailControl; +import de.jost_net.JVerein.gui.control.MailVorlageControl; +import de.jost_net.JVerein.gui.dialogs.MailEmpfaengerAuswahlDialog; +import de.jost_net.JVerein.gui.dialogs.MailVorschauDialog; +import de.jost_net.JVerein.rmi.MailEmpfaenger; +import de.jost_net.JVerein.rmi.Mitglied; +import de.willuhn.jameica.gui.AbstractControl; +import de.willuhn.jameica.gui.Action; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +import java.rmi.RemoteException; + +public class MailVorschauAction implements Action +{ + private final AbstractControl control; + + public MailVorschauAction(AbstractControl control) + { + super(); + this.control = control; + } + + @Override + public void handleAction(Object context) throws ApplicationException + { + if (context instanceof MailEmpfaenger && control instanceof MailControl) + { + MailEmpfaenger m = (MailEmpfaenger) context; + try + { + new MailVorschauDialog((MailControl) control, m, + MailEmpfaengerAuswahlDialog.POSITION_CENTER); + } + catch (RemoteException e) + { + throw new ApplicationException("Fehler beim Anzeigen der Vorschau"); + } + } + else if (context instanceof Mitglied && (control instanceof MailControl || control instanceof MailVorlageControl)) + { + Mitglied m = (Mitglied) context; + new MailVorschauDialog(control, m, + MailEmpfaengerAuswahlDialog.POSITION_CENTER); + } + else + { + String name = ""; + if (context != null && context.getClass() != null) + { + name = context.getClass().getCanonicalName(); + } + Logger.error("ShowVariablesDiaglog: Ungültige Klasse: " + name); + } + } +} diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedDetailAction.java b/src/de/jost_net/JVerein/gui/action/MitgliedDetailAction.java index 20352c935..5b5e160f0 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedDetailAction.java +++ b/src/de/jost_net/JVerein/gui/action/MitgliedDetailAction.java @@ -22,13 +22,14 @@ import de.jost_net.JVerein.gui.view.NichtMitgliedDetailView; import de.jost_net.JVerein.gui.view.MitgliedDetailView; import de.jost_net.JVerein.io.ArbeitseinsatzZeile; -import de.jost_net.JVerein.rmi.Arbeitseinsatz; -import de.jost_net.JVerein.rmi.Lastschrift; -import de.jost_net.JVerein.rmi.Lehrgang; import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.rmi.Buchung; +import de.jost_net.JVerein.rmi.Arbeitseinsatz; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.rmi.Wiedervorlage; import de.jost_net.JVerein.rmi.Zusatzbetrag; +import de.jost_net.JVerein.rmi.Lehrgang; +import de.jost_net.JVerein.rmi.Lastschrift; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.system.OperationCanceledException; @@ -40,56 +41,59 @@ public class MitgliedDetailAction implements Action @Override public void handleAction(Object context) throws ApplicationException { - Mitglied m = null; + Mitglied mitglied; try { if (context != null && context instanceof FamilienbeitragNode) { FamilienbeitragNode fbn = (FamilienbeitragNode) context; - m = fbn.getMitglied(); + mitglied = fbn.getMitglied(); } else if (context != null && (context instanceof Arbeitseinsatz)) { Arbeitseinsatz aeins = (Arbeitseinsatz) context; - m = aeins.getMitglied(); + mitglied = aeins.getMitglied(); } else if (context != null && context instanceof ArbeitseinsatzZeile) { ArbeitseinsatzZeile aez = (ArbeitseinsatzZeile) context; - m = (Mitglied) aez.getAttribute("mitglied"); + mitglied = (Mitglied) aez.getAttribute("mitglied"); } else if (context != null && (context instanceof Mitglied)) { - m = (Mitglied) context; + mitglied = (Mitglied) context; } else if (context != null && (context instanceof Mitgliedskonto)) { Mitgliedskonto mk = (Mitgliedskonto) context; - m = mk.getMitglied(); + mitglied = mk.getMitglied(); } else if (context != null && (context instanceof Wiedervorlage)) { Wiedervorlage w = (Wiedervorlage) context; - m = w.getMitglied(); + mitglied = w.getMitglied(); } else if (context != null && (context instanceof Zusatzbetrag)) { Zusatzbetrag z = (Zusatzbetrag) context; - m = z.getMitglied(); + mitglied = z.getMitglied(); } else if (context != null && (context instanceof Lehrgang)) { Lehrgang l = (Lehrgang) context; - m = l.getMitglied(); + mitglied = l.getMitglied(); } else if (context != null && (context instanceof Lastschrift)) { Lastschrift l = (Lastschrift) context; - m = l.getMitglied(); + mitglied = l.getMitglied(); + } + else if ((context instanceof Buchung ) && ((Buchung) context).getMitgliedskonto() != null ) { + mitglied = ((Buchung) context).getMitgliedskonto().getMitglied(); } else { - m = (Mitglied) Einstellungen.getDBService().createObject( + mitglied = (Mitglied) Einstellungen.getDBService().createObject( Mitglied.class, null); if (Einstellungen.getEinstellung().getJuristischePersonen()) { @@ -100,20 +104,20 @@ else if (context != null && (context instanceof Lastschrift)) { return; } - m.setPersonenart(pa); + mitglied.setPersonenart(pa); } else { - m.setPersonenart("n"); + mitglied.setPersonenart("n"); } } - if (m.getAdresstyp() == null || m.getAdresstyp().getID().equals("1")) + if (mitglied.getAdresstyp() == null || mitglied.getAdresstyp().getID().equals("1")) { - GUI.startView(new MitgliedDetailView(), m); + GUI.startView(new MitgliedDetailView(), mitglied); } else { - GUI.startView(new NichtMitgliedDetailView(), m); + GUI.startView(new NichtMitgliedDetailView(), mitglied); } } catch (OperationCanceledException oce) diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedEigenschaftZuordnungAction.java b/src/de/jost_net/JVerein/gui/action/MitgliedEigenschaftZuordnungAction.java index 6901136f1..7fb727bbb 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedEigenschaftZuordnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/MitgliedEigenschaftZuordnungAction.java @@ -66,7 +66,7 @@ else if (context instanceof Mitglied[]) int anzGeloescht = 0; try { - EigenschaftenAuswahlDialog ead = new EigenschaftenAuswahlDialog("", true, + EigenschaftenAuswahlDialog ead = new EigenschaftenAuswahlDialog("", false, new MitgliedControl(null), false, mitglieder); EigenschaftenAuswahlParameter param = ead.open(); if (param == null || param.getEigenschaftenNodes() == null) diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedLastschriftAction.java b/src/de/jost_net/JVerein/gui/action/MitgliedLastschriftAction.java index cfcee8c16..6d355e133 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedLastschriftAction.java +++ b/src/de/jost_net/JVerein/gui/action/MitgliedLastschriftAction.java @@ -122,7 +122,6 @@ private boolean checkSEPA(Mitglied m) throws RemoteException if (m.getZahlungsweg() == null || m.getZahlungsweg() != Zahlungsweg.BASISLASTSCHRIFT) { - abortDialog("Fehler", "Zahlungsweg ist nicht Basislastschrift"); return false; } @@ -136,22 +135,24 @@ private boolean checkSEPA(Mitglied m) throws RemoteException } } - // pruefe Sepa Gueltigkeit: Datum der letzen Abbuchung - Date letzte_lastschrift = m.getLetzteLastschrift(); - if (letzte_lastschrift != null) + // Pruefe Sepa Gueltigkeit: + // Bei Mandaten älter als 3 Jahre muss es eine Lastschrift + // innerhalb der letzten 3 Jahre geben + Calendar sepagueltigkeit = Calendar.getInstance(); + sepagueltigkeit.add(Calendar.MONTH, -36); + if (m.getMandatDatum().before(sepagueltigkeit.getTime())) { - Calendar sepagueltigkeit = Calendar.getInstance(); - sepagueltigkeit.add(Calendar.MONTH, -36); - if (letzte_lastschrift.before(sepagueltigkeit.getTime())) + Date letzte_lastschrift = m.getLetzteLastschrift(); + if (letzte_lastschrift == null + || letzte_lastschrift.before(sepagueltigkeit.getTime())) { - if (!confirmDialog("Letzte Lastschrift", - "Letzte Lastschrift ist älter als 36 Monate")) + if (!confirmDialog("Mandat abgelaufen", + "Das Mandat-Datum ist älter als 36 Monate und es erfolgte keine Lastschrift in den letzten 36 Monaten.")) { return false; } - } + } } - return true; } diff --git a/src/de/jost_net/JVerein/gui/action/MittelverwendungListeAction.java b/src/de/jost_net/JVerein/gui/action/MittelverwendungListeAction.java new file mode 100644 index 000000000..969678b0c --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/MittelverwendungListeAction.java @@ -0,0 +1,30 @@ +/********************************************************************** + * 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.MittelverwendungListeView; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; + +public class MittelverwendungListeAction implements Action +{ + @Override + public void handleAction(Object context) + { + GUI.startView(MittelverwendungListeView.class.getName(), null); + } +} diff --git a/src/de/jost_net/JVerein/gui/action/OpenInsertVariableDialogAction.java b/src/de/jost_net/JVerein/gui/action/OpenInsertVariableDialogAction.java new file mode 100644 index 000000000..c5b7a0e3f --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/OpenInsertVariableDialogAction.java @@ -0,0 +1,81 @@ +/********************************************************************** + * 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 java.util.Map; + +import de.jost_net.JVerein.Variable.AllgemeineMap; +import de.jost_net.JVerein.Variable.MitgliedMap; +import de.jost_net.JVerein.gui.dialogs.ShowVariablesDialog; +import de.jost_net.JVerein.gui.menu.ShowVariablesMenu; +import de.jost_net.JVerein.rmi.MailEmpfaenger; +import de.jost_net.JVerein.util.LesefeldAuswerter; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.system.OperationCanceledException; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class OpenInsertVariableDialogAction implements Action +{ + @SuppressWarnings("unchecked") + @Override + public void handleAction(Object context) + { + String prependCopyText = ""; + try + { + ShowVariablesMenu menu = new ShowVariablesMenu(); + Map map; + if (context instanceof LesefeldAuswerter) + { + map = ((LesefeldAuswerter) context).getMap(); + } + else if (context instanceof Map) + { + map = (Map) context; + prependCopyText = "$"; + } + else if (context instanceof MailEmpfaenger) + { + map = new MitgliedMap().getMap(((MailEmpfaenger) context).getMitglied(), + new AllgemeineMap().getMap(null)); + prependCopyText = "$"; + } + else + { + throw new ApplicationException("Falscher Kontext"); + } + ShowVariablesDialog d = new ShowVariablesDialog(map, false, + prependCopyText, ""); + menu.setAppendCopyText(""); + menu.setPrependCopyText(prependCopyText); + d.setContextMenu(menu); + d.setDoubleClickAction(menu.getCopyToClipboardAction()); + d.open(); + } + catch (OperationCanceledException ignored) + { + } + catch (Exception e) + { + Logger.error("Fehler beim Anzeigen der Variablen.", e); + GUI.getStatusBar().setErrorText("Fehler beim Anzeigen der Variablen."); + } + } +} diff --git a/src/de/jost_net/JVerein/gui/action/RechnungAction.java b/src/de/jost_net/JVerein/gui/action/RechnungAction.java new file mode 100644 index 000000000..2f31bec39 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/RechnungAction.java @@ -0,0 +1,39 @@ +/********************************************************************** + * 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.RechnungView; +import de.jost_net.JVerein.rmi.Rechnung; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.util.ApplicationException; + +public class RechnungAction implements Action +{ + @Override + public void handleAction(Object context) throws ApplicationException + { + if (context != null && (context instanceof Rechnung)) + { + GUI.startView(RechnungView.class.getName(), context); + } + else + { + throw new ApplicationException("Keine Rechnung ausgewählt"); + } + } +} diff --git a/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java b/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java new file mode 100644 index 000000000..d44b26633 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/RechnungAutoNeuAction.java @@ -0,0 +1,33 @@ +/********************************************************************** + * 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/RechnungDeleteAction.java b/src/de/jost_net/JVerein/gui/action/RechnungDeleteAction.java new file mode 100644 index 000000000..e0f251b79 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/RechnungDeleteAction.java @@ -0,0 +1,96 @@ +/********************************************************************** + * 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 java.rmi.RemoteException; + +import de.jost_net.JVerein.rmi.Rechnung; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.dialogs.YesNoDialog; +import de.willuhn.jameica.gui.parts.TablePart; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class RechnungDeleteAction implements Action +{ + @Override + public void handleAction(Object context) throws ApplicationException + { + Rechnung[] res = null; + if (context instanceof TablePart) + { + TablePart tp = (TablePart) context; + context = tp.getSelection(); + } + if (context == null) + { + throw new ApplicationException("Keine Rechnung ausgewählt"); + } + else if (context instanceof Rechnung) + { + res = new Rechnung[] { (Rechnung) context}; + } + else if (context instanceof Rechnung[]) + { + res = (Rechnung[]) context; + } + else + { + return; + } + try + { + String mehrzahl = res.length > 1 ? "en" : ""; + YesNoDialog d = new YesNoDialog(YesNoDialog.POSITION_CENTER); + d.setTitle("Rechnung" + mehrzahl + " löschen"); + d.setText("Wollen Sie die Rechnung" + mehrzahl + + " wirklich löschen?"); + + try + { + Boolean choice = (Boolean) d.open(); + if (!choice.booleanValue()) + { + return; + } + } + catch (Exception e) + { + Logger.error("Fehler beim Löschen der Rechnung" + mehrzahl, + e); + return; + } + for (Rechnung re : res) + { + if (re.isNewObject()) + { + continue; + } + re.delete(); + } + GUI.getStatusBar().setSuccessText( + "Rechnung" + mehrzahl + " gelöscht."); + } + catch (RemoteException e) + { + String fehler = "Fehler beim Löschen der Rechnung"; + GUI.getStatusBar().setErrorText(fehler); + Logger.error(fehler, e); + } + } +} diff --git a/src/de/jost_net/JVerein/gui/action/RechnungListeAction.java b/src/de/jost_net/JVerein/gui/action/RechnungListeAction.java new file mode 100644 index 000000000..86060e17e --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/RechnungListeAction.java @@ -0,0 +1,30 @@ +/********************************************************************** + * 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.RechnungListeView; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; + +public class RechnungListeAction implements Action +{ + @Override + public void handleAction(Object context) + { + GUI.startView(RechnungListeView.class.getName(), null); + } +} diff --git a/src/de/jost_net/JVerein/gui/action/RechnungSendAction.java b/src/de/jost_net/JVerein/gui/action/RechnungSendAction.java new file mode 100644 index 000000000..876a0a68c --- /dev/null +++ b/src/de/jost_net/JVerein/gui/action/RechnungSendAction.java @@ -0,0 +1,30 @@ +/********************************************************************** + * 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.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; + +public class RechnungSendAction implements Action +{ + @Override + public void handleAction(Object context) + { + GUI.startView(RechnungMailView.class.getName(), context); + } +} diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungEditAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungEditAction.java similarity index 97% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungEditAction.java rename to src/de/jost_net/JVerein/gui/action/SollbuchungEditAction.java index ca6f0cc74..a612ded89 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungEditAction.java +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungEditAction.java @@ -26,7 +26,7 @@ import de.willuhn.jameica.gui.GUI; import de.willuhn.util.ApplicationException; -public class MitgliedskontoSollbuchungEditAction implements Action +public class SollbuchungEditAction implements Action { @Override diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoExportAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungExportAction.java similarity index 70% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoExportAction.java rename to src/de/jost_net/JVerein/gui/action/SollbuchungExportAction.java index 10e8b26ed..e6f08decf 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoExportAction.java +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungExportAction.java @@ -23,8 +23,7 @@ import de.jost_net.JVerein.gui.view.DokumentationUtil; import de.jost_net.JVerein.io.Exporter; import de.jost_net.JVerein.io.IORegistry; -import de.jost_net.JVerein.io.MitgliedskontoExport; -import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.io.SollbuchungExport; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; @@ -32,34 +31,13 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -public class MitgliedskontoExportAction implements Action +public class SollbuchungExportAction implements Action { private EXPORT_TYP exportTyp; - private Mitglied selectedMitglied; - - public MitgliedskontoExportAction(EXPORT_TYP exportTyp, Object currentObject) + public SollbuchungExportAction(EXPORT_TYP exportTyp) { - try - { - this.exportTyp = exportTyp; - if (null != currentObject) - { - if (currentObject instanceof Mitglied) - { - selectedMitglied = (Mitglied) currentObject; - } - else if (currentObject instanceof Mitgliedskonto) - { - Mitgliedskonto konto = (Mitgliedskonto) currentObject; - selectedMitglied = konto.getMitglied(); - } - } - } - catch (RemoteException e) - { - Logger.error("Export kann nicht initialisiert werden", e); - } + this.exportTyp = exportTyp; } /** @@ -87,9 +65,8 @@ public void handleAction(Object context) throws ApplicationException catch (Exception e) { Logger.error("Fehler", e); - GUI.getStatusBar().setErrorText( - - "Fehler beim exportieren der Mitgliedskonten"); + GUI.getStatusBar() + .setErrorText("Fehler beim exportieren der Sollbuchungen"); } } @@ -102,20 +79,21 @@ private void initExporter() Exporter[] exporters = IORegistry.getExporters(); for (Exporter export : exporters) { - if (export instanceof MitgliedskontoExport) + if (export instanceof SollbuchungExport) { - MitgliedskontoExport mkexport = (MitgliedskontoExport) export; - mkexport.setExportTyp(exportTyp); + SollbuchungExport sollbexport = (SollbuchungExport) export; + sollbexport.setExportTyp(exportTyp); } } } - private Object[] gibSuchGrenzen(Object context) throws ApplicationException + private Object[] gibSuchGrenzen(Object context) + throws ApplicationException, RemoteException { if (context instanceof MitgliedskontoControl) { MitgliedskontoControl control = (MitgliedskontoControl) context; - return control.getCVSExportGrenzen(selectedMitglied); + return control.getCVSExportGrenzen(); } throw new ApplicationException( "Dieser Export wurde aus dem falschen Context aufgerufen!"); @@ -123,7 +101,7 @@ private Object[] gibSuchGrenzen(Object context) throws ApplicationException public enum EXPORT_TYP { - MITGLIEDSKONTO("Mitgliedskonten"), MAHNUNGEN("Mahnungen"), RECHNUNGEN( + MITGLIEDSKONTO("Sollbuchungen"), MAHNUNGEN("Mahnungen"), RECHNUNGEN( "Rechnungen"); private final String titel; diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungLoeschenAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungLoeschenAction.java similarity index 97% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungLoeschenAction.java rename to src/de/jost_net/JVerein/gui/action/SollbuchungLoeschenAction.java index c79866ed1..690fdb3df 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungLoeschenAction.java +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungLoeschenAction.java @@ -30,7 +30,7 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -public class MitgliedskontoSollbuchungLoeschenAction implements Action +public class SollbuchungLoeschenAction implements Action { @Override diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoMahnungAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungMahnungAction.java similarity index 81% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoMahnungAction.java rename to src/de/jost_net/JVerein/gui/action/SollbuchungMahnungAction.java index 69b659292..de563093d 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoMahnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungMahnungAction.java @@ -16,12 +16,12 @@ **********************************************************************/ package de.jost_net.JVerein.gui.action; -import de.jost_net.JVerein.gui.view.MitgliedskontoMahnungView; +import de.jost_net.JVerein.gui.view.MahnungMailView; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; -public class MitgliedskontoMahnungAction implements Action +public class SollbuchungMahnungAction implements Action { @Override public void handleAction(Object context) @@ -29,16 +29,16 @@ public void handleAction(Object context) if (context != null && context instanceof Mitgliedskonto) { Mitgliedskonto mk = (Mitgliedskonto) context; - GUI.startView(MitgliedskontoMahnungView.class.getName(), mk); + GUI.startView(MahnungMailView.class.getName(), mk); } else if (context != null && context instanceof Mitgliedskonto[]) { Mitgliedskonto[] mk = (Mitgliedskonto[]) context; - GUI.startView(MitgliedskontoMahnungView.class.getName(), mk); + GUI.startView(MahnungMailView.class.getName(), mk); } else { - GUI.startView(MitgliedskontoMahnungView.class, null); + GUI.startView(MahnungMailView.class, null); } } } diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungNeuAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungNeuAction.java similarity index 93% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungNeuAction.java rename to src/de/jost_net/JVerein/gui/action/SollbuchungNeuAction.java index d0dfb0ef8..206d85750 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoSollbuchungNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungNeuAction.java @@ -27,7 +27,7 @@ import de.willuhn.jameica.gui.GUI; import de.willuhn.util.ApplicationException; -public class MitgliedskontoSollbuchungNeuAction implements Action +public class SollbuchungNeuAction implements Action { @Override @@ -38,7 +38,7 @@ public void handleAction(Object context) throws ApplicationException if (context == null || !(context instanceof MitgliedskontoNode)) { - throw new ApplicationException("Kein Mitgliedskonto ausgewählt"); + throw new ApplicationException("Keine Sollbuchung ausgewählt"); } mkn = (MitgliedskontoNode) context; diff --git a/src/de/jost_net/JVerein/gui/action/MitgliedskontoRechnungAction.java b/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungAction.java similarity index 81% rename from src/de/jost_net/JVerein/gui/action/MitgliedskontoRechnungAction.java rename to src/de/jost_net/JVerein/gui/action/SollbuchungRechnungAction.java index fa6e69e13..aa985f65e 100644 --- a/src/de/jost_net/JVerein/gui/action/MitgliedskontoRechnungAction.java +++ b/src/de/jost_net/JVerein/gui/action/SollbuchungRechnungAction.java @@ -16,12 +16,12 @@ **********************************************************************/ package de.jost_net.JVerein.gui.action; -import de.jost_net.JVerein.gui.view.MitgliedskontoRechnungView; +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 MitgliedskontoRechnungAction implements Action +public class SollbuchungRechnungAction implements Action { @Override public void handleAction(Object context) @@ -29,16 +29,16 @@ public void handleAction(Object context) if (context != null && context instanceof Mitgliedskonto) { Mitgliedskonto mk = (Mitgliedskonto) context; - GUI.startView(MitgliedskontoRechnungView.class.getName(), mk); + GUI.startView(RechnungMailView.class.getName(), mk); } else if (context != null && context instanceof Mitgliedskonto[]) { Mitgliedskonto[] mk = (Mitgliedskonto[]) context; - GUI.startView(MitgliedskontoRechnungView.class.getName(), mk); + GUI.startView(RechnungMailView.class.getName(), mk); } else { - GUI.startView(MitgliedskontoRechnungView.class, null); + GUI.startView(RechnungMailView.class, null); } } } diff --git a/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungAction.java b/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungAction.java index 7c93abbd4..8d5aa8900 100644 --- a/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungAction.java +++ b/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungAction.java @@ -156,10 +156,7 @@ private void adressaufbereitung(Mitglied m, Spendenbescheinigung spb) } adresse.add(m.getStrasse()); adresse.add(m.getPlz() + " " + m.getOrt()); - if (m.getStaat() != null && m.getStaat().length() > 0) - { - adresse.add(m.getStaat()); - } + adresse.add(m.getStaat()); switch (adresse.size()) { case 7: diff --git a/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungPrintAction.java b/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungPrintAction.java index 4bc06cb9c..d22376737 100644 --- a/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungPrintAction.java +++ b/src/de/jost_net/JVerein/gui/action/SpendenbescheinigungPrintAction.java @@ -39,6 +39,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.Variable.AllgemeineMap; import de.jost_net.JVerein.Variable.MitgliedMap; +import de.jost_net.JVerein.Variable.SpendenbescheinigungMap; import de.jost_net.JVerein.Variable.SpendenbescheinigungVar; import de.jost_net.JVerein.Variable.VarTools; import de.jost_net.JVerein.io.FileViewer; @@ -67,13 +68,13 @@ */ public class SpendenbescheinigungPrintAction implements Action { - + private Adressblatt adressblatt = Adressblatt.OHNE_ADRESSBLATT; private String fileName = null; - + private String text = null; - + private boolean open = false; private de.willuhn.jameica.system.Settings settings; @@ -109,7 +110,7 @@ public SpendenbescheinigungPrintAction(String text, Adressblatt adressblatt, boo this.text = text; this.open = open; } - + /** * Konstruktor. Über den Parameter kann festgelegt werden, ob das Standard- * oder das individuelle Dokument aufbereitet werden soll. @@ -246,9 +247,11 @@ else if (context instanceof Spendenbescheinigung[]) { Formular fo = (Formular) Einstellungen.getDBService() .createObject(Formular.class, spb.getFormular().getID()); - Map map = spb.getMap(null); + Map map = new SpendenbescheinigungMap().getMap(spb, null); map = new AllgemeineMap().getMap(map); - FormularAufbereitung fa = new FormularAufbereitung(file); + if(spb.getMitglied() != null) + map = new MitgliedMap().getMap(spb.getMitglied(), map); + FormularAufbereitung fa = new FormularAufbereitung(file, false); fa.writeForm(fo, map); if (adressblatt != Adressblatt.OHNE_ADRESSBLATT) { @@ -270,10 +273,11 @@ else if (context instanceof Spendenbescheinigung[]) fa.printAnschreiben(spb, text); } fa.closeFormular(); + fo.store(); } } String erfolg = (spbArr.length > 1) ? "Die Spendenbescheinigungen wurden erstellt und unter " + path + " gespeichert." - : "Die Spendenbescheinigung wurde erstellt und unter " + path + " gespeichert."; + : "Die Spendenbescheinigung wurde erstellt und unter " + path + " gespeichert."; GUI.getStatusBar().setSuccessText(erfolg); if (file != null && spbArr.length == 1 && open) FileViewer.show(file); @@ -299,16 +303,16 @@ else if (context instanceof Spendenbescheinigung[]) */ private void generiereSpendenbescheinigungStandardAb2014( Spendenbescheinigung spb, String fileName, Adressblatt adressblatt) - throws IOException, DocumentException + throws IOException, DocumentException { final File file = new File(fileName); FileOutputStream fos = new FileOutputStream(file); - Map map = spb.getMap(null); + Map map = new SpendenbescheinigungMap().getMap(spb, null); map = new AllgemeineMap().getMap(map); boolean isSammelbestaetigung = spb.isSammelbestaetigung(); Reporter rpt = new Reporter(fos, 80, 50, 50, 50); - + // Aussteller, kein Header rpt.addHeaderColumn("", Element.ALIGN_CENTER, 100, BaseColor.LIGHT_GRAY); rpt.createHeader(); @@ -331,7 +335,7 @@ private void generiereSpendenbescheinigungStandardAb2014( "im Sinne des § 10b des Einkommenssteuergesetzes an eine der in § 5 Abs. 1 Nr. 9 des " + "Körperschaftssteuergesetzes bezeichneten Körperschaften, Personenvereinigungen " + "oder Vermögensmassen\n", 8); - + // Name und Anschrift, kein Header rpt.addHeaderColumn("", Element.ALIGN_CENTER, 100, BaseColor.LIGHT_GRAY); rpt.createHeader(); @@ -431,7 +435,7 @@ private void generiereSpendenbescheinigungStandardAb2014( p.add(new Chunk((char) 113, FontFactory.getFont(FontFactory.ZAPFDINGBATS, 8))); // box leer p.add(" Der Zuwendende hat trotz Aufforderung keine Angaben zur Herkunft der Sachzuwendung gemacht.\n"); rpt.add(p); - + p = new Paragraph(); p.setFont(Reporter.getFreeSans(8)); p.setAlignment(Element.ALIGN_JUSTIFIED); @@ -516,14 +520,14 @@ private void generiereSpendenbescheinigungStandardAb2014( p.add(new Chunk((char) 113, FontFactory.getFont(FontFactory.ZAPFDINGBATS, 8))); // box leer p.add(txt); rpt.add(p); - + txt = " Die Einhaltung der satzungsgemäßen Voraussetzungen nach den §§ 51, 59, 60 und 61 " + "AO wurde vom Finanzamt " + Einstellungen.getEinstellung().getFinanzamt() + ", StNr. " + Einstellungen.getEinstellung().getSteuernummer() + ", mit Bescheid vom " + new JVDateFormatTTMMJJJJ() - .format(Einstellungen.getEinstellung().getBescheiddatum()) + .format(Einstellungen.getEinstellung().getBescheiddatum()) + " nach § 60a AO gesondert festgestellt. Wir fördern nach unserer Satzung " + Einstellungen.getEinstellung().getBeguenstigterzweck() + "."; p = new Paragraph(); @@ -546,13 +550,13 @@ private void generiereSpendenbescheinigungStandardAb2014( + ", StNr. " + Einstellungen.getEinstellung().getSteuernummer() + ", vom " + new JVDateFormatTTMMJJJJ() - .format(Einstellungen.getEinstellung().getBescheiddatum()) + .format(Einstellungen.getEinstellung().getBescheiddatum()) + " für den letzten Veranlagungszeitraum " + new JVDateFormatJJJJ() - .format(Einstellungen.getEinstellung().getVeranlagungVon()) + .format(Einstellungen.getEinstellung().getVeranlagungVon()) + " bis " + new JVDateFormatJJJJ() - .format(Einstellungen.getEinstellung().getVeranlagungBis()) + .format(Einstellungen.getEinstellung().getVeranlagungBis()) + " nach § 5 Abs. 1 Nr. 9 des Körperschaftsteuergesetzes von der Körperschaftsteuer und nach " + "§ 3 Nr. 6 des Gewerbesteuergesetzes von der Gewerbesteuer befreit.\n "; Paragraph p = new Paragraph(); @@ -580,9 +584,9 @@ private void generiereSpendenbescheinigungStandardAb2014( p.add(new Chunk((char) 113, FontFactory.getFont(FontFactory.ZAPFDINGBATS, 8))); // box leer p.add(txt); rpt.add(p); - + } - + // Rahmen über Unterschrift PdfPCell cell = new PdfPCell(); Paragraph p = new Paragraph(); @@ -605,7 +609,7 @@ private void generiereSpendenbescheinigungStandardAb2014( "Nur für steuerbegünstigte Einrichtungen, bei denen die Mitgliedsbeiträge " + "steuerlich nicht abziehbar sind:\n")); cell.addElement(p); - + p = new Paragraph(); p.setFont(Reporter.getFreeSans(8)); p.setAlignment(Element.ALIGN_JUSTIFIED); @@ -642,8 +646,15 @@ private void generiereSpendenbescheinigungStandardAb2014( 8); } - if (Einstellungen.getEinstellung().getUnterschriftdrucken() && - Einstellungen.getEinstellung().getUnterschrift() != null) + boolean unterschriftDrucken = false; + if (Einstellungen.getEinstellung().getUnterschriftdrucken() + && Einstellungen.getEinstellung().getUnterschrift() != null + && spb.isEchteGeldspende()) + { + unterschriftDrucken = true; + } + + if (unterschriftDrucken) { rpt.add("\n", 8); rpt.add(Einstellungen.getEinstellung().getUnterschrift(), 400, 55, 0); @@ -655,13 +666,20 @@ private void generiereSpendenbescheinigungStandardAb2014( rpt.add( "\n" + Einstellungen.getEinstellung().getOrt() + ", " + new JVDateFormatTTMMJJJJ().format(spb.getBescheinigungsdatum()), - 9); - + 9); + rpt.addLight( - "..............................................................................." - + "...............................................................................\n" - + "(Ort, Datum und Unterschrift des Zuwendungsempfängers)", - 8); + "..............................................................................." + + "...............................................................................\n" + + "(Ort, Datum und Unterschrift des Zuwendungsempfängers)", + 8); + + if (unterschriftDrucken) + { + rpt.addLight("\nDie maschinelle Erstellung der Zuwendungsbestätigung wurde dem " + + "zuständigen Finanzamt " + Einstellungen.getEinstellung().getFinanzamt() + + " angezeigt.", 8); + } rpt.add("\nHinweis:", 8); rpt.addLight( @@ -675,7 +693,7 @@ private void generiereSpendenbescheinigungStandardAb2014( + "bzw. das Datum der Feststellung der Einhaltung der satzungsmäßigen Voraussetzungen " + "nach § 60a Abs. 1 AO länger als 3 Jahre seit Ausstellung des Bescheides zurückliegt " + "(§ 63 Abs. 5 AO).", - 7); + 7); /* Es sind mehrere Spenden für diese Spendenbescheinigung vorhanden */ if (isSammelbestaetigung) @@ -746,14 +764,14 @@ private void generiereSpendenbescheinigungStandardAb2014( rpt.closeTable(); } - + if (adressblatt != Adressblatt.OHNE_ADRESSBLATT) { // Neue Seite für Anschrift in Fenster in querem Brief // oder für Anschreiben rpt.newPage(); } - + if (adressblatt == Adressblatt.MIT_ADRESSE || adressblatt == Adressblatt.MIT_ADRESSE_ANSCHREIBEN) { @@ -762,7 +780,7 @@ private void generiereSpendenbescheinigungStandardAb2014( rpt.addUnderline(getAussteller(),8); rpt.addLight((String) map.get(SpendenbescheinigungVar.EMPFAENGER.getName()),10); } - + if (adressblatt == Adressblatt.MIT_ANSCHREIBEN || adressblatt == Adressblatt.MIT_ADRESSE_ANSCHREIBEN) { @@ -788,7 +806,7 @@ private void generiereSpendenbescheinigungStandardAb2014( rpt.addLight(text, 10); } } - + rpt.close(); fos.close(); } diff --git a/src/de/jost_net/JVerein/gui/action/SplitBuchungAction.java b/src/de/jost_net/JVerein/gui/action/SplitBuchungAction.java index 1e615748f..9d30b08a1 100644 --- a/src/de/jost_net/JVerein/gui/action/SplitBuchungAction.java +++ b/src/de/jost_net/JVerein/gui/action/SplitBuchungAction.java @@ -23,6 +23,7 @@ import de.jost_net.JVerein.keys.SplitbuchungTyp; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Jahresabschluss; +import de.jost_net.JVerein.rmi.Spendenbescheinigung; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; @@ -73,6 +74,12 @@ public void handleAction(Object context) throws ApplicationException "Buchung wurde bereits am %s von %s abgeschlossen.", new JVDateFormatTTMMJJJJ().format(ja.getDatum()), ja.getName())); } + Spendenbescheinigung spb = bu.getSpendenbescheinigung(); + if(spb != null) + { + throw new ApplicationException( + "Buchung kann nicht bearbeitet werden. Sie ist einer Spendenbescheinigung zugeordnet."); + } if (bu.getBuchungsart() == null) { throw new ApplicationException( diff --git a/src/de/jost_net/JVerein/gui/action/SplitBuchungDetailAction.java b/src/de/jost_net/JVerein/gui/action/SplitBuchungDetailAction.java index 385a68d2d..075f5fd5b 100644 --- a/src/de/jost_net/JVerein/gui/action/SplitBuchungDetailAction.java +++ b/src/de/jost_net/JVerein/gui/action/SplitBuchungDetailAction.java @@ -17,7 +17,7 @@ package de.jost_net.JVerein.gui.action; import de.jost_net.JVerein.gui.control.BuchungsControl; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.gui.dialogs.SplitBuchungDialog; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; @@ -39,7 +39,7 @@ public SplitBuchungDetailAction(BuchungsControl control, AbstractView view) @Override public void handleAction(Object context) throws ApplicationException { - BuchungsControl bc = new BuchungsControl(view, Kontenart.GELDKONTO); + BuchungsControl bc = new BuchungsControl(view, Kontenfilter.GELDKONTO); SplitBuchungDialog spd = new SplitBuchungDialog(bc, view); try { diff --git a/src/de/jost_net/JVerein/gui/action/SplitbuchungBulkAufloesenAction.java b/src/de/jost_net/JVerein/gui/action/SplitbuchungBulkAufloesenAction.java index 7b7270945..49af3b7ef 100644 --- a/src/de/jost_net/JVerein/gui/action/SplitbuchungBulkAufloesenAction.java +++ b/src/de/jost_net/JVerein/gui/action/SplitbuchungBulkAufloesenAction.java @@ -26,6 +26,7 @@ import de.jost_net.JVerein.io.SplitbuchungsContainer; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Jahresabschluss; +import de.jost_net.JVerein.rmi.Spendenbescheinigung; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.datasource.rmi.DBService; import de.willuhn.datasource.rmi.ResultSetExtractor; @@ -157,6 +158,12 @@ public Object extract(ResultSet rs) "Buchung wurde bereits am %s von %s abgeschlossen.", new JVDateFormatTTMMJJJJ().format(ja.getDatum()), ja.getName())); } + Spendenbescheinigung spb = bu.getSpendenbescheinigung(); + if(spb != null) + { + throw new ApplicationException( + "Buchung kann nicht bearbeitet werden. Sie ist einer Spendenbescheinigung zugeordnet."); + } splitid = bu.getSplitId(); if (!geloescht.contains(splitid)) { diff --git a/src/de/jost_net/JVerein/gui/action/SplitbuchungNeuAction.java b/src/de/jost_net/JVerein/gui/action/SplitbuchungNeuAction.java index 6850191d3..699f04e71 100644 --- a/src/de/jost_net/JVerein/gui/action/SplitbuchungNeuAction.java +++ b/src/de/jost_net/JVerein/gui/action/SplitbuchungNeuAction.java @@ -48,7 +48,8 @@ public void handleAction(Object context) buch.setSplitId(Long.valueOf(master.getID())); buch.setUmsatzid(master.getUmsatzid()); buch.setZweck(master.getZweck()); - buch.setBuchungsart(Long.parseLong(master.getBuchungsart().getID())); + buch.setBuchungsartId(master.getBuchungsartId()); + buch.setBuchungsklasseId(master.getBuchungsklasseId()); buch.setSpeicherung(false); buch.setSplitTyp(SplitbuchungTyp.SPLIT); buch.setBetrag(SplitbuchungsContainer.getSumme(SplitbuchungTyp.HAUPT).doubleValue() - SplitbuchungsContainer.getSumme(SplitbuchungTyp.SPLIT).doubleValue()); diff --git a/src/de/jost_net/JVerein/gui/action/ZusatzbetragVorlageAuswahlAction.java b/src/de/jost_net/JVerein/gui/action/ZusatzbetragVorlageAuswahlAction.java index 856538ac6..7378e90c5 100644 --- a/src/de/jost_net/JVerein/gui/action/ZusatzbetragVorlageAuswahlAction.java +++ b/src/de/jost_net/JVerein/gui/action/ZusatzbetragVorlageAuswahlAction.java @@ -1,16 +1,16 @@ /********************************************************************** * 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 + * 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 + * 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, + * 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 **********************************************************************/ @@ -19,6 +19,7 @@ import de.jost_net.JVerein.gui.dialogs.ZusatzbetragVorlageDialog; import de.jost_net.JVerein.gui.parts.ZusatzbetragPart; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.ZusatzbetragVorlage; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; @@ -52,7 +53,9 @@ public void handleAction(Object context) throws ApplicationException part.getIntervall().setValue(zbv.getIntervall()); part.getBuchungsart().setValue(zbv.getBuchungsart()); if (part.isBuchungsklasseActive()) + { part.getBuchungsklasse().setValue(zbv.getBuchungsklasse()); + } for (Object obj : part.getIntervall().getList()) { IntervallZusatzzahlung ivz = (IntervallZusatzzahlung) obj; @@ -62,6 +65,14 @@ public void handleAction(Object context) throws ApplicationException break; } } + if (zbv.getZahlungsweg().getKey() == Zahlungsweg.STANDARD) + { + part.getZahlungsweg().setValue(null); + } + else + { + part.getZahlungsweg().setValue(zbv.getZahlungsweg()); + } part.getStartdatum(false).setValue(zbv.getStartdatum()); } } @@ -72,8 +83,8 @@ public void handleAction(Object context) throws ApplicationException catch (Exception e) { Logger.error("Fehler", e); - GUI.getStatusBar().setErrorText( - "Fehler bei der Zusatzbeitrag Vorlagen Auswahl"); + GUI.getStatusBar() + .setErrorText("Fehler bei der Zusatzbeitrag Vorlagen Auswahl"); } } } diff --git a/src/de/jost_net/JVerein/gui/boxes/MitgliedNextBGruppeChecker.java b/src/de/jost_net/JVerein/gui/boxes/MitgliedNextBGruppeChecker.java index bc9860d3d..0c1332583 100644 --- a/src/de/jost_net/JVerein/gui/boxes/MitgliedNextBGruppeChecker.java +++ b/src/de/jost_net/JVerein/gui/boxes/MitgliedNextBGruppeChecker.java @@ -19,6 +19,8 @@ import java.rmi.RemoteException; import java.util.List; +import de.willuhn.jameica.gui.parts.Button; +import de.willuhn.jameica.gui.parts.ButtonArea; import org.eclipse.swt.widgets.Composite; import de.jost_net.JVerein.Einstellungen; @@ -133,7 +135,10 @@ public void paint(Composite parent) throws RemoteException LabelGroup labelGroup = new LabelGroup(parent, "Mitgliederdaten wollen angepasst werden:", true); labelGroup.addPart(getListeZuAendern()); - + ButtonArea buttonArea = new ButtonArea(); + buttonArea.addButton(new Button("Alle Änderungen durchführen", + new AlleAenderungenDurchfuehrenAction(), null, false, "ok.png")); + labelGroup.addButtonArea(buttonArea); } private TablePart getListeZuAendern() throws RemoteException @@ -169,6 +174,7 @@ private void listeAktuallisieren() throws RemoteException aenderungsListenPart.addItem(mitgliedBeitraege); datenVorhanden = true; } + aenderungsListenPart.sort(); this.isAktiv = datenVorhanden; } diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java index 4e4caafd5..c8126de00 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungSEPAControl.java @@ -47,10 +47,8 @@ import de.willuhn.jameica.gui.input.SelectInput; import de.willuhn.jameica.gui.input.TextInput; import de.willuhn.jameica.gui.parts.Button; -import de.willuhn.jameica.hbci.gui.dialogs.PainVersionDialog; 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; @@ -206,7 +204,7 @@ public TextInput getZahlungsgrund() } String zgrund = settings.getString("zahlungsgrund", "bitte eingeben"); - zahlungsgrund = new TextInput(zgrund, 50); + zahlungsgrund = new TextInput(zgrund, 140); return zahlungsgrund; } @@ -361,30 +359,14 @@ private void doAbrechnung() throws ApplicationException, RemoteException String file = fd.open(); if (file == null || file.length() == 0) { - throw new ApplicationException("keine Datei ausgewählt!"); + throw new ApplicationException("Keine Datei ausgewählt!"); } sepafilercur = new File(file); // Wir merken uns noch das Verzeichnis fürs nächste mal settings.setAttribute("lastdir.sepa", sepafilercur.getParent()); try { - if (Einstellungen.getEinstellung().getSepaVersion() != null) - { - sepaVersion = Einstellungen.getEinstellung().getSepaVersion(); - } - else - { - PainVersionDialog d = new PainVersionDialog(org.kapott.hbci.sepa.SepaVersion.Type.PAIN_008); - sepaVersion = (SepaVersion) d.open(); - if (sepaVersion == null) - { - return; - } - } - } - catch (OperationCanceledException oce) - { - throw oce; + sepaVersion = Einstellungen.getEinstellung().getSepaVersion(); } catch (Exception e) { diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java index 5038f493a..59cfa514c 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufBuchungenControl.java @@ -190,6 +190,7 @@ public Part getSollbuchungsList() throws RemoteException { SollbuchungsList.addItem(it.next()); } + SollbuchungsList.sort(); } return SollbuchungsList; } diff --git a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java index 20eea73b0..921401355 100644 --- a/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java +++ b/src/de/jost_net/JVerein/gui/control/AbrechnungslaufControl.java @@ -346,7 +346,7 @@ public void handleStore() } } - public Part getAbrechungslaeufeList() throws RemoteException + public Part getAbrechnungslaeufeList() throws RemoteException { DBService service = Einstellungen.getDBService(); DBIterator abrechnungslaeufe = service @@ -397,6 +397,7 @@ public Part getAbrechungslaeufeList() throws RemoteException { abrechnungslaufList.addItem(abrechnungslaeufe.next()); } + abrechnungslaufList.sort(); } return abrechnungslaufList; } @@ -409,7 +410,7 @@ public void TabRefresh() } try { - getAbrechungslaeufeList(); + getAbrechnungslaeufeList(); } catch (RemoteException e1) { diff --git a/src/de/jost_net/JVerein/gui/control/AnfangsbestandControl.java b/src/de/jost_net/JVerein/gui/control/AnfangsbestandControl.java index 77efa00d0..9635f2f9a 100644 --- a/src/de/jost_net/JVerein/gui/control/AnfangsbestandControl.java +++ b/src/de/jost_net/JVerein/gui/control/AnfangsbestandControl.java @@ -180,6 +180,7 @@ public void TabRefresh() { anfangsbestandList.addItem(anfangsbestaende.next()); } + anfangsbestandList.sort(); } catch (RemoteException e1) { diff --git a/src/de/jost_net/JVerein/gui/control/ArbeitseinsatzControl.java b/src/de/jost_net/JVerein/gui/control/ArbeitseinsatzControl.java index 7d2e4d7a3..f07d7abad 100644 --- a/src/de/jost_net/JVerein/gui/control/ArbeitseinsatzControl.java +++ b/src/de/jost_net/JVerein/gui/control/ArbeitseinsatzControl.java @@ -542,6 +542,7 @@ public Part getArbeitseinsatzUeberpruefungList() throws ApplicationException { arbeitseinsatzueberpruefungList.addItem(az); } + arbeitseinsatzueberpruefungList.sort(); } } catch (RemoteException e) @@ -615,6 +616,7 @@ public void TabRefresh() { arbeitseinsatzList.addItem(arbeitseinsaetze.next()); } + arbeitseinsatzList.sort(); } catch (RemoteException e1) { diff --git a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java index 680bb3883..5c9716122 100644 --- a/src/de/jost_net/JVerein/gui/control/BuchungsControl.java +++ b/src/de/jost_net/JVerein/gui/control/BuchungsControl.java @@ -51,23 +51,24 @@ 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; import de.jost_net.JVerein.gui.parts.SplitbuchungListTablePart; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.jost_net.JVerein.gui.util.AfaUtil; import de.jost_net.JVerein.io.BuchungAuswertungCSV; import de.jost_net.JVerein.io.BuchungAuswertungPDF; 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; @@ -79,6 +80,7 @@ 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; import de.jost_net.JVerein.util.Dateiname; import de.jost_net.JVerein.util.Datum; import de.jost_net.JVerein.util.Geschaeftsjahr; @@ -206,13 +208,13 @@ public class BuchungsControl extends AbstractControl protected String settingsprefix = "geldkonto."; - private Kontenart kontoart = Kontenart.ALLE; + private Kontenfilter kontenfilter = Kontenfilter.ALLE; private boolean geldkonto = true; - public enum Kontenart + public enum Kontenfilter { - GELDKONTO, + GELDKONTO, // Beinhaltet Rückstellungen ANLAGEKONTO, ALLE } @@ -224,13 +226,13 @@ private enum RANGE MONAT, TAG } - public BuchungsControl(AbstractView view, Kontenart kontoart) + public BuchungsControl(AbstractView view, Kontenfilter kontenfilter) { super(view); settings = new de.willuhn.jameica.system.Settings(this.getClass()); settings.setStoreWhenRead(true); - this.kontoart = kontoart; - if (kontoart == Kontenart.ANLAGEKONTO) + this.kontenfilter = kontenfilter; + if (kontenfilter == Kontenfilter.ANLAGEKONTO) { geldkonto = false; settingsprefix = "anlagenkonto."; @@ -254,7 +256,7 @@ public Buchung getBuchung() throws RemoteException public void fillBuchung(Buchung b) throws ApplicationException, RemoteException { - b.setBuchungsart(getSelectedBuchungsArtId()); + b.setBuchungsartId(getSelectedBuchungsArtId()); b.setBuchungsklasseId(getSelectedBuchungsKlasseId()); b.setProjektID(getSelectedProjektId()); b.setKonto(getSelectedKonto()); @@ -289,27 +291,42 @@ public ArrayList getDependentBuchungen() throws RemoteException { return dependent_buchungen; } - + boolean isSteuerBuchung = false; // Falls noch nichts erzeugt wurde, neue Liste erzeugen und DependencyId setzen! dependent_buchungen = new ArrayList(); - if (getBuchung().getDependencyId() == -1) { + if (getBuchung().getDependencyId() == -1) + { Buchung new_dependent_buchung = (Buchung) Einstellungen.getDBService() - .createObject(Buchung.class, null); + .createObject(Buchung.class, null); getBuchung().setDependencyId(SplitbuchungsContainer.getNewDependencyId()); new_dependent_buchung.setDependencyId(getBuchung().getDependencyId()); dependent_buchungen.add(new_dependent_buchung); } // Falls DependencyId vorhanden ist, alle anderen Elemente mit gleicher Id raussuchen - else { + // Ein Container wird nicht für die Steuerbuchungen generiert, sonst werden zugehörige + // Buchungen gelöscht + else + { int pos_b = SplitbuchungsContainer.get().indexOf(getBuchung()); - for (Buchung b_tmp : SplitbuchungsContainer.get()) { + Double buchungBetrag = Math.abs(getBuchung().getBetrag()); + for (Buchung b_tmp : SplitbuchungsContainer.get()) + { if (b_tmp.getDependencyId() == getBuchung().getDependencyId() && - SplitbuchungsContainer.get().indexOf(b_tmp) != pos_b) { + SplitbuchungsContainer.get().indexOf(b_tmp) != pos_b) + { + if (Math.abs(b_tmp.getBetrag()) > buchungBetrag) + { + // Das ist eine Steuerbuchung + isSteuerBuchung = true; + dependent_buchungen = new ArrayList(); + break; + } dependent_buchungen.add(b_tmp); } } } - if (dependent_buchungen.size() == 0) { + if (dependent_buchungen.size() == 0 && !isSteuerBuchung) + { throw new RemoteException("Buchungen mit Id " + getBuchung().getDependencyId() + " konnten nicht gefunden werden!"); } return dependent_buchungen; @@ -350,7 +367,7 @@ public DialogInput getKonto(boolean withFocus) throws RemoteException } String kontoid = getVorauswahlKontoId(); konto = new KontoauswahlInput(getBuchung().getKonto()) - .getKontoAuswahl(false, kontoid, false, true, kontoart); + .getKontoAuswahl(false, kontoid, false, true, kontenfilter); if (withFocus) { konto.focus(); @@ -672,7 +689,7 @@ public DialogInput getSuchKonto() throws RemoteException } String kontoid = settings.getString(settingsprefix + "suchkontoid", ""); suchkonto = new KontoauswahlInput().getKontoAuswahl(true, kontoid, false, - true, kontoart); + true, kontenfilter); suchkonto.addListener(new FilterListener()); return suchkonto; } @@ -700,7 +717,7 @@ public void handleAction(Object context) b.setAuszugsnummer(master.getAuszugsnummer()); b.setBetrag(ssub.getBetrag() * -1); b.setBlattnummer(master.getBlattnummer()); - b.setBuchungsart(master.getBuchungsartId()); + b.setBuchungsartId(master.getBuchungsartId()); b.setBuchungsklasseId(master.getBuchungsklasseId()); b.setDatum(su.getAusfuehrungsdatum()); b.setKonto(master.getKonto()); @@ -966,7 +983,9 @@ private void handleStore() throws ApplicationException { b.plausi(); Buchungsart b_art = b.getBuchungsart(); - if (b_art.getSteuersatz() > 0) { + // Keine Steuer Buchungen erzeugen beim Speichern einer Haupt- bzw. Gegenbuchung + if (b.getSplitTyp() == SplitbuchungTyp.SPLIT && b_art.getSteuersatz() > 0) + { Buchung b_steuer = getDependentBuchungen().get(0); fillBuchung(b_steuer); @@ -986,7 +1005,8 @@ private void handleStore() throws ApplicationException break; } - b_steuer.setBuchungsart(Long.valueOf(b_art.getSteuerBuchungsart().getID())); + 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.setSplitId(b.getSplitId()); @@ -995,10 +1015,12 @@ private void handleStore() throws ApplicationException SplitbuchungsContainer.add(b); SplitbuchungsContainer.add(b_steuer); } - else { + else + { // Falls vorher abhängige Buchungen erzeugt wurden, nun dies aber durch ändern der Buchungsart o.ä. aufgehoben wird, // alle abhängigen Buchungen löschen und Abhängigkeit resetten - if (b.getDependencyId() != -1) { + if (b.getDependencyId() != -1 && getDependentBuchungen().size() > 0) + { for (Buchung b_tmp : getDependentBuchungen()) { b_tmp.setDependencyId(-1); b_tmp.setDelete(true); @@ -1098,6 +1120,11 @@ private Konto getSelectedKonto() throws ApplicationException try { Konto konto = (Konto) getKonto(false).getValue(); + if (konto == null) + { + throw new ApplicationException( + "Kein Konto Ausgewählt. Ggfs. erst unter Buchführung->Konten ein Konto anlegen."); + } settings.setAttribute(settingsprefix + "kontoid", konto.getID()); return konto; } @@ -1219,6 +1246,7 @@ public Part getBuchungsList() throws RemoteException } settings.setAttribute(settingsprefix + "suchtext", (String) getSuchtext().getValue()); settings.setAttribute(settingsprefix + "suchbetrag", (String) getSuchBetrag().getValue()); + settings.setAttribute(settingsprefix + "mitglied", (String) getMitglied().getValue()); query = new BuchungQuery(dv, db, k, b, p, (String) getSuchtext().getValue(), (String) getSuchBetrag().getValue(), m.getValue(), @@ -1451,6 +1479,7 @@ public void refreshSplitbuchungen() throws RemoteException { splitbuchungsList.addItem(b); } + splitbuchungsList.sort(); } private void starteAuswertung(boolean einzelbuchungen) @@ -1785,6 +1814,13 @@ public boolean isBuchungAbgeschlossen() throws ApplicationException new JVDateFormatTTMMJJJJ().format(ja.getDatum()), ja.getName())); return true; } + Spendenbescheinigung spb = getBuchung().getSpendenbescheinigung(); + if(spb != null) + { + GUI.getStatusBar().setErrorText( + "Buchung kann nicht bearbeitet werden. Sie ist einer Spendenbescheinigung zugeordnet."); + return true; + } } } catch (RemoteException e) @@ -1815,6 +1851,13 @@ public boolean isSplitBuchungAbgeschlossen() throws ApplicationException new JVDateFormatTTMMJJJJ().format(ja.getDatum()), ja.getName())); return true; } + Spendenbescheinigung spb = getBuchung().getSpendenbescheinigung(); + if(spb != null) + { + GUI.getStatusBar().setErrorText( + "Buchung kann nicht bearbeitet werden. Sie ist einer Spendenbescheinigung zugeordnet."); + return true; + } } } } @@ -2180,9 +2223,9 @@ public String getSettingsPrefix() return settingsprefix; } - public Button getZurueckButton() + public ToolTipButton getZurueckButton() { - return new Button("", new Action() + return new ToolTipButton("", new Action() { @Override public void handleAction(Object context) throws ApplicationException @@ -2225,9 +2268,9 @@ public void handleAction(Object context) throws ApplicationException }, null, false, "go-previous.png"); } - public Button getVorButton() + public ToolTipButton getVorButton() { - return new Button("", new Action() + return new ToolTipButton("", new Action() { @Override public void handleAction(Object context) throws ApplicationException diff --git a/src/de/jost_net/JVerein/gui/control/BuchungsartControl.java b/src/de/jost_net/JVerein/gui/control/BuchungsartControl.java index 9dcde9e77..a2ca768fd 100644 --- a/src/de/jost_net/JVerein/gui/control/BuchungsartControl.java +++ b/src/de/jost_net/JVerein/gui/control/BuchungsartControl.java @@ -47,7 +47,6 @@ import de.willuhn.datasource.pseudo.PseudoIterator; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBService; -import de.willuhn.jameica.gui.AbstractControl; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; @@ -68,10 +67,8 @@ import de.willuhn.util.ApplicationException; import de.willuhn.util.ProgressMonitor; -public class BuchungsartControl extends AbstractControl +public class BuchungsartControl extends FilterControl { - private de.willuhn.jameica.system.Settings settings; - private TablePart buchungsartList; private IntegerInput nummer; @@ -83,20 +80,17 @@ public class BuchungsartControl extends AbstractControl private SelectInput buchungsklasse; private CheckboxInput spende; - + private CheckboxInput abschreibung; private SelectInput steuersatz; - - private SelectInput steuer_buchungsart; - private TextInput suchtext; + private SelectInput steuer_buchungsart; private Buchungsart buchungsart; - + private SelectInput status; - - private SelectInput suchstatus; + public BuchungsartControl(AbstractView view) { @@ -160,44 +154,6 @@ public SelectInput getStatus() throws RemoteException new StatusBuchungsart(getBuchungsart().getStatus())); return status; } - - public SelectInput getSuchStatus() throws RemoteException - { - if (suchstatus != null) - { - return suchstatus; - } - suchstatus = new SelectInput( - new String[] { "Alle", "Ohne Deaktiviert" }, - settings.getString("suchstatus", "Alle")); - suchstatus.addListener(new FilterListener()); - return suchstatus; - } - - public class FilterListener implements Listener - { - - FilterListener() - { - } - - @Override - public void handleEvent(Event event) - { - if (event.type != SWT.Selection && event.type != SWT.FocusOut) - { - return; - } - try - { - getBuchungsartList(); - } - catch (RemoteException e) - { - GUI.getStatusBar().setErrorText(e.getMessage()); - } - } - } public CheckboxInput getSpende() throws RemoteException { @@ -468,7 +424,7 @@ public void handleStore() b.setSteuersatz(steuersatzValue); if (steuer_buchungsart.getValue() instanceof Buchungsart) { - b.setSteuerBuchungsart(Integer.parseInt(((Buchungsart) steuer_buchungsart.getValue()).getID())); + b.setSteuerBuchungsart(Long.parseLong(((Buchungsart) steuer_buchungsart.getValue()).getID())); } else { @@ -495,66 +451,11 @@ public void handleStore() } } - public TextInput getSuchtext() - { - if (suchtext != null) - { - return suchtext; - } - suchtext = new TextInput(settings.getString("suchtext", ""), 35); - return suchtext; - } - - @SuppressWarnings("unchecked") public Part getBuchungsartList() throws RemoteException { - - if (suchstatus != null) - { - String tmp = (String) suchstatus.getValue(); - if (tmp != null) - { - settings.setAttribute("suchstatus", tmp); - } - else - { - settings.setAttribute("suchstatus", ""); - } - } - - if (suchtext != null) - { - String tmp = (String) suchtext.getValue(); - if (tmp != null) - { - settings.setAttribute("suchtext", tmp); - } - else - { - settings.setAttribute("suchtext", ""); - } - } - - DBService service = Einstellungen.getDBService(); - DBIterator buchungsarten = service - .createList(Buchungsart.class); - buchungsarten.addFilter("nummer >= 0"); - if (suchstatus != null && - suchstatus.getValue().toString().equalsIgnoreCase("Ohne Deaktiviert")) - buchungsarten.addFilter("status != ?", new Object[] { StatusBuchungsart.INACTIVE }); - if (!getSuchtext().getValue().equals("")) - { - String text = "%" + ((String) getSuchtext().getValue()).toUpperCase() - + "%"; - buchungsarten.addFilter("(UPPER(bezeichnung) like ? or nummer like ?)", - new Object[] { text, text }); - } - buchungsarten.setOrder("ORDER BY nummer"); - if (buchungsartList == null) { - - buchungsartList = new TablePart(buchungsarten, new BuchungsartAction()); + buchungsartList = new TablePart(getBuchungsarten(), new BuchungsartAction()); buchungsartList.addColumn("Nummer", "nummer"); buchungsartList.addColumn("Bezeichnung", "bezeichnung"); buchungsartList.addColumn("Art", "art", new Formatter() @@ -622,20 +523,67 @@ public String format(Object o) else { buchungsartList.removeAll(); - - for (Buchungsart bu : (List) PseudoIterator - .asList(buchungsarten)) + DBIterator buchungsarten = getBuchungsarten(); + while (buchungsarten.hasNext()) { - buchungsartList.addItem(bu); + buchungsartList.addItem(buchungsarten.next()); } buchungsartList.sort(); } return buchungsartList; } + private DBIterator getBuchungsarten() throws RemoteException + { + DBService service = Einstellungen.getDBService(); + DBIterator buchungsarten = service + .createList(Buchungsart.class); + + if (isSuchStatusAktiv() && + getSuchStatus().getValue().toString().equalsIgnoreCase("Ohne Deaktiviert")) + buchungsarten.addFilter("status != ?", new Object[] { StatusBuchungsart.INACTIVE }); + if (isSuchnameAktiv() && !getSuchname().getValue().equals("")) + { + String text = "%" + ((String) getSuchname().getValue()).toUpperCase() + + "%"; + buchungsarten.addFilter("nummer like ?", new Object[] { text }); + } + if (isSuchtextAktiv() && !getSuchtext().getValue().equals("")) + { + String text = "%" + ((String) getSuchtext().getValue()).toUpperCase() + + "%"; + buchungsarten.addFilter("UPPER(bezeichnung) like ?", + new Object[] { text }); + } + if (isSuchBuchungsartArtAktiv() && getSuchBuchungsartArt().getValue() != null) + { + ArtBuchungsart art = (ArtBuchungsart) getSuchBuchungsartArt().getValue(); + buchungsarten.addFilter("art = ?", new Object[] { art.getKey() }); + } + if (isSuchBuchungsklasseAktiv() && getSuchBuchungsklasse().getValue() != null) + { + Buchungsklasse tmp = (Buchungsklasse) getSuchBuchungsklasse().getValue(); + buchungsarten.addFilter("buchungsklasse = ?", new Object[] { tmp.getID() }); + } + buchungsarten.setOrder("ORDER BY nummer"); + return buchungsarten; + } + + public void TabRefresh() + { + try + { + getBuchungsartList(); + } + catch (RemoteException e) + { + // + } + } + public Button getPDFAusgabeButton() { - Button b = new Button("PDF-Ausgabe", new Action() + Button b = new Button("PDF", new Action() { @Override public void handleAction(Object context) throws ApplicationException @@ -679,12 +627,7 @@ private void starteAuswertung() throws RemoteException s = s + ".pdf"; } final File file = new File(s); - final DBIterator it = Einstellungen.getDBService() - .createList(Buchungsart.class); - if (suchstatus != null && - suchstatus.getValue().toString().equalsIgnoreCase("Ohne Deaktiviert")) - it.addFilter("status != ?", new Object[] { StatusBuchungsart.INACTIVE }); - it.setOrder("ORDER BY nummer"); + final DBIterator it = getBuchungsarten(); settings.setAttribute("lastdir", file.getParent()); BackgroundTask t = new BackgroundTask() { diff --git a/src/de/jost_net/JVerein/gui/control/BuchungsuebernahmeControl.java b/src/de/jost_net/JVerein/gui/control/BuchungsuebernahmeControl.java index a1c4e3748..52a9967be 100644 --- a/src/de/jost_net/JVerein/gui/control/BuchungsuebernahmeControl.java +++ b/src/de/jost_net/JVerein/gui/control/BuchungsuebernahmeControl.java @@ -23,46 +23,18 @@ import java.util.List; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.io.Buchungsuebernahme; import de.jost_net.JVerein.rmi.Konto; 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.Action; -import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.TablePart; -import de.willuhn.jameica.system.Settings; import de.willuhn.logging.Logger; -public class BuchungsuebernahmeControl extends AbstractControl +public class BuchungsuebernahmeControl { - private Settings settings = null; - private TablePart kontenlist = null; - public BuchungsuebernahmeControl(AbstractView view) - { - super(view); - settings = new Settings(this.getClass()); - settings.setStoreWhenRead(true); - } - - public Button getStartButton() - { - Button button = new Button("Starten", new Action() - { - @Override - public void handleAction(Object context) - { - new Buchungsuebernahme(); - } - }, null, true, "walking.png"); - return button; - } - public TablePart getKontenList() throws RemoteException { List ueko = new ArrayList<>(); diff --git a/src/de/jost_net/JVerein/gui/control/DbBereinigenControl.java b/src/de/jost_net/JVerein/gui/control/DbBereinigenControl.java index 13d28fe28..607627557 100644 --- a/src/de/jost_net/JVerein/gui/control/DbBereinigenControl.java +++ b/src/de/jost_net/JVerein/gui/control/DbBereinigenControl.java @@ -30,10 +30,12 @@ import de.jost_net.JVerein.rmi.Jahresabschluss; import de.jost_net.JVerein.rmi.Lastschrift; import de.jost_net.JVerein.rmi.Mail; +import de.jost_net.JVerein.rmi.Rechnung; import de.jost_net.JVerein.rmi.Spendenbescheinigung; import de.jost_net.JVerein.util.Datum; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBService; +import de.willuhn.datasource.rmi.ObjectNotFoundException; import de.willuhn.datasource.rmi.ResultSetExtractor; import de.willuhn.jameica.gui.AbstractControl; import de.willuhn.jameica.gui.AbstractView; @@ -52,15 +54,19 @@ public class DbBereinigenControl extends AbstractControl { private Settings settings = null; - + Date defaultDate = null; - - private double anzahl = 6.0d; - + + private double anzahl = 7.0d; + + // Rechnungen loeschen + private CheckboxInput rLoeschenInput = null; + private DateInput rDateInput = null; + // Spendenbescheinigungen loeschen private CheckboxInput sLoeschenInput = null; private DateInput sDateInput = null; - + // Buchungen loeschen private CheckboxInput bLoeschenInput = null; private DateInput bDateInput = null; @@ -69,15 +75,15 @@ public class DbBereinigenControl extends AbstractControl // Lastschriften loeschen private CheckboxInput lLoeschenInput = null; private DateInput lDateInput = null; - + // Abrechnungslauf loeschen private CheckboxInput aLoeschenInput = null; private DateInput aDateInput = null; - + // Jahresabschluss loeschen private CheckboxInput jLoeschenInput = null; private DateInput jDateInput = null; - + // Mails loeschen private CheckboxInput mLoeschenInput = null; private DateInput mDateInput = null; @@ -107,6 +113,7 @@ public void handleAction(Object context) try { runDelete( + (boolean) rLoeschenInput.getValue(), (Date) rDateInput.getValue(), (boolean) sLoeschenInput.getValue(), (Date) sDateInput.getValue(), (boolean) bLoeschenInput.getValue(), (Date) bDateInput.getValue(), (boolean) sollLoeschenInput.getValue(), @@ -125,8 +132,10 @@ public void handleAction(Object context) return b; } - - private void runDelete(final boolean sloeschen, final Date sdate, + + private void runDelete( + final boolean rloeschen, final Date rdate, + final boolean sloeschen, final Date sdate, final boolean bloeschen, final Date bdate, final boolean sollloeschen, final boolean lloeschen, final Date ldate, final boolean aloeschen, final Date adate, @@ -143,7 +152,19 @@ public void run(ProgressMonitor monitor) monitor.setStatus(ProgressMonitor.STATUS_RUNNING); monitor.setPercentComplete(0); double progress = 1.0d; - + + // Rechnungen löschen + if ( rloeschen && rdate == null) + { + monitor.log("Rechnungen löschen: Kein gültiges Datum eingegeben"); + } + else if ( rloeschen && rdate != null) + { + rechnungenLoeschen(monitor, rdate); + } + monitor.setPercentComplete((int) (progress / anzahl * 100d)); + progress++; + // Spendenbescheinigungen löschen if ( sloeschen && sdate == null) { @@ -155,7 +176,7 @@ else if ( sloeschen && sdate != null) } monitor.setPercentComplete((int) (progress / anzahl * 100d)); progress++; - + // Buchungen löschen if ( bloeschen && bdate == null) { @@ -167,7 +188,7 @@ else if ( bloeschen && bdate != null) } monitor.setPercentComplete((int) (progress / anzahl * 100d)); progress++; - + // Lastschriften löschen if ( lloeschen && ldate == null) { @@ -179,7 +200,7 @@ else if ( lloeschen && ldate != null) } monitor.setPercentComplete((int) (progress / anzahl * 100d)); progress++; - + // Abrechnungslauf löschen if ( aloeschen && adate == null) { @@ -191,7 +212,7 @@ else if ( aloeschen && adate != null) } monitor.setPercentComplete((int) (progress / anzahl * 100d)); progress++; - + // Jahresabschluss löschen if ( jloeschen && jdate == null) { @@ -203,7 +224,7 @@ else if ( jloeschen && jdate != null) } monitor.setPercentComplete((int) (progress / anzahl * 100d)); progress++; - + // Mails löschen if ( mloeschen && mdate == null) { @@ -213,7 +234,7 @@ else if ( mloeschen && mdate != null) { mailsLoeschen(monitor, mdate); } - + monitor.setPercentComplete(100); monitor.setStatus(ProgressMonitor.STATUS_DONE); monitor.setStatusText("Bereinigung beendet"); @@ -224,7 +245,7 @@ else if ( mloeschen && mdate != null) monitor.log(re.getMessage()); } } - + @Override public void interrupt() { @@ -239,7 +260,28 @@ public boolean isInterrupted() }; Application.getController().start(t); } - + + // Rechnungen loeschen + public CheckboxInput getRechnungenLoeschen() + { + if (rLoeschenInput != null) + { + return rLoeschenInput; + } + rLoeschenInput = new CheckboxInput(false); + return rLoeschenInput; + } + + public DateInput getDatumAuswahlRechnungen() + { + if (rDateInput != null) + { + return rDateInput; + } + rDateInput = new DateInput(defaultDate); + return rDateInput; + } + // Spendenbescheinigungen loeschen public CheckboxInput getSpendenbescheinigungenLoeschen() { @@ -250,7 +292,7 @@ public CheckboxInput getSpendenbescheinigungenLoeschen() sLoeschenInput = new CheckboxInput(false); return sLoeschenInput; } - + public DateInput getDatumAuswahlSpendenbescheinigungen() { if (sDateInput != null) @@ -271,7 +313,7 @@ public CheckboxInput getBuchungenLoeschen() bLoeschenInput = new CheckboxInput(false); return bLoeschenInput; } - + public DateInput getDatumAuswahlBuchungen() { if (bDateInput != null) @@ -291,7 +333,7 @@ public CheckboxInput getSollbuchungenLoeschen() sollLoeschenInput = new CheckboxInput(true); return sollLoeschenInput; } - + // Lastschriften loeschen public CheckboxInput getLastschriftenLoeschen() { @@ -302,7 +344,7 @@ public CheckboxInput getLastschriftenLoeschen() lLoeschenInput = new CheckboxInput(false); return lLoeschenInput; } - + public DateInput getDatumAuswahlLastschriften() { if (lDateInput != null) @@ -312,7 +354,7 @@ public DateInput getDatumAuswahlLastschriften() lDateInput = new DateInput(defaultDate); return lDateInput; } - + // Abrechnungslauf loeschen public CheckboxInput getAbrechnungslaufLoeschen() { @@ -323,7 +365,7 @@ public CheckboxInput getAbrechnungslaufLoeschen() aLoeschenInput = new CheckboxInput(false); return aLoeschenInput; } - + public DateInput getDatumAuswahlAbrechnungslauf() { if (aDateInput != null) @@ -344,7 +386,7 @@ public CheckboxInput getJahresabschlussLoeschen() jLoeschenInput = new CheckboxInput(false); return jLoeschenInput; } - + public DateInput getDatumAuswahlJahresabschluss() { if (jDateInput != null) @@ -354,7 +396,7 @@ public DateInput getDatumAuswahlJahresabschluss() jDateInput = new DateInput(defaultDate); return jDateInput; } - + // Mails loeschen public CheckboxInput getMailsLoeschen() { @@ -365,7 +407,7 @@ public CheckboxInput getMailsLoeschen() mLoeschenInput = new CheckboxInput(false); return mLoeschenInput; } - + public DateInput getDatumAuswahlMails() { if (mDateInput != null) @@ -375,8 +417,58 @@ public DateInput getDatumAuswahlMails() mDateInput = new DateInput(defaultDate); return mDateInput; } - + // Lösch Aktionen + private void rechnungenLoeschen(ProgressMonitor monitor, final Date date) + { + try + { + DBIterator it = Einstellungen.getDBService() + .createList(Rechnung.class); + it.addFilter("datum < ?", date); + it.setOrder("order by datum"); + int count = 0; + Rechnung rechnung = null; + while (it.hasNext()) + { + try + { + rechnung = it.next(); + rechnung.delete(); + count++; + } + catch (OperationCanceledException oce) + { + throw oce; + } + catch (Exception e) + { + String fehler = "Fehler beim Löschen der Rechnungung mit Nr " + + rechnung.getID() + ", " + e.getMessage(); + monitor.setStatusText(fehler); + } + } + if (count > 0) + { + monitor.setStatusText(String.format( + "%d Rechnung" + (count != 1 ? "en" : "") + " gelöscht.", count)); + } + else + { + monitor.log("Keine Rechnung im vorgegebenen Zeitraum vorhanden!"); + } + } + catch (OperationCanceledException oce) + { + throw oce; + } + catch (Exception e) + { + String fehler = "Fehler beim Löschen von Rechnungen."; + monitor.setStatusText(fehler); + } + } + private void spendenbescheinigungenLoeschen(ProgressMonitor monitor, final Date date) { try @@ -422,11 +514,11 @@ private void spendenbescheinigungenLoeschen(ProgressMonitor monitor, final Date } catch (Exception e) { - String fehler = "Fehler beim Löschen von Lastschriften."; + String fehler = "Fehler beim Löschen von Spendenbescheinigungen."; monitor.setStatusText(fehler); } } - + private void buchungenLoeschen(ProgressMonitor monitor, final Date date, final boolean sollloeschen) { @@ -453,7 +545,7 @@ public Object extract(ResultSet rs) return list; } }); - + DBIterator it = Einstellungen.getDBService() .createList(Buchung.class); it.addFilter("datum < ?", date); @@ -487,6 +579,12 @@ public Object extract(ResultSet rs) if(b.getSplitId() == null) throw e; } + catch (Exception e) + { + String fehler = "Fehler beim Löschen der Buchung mit Nr " + + b.getID() + ", " + e.getMessage(); + monitor.setStatusText(fehler); + } try { if (sollloeschen && (b.getMitgliedskonto() != null)) @@ -499,12 +597,18 @@ public Object extract(ResultSet rs) { throw oce; } - catch (Exception e) + catch (ObjectNotFoundException e) { // Das kann passieren wenn der Sollbuchung mehrere Buchungen // zugeordnet waren. Dann existiert die Sollbuchung nicht mehr // bei den weiteren Buchungen da das Query vorher erfolgt ist } + catch (Exception e) + { + String fehler = "Fehler beim Löschen der Sollbuchung mit Nr " + + b.getMitgliedskonto().getID() + ", " + e.getMessage(); + monitor.setStatusText(fehler); + } countb++; } catch (OperationCanceledException oce) @@ -513,8 +617,8 @@ public Object extract(ResultSet rs) } catch (Exception e) { - String fehler = "Fehler beim Löschen der Buchungen mit Nr " + - b.getID() + ", " + e.getMessage(); + String fehler = "Fehler beim Löschen der Buchung mit Nr " + + b.getID() + ", " + e.getMessage(); monitor.setStatusText(fehler); } } @@ -543,7 +647,7 @@ public Object extract(ResultSet rs) monitor.setStatusText(fehler); } } - + private void lastschriftenLoeschen(ProgressMonitor monitor, final Date date) { try @@ -726,7 +830,7 @@ public Object extract(ResultSet rs) monitor.setStatusText(fehler); } } - + private void jahresabschlussLoeschen(ProgressMonitor monitor, final Date date) { try @@ -750,7 +854,7 @@ public Object extract(ResultSet rs) return null; } }); - + DBIterator it = Einstellungen.getDBService() .createList(Jahresabschluss.class); it.addFilter("bis < ?", date); @@ -815,7 +919,7 @@ public Object extract(ResultSet rs) monitor.setStatusText(fehler); } } - + private void mailsLoeschen(ProgressMonitor monitor, final Date date) { try diff --git a/src/de/jost_net/JVerein/gui/control/DokumentControl.java b/src/de/jost_net/JVerein/gui/control/DokumentControl.java index ef1ad567f..5d1f00d5f 100644 --- a/src/de/jost_net/JVerein/gui/control/DokumentControl.java +++ b/src/de/jost_net/JVerein/gui/control/DokumentControl.java @@ -227,6 +227,7 @@ public void refreshTable() throws RemoteException { docsList.addItem(docs.next()); } + docsList.sort(); } /** diff --git a/src/de/jost_net/JVerein/gui/control/EigenschaftControl.java b/src/de/jost_net/JVerein/gui/control/EigenschaftControl.java index a7b8f2685..6688b9a39 100644 --- a/src/de/jost_net/JVerein/gui/control/EigenschaftControl.java +++ b/src/de/jost_net/JVerein/gui/control/EigenschaftControl.java @@ -163,6 +163,7 @@ public Part getEigenschaftList() throws RemoteException { eigenschaftList.addItem(eigenschaften.next()); } + eigenschaftList.sort(); } return eigenschaftList; } diff --git a/src/de/jost_net/JVerein/gui/control/EinstellungControl.java b/src/de/jost_net/JVerein/gui/control/EinstellungControl.java index f1d3a8a98..784466ae1 100644 --- a/src/de/jost_net/JVerein/gui/control/EinstellungControl.java +++ b/src/de/jost_net/JVerein/gui/control/EinstellungControl.java @@ -39,6 +39,7 @@ import de.jost_net.JVerein.keys.AbstractInputAuswahl; import de.jost_net.JVerein.keys.BuchungsartSort; import de.jost_net.JVerein.keys.SepaMandatIdSource; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.keys.Zahlungsrhythmus; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Einstellung; @@ -309,7 +310,6 @@ public class EinstellungControl extends AbstractControl private CheckboxInput summenAnlagenkonto; - private IntegerInput qrcodesize; private CheckboxInput qrcodeptext; @@ -335,12 +335,18 @@ public class EinstellungControl extends AbstractControl private SelectInput afaort; private TextInput beitragaltersstufen; + + private CheckboxInput mittelverwendung; /** * Verschlüsselte Datei für besonders sensible Daten (Passwörter) */ private Wallet wallet = null; + private TextInput ustid; + + private SelectInput staat; + public EinstellungControl(AbstractView view) { super(view); @@ -407,6 +413,27 @@ public Input getOrt() throws RemoteException return ort; } + public SelectInput getStaat() throws RemoteException + { + if (staat != null) + { + return staat; + } + staat = new SelectInput(Staat.values(), + Staat.getByKey(Einstellungen.getEinstellung().getStaat())); + return staat; + } + + public Input getUstID() throws RemoteException + { + if (ustid != null) + { + return ustid; + } + ustid = new TextInput(Einstellungen.getEinstellung().getUStID(), 50); + return ustid; + } + public TextInput getFinanzamt() throws RemoteException { if (finanzamt != null) @@ -1332,7 +1359,6 @@ public SelectInput getSepaVersion() throws RemoteException sepaversion = new SelectInput(list, Einstellungen.getEinstellung().getSepaVersion()); sepaversion.setAttribute("file"); - sepaversion.setPleaseChoose("Bitte auswählen"); return sepaversion; } @@ -1347,7 +1373,6 @@ public SelectInput getCt1SepaVersion() throws RemoteException ct1sepaversion = new SelectInput(list, Einstellungen.getEinstellung().getCt1SepaVersion()); ct1sepaversion.setAttribute("file"); - ct1sepaversion.setPleaseChoose("Bitte auswählen"); return ct1sepaversion; } @@ -1969,6 +1994,8 @@ public CheckboxInput getUnterschriftdrucken() throws RemoteException return unterschriftdrucken; } unterschriftdrucken = new CheckboxInput(Einstellungen.getEinstellung().getUnterschriftdrucken()); + unterschriftdrucken.setName(" *Die maschinelle Erstellung von Zuwendungsbestätigungen muss " + + "vorab dem zuständigen Finanzamt angezeigt worden sein."); return unterschriftdrucken; } @@ -2027,6 +2054,17 @@ public SelectInput getAfaOrt() throws RemoteException return afaort; } + public CheckboxInput getMittelverwendung() throws RemoteException + { + if (mittelverwendung != null) + { + return mittelverwendung; + } + mittelverwendung = new CheckboxInput( + Einstellungen.getEinstellung().getMittelverwendung()); + return mittelverwendung; + } + public void handleStoreAllgemein() { try @@ -2044,6 +2082,8 @@ public void handleStoreAllgemein() else e.setIban(ib.toUpperCase().replace(" ","")); e.setGlaeubigerID((String) getGlaeubigerID().getValue()); + e.setStaat(((Staat)getStaat().getValue()).getKey()); + e.setUStID((String) getUstID().getValue()); e.store(); Einstellungen.setEinstellung(e); @@ -2114,6 +2154,7 @@ public void handleStoreAnzeige() e.setAfaInJahresabschluss(false); else e.setAfaInJahresabschluss(true); + e.setMittelverwendung((Boolean) mittelverwendung.getValue()); e.store(); Einstellungen.setEinstellung(e); diff --git a/src/de/jost_net/JVerein/gui/control/FilterControl.java b/src/de/jost_net/JVerein/gui/control/FilterControl.java index a2a76727a..c9c84e93c 100644 --- a/src/de/jost_net/JVerein/gui/control/FilterControl.java +++ b/src/de/jost_net/JVerein/gui/control/FilterControl.java @@ -18,6 +18,9 @@ import java.rmi.RemoteException; import java.text.ParseException; +import java.time.LocalDate; +import java.time.ZoneId; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; @@ -36,9 +39,13 @@ import de.jost_net.JVerein.gui.input.GeschlechtInput; import de.jost_net.JVerein.gui.input.IntegerNullInput; import de.jost_net.JVerein.gui.input.MailAuswertungInput; +import de.jost_net.JVerein.gui.parts.ToolTipButton; +import de.jost_net.JVerein.keys.ArtBuchungsart; +import de.jost_net.JVerein.keys.SuchSpendenart; import de.jost_net.JVerein.rmi.Abrechnungslauf; import de.jost_net.JVerein.rmi.Adresstyp; import de.jost_net.JVerein.rmi.Beitragsgruppe; +import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Eigenschaft; import de.jost_net.JVerein.rmi.Lehrgangsart; import de.jost_net.JVerein.rmi.Mitglied; @@ -77,7 +84,7 @@ public class FilterControl extends AbstractControl protected String additionalparamprefix2 = ""; protected Settings settings = null; - + protected Mitgliedstyp typ = Mitgliedstyp.NOT_USED; protected TreePart eigenschaftenAuswahlTree = null; @@ -85,13 +92,13 @@ public class FilterControl extends AbstractControl protected SelectInput suchadresstyp = null; protected SelectInput status = null; - + protected SelectInput art = null; protected TextInput suchexternemitgliedsnummer = null; protected IntegerNullInput suchmitgliedsnummer = null; - + protected DialogInput eigenschaftenabfrage = null; protected SelectInput beitragsgruppeausw = null; @@ -117,23 +124,23 @@ public class FilterControl extends AbstractControl protected DateInput austrittvon = null; protected DateInput austrittbis = null; - + protected DialogInput zusatzfelderabfrage = null; - + protected SelectInput mailAuswahl = null; - - protected ZusatzfelderAuswahlDialog zad= null; - + + protected ZusatzfelderAuswahlDialog zad = null; + protected DateInput datumvon = null; protected DateInput datumbis = null; - + protected SelectInput differenz = null; - + protected CheckboxInput ohneabbucher = null; - + protected SelectInput suchlehrgangsart = null; - + protected DateInput eingabedatumvon = null; protected DateInput eingabedatumbis = null; @@ -143,11 +150,26 @@ public class FilterControl extends AbstractControl protected DateInput abbuchungsdatumbis = null; protected TextInput suchtext = null; - + protected SelectInput abrechnungslaufausw = null; - + protected IntegerNullInput integerausw = null; - + + protected SelectInput suchstatus = null; + + protected SelectInput suchbuchungsklasse = null; + + protected SelectInput suchbuchungsartart = null; + + private Calendar calendar = Calendar.getInstance(); + + private enum RANGE + { + MONAT, TAG + } + + protected SelectInput suchspendenart = null; + public enum Mitgliedstyp { MITGLIED, NICHTMITGLIED, @@ -350,10 +372,6 @@ public boolean isSuchExterneMitgliedsnummerActive() public DialogInput getEigenschaftenAuswahl() throws RemoteException { String tmp = settings.getString(settingsprefix + "eigenschaften", ""); - final EigenschaftenAuswahlDialog d = new EigenschaftenAuswahlDialog(tmp, - false, true, this, false); - d.addCloseListener(new EigenschaftenCloseListener()); - StringTokenizer stt = new StringTokenizer(tmp, ","); StringBuilder text = new StringBuilder(); while (stt.hasMoreElements()) @@ -365,11 +383,22 @@ public DialogInput getEigenschaftenAuswahl() throws RemoteException try { String s = stt.nextToken(); + String eigenschaftId = s.substring(0,s.length()-1); + String plusMinus = s.substring(s.length()-1); + if (eigenschaftId.isEmpty() || + !(plusMinus.equals(EigenschaftenNode.PLUS) || + plusMinus.equals(EigenschaftenNode.MINUS))) + { + text = new StringBuilder(); + tmp = ""; + settings.setAttribute(settingsprefix + "eigenschaften", tmp); + break; + } String prefix = "+"; - if (s.substring(s.length()-1).equals(EigenschaftenNode.MINUS)) + if (plusMinus.equals(EigenschaftenNode.MINUS)) prefix = "-"; Eigenschaft ei = (Eigenschaft) Einstellungen.getDBService() - .createObject(Eigenschaft.class, s.substring(0,s.length()-1)); + .createObject(Eigenschaft.class, eigenschaftId); text.append(prefix + ei.getBezeichnung()); } catch (ObjectNotFoundException e) @@ -377,6 +406,9 @@ public DialogInput getEigenschaftenAuswahl() throws RemoteException // } } + final EigenschaftenAuswahlDialog d = new EigenschaftenAuswahlDialog(tmp, + true, this, false); + d.addCloseListener(new EigenschaftenCloseListener()); eigenschaftenabfrage = new DialogInput(text.toString(), d); eigenschaftenabfrage.setName("Eigenschaften"); eigenschaftenabfrage.disableClientControl(); @@ -405,11 +437,11 @@ public void updateEigenschaftenAuswahlTooltip() } public TreePart getEigenschaftenAuswahlTree(String vorbelegung, - boolean ohnePflicht, boolean onlyChecked, + boolean onlyChecked, Mitglied[] mitglieder) throws RemoteException { eigenschaftenAuswahlTree = new TreePart( - new EigenschaftenNode(vorbelegung, ohnePflicht, onlyChecked, mitglieder), null); + new EigenschaftenNode(vorbelegung, onlyChecked, mitglieder), null); eigenschaftenAuswahlTree.addSelectionListener( new EigenschaftListener()); eigenschaftenAuswahlTree.setFormatter(new EigenschaftTreeFormatter()); @@ -1049,6 +1081,113 @@ public boolean isIntegerAuswAktiv() return integerausw != null; } + public SelectInput getSuchSpendenart() + { + if (suchspendenart != null) + { + return suchspendenart; + } + SuchSpendenart defaultwert = SuchSpendenart + .getByKey(settings.getInt(settingsprefix + "suchspendenart.key", 1)); + suchspendenart = new SelectInput(SuchSpendenart.values(), defaultwert); + suchspendenart.setName("Spendenart"); + suchspendenart.addListener(new FilterListener()); + return suchspendenart; + } + + public boolean isSuchSpendenartAktiv() + { + return suchspendenart != null; + } + + public SelectInput getSuchStatus() throws RemoteException + { + if (suchstatus != null) + { + return suchstatus; + } + suchstatus = new SelectInput(new String[] { "Alle", "Ohne Deaktiviert" }, + settings.getString(settingsprefix + "suchstatus", "Alle")); + suchstatus.addListener(new FilterListener()); + suchstatus.setName("Status"); + return suchstatus; + } + + public boolean isSuchStatusAktiv() + { + return suchstatus != null; + } + + public SelectInput getSuchBuchungsklasse() throws RemoteException + { + if (suchbuchungsklasse != null) + { + return suchbuchungsklasse; + } + Buchungsklasse bk = null; + String buchungskl = settings + .getString(settingsprefix + "suchbuchungsklasse", ""); + if (buchungskl.length() > 0) + { + try + { + bk = (Buchungsklasse) Einstellungen.getDBService() + .createObject(Buchungsklasse.class, buchungskl); + } + catch (ObjectNotFoundException e) + { + bk = (Buchungsklasse) Einstellungen.getDBService() + .createObject(Buchungsklasse.class, null); + } + } + DBIterator list = Einstellungen.getDBService() + .createList(Buchungsklasse.class); + list.setOrder("ORDER BY bezeichnung"); + suchbuchungsklasse = new SelectInput( + list != null ? PseudoIterator.asList(list) : null, bk); + suchbuchungsklasse.setName("Buchungsklasse"); + suchbuchungsklasse.setAttribute("bezeichnung"); + suchbuchungsklasse.setPleaseChoose("Bitte auswählen"); + suchbuchungsklasse.addListener(new FilterListener()); + return suchbuchungsklasse; + } + + public boolean isSuchBuchungsklasseAktiv() + { + return suchbuchungsklasse != null; + } + + public SelectInput getSuchBuchungsartArt() throws RemoteException + { + if (suchbuchungsartart != null) + { + return suchbuchungsartart; + } + String art = settings.getString(settingsprefix + "suchbuchungsartart", ""); + ArtBuchungsart artb = null; + if (art.length() > 0) + { + try + { + artb = new ArtBuchungsart(Integer.valueOf(art)); + } + catch (Exception e) + { + // + } + } + suchbuchungsartart = new SelectInput(ArtBuchungsart.getArray(), artb); + suchbuchungsartart.setName("Art"); + suchbuchungsartart.setPleaseChoose("Bitte auswählen"); + suchbuchungsartart.addListener(new FilterListener()); + return suchbuchungsartart; + } + + public boolean isSuchBuchungsartArtAktiv() + { + return suchbuchungsartart != null; + } + /** * Buttons */ @@ -1167,6 +1306,14 @@ public void handleAction(Object context) throws ApplicationException suchtext.setValue(""); if (integerausw != null) integerausw.setValue(null); + if (suchspendenart != null) + suchspendenart.setValue(SuchSpendenart.ALLE); + if (suchstatus != null) + suchstatus.setValue("Alle"); + if (suchbuchungsklasse != null) + suchbuchungsklasse.setValue(null); + if (suchbuchungsartart != null) + suchbuchungsartart.setValue(null); refresh(); } }, null, false, "eraser.png"); @@ -1554,8 +1701,55 @@ public void saveFilterSettings() throws RemoteException settings.setAttribute(settingsprefix + "intergerauswahl", ""); } } + + if (suchspendenart != null ) + { + SuchSpendenart ss = (SuchSpendenart) suchspendenart.getValue(); + settings.setAttribute(settingsprefix + "suchspendenart.key", ss.getKey()); + } + + if (suchstatus != null) + { + String tmp = (String) suchstatus.getValue(); + if (tmp != null) + { + settings.setAttribute(settingsprefix + "suchstatus", tmp); + } + else + { + settings.setAttribute(settingsprefix + "suchstatus", ""); + } + } + + if (suchbuchungsklasse != null) + { + Buchungsklasse tmpbk = (Buchungsklasse) suchbuchungsklasse.getValue(); + if (tmpbk != null) + { + settings.setAttribute(settingsprefix + "suchbuchungsklasse", + tmpbk.getID()); + } + else + { + settings.setAttribute(settingsprefix + "suchbuchungsklasse", ""); + } + } + + if (suchbuchungsartart != null) + { + ArtBuchungsart art = (ArtBuchungsart) suchbuchungsartart.getValue(); + if (art != null) + { + settings.setAttribute(settingsprefix + "suchbuchungsartart", + art.getKey()); + } + else + { + settings.setAttribute(settingsprefix + "suchbuchungsartart", ""); + } + } } - + private void saveDate(Date tmp, String setting) { if (tmp != null) @@ -1568,4 +1762,109 @@ private void saveDate(Date tmp, String setting) settings.setAttribute(settingsprefix + setting, ""); } } + + public ToolTipButton getZurueckButton(DateInput vonDatum, DateInput bisDatum) + { + return new ToolTipButton("", new Action() + { + @Override + public void handleAction(Object context) throws ApplicationException + { + Date von = (Date) vonDatum.getValue(); + Date bis = (Date) bisDatum.getValue(); + if (getRangeTyp(von, bis) == RANGE.TAG) + { + int delta = (int) ChronoUnit.DAYS.between(von.toInstant(), bis.toInstant()); + delta++; + calendar.setTime(von); + calendar.add(Calendar.DAY_OF_MONTH, -delta); + vonDatum.setValue(calendar.getTime()); + calendar.setTime(bis); + calendar.add(Calendar.DAY_OF_MONTH, -delta); + bisDatum.setValue(calendar.getTime()); + } + else + { + LocalDate lvon = von.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate lbis = bis.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + int delta = (int) ChronoUnit.MONTHS.between(lvon, lbis); + delta++; + calendar.setTime(von); + calendar.add(Calendar.MONTH, -delta); + vonDatum.setValue(calendar.getTime()); + calendar.add(Calendar.MONTH, delta); + calendar.add(Calendar.DAY_OF_MONTH, -1); + bisDatum.setValue(calendar.getTime()); + } + TabRefresh(); + } + }, null, false, "go-previous.png"); + } + + public ToolTipButton getVorButton(DateInput vonDatum, DateInput bisDatum) + { + return new ToolTipButton("", new Action() + { + @Override + public void handleAction(Object context) throws ApplicationException + { + Date von = (Date) vonDatum.getValue(); + Date bis = (Date) bisDatum.getValue(); + if (getRangeTyp(von, bis) == RANGE.TAG) + { + int delta = (int) ChronoUnit.DAYS.between(von.toInstant(), bis.toInstant()); + delta++; + calendar.setTime(von); + calendar.add(Calendar.DAY_OF_MONTH, delta); + vonDatum.setValue(calendar.getTime()); + calendar.setTime(bis); + calendar.add(Calendar.DAY_OF_MONTH, delta); + bisDatum.setValue(calendar.getTime()); + } + else + { + LocalDate lvon = von.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + LocalDate lbis = bis.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); + int delta = (int) ChronoUnit.MONTHS.between(lvon, lbis); + delta++; + calendar.setTime(von); + calendar.add(Calendar.MONTH, delta); + vonDatum.setValue(calendar.getTime()); + calendar.add(Calendar.MONTH, delta); + calendar.add(Calendar.DAY_OF_MONTH, -1); + bisDatum.setValue(calendar.getTime()); + } + TabRefresh(); + } + }, null, false, "go-next.png"); + } + + private RANGE getRangeTyp(Date von, Date bis) throws ApplicationException + { + checkDate(von, bis); + calendar.setTime(von); + if (calendar.get(Calendar.DAY_OF_MONTH) != 1) + return RANGE.TAG; + calendar.setTime(bis); + calendar.add(Calendar.DAY_OF_MONTH, 1); + if (calendar.get(Calendar.DAY_OF_MONTH) != 1) + return RANGE.TAG; + return RANGE.MONAT; + } + + private void checkDate(Date von, Date bis) throws ApplicationException + { + if (von == null) + { + throw new ApplicationException("Bitte Von Datum eingeben!"); + } + if (bis == null) + { + throw new ApplicationException("Bitte Bis Datum eingeben!"); + } + if (von.after(bis)) + { + throw new ApplicationException("Von Datum ist nach Bis Datum!"); + } + } } diff --git a/src/de/jost_net/JVerein/gui/control/FormularControl.java b/src/de/jost_net/JVerein/gui/control/FormularControl.java index cbefea78a..5b52493e4 100644 --- a/src/de/jost_net/JVerein/gui/control/FormularControl.java +++ b/src/de/jost_net/JVerein/gui/control/FormularControl.java @@ -264,6 +264,7 @@ public Part getFormularList() throws RemoteException formularList.setContextMenu(new FormularMenu(this)); formularList.setRememberOrder(true); formularList.removeFeature(FeatureSummary.class); + formularList.setMulti(true); return formularList; } @@ -277,6 +278,7 @@ public void refreshFormularTable() throws RemoteException { formularList.addItem(formulare.next()); } + formularList.sort(); } } diff --git a/src/de/jost_net/JVerein/gui/control/FormularPartControl.java b/src/de/jost_net/JVerein/gui/control/FormularPartControl.java index fc72921a4..b32115af9 100644 --- a/src/de/jost_net/JVerein/gui/control/FormularPartControl.java +++ b/src/de/jost_net/JVerein/gui/control/FormularPartControl.java @@ -79,6 +79,7 @@ public void refreshTable() throws RemoteException { formularfelderList.addItem(formularfelder.next()); } + formularfelderList.sort(); } } diff --git a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java index d942d7cc7..d4da98cc3 100644 --- a/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java +++ b/src/de/jost_net/JVerein/gui/control/FormularfeldControl.java @@ -18,6 +18,7 @@ import java.rmi.RemoteException; import java.util.ArrayList; +import java.util.Collections; import com.itextpdf.text.pdf.BaseFont; @@ -25,7 +26,7 @@ import de.jost_net.JVerein.Variable.AllgemeineVar; import de.jost_net.JVerein.Variable.LastschriftVar; import de.jost_net.JVerein.Variable.MitgliedVar; -import de.jost_net.JVerein.Variable.MitgliedskontoVar; +import de.jost_net.JVerein.Variable.RechnungVar; import de.jost_net.JVerein.Variable.SpendenbescheinigungVar; import de.jost_net.JVerein.keys.FormularArt; import de.jost_net.JVerein.rmi.Felddefinition; @@ -40,7 +41,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 @@ -196,6 +196,10 @@ public SelectInput getName() throws Exception { namen.add(spv.getName()); } + for (MitgliedVar mv : MitgliedVar.values()) + { + namen.add(mv.getName()); + } } if (formular.getArt() == FormularArt.SAMMELSPENDENBESCHEINIGUNG) { @@ -207,6 +211,10 @@ public SelectInput getName() throws Exception { namen.add(spv.getName()); } + for (MitgliedVar mv : MitgliedVar.values()) + { + namen.add(mv.getName()); + } } if (formular.getArt() == FormularArt.FREIESFORMULAR) { @@ -241,7 +249,7 @@ public SelectInput getName() throws Exception { namen.add(mv.getName()); } - for (MitgliedskontoVar mkv : MitgliedskontoVar.values()) + for (RechnungVar mkv : RechnungVar.values()) { namen.add(mkv.getName()); } @@ -249,7 +257,9 @@ public SelectInput getName() throws Exception } if (formular.getArt() == FormularArt.FREIESFORMULAR || formular.getArt() == FormularArt.RECHNUNG - || formular.getArt() == FormularArt.MAHNUNG) + || formular.getArt() == FormularArt.MAHNUNG + || formular.getArt() == FormularArt.SPENDENBESCHEINIGUNG + || formular.getArt() == FormularArt.SAMMELSPENDENBESCHEINIGUNG) { DBIterator itlesefelder = Einstellungen.getDBService() .createList(Lesefeld.class); @@ -267,6 +277,7 @@ public SelectInput getName() throws Exception namen.add(Einstellungen.ZUSATZFELD_PRE + zusatzfeld.getName()); } } + Collections.sort(namen); name = new SelectInput(namen, getFormularfeld().getName()); return name; } diff --git a/src/de/jost_net/JVerein/gui/control/FreieFormulareControl.java b/src/de/jost_net/JVerein/gui/control/FreieFormulareControl.java index 4af4f7369..df1bab7e5 100644 --- a/src/de/jost_net/JVerein/gui/control/FreieFormulareControl.java +++ b/src/de/jost_net/JVerein/gui/control/FreieFormulareControl.java @@ -1,12 +1,14 @@ package de.jost_net.JVerein.gui.control; import java.io.IOException; + import de.jost_net.JVerein.io.FreiesFormularAusgabe; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.Button; import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; public class FreieFormulareControl extends DruckMailControl { @@ -41,7 +43,8 @@ public void handleAction(Object context) return button; } - private void generiereFreieFormulare(Object currentObject) throws IOException + private void generiereFreieFormulare(Object currentObject) + throws IOException, ApplicationException { saveDruckMailSettings(); new FreiesFormularAusgabe(this); diff --git a/src/de/jost_net/JVerein/gui/control/JahresabschlussControl.java b/src/de/jost_net/JVerein/gui/control/JahresabschlussControl.java index 90a34f5d9..a0688a3b2 100644 --- a/src/de/jost_net/JVerein/gui/control/JahresabschlussControl.java +++ b/src/de/jost_net/JVerein/gui/control/JahresabschlussControl.java @@ -27,6 +27,7 @@ import de.jost_net.JVerein.gui.parts.KontensaldoList; import de.jost_net.JVerein.gui.util.AfaUtil; import de.jost_net.JVerein.io.SaldoZeile; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Anfangsbestand; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Jahresabschluss; @@ -297,6 +298,7 @@ public void refreshTable() throws RemoteException { jahresabschlussList.addItem(jahresabschluesse.next()); } + jahresabschlussList.sort(); } public String getInfo() @@ -308,7 +310,8 @@ public String getInfo() Date bisgj = (Date) getBis().getValue(); DBService service = Einstellungen.getDBService(); DBIterator kontenIt = service.createList(Konto.class); - kontenIt.addFilter("anlagenkonto = TRUE"); + kontenIt.addFilter("kontoart = ?", + new Object[] { Kontoart.ANLAGE.getKey() }); kontenIt.addFilter("(eroeffnung IS NULL OR eroeffnung <= ?)", new Object[] { new java.sql.Date(bisgj.getTime()) }); kontenIt.addFilter("(aufloesung IS NULL OR aufloesung >= ?)", diff --git a/src/de/jost_net/JVerein/gui/control/KontoControl.java b/src/de/jost_net/JVerein/gui/control/KontoControl.java index 0ecdf912d..819ece9b3 100644 --- a/src/de/jost_net/JVerein/gui/control/KontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/KontoControl.java @@ -20,6 +20,7 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Calendar; import java.util.Date; @@ -30,13 +31,13 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.action.KontoAction; import de.jost_net.JVerein.gui.formatter.BuchungsartFormatter; -import de.jost_net.JVerein.gui.formatter.JaNeinFormatter; import de.jost_net.JVerein.gui.input.BuchungsartInput; import de.jost_net.JVerein.gui.input.IntegerNullInput; import de.jost_net.JVerein.gui.input.KontoInput; import de.jost_net.JVerein.gui.input.BuchungsartInput.buchungsarttyp; import de.jost_net.JVerein.gui.menu.KontoMenu; import de.jost_net.JVerein.keys.BuchungsartSort; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.keys.StatusBuchungsart; import de.jost_net.JVerein.keys.AfaMode; import de.jost_net.JVerein.keys.ArtBuchungsart; @@ -56,10 +57,10 @@ import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.Part; +import de.willuhn.jameica.gui.dialogs.SimpleDialog; import de.willuhn.jameica.gui.formatter.DateFormatter; import de.willuhn.jameica.gui.formatter.Formatter; import de.willuhn.jameica.gui.input.AbstractInput; -import de.willuhn.jameica.gui.input.CheckboxInput; import de.willuhn.jameica.gui.input.DateInput; import de.willuhn.jameica.gui.input.DecimalInput; import de.willuhn.jameica.gui.input.Input; @@ -96,7 +97,7 @@ public class KontoControl extends AbstractControl private SelectInput buchungsart; - private CheckboxInput anlagenkonto; + private SelectInput kontoart; private int unterdrueckunglaenge = 0; @@ -185,7 +186,7 @@ public DateInput getAnschaffung() throws RemoteException } anschaffung = new DateInput(getKonto().getAnschaffung(), new JVDateFormatTTMMJJJJ()); - if (!((boolean) getAnlagenkonto().getValue())) + if (((Kontoart) getKontoArt().getValue()) != Kontoart.ANLAGE) { anschaffung.setValue(null); anschaffung.disable(); @@ -251,7 +252,7 @@ public void handleStore() k.setAufloesung((Date) getAufloesung().getValue()); k.setBuchungsartId(getSelectedBuchungsArtId()); k.setKommentar((String) getKommentar().getValue()); - k.setAnlagenkonto((Boolean) getAnlagenkonto().getValue()); + k.setKontoArt((Kontoart) getKontoArt().getValue()); if (getHibiscusId().getValue() == null) { k.setHibiscusId(-1); @@ -277,6 +278,37 @@ public void handleStore() { k.setAfaMode(Integer.valueOf(((AfaMode) getAfaMode().getValue()).getKey())); } + DBService service = Einstellungen.getDBService(); + String sql = "SELECT DISTINCT konto.id from konto " + + "WHERE (kontoart = ?) "; + boolean exist = (boolean) service.execute(sql, + new Object[] { Kontoart.ANLAGE.getKey() }, new ResultSetExtractor() + { + @Override + public Object extract(ResultSet rs) + throws RemoteException, SQLException + { + if (rs.next()) + { + return true; + } + return false; + } + }); + if (!exist && getKonto().getKontoArt() == Kontoart.ANLAGE) + { + SimpleDialog d = new SimpleDialog(SimpleDialog.POSITION_CENTER); + d.setTitle("Erstes Anlagenkonto"); + d.setText("Beim ersten Anlagenkonto bitte JVerein neu starten um die Änderungen anzuwenden"); + try + { + d.open(); + } + catch (Exception e) + { + Logger.error("Fehler", e); + } + } k.store(); GUI.getStatusBar().setSuccessText("Konto gespeichert"); } @@ -303,8 +335,22 @@ public Part getKontenList() throws RemoteException kontenList = new TablePart(konten, new KontoAction()); kontenList.addColumn("Nummer", "nummer"); kontenList.addColumn("Bezeichnung", "bezeichnung"); - kontenList.addColumn("Anlagenkonto", "anlagenkonto", - new JaNeinFormatter()); + kontenList.addColumn("Kontoart", "kontoart", new Formatter() + { + @Override + public String format(Object o) + { + if (o == null) + { + return ""; + } + if (o instanceof Integer) + { + return Kontoart.getByKey((Integer) o).getText(); + } + return "ungültig"; + } + }, false, Column.ALIGN_LEFT); kontenList.addColumn("Hibiscus-Konto", "hibiscusid", new Formatter() { @@ -344,11 +390,11 @@ public void refreshTable() throws RemoteException kontenList.removeAll(); DBIterator konten = Einstellungen.getDBService() .createList(Konto.class); - konten.setOrder("ORDER BY nummer"); while (konten.hasNext()) { kontenList.addItem(konten.next()); } + kontenList.sort(); } public Input getBuchungsart() throws RemoteException @@ -511,36 +557,21 @@ private void addToList(ArrayList liste, ArrayList erge } } - public CheckboxInput getAnlagenkonto() throws RemoteException + public SelectInput getKontoArt() throws RemoteException { - if (anlagenkonto != null) + if (kontoart != null) { - return anlagenkonto; + return kontoart; } - anlagenkonto = new CheckboxInput(getKonto().getAnlagenkonto()); - DBService service = Einstellungen.getDBService(); - String sql = "SELECT DISTINCT konto.id from konto " - + "WHERE (anlagenkonto = TRUE) "; - boolean exist = (boolean) service.execute(sql, - new Object[] { }, new ResultSetExtractor() - { - @Override - public Object extract(ResultSet rs) - throws RemoteException, SQLException - { - if (rs.next()) - { - return true; - } - return false; - } - }); - if (!exist) + Kontoart art = Kontoart.GELD; + if (!getKonto().isNewObject()) { - anlagenkonto.setName(" *Beim ersten Anlagenkonto bitte JVerein neu starten um die Änderungen anzuwenden"); + art = getKonto().getKontoArt(); } - - anlagenkonto.addListener(new Listener() + ArrayList values = new ArrayList(Arrays.asList(Kontoart.values())); + values.remove(Kontoart.LIMIT); + kontoart = new SelectInput(values, art); + kontoart.addListener(new Listener() { @Override @@ -549,7 +580,7 @@ public void handleEvent(Event event) refreshGui(); } }); - return anlagenkonto; + return kontoart; } @@ -563,7 +594,7 @@ public Input getAnlagenart() throws RemoteException getKonto().getAnlagenart(), buchungsarttyp.ANLAGENART, Einstellungen.getEinstellung().getBuchungBuchungsartAuswahl()); anlagenart.addListener(new AnlagenartListener()); - if ((boolean) getAnlagenkonto().getValue()) + if (getKontoArt().getValue() == Kontoart.ANLAGE) { anlagenart.setMandatory(true); } @@ -607,7 +638,7 @@ public Input getAnlagenklasse() throws RemoteException getKonto().getAnlagenklasse()); anlagenklasse.setAttribute(getBuchungartAttribute()); anlagenklasse.setPleaseChoose("Bitte auswählen"); - if ((boolean) getAnlagenkonto().getValue()) + if (getKontoArt().getValue() == Kontoart.ANLAGE) { anlagenklasse.setMandatory(true); } @@ -648,7 +679,7 @@ public Input getAfaart() throws RemoteException getKonto().getAfaart(), buchungsarttyp.AFAART, Einstellungen.getEinstellung().getBuchungBuchungsartAuswahl()); afaart.addListener(new AnlagenartListener()); - if ((boolean) getAnlagenkonto().getValue()) + if (getKontoArt().getValue() == Kontoart.ANLAGE) { afaart.setMandatory(true); } @@ -703,7 +734,7 @@ public void handleEvent (Event e) { } } }); - if (!((boolean) getAnlagenkonto().getValue())) + if (getKontoArt().getValue() != Kontoart.ANLAGE) { betrag.setValue(null); betrag.disable(); @@ -725,7 +756,7 @@ public IntegerNullInput getNutzungsdauer() throws RemoteException { nutzungsdauer = new IntegerNullInput(); } - if (!((boolean) getAnlagenkonto().getValue())) + if (getKontoArt().getValue() != Kontoart.ANLAGE) { nutzungsdauer.setValue(null); nutzungsdauer.disable(); @@ -752,7 +783,7 @@ public DecimalInput getAfaStart() throws RemoteException } afastart = new DecimalInput(getKonto().getAfaStart(), Einstellungen.DECIMALFORMAT); - if (!((boolean) getAnlagenkonto().getValue()) || + if (getKontoArt().getValue() != Kontoart.ANLAGE || getAfaMode().getValue() == null || ((AfaMode) getAfaMode().getValue()).getKey() != AfaMode.ANGEPASST) { @@ -775,7 +806,7 @@ public DecimalInput getAfaDauer() throws RemoteException } afadauer = new DecimalInput(getKonto().getAfaDauer(), Einstellungen.DECIMALFORMAT); - if (!((boolean) getAnlagenkonto().getValue()) || + if (getKontoArt().getValue() != Kontoart.ANLAGE || getAfaMode().getValue() == null || ((AfaMode) getAfaMode().getValue()).getKey() != AfaMode.ANGEPASST) { @@ -798,7 +829,7 @@ public DecimalInput getAfaRestwert() throws RemoteException } afarestwert = new DecimalInput(getKonto().getAfaRestwert(), Einstellungen.DECIMALFORMAT); - if (!((boolean) getAnlagenkonto().getValue())) + if (getKontoArt().getValue() != Kontoart.ANLAGE) { afarestwert.setValue(null); afarestwert.disable(); @@ -850,7 +881,7 @@ public void handleEvent (Event e) { } } }); - if ((boolean) getAnlagenkonto().getValue()) + if (getKontoArt().getValue() == Kontoart.ANLAGE) { afamode.setMandatory(true); } @@ -943,7 +974,7 @@ public void refreshGui() { try { - if ((boolean) getAnlagenkonto().getValue()) + if (getKontoArt().getValue() == Kontoart.ANLAGE) { getAnlagenklasse().enable(); getAnlagenklasse().setMandatory(true); @@ -1021,7 +1052,7 @@ public void handleAction(Object context) { if (getBetrag().getValue() != null) autobutton.setEnabled(false); - if (!((boolean) getAnlagenkonto().getValue())) + if (getKontoArt().getValue() != Kontoart.ANLAGE) { autobutton.setEnabled(false); } @@ -1050,7 +1081,7 @@ public void handleAction(Object context) }, null, true, "view-refresh.png"); try { - if (!((boolean) getAnlagenkonto().getValue()) || + if (getKontoArt().getValue() != Kontoart.ANLAGE || getAfaMode().getValue() == null || ((AfaMode) getAfaMode().getValue()).getKey() != AfaMode.ANGEPASST) { diff --git a/src/de/jost_net/JVerein/gui/control/KursteilnehmerControl.java b/src/de/jost_net/JVerein/gui/control/KursteilnehmerControl.java index bbb7203f4..c720ccc37 100644 --- a/src/de/jost_net/JVerein/gui/control/KursteilnehmerControl.java +++ b/src/de/jost_net/JVerein/gui/control/KursteilnehmerControl.java @@ -39,6 +39,7 @@ import de.jost_net.JVerein.gui.menu.KursteilnehmerMenu; import de.jost_net.JVerein.io.FileViewer; import de.jost_net.JVerein.io.Reporter; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.rmi.Kursteilnehmer; import de.jost_net.JVerein.util.Dateiname; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; @@ -52,6 +53,7 @@ import de.willuhn.jameica.gui.input.DateInput; import de.willuhn.jameica.gui.input.DecimalInput; import de.willuhn.jameica.gui.input.Input; +import de.willuhn.jameica.gui.input.SelectInput; import de.willuhn.jameica.gui.input.TextInput; import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.TablePart; @@ -85,7 +87,7 @@ public class KursteilnehmerControl extends FilterControl private TextInput ort; - private TextInput staat; + private SelectInput staat; private EmailInput email; @@ -246,13 +248,22 @@ public Input getOrt() throws RemoteException return ort; } - public TextInput getStaat() throws RemoteException + public SelectInput getStaat() throws RemoteException { if (staat != null) { return staat; } - staat = new TextInput(getKursteilnehmer().getStaat(), 50); + if (getKursteilnehmer().getStaat() != null + && getKursteilnehmer().getStaat().length() > 0 + && Staat.getByKey(getKursteilnehmer().getStaat()) == null) + { + GUI.getStatusBar() + .setErrorText("Konnte Staat \"" + getKursteilnehmer().getStaat() + + "\" nicht finden, bitte anpassen."); + } + staat = new SelectInput(Staat.values(), Staat.getByKey(getKursteilnehmer().getStaat())); + staat.setPleaseChoose("Nicht gesetzt"); staat.setName("Staat"); return staat; } @@ -416,6 +427,7 @@ public void TabRefresh() Kursteilnehmer kt = kursteilnehmer.next(); part.addItem(kt); } + part.sort(); } catch (RemoteException e1) { @@ -454,7 +466,7 @@ public void handleStore() k.setAdressierungszuatz((String) getAdressierungszusatz().getValue()); k.setPlz((String) getPLZ().getValue()); k.setOrt((String) getOrt().getValue()); - k.setStaat((String) getStaat().getValue()); + k.setStaat(((Staat) getStaat().getValue()).getKey()); k.setEmail((String) getEmail().getValue()); k.setVZweck1((String) getVZweck1().getValue()); k.setMandatDatum((Date) getMandatDatum().getValue()); diff --git a/src/de/jost_net/JVerein/gui/control/LastschriftControl.java b/src/de/jost_net/JVerein/gui/control/LastschriftControl.java index 6b83d9fb2..1fa7d4fc4 100644 --- a/src/de/jost_net/JVerein/gui/control/LastschriftControl.java +++ b/src/de/jost_net/JVerein/gui/control/LastschriftControl.java @@ -138,6 +138,7 @@ public void TabRefresh() { lastschriftList.addItem(lastschriften.next()); } + lastschriftList.sort(); } catch (RemoteException e1) { diff --git a/src/de/jost_net/JVerein/gui/control/LehrgangControl.java b/src/de/jost_net/JVerein/gui/control/LehrgangControl.java index f965d0bff..38d63d4ea 100644 --- a/src/de/jost_net/JVerein/gui/control/LehrgangControl.java +++ b/src/de/jost_net/JVerein/gui/control/LehrgangControl.java @@ -231,6 +231,7 @@ public void TabRefresh() { lehrgaengeList.addItem(lehrgaenge.next()); } + lehrgaengeList.sort(); } catch (RemoteException e1) { @@ -301,6 +302,7 @@ public Part getLehrgaengeList() throws RemoteException { lehrgaengeList.addItem(lehrgaenge.next()); } + lehrgaengeList.sort(); } return lehrgaengeList; } diff --git a/src/de/jost_net/JVerein/gui/control/LehrgangsartControl.java b/src/de/jost_net/JVerein/gui/control/LehrgangsartControl.java index 92f8e9e0a..2e50050fa 100644 --- a/src/de/jost_net/JVerein/gui/control/LehrgangsartControl.java +++ b/src/de/jost_net/JVerein/gui/control/LehrgangsartControl.java @@ -186,11 +186,11 @@ public void refreshTable() throws RemoteException lehrgangsartList.removeAll(); DBIterator lehrgangsarten = Einstellungen.getDBService() .createList(Lehrgangsart.class); - lehrgangsarten.setOrder("ORDER BY bezeichnung"); while (lehrgangsarten.hasNext()) { lehrgangsartList.addItem(lehrgangsarten.next()); } + lehrgangsartList.sort(); } } diff --git a/src/de/jost_net/JVerein/gui/control/MailControl.java b/src/de/jost_net/JVerein/gui/control/MailControl.java index e62036ea7..cf347f376 100644 --- a/src/de/jost_net/JVerein/gui/control/MailControl.java +++ b/src/de/jost_net/JVerein/gui/control/MailControl.java @@ -10,43 +10,33 @@ * * 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.control; -import java.io.IOException; -import java.io.StringWriter; import java.rmi.RemoteException; import java.sql.Timestamp; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; -import java.util.Map; import java.util.TreeSet; -import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; -import org.apache.velocity.exception.MethodInvocationException; -import org.apache.velocity.exception.ParseErrorException; -import org.apache.velocity.exception.ResourceNotFoundException; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.Variable.AllgemeineMap; -import de.jost_net.JVerein.Variable.MitgliedMap; -import de.jost_net.JVerein.Variable.VarTools; import de.jost_net.JVerein.gui.action.MailDetailAction; import de.jost_net.JVerein.gui.menu.MailAnhangMenu; import de.jost_net.JVerein.gui.menu.MailAuswahlMenu; import de.jost_net.JVerein.gui.menu.MailMenu; +import de.jost_net.JVerein.gui.util.EvalMail; import de.jost_net.JVerein.io.MailSender; import de.jost_net.JVerein.rmi.Mail; import de.jost_net.JVerein.rmi.MailAnhang; import de.jost_net.JVerein.rmi.MailEmpfaenger; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.util.JVDateFormatDATETIME; -import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBService; import de.willuhn.jameica.gui.AbstractView; @@ -84,7 +74,6 @@ public class MailControl extends FilterControl private TablePart mailsList; - public MailControl(AbstractView view) { super(view); @@ -292,10 +281,9 @@ public void handleAction(Object context) throws ApplicationException { YesNoDialog d = new YesNoDialog(YesNoDialog.POSITION_CENTER); d.setTitle("Mail senden?"); - d.setText("Diese Mail wurde bereits an " - + (getMail().getEmpfaenger().size() - toBeSentCount) - + " der gewählten Empfänger versendet. Wollen Sie diese Mail an alle weiteren " - + toBeSentCount + " Empfänger senden?"); + d.setText( + "Diese Mail wurde bereits an " + (getMail().getEmpfaenger() + .size() - toBeSentCount) + " der gewählten Empfänger versendet. Wollen Sie diese Mail an alle weiteren " + toBeSentCount + " Empfänger senden?"); try { Boolean choice = (Boolean) d.open(); @@ -417,13 +405,13 @@ public String getTxtString() throws RemoteException private void sendeMail(final boolean erneutSenden) throws RemoteException { String text = getTxtString(); - if (text.toLowerCase().contains("" - + Einstellungen.getEinstellung().getMailSignatur(false); + text = text + "
" + Einstellungen.getEinstellung() + .getMailSignatur(false); text = text + ""; } else @@ -436,7 +424,7 @@ private void sendeMail(final boolean erneutSenden) throws RemoteException BackgroundTask t = new BackgroundTask() { - private boolean cancel= false; + private boolean cancel = false; @Override public void run(ProgressMonitor monitor) @@ -465,7 +453,7 @@ public void run(ProgressMonitor monitor) int sentCount = 0; for (final MailEmpfaenger empf : getMail().getEmpfaenger()) { - if(isInterrupted()) + if (isInterrupted()) { monitor.setStatus(ProgressMonitor.STATUS_ERROR); monitor.setStatusText("Mailversand abgebrochen"); @@ -503,8 +491,8 @@ public void run(ProgressMonitor monitor) monitor.log(empf.getMailAdresse() + " - " + e.getMessage()); } zae++; - double proz = (double) zae - / (double) getMail().getEmpfaenger().size() * 100d; + double proz = (double) zae / (double) getMail().getEmpfaenger() + .size() * 100d; monitor.setPercentComplete((int) proz); } monitor.setPercentComplete(100); @@ -543,18 +531,11 @@ public boolean isInterrupted() Application.getController().start(t); } - public Map getVariables(Mitglied m) throws RemoteException - { - Map map = new MitgliedMap().getMap(m, null); - map = new AllgemeineMap().getMap(map); - return map; - } - /** * Speichert die Mail in der DB. - * + * * @param mitversand - * wenn true, wird Spalte Versand auf aktuelles Datum gesetzt. + * wenn true, wird Spalte Versand auf aktuelles Datum gesetzt. */ public void handleStore(boolean mitversand) { @@ -612,8 +593,7 @@ public void handleStore(boolean mitversand) } catch (RemoteException e) { - String fehler = "Fehler bei speichern der Mail: " - + e.getLocalizedMessage(); + String fehler = "Fehler bei speichern der Mail: " + e.getLocalizedMessage(); Logger.error(fehler, e); GUI.getStatusBar().setErrorText(fehler); } @@ -639,7 +619,7 @@ public Part getMailList() throws RemoteException mailsList.setRememberOrder(true); return mailsList; } - + public void TabRefresh() { try @@ -654,19 +634,19 @@ public void TabRefresh() { mailsList.addItem(mails.next()); } + mailsList.sort(); } catch (RemoteException e1) { Logger.error("Fehler", e1); } } - - private DBIterator getMails() throws RemoteException + + private DBIterator getMails() throws RemoteException { DBService service = Einstellungen.getDBService(); DBIterator mails = service.createList(Mail.class); - if (isSuchnameAktiv() && getSuchname().getValue() != null) { String tmpSuchname = (String) getSuchname().getValue(); @@ -676,9 +656,9 @@ private DBIterator getMails() throws RemoteException mails.addFilter("mailempfaenger.mail = mail.id"); mails.join("mitglied"); mails.addFilter("mitglied.id = mailempfaenger.mitglied"); - mails.addFilter("(lower(name) like ? or lower(vorname) like ?) ", + mails.addFilter("(lower(name) like ? or lower(vorname) like ?) ", new Object[] { "%" + tmpSuchname.toLowerCase() + "%", - "%" + tmpSuchname.toLowerCase() + "%"}); + "%" + tmpSuchname.toLowerCase() + "%" }); } } if (isSuchtextAktiv() && getSuchtext().getValue() != null) @@ -686,76 +666,40 @@ private DBIterator getMails() throws RemoteException String tmpSuchtext = (String) getSuchtext().getValue(); if (tmpSuchtext.length() > 0) { - mails.addFilter("(lower(betreff) like ?)", + mails.addFilter("(lower(betreff) like ?)", new Object[] { "%" + tmpSuchtext.toLowerCase() + "%" }); } } - if (isEingabedatumvonAktiv() && getEingabedatumvon().getValue() != null) + if (isEingabedatumvonAktiv() && getEingabedatumvon().getValue() != null) { Date d = (Date) getEingabedatumvon().getValue(); - mails.addFilter("bearbeitung >= ?", new Object[] { new java.sql.Date(d.getTime()) }); + mails.addFilter("bearbeitung >= ?", + new Object[] { new java.sql.Date(d.getTime()) }); } if (isEingabedatumbisAktiv() && getEingabedatumbis().getValue() != null) { Calendar cal = Calendar.getInstance(); cal.setTime((Date) getEingabedatumbis().getValue()); cal.add(Calendar.DAY_OF_MONTH, 1); - mails.addFilter("bearbeitung <= ?", + mails.addFilter("bearbeitung <= ?", new Object[] { new java.sql.Date(cal.getTimeInMillis()) }); } if (isDatumvonAktiv() && getDatumvon().getValue() != null) { Date d = (Date) getDatumvon().getValue(); - mails.addFilter("mail.versand >= ?", new Object[] { new java.sql.Date(d.getTime()) }); + mails.addFilter("mail.versand >= ?", + new Object[] { new java.sql.Date(d.getTime()) }); } if (isDatumbisAktiv() && getDatumbis().getValue() != null) { Calendar cal = Calendar.getInstance(); cal.setTime((Date) getDatumbis().getValue()); cal.add(Calendar.DAY_OF_MONTH, 1); - mails.addFilter("mail.versand <= ?", + mails.addFilter("mail.versand <= ?", new Object[] { new java.sql.Date(cal.getTimeInMillis()) }); } mails.setOrder("ORDER BY betreff"); return mails; } - - public class EvalMail - { - - VelocityContext context = null; - - public EvalMail(MailEmpfaenger empf) throws RemoteException - { - context = new VelocityContext(); - context.put("dateformat", new JVDateFormatTTMMJJJJ()); - context.put("decimalformat", Einstellungen.DECIMALFORMAT); - context.put("email", empf.getMailAdresse()); - context.put("empf", empf.getMitglied()); - Map map = getVariables(empf.getMitglied()); - VarTools.add(context, map); - } - - public String evalBetreff(String betr) throws ParseErrorException, - MethodInvocationException, ResourceNotFoundException, IOException - { - if (context == null) - return null; - StringWriter wbetr = new StringWriter(); - Velocity.evaluate(context, wbetr, "LOG", betr); - return wbetr.getBuffer().toString(); - } - - public String evalText(String txt) throws ParseErrorException, - MethodInvocationException, ResourceNotFoundException, IOException - { - if (context == null) - return null; - StringWriter wtext = new StringWriter(); - Velocity.evaluate(context, wtext, "LOG", txt); - return wtext.getBuffer().toString(); - } - } - } diff --git a/src/de/jost_net/JVerein/gui/control/MailVorlageControl.java b/src/de/jost_net/JVerein/gui/control/MailVorlageControl.java index b2f127d4d..1880361f3 100644 --- a/src/de/jost_net/JVerein/gui/control/MailVorlageControl.java +++ b/src/de/jost_net/JVerein/gui/control/MailVorlageControl.java @@ -10,7 +10,7 @@ * * 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 **********************************************************************/ @@ -75,6 +75,11 @@ public TextInput getBetreff(boolean withFocus) throws RemoteException return betreff; } + public String getBetreffString() + { + return (String) betreff.getValue(); + } + public TextAreaInput getTxt() throws RemoteException { if (txt != null) @@ -87,6 +92,11 @@ public TextAreaInput getTxt() throws RemoteException return txt; } + public String getTxtString() + { + return (String) txt.getValue(); + } + public void handleStore() { try @@ -103,8 +113,7 @@ public void handleStore() } catch (RemoteException e) { - String fehler = "Fehler bei speichern der MailVorlage: " - + e.getLocalizedMessage(); + String fehler = "Fehler bei speichern der MailVorlage: " + e.getLocalizedMessage(); Logger.error(fehler, e); GUI.getStatusBar().setErrorText(fehler); } diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedControl.java index 5bfd6fb7a..2e14dc153 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedControl.java @@ -82,6 +82,7 @@ import de.jost_net.JVerein.io.MitgliederStatistik; import de.jost_net.JVerein.keys.ArtBeitragsart; import de.jost_net.JVerein.keys.Datentyp; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.keys.Zahlungsrhythmus; import de.jost_net.JVerein.keys.Zahlungstermin; import de.jost_net.JVerein.keys.Zahlungsweg; @@ -174,7 +175,9 @@ public class MitgliedControl extends FilterControl private Input ort; - private Input staat; + private SelectNoScrollInput staat; + + private TextInput leitwegID; private DateInput geburtsdatum = null; @@ -220,7 +223,7 @@ public class MitgliedControl extends FilterControl private TextInput ktoiort; - private TextInput ktoistaat; + private SelectNoScrollInput ktoistaat; private EmailInput ktoiemail; @@ -515,16 +518,36 @@ public Input getOrt() throws RemoteException return ort; } - public Input getStaat() throws RemoteException + public SelectNoScrollInput getStaat() throws RemoteException { if (staat != null) { return staat; } - staat = new TextInput(getMitglied().getStaat(), 50); + if (getMitglied().getStaat() != null + && getMitglied().getStaat().length() > 0 + && Staat.getByKey(getMitglied().getStaatCode()) == null) + { + GUI.getStatusBar().setErrorText("Konnte Staat \"" + + getMitglied().getStaat() + "\" nicht finden, bitte anpassen."); + } + staat = new SelectNoScrollInput(Staat.values(), + Staat.getByKey(getMitglied().getStaatCode())); + staat.setPleaseChoose("Nicht gesetzt"); staat.setName("Staat"); return staat; } + + public TextInput getLeitwegID() throws RemoteException + { + if (leitwegID != null) + { + return leitwegID; + } + leitwegID = new TextInput(getMitglied().getLeitwegID()); + leitwegID.setName("LeitwegID"); + return leitwegID; + } public DateInput getGeburtsdatum() throws RemoteException { @@ -965,13 +988,22 @@ public TextInput getKtoiOrt() throws RemoteException return ktoiort; } - public TextInput getKtoiStaat() throws RemoteException + public SelectNoScrollInput getKtoiStaat() throws RemoteException { if (ktoistaat != null) { return ktoistaat; } - ktoistaat = new TextInput(getMitglied().getKtoiStaat(), 50); + if (getMitglied().getKtoiStaat() != null + && getMitglied().getKtoiStaat().length() > 0 + && Staat.getByKey(getMitglied().getKtoiStaatCode()) == null) + { + GUI.getStatusBar().setErrorText("Konnte Kontoinhaber Staat \"" + + getMitglied().getKtoiStaat() + "\" nicht finden, bitte anpassen."); + } + ktoistaat = new SelectNoScrollInput(Staat.values(), + Staat.getByKey(getMitglied().getKtoiStaatCode())); + ktoistaat.setPleaseChoose("Nicht gesetzt"); ktoistaat.setName("Staat"); return ktoistaat; } @@ -1620,6 +1652,7 @@ public void refreshFamilienangehoerigeTable() throws RemoteException m = getMitglied(); familienangehoerige.addItem(m); } + familienangehoerige.sort(); } public Part getFamilienangehoerigenTable() throws RemoteException @@ -1672,9 +1705,9 @@ public Part getZusatzbetraegeTable() throws RemoteException zusatzbetraegeList.addColumn("Startdatum", "startdatum", new DateFormatter(new JVDateFormatTTMMJJJJ())); - zusatzbetraegeList.addColumn("nächste Fälligkeit", "faelligkeit", + zusatzbetraegeList.addColumn("Nächste Fälligkeit", "faelligkeit", new DateFormatter(new JVDateFormatTTMMJJJJ())); - zusatzbetraegeList.addColumn("letzte Ausführung", "ausfuehrung", + zusatzbetraegeList.addColumn("Letzte Ausführung", "ausfuehrung", new DateFormatter(new JVDateFormatTTMMJJJJ())); zusatzbetraegeList.addColumn("Intervall", "intervalltext"); zusatzbetraegeList.addColumn("Endedatum", "endedatum", @@ -1682,6 +1715,13 @@ public Part getZusatzbetraegeTable() throws RemoteException zusatzbetraegeList.addColumn("Buchungstext", "buchungstext"); zusatzbetraegeList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + zusatzbetraegeList.addColumn("Zahlungsweg", "zahlungsweg", new Formatter() { + @Override + public String format(Object o) + { + return new Zahlungsweg((Integer)o).getText(); + } + }); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { zusatzbetraegeList.addColumn("Buchungsklasse", "buchungsklasse", @@ -2140,6 +2180,7 @@ public TablePart refreshMitgliedTable(int atyp) throws RemoteException { part.addItem(m); } + part.sort(); return part; } @@ -2315,6 +2356,10 @@ public void handleStore() m.setGeschlecht((String) getGeschlecht().getValue()); } + else + { + m.setLeitwegID((String) getLeitwegID().getValue()); + } m.setKtoiAdressierungszusatz( (String) getKtoiAdressierungszusatz().getValue()); m.setKtoiAnrede((String) getKtoiAnrede().getValue()); @@ -2324,7 +2369,8 @@ public void handleStore() String persa = (String) getKtoiPersonenart().getValue(); m.setKtoiPersonenart(persa.substring(0, 1)); m.setKtoiPlz((String) getKtoiPlz().getValue()); - m.setKtoiStaat((String) getKtoiStaat().getValue()); + m.setKtoiStaat(getKtoiStaat().getValue() == null ? "" + : ((Staat) getKtoiStaat().getValue()).getKey()); m.setKtoiStrasse((String) getKtoiStrasse().getValue()); m.setKtoiTitel((String) getKtoiTitel().getValue()); m.setKtoiVorname((String) getKtoiVorname().getValue()); @@ -2334,7 +2380,8 @@ public void handleStore() m.setName((String) getName(false).getValue()); m.setOrt((String) getOrt().getValue()); m.setPlz((String) getPlz().getValue()); - m.setStaat((String) getStaat().getValue()); + m.setStaat(getStaat().getValue() == null ? "" + : ((Staat) getStaat().getValue()).getKey()); m.setStrasse((String) getStrasse().getValue()); m.setTelefondienstlich((String) getTelefondienstlich().getValue()); m.setTelefonprivat((String) getTelefonprivat().getValue()); @@ -2929,6 +2976,7 @@ public void refreshMitgliedBeitraegeTabelle() throws RemoteException MitgliedNextBGruppe m = datenIterator.next(); beitragsTabelle.addItem(m); } + beitragsTabelle.sort(); } @Override diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedSuchProfilControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedSuchProfilControl.java index 9c10503fe..e0f474013 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedSuchProfilControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedSuchProfilControl.java @@ -104,6 +104,7 @@ public void refreshSuchprofilList() throws RemoteException Suchprofil sp = (Suchprofil) it.next(); profillist.addItem(sp); } + profillist.sort(); } private DBIterator getIterator() throws RemoteException diff --git a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java index fdeefefcc..af8c8b42d 100644 --- a/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java +++ b/src/de/jost_net/JVerein/gui/control/MitgliedskontoControl.java @@ -16,11 +16,7 @@ **********************************************************************/ package de.jost_net.JVerein.gui.control; -import java.io.IOException; -import java.math.BigDecimal; import java.rmi.RemoteException; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -33,10 +29,12 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.Messaging.MitgliedskontoMessage; +import de.jost_net.JVerein.Queries.SollbuchungQuery; +import de.jost_net.JVerein.gui.formatter.BuchungsartFormatter; +import de.jost_net.JVerein.gui.formatter.BuchungsklasseFormatter; import de.jost_net.JVerein.gui.formatter.ZahlungswegFormatter; import de.jost_net.JVerein.gui.input.BuchungsartInput; import de.jost_net.JVerein.gui.input.BuchungsklasseInput; -import de.jost_net.JVerein.gui.input.MailAuswertungInput; 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; @@ -44,8 +42,6 @@ import de.jost_net.JVerein.gui.view.BuchungView; import de.jost_net.JVerein.gui.view.SollbuchungDetailView; import de.jost_net.JVerein.io.Kontoauszug; -import de.jost_net.JVerein.io.Mahnungsausgabe; -import de.jost_net.JVerein.io.Rechnungsausgabe; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Buchungsart; @@ -54,17 +50,14 @@ 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.pseudo.PseudoIterator; import de.willuhn.datasource.rmi.DBIterator; -import de.willuhn.datasource.rmi.DBService; -import de.willuhn.datasource.rmi.ResultSetExtractor; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; 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.formatter.Formatter; import de.willuhn.jameica.gui.formatter.TreeFormatter; import de.willuhn.jameica.gui.input.AbstractInput; import de.willuhn.jameica.gui.input.CheckboxInput; @@ -92,6 +85,7 @@ public class MitgliedskontoControl extends DruckMailControl public enum DIFFERENZ { EGAL("Egal"), FEHLBETRAG("Fehlbetrag"), UEBERZAHLUNG("Überzahlung"); + private final String titel; private DIFFERENZ(String titel) @@ -126,28 +120,22 @@ public static DIFFERENZ fromString(final String text) private DecimalInput betrag; private AbstractInput buchungsart; - + private SelectInput buchungsklasse; - + private AbstractInput mitglied; - // MitgliedskontoMahnung/RechnungView - public enum TYP - { - RECHNUNG, MAHNUNG - } - private Mitgliedskonto mkto; private TreePart mitgliedskontoTree; - + // SollbuchungListeView, SollbuchungAuswahldialog private TablePart mitgliedskontoList; private TablePart mitgliedskontoList2; private TextInput suchname2 = null; - + private CheckboxInput spezialsuche2 = null; // private CheckboxInput offenePosten = null; @@ -155,9 +143,8 @@ public enum TYP private MitgliedskontoMessageConsumer mc = null; private Action action; - - private boolean umwandeln; + private boolean umwandeln; public MitgliedskontoControl(AbstractView view) { @@ -243,8 +230,8 @@ public SelectInput getZahlungsweg() throws RemoteException z = getMitgliedskonto().getZahlungsweg(); } boolean mitVollzahler = false; - if(getMitglied().getValue() != null && - ((Mitglied) getMitglied().getValue()).getZahlerID() != null) + if (getMitglied().getValue() != null + && ((Mitglied) getMitglied().getValue()).getZahlerID() != null) mitVollzahler = true; ArrayList weg = Zahlungsweg.getArray(mitVollzahler); @@ -288,8 +275,8 @@ public void handleEvent(Event event) try { Buchungsart bua = (Buchungsart) buchungsart.getValue(); - if (buchungsklasse != null && buchungsklasse.getValue() == null && - bua != null) + if (buchungsklasse != null && buchungsklasse.getValue() == null + && bua != null) buchungsklasse.setValue(bua.getBuchungsklasse()); } catch (RemoteException e) @@ -300,25 +287,26 @@ public void handleEvent(Event event) }); return buchungsart; } - + public SelectInput getBuchungsklasse() throws RemoteException { if (buchungsklasse != null) { return buchungsklasse; } - buchungsklasse = new BuchungsklasseInput().getBuchungsklasseInput(buchungsklasse, - getMitgliedskonto().getBuchungsklasse()); + 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(); + Buchungsklasse buchungsKlasse = (Buchungsklasse) getBuchungsklasse() + .getValue(); if (null == buchungsKlasse) return null; Long id = Long.valueOf(buchungsKlasse.getID()); @@ -332,22 +320,6 @@ private Long getSelectedBuchungsKlasseId() throws ApplicationException } } - public Object[] getCVSExportGrenzen(Mitglied selectedMitglied) - { - return new Object[] { - getDatumvon().getValue(), - getDatumbis().getValue(), - getDifferenz().getValue(), getCVSExportGrenzeOhneAbbucher(), - selectedMitglied }; - } - - private Boolean getCVSExportGrenzeOhneAbbucher() - { - if (null == ohneabbucher) - return Boolean.FALSE; - return (Boolean) ohneabbucher.getValue(); - } - public CheckboxInput getSpezialSuche2() { if (spezialsuche2 != null && !spezialsuche2.getControl().isDisposed()) @@ -387,8 +359,8 @@ public TextInput getSuchName1(boolean newcontrol) suchname.setName("Name"); return suchname; } - - //Für SollbuchungAuswahlDialog + + // Für SollbuchungAuswahlDialog public TextInput getSuchName2(boolean newcontrol) { if (!newcontrol && suchname2 != null) @@ -399,7 +371,7 @@ public TextInput getSuchName2(boolean newcontrol) suchname2.setName("Name"); return suchname2; } - + public void handleStore() { try @@ -416,6 +388,10 @@ public void handleStore() throw new ApplicationException("Bitte Mitglied eingeben"); } } + + if (mkto.getRechnung() != null) + throw new ApplicationException( + "Sollbuchung kann nicht geändert werden, es existiert eine Rechnung darüber."); mkto.setBetrag((Double) getBetrag().getValue()); mkto.setDatum((Date) getDatum().getValue()); Zahlungsweg zw = (Zahlungsweg) getZahlungsweg().getValue(); @@ -435,11 +411,12 @@ public void handleStore() mkto.setSteuersatz(steuersatz); if (getBetrag().getValue() != null) { - Double netto = ((Double) getBetrag().getValue() / (1d + (steuersatz / 100d))); + Double netto = ((Double) getBetrag().getValue() + / (1d + (steuersatz / 100d))); mkto.setNettobetrag(netto); mkto.setSteuerbetrag((Double) getBetrag().getValue() - netto); } - + mkto.store(); GUI.getStatusBar().setSuccessText("Sollbuchung gespeichert"); } @@ -459,38 +436,41 @@ public Part getMitgliedskontoTree(Mitglied mitglied) throws RemoteException { mitgliedskontoTree = new TreePart(new MitgliedskontoNode(mitglied), new Action() - { - - @Override - public void handleAction(Object context) throws ApplicationException - { - if (context == null || !(context instanceof MitgliedskontoNode)) { - return; - } - try - { - MitgliedskontoNode mkn = (MitgliedskontoNode) context; - if (mkn.getType() == MitgliedskontoNode.IST) - { - Buchung bu = (Buchung) Einstellungen.getDBService().createObject( - Buchung.class, mkn.getID()); - GUI.startView(BuchungView.class.getName(), bu); - } - if (mkn.getType() == MitgliedskontoNode.SOLL) + + @Override + public void handleAction(Object context) throws ApplicationException { - Mitgliedskonto mk = (Mitgliedskonto) Einstellungen.getDBService().createObject( - Mitgliedskonto.class, mkn.getID()); - GUI.startView(new SollbuchungDetailView(MitgliedskontoNode.SOLL), mk); + if (context == null || !(context instanceof MitgliedskontoNode)) + { + return; + } + try + { + MitgliedskontoNode mkn = (MitgliedskontoNode) context; + if (mkn.getType() == MitgliedskontoNode.IST) + { + Buchung bu = (Buchung) Einstellungen.getDBService() + .createObject(Buchung.class, mkn.getID()); + GUI.startView(BuchungView.class.getName(), bu); + } + if (mkn.getType() == MitgliedskontoNode.SOLL) + { + Mitgliedskonto mk = (Mitgliedskonto) Einstellungen + .getDBService() + .createObject(Mitgliedskonto.class, mkn.getID()); + GUI.startView( + new SollbuchungDetailView(MitgliedskontoNode.SOLL), mk); + } + } + catch (RemoteException e) + { + Logger.error(e.getMessage()); + throw new ApplicationException( + "Fehler beim Editieren der Buchung"); + } } - } - catch (RemoteException e) - { - Logger.error(e.getMessage()); - throw new ApplicationException("Fehler beim Editieren der Buchung"); - } - } - }) + }) { @@ -534,16 +514,19 @@ public void paint(Composite composite) throws RemoteException return mitgliedskontoTree; } - public TablePart getMitgliedskontoList(Action action, ContextMenu menu, boolean umwandeln) - throws RemoteException + public TablePart getMitgliedskontoList(Action action, ContextMenu menu, + boolean umwandeln) throws RemoteException { this.action = action; this.umwandeln = umwandeln; @SuppressWarnings("rawtypes") - GenericIterator mitgliedskonten = getMitgliedskontoIterator(umwandeln); + GenericIterator mitgliedskonten = new SollbuchungQuery(this, umwandeln, + null).get(); if (mitgliedskontoList == null) { - mitgliedskontoList = new SollbuchungListTablePart(mitgliedskonten, action); + mitgliedskontoList = new SollbuchungListTablePart(mitgliedskonten, + action); + mitgliedskontoList.addColumn("Nr", "id-int"); mitgliedskontoList.addColumn("Datum", "datum", new DateFormatter(new JVDateFormatTTMMJJJJ())); mitgliedskontoList.addColumn("Abrechnungslauf", "abrechnungslauf"); @@ -551,8 +534,23 @@ public TablePart getMitgliedskontoList(Action action, ContextMenu menu, boolean mitgliedskontoList.addColumn("Zweck", "zweck1"); mitgliedskontoList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + mitgliedskontoList.addColumn("Zahlungsweg","zahlungsweg", new Formatter() { + @Override + public String format(Object o) + { + return new Zahlungsweg((Integer)o).getText(); + } + }); mitgliedskontoList.addColumn("Zahlungseingang", "istsumme", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + mitgliedskontoList.addColumn("Rechnung", "rechnung"); + mitgliedskontoList.addColumn("Buchungsart", "buchungsart", + new BuchungsartFormatter()); + if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) + { + mitgliedskontoList.addColumn("Buchungsklasse", "buchungsklasse", + new BuchungsklasseFormatter()); + } mitgliedskontoList.setContextMenu(menu); mitgliedskontoList.setRememberColWidths(true); mitgliedskontoList.setRememberOrder(true); @@ -566,6 +564,7 @@ public TablePart getMitgliedskontoList(Action action, ContextMenu menu, boolean { mitgliedskontoList.addItem(mitgliedskonten.next()); } + mitgliedskontoList.sort(); } return mitgliedskontoList; } @@ -593,6 +592,7 @@ public TablePart getMitgliedskontoList2(Action action, ContextMenu menu) { mitgliedskontoList2.addItem(mitglieder.next()); } + mitgliedskontoList2.sort(); } return mitgliedskontoList2; } @@ -605,6 +605,7 @@ private void refreshMitgliedkonto2() throws RemoteException { mitgliedskontoList2.addItem(mitglieder.next()); } + mitgliedskontoList2.sort(); } private GenericIterator getMitgliedIterator() throws RemoteException @@ -647,416 +648,17 @@ private GenericIterator getMitgliedIterator() throws RemoteException return mitglieder; } - public void refreshMitgliedkonto1() throws RemoteException { @SuppressWarnings("rawtypes") - GenericIterator mitgliedskonten = getMitgliedskontoIterator(umwandeln); + GenericIterator mitgliedskonten = new SollbuchungQuery(this, umwandeln, + null).get(); mitgliedskontoList.removeAll(); while (mitgliedskonten.hasNext()) { mitgliedskontoList.addItem(mitgliedskonten.next()); } - } - - @SuppressWarnings("rawtypes") - public GenericIterator getMitgliedskontoIterator(boolean umwandeln) throws RemoteException - { - this.umwandeln = umwandeln; - Date d1 = null; - java.sql.Date vd = null; - java.sql.Date bd = null; - if (datumvon != null) - { - d1 = (Date) datumvon.getValue(); - if (d1 != null) - { - vd = new java.sql.Date(d1.getTime()); - } - } - if (datumbis != null) - { - d1 = (Date) datumbis.getValue(); - if (d1 != null) - { - bd = new java.sql.Date(d1.getTime()); - } - } - - DIFFERENZ diff = DIFFERENZ.EGAL; - if (differenz != null) - { - diff = (DIFFERENZ) differenz.getValue(); - } - - boolean kein_name = suchname == null || suchname.getValue() == null || - ((String) suchname.getValue()).isEmpty(); - boolean ein_name = suchname != null && suchname.getValue() != null && - !((String) suchname.getValue()).isEmpty(); - boolean keine_email = mailAuswahl == null || (Integer) mailAuswahl.getValue() == - MailAuswertungInput.ALLE; - boolean filter_email = mailAuswahl != null && !((Integer) mailAuswahl.getValue() == - MailAuswertungInput.ALLE); - - // Falls kein Name, kein Mailfilter und keine Differenz dann alles lesen - if (kein_name && keine_email && diff == DIFFERENZ.EGAL) - { - DBIterator sollbuchungen = Einstellungen.getDBService() - .createList(Mitgliedskonto.class); - if (vd != null) - { - sollbuchungen.addFilter("mitgliedskonto.datum >= ? ", - new Object[] { vd }); - } - if (bd != null) - { - sollbuchungen.addFilter("mitgliedskonto.datum <= ? ", - new Object[] { bd }); - } - if (ohneabbucher != null && (Boolean) ohneabbucher.getValue()) - { - sollbuchungen.addFilter("mitgliedskonto.zahlungsweg <> ?", - Zahlungsweg.BASISLASTSCHRIFT); - } - return sollbuchungen; - } - - // Falls ein Name oder Mailfilter aber keine Differenz dann alles des Mitglieds lesen - if ((ein_name || filter_email) && diff == DIFFERENZ.EGAL) - { - DBIterator sollbuchungen = Einstellungen.getDBService() - .createList(Mitgliedskonto.class); - - if ((!umwandeln && ein_name) || filter_email) - { - sollbuchungen.join("mitglied"); - sollbuchungen.addFilter("mitglied.id = mitgliedskonto.mitglied"); - } - - if (!umwandeln && ein_name) - { - // Der Name kann so verwendet werden ohne Umwandeln der Umlaute - String name = (String) suchname.getValue(); - sollbuchungen.addFilter("((lower(mitglied.name) like ?)" - + " OR (lower(mitglied.vorname) like ?))", - new Object[] {name.toLowerCase() + "%", name.toLowerCase() + "%"}); - } - else if (umwandeln && ein_name) - { - // Der Name muss umgewandelt werden, es kann mehrere Matches geben - ArrayList namenids = getNamenIds(); - if (namenids != null) - { - int anzahl = namenids.size(); - String querystring = null; - - for (int i = 1; i <= anzahl; i++) - { - if (anzahl == 1) - { - querystring = "(mitgliedskonto.mitglied = ?) "; - } - else if (i == 1) - { - querystring = "((mitgliedskonto.mitglied = ?) OR "; - } - else if (i < anzahl) - { - querystring = querystring + "(mitgliedskonto.mitglied = ?) OR "; - } - else if (i == anzahl) - { - querystring = querystring + "(mitgliedskonto.mitglied = ?)) "; - } - } - sollbuchungen.addFilter(querystring, namenids.toArray() ); - } - } - - if (vd != null) - { - sollbuchungen.addFilter("(mitgliedskonto.datum >= ?) ", - new Object[] { vd }); - } - if (bd != null) - { - sollbuchungen.addFilter("(mitgliedskonto.datum <= ?) ", - new Object[] { bd }); - } - if (ohneabbucher != null && (Boolean) ohneabbucher.getValue()) - { - sollbuchungen.addFilter("mitgliedskonto.zahlungsweg <> ?", - Zahlungsweg.BASISLASTSCHRIFT); - } - if (filter_email) - { - int mailauswahl = (Integer) mailAuswahl.getValue(); - if (mailauswahl == MailAuswertungInput.OHNE) - { - sollbuchungen.addFilter("(email is null or length(email) = 0)"); - } - if (mailauswahl == MailAuswertungInput.MIT) - { - sollbuchungen.addFilter("(email is not null and length(email) > 0)"); - } - } - return sollbuchungen; - } - - // Eine Differenz ist ausgewählt - final DBService service = Einstellungen.getDBService(); - String sql = "SELECT mitgliedskonto.id, mitglied.name, mitglied.vorname, " - + " mitgliedskonto.betrag, sum(buchung.betrag) FROM mitgliedskonto " - + "JOIN mitglied on (mitgliedskonto.mitglied = mitglied.id) " - + "LEFT JOIN buchung on mitgliedskonto.id = buchung.mitgliedskonto "; - String where = ""; - ArrayList param = new ArrayList<>(); - if (suchname != null && suchname.getValue() != null && - !((String) suchname.getValue()).isEmpty() && umwandeln == false) - { - // Der Name kann so verwendet werden ohne Umwandeln der Umlaute - String tmpSuchname = (String) suchname.getValue(); - where += (where.length() > 0 ? "and " : "") - + "((lower(mitglied.name) like ?) OR (lower(mitglied.vorname) like ?)) "; - param.add(tmpSuchname.toLowerCase() + "%"); - param.add(tmpSuchname.toLowerCase() + "%"); - } - else if (suchname != null && suchname.getValue() != null && - !((String) suchname.getValue()).isEmpty() && umwandeln == true) - { - // Der Name muss umgewandelt werden, es kann mehrere Matches geben - ArrayList namenids = getNamenIds(); - if (namenids != null) - { - int count = 0; - int anzahl = namenids.size(); - for (BigDecimal id: namenids) - { - count++; - if (anzahl == 1) - { - where += (where.length() > 0 ? "and " : "") - + "mitgliedskonto.mitglied = ? "; - } - else if (count == 1) - { - where += (where.length() > 0 ? "and " : "") - + "(mitgliedskonto.mitglied = ? "; - } - else if (count < anzahl) - { - where += " OR mitgliedskonto.mitglied = ? "; - } - else if (count == anzahl) - { - where += " OR mitgliedskonto.mitglied = ?) "; - } - param.add(id); - } - } - } - if (vd != null) - { - where += (where.length() > 0 ? "and " : "") - + "mitgliedskonto.datum >= ? "; - param.add(vd); - } - if (bd != null) - { - where += (where.length() > 0 ? "and " : "") - + "mitgliedskonto.datum <= ? "; - param.add(bd); - } - if (ohneabbucher != null && (Boolean) ohneabbucher.getValue()) - { - where += (where.length() > 0 ? "and " : "") - +"mitgliedskonto.zahlungsweg <> ?"; - param.add(Zahlungsweg.BASISLASTSCHRIFT); - } - if (filter_email) - { - int mailauswahl = (Integer) mailAuswahl.getValue(); - if (mailauswahl == MailAuswertungInput.OHNE) - { - where += (where.length() > 0 ? "and " : "") - + "(email is null or length(email) = 0)"; - } - if (mailauswahl == MailAuswertungInput.MIT) - { - where += (where.length() > 0 ? "and " : "") - + "(email is not null and length(email) > 0)"; - } - } - - if (where.length() > 0) - { - sql += "WHERE " + where; - } - sql += "group by mitgliedskonto.id "; - - if (DIFFERENZ.FEHLBETRAG == diff) - { - sql += "having sum(buchung.betrag) < mitgliedskonto.betrag or " - + "(sum(buchung.betrag) is null and mitgliedskonto.betrag > 0) "; - } - if (DIFFERENZ.UEBERZAHLUNG == diff) - { - sql += "having sum(buchung.betrag) > mitgliedskonto.betrag "; - } - sql += "order by mitglied.name, mitglied.vorname, mitgliedskonto.datum desc"; - @SuppressWarnings("unchecked") - ArrayList mitgliedskonten = (ArrayList) service.execute(sql, - param.toArray(), new ResultSetExtractor() - { - @Override - public Object extract(ResultSet rs) - throws RemoteException, SQLException - { - ArrayList list = new ArrayList<>(); - while (rs.next()) - { - list.add( - (Mitgliedskonto) service.createObject(Mitgliedskonto.class, rs.getString(1))); - } - return list; - } - }); - - return PseudoIterator.fromArray( - mitgliedskonten.toArray(new GenericObject[mitgliedskonten.size()])); - } - - private ArrayList getNamenIds() throws RemoteException - { - DBService service = Einstellungen.getDBService(); - String sql = "SELECT mitglied.id, mitglied.name, mitglied.vorname from mitglied"; - - @SuppressWarnings("unchecked") - ArrayList mitgliedids = (ArrayList) service.execute(sql, - new Object[] { }, new ResultSetExtractor() - { - @Override - public Object extract(ResultSet rs) - throws RemoteException, SQLException - { - ArrayList ergebnis = new ArrayList<>(); - - // In case the text search input is used, we calculate - // an "equality" score for each Mitglied entry. - // Only the entries with - // score == maxScore will be shown. - Integer maxScore = 0; - int count = 0; - String name = reduceWord((String) suchname.getValue()); - BigDecimal mgid = null; - String nachname = null; - String vorname = null; - while (rs.next()) - { - count++; - // Nur die ids der Mitglieder speichern - mgid = rs.getBigDecimal(1); - - StringTokenizer tok = new StringTokenizer(name, " ,-"); - Integer score = 0; - nachname = reduceWord(rs.getString(2)); - vorname = reduceWord(rs.getString(3)); - while (tok.hasMoreElements()) - { - String nextToken = tok.nextToken(); - if (nextToken.length() > 2) - { - score += scoreWord(nextToken, nachname); - score += scoreWord(nextToken, vorname); - } - } - - if (maxScore < score) - { - maxScore = score; - // We found a Mitgliedskonto matching with a higher equality - // score, so we drop all previous matches, because they were - // less equal. - ergebnis.clear(); - } - else if (maxScore > score) - { - // This match is worse, so skip it. - continue; - } - ergebnis.add(mgid); - } - if (ergebnis.size() != count) - { - return ergebnis; - } - else - { - // Kein Match - return null; - } - } - }); - return mitgliedids; - } - - public Integer scoreWord(String word, String in) - { - Integer wordScore = 0; - StringTokenizer tok = new StringTokenizer(in, " ,-"); - - while (tok.hasMoreElements()) - { - String nextToken = tok.nextToken(); - - // Full match is twice worth - if (nextToken.equals(word)) - { - wordScore += 2; - } - else if (nextToken.contains(word)) - { - wordScore += 1; - } - } - - return wordScore; - } - - public String reduceWord(String word) - { - // We replace "ue" -> "u" and "ü" -> "u", because some bank institutions - // remove the dots "ü" -> "u". So we get "u" == "ü" == "ue". - return word.toLowerCase().replaceAll("ä", "a").replaceAll("ae", "a") - .replaceAll("ö", "o").replaceAll("oe", "o").replaceAll("ü", "u") - .replaceAll("ue", "u").replaceAll("ß", "s").replaceAll("ss", "s"); - } - - public Button getStartRechnungButton(final Object currentObject) - { - Button button = new Button("Starten", new Action() - { - - @Override - public void handleAction(Object context) - { - try - { - generiereRechnung(currentObject); - } - catch (RemoteException e) - { - Logger.error("", e); - GUI.getStatusBar().setErrorText(e.getMessage()); - } - catch (IOException e) - { - Logger.error("", e); - GUI.getStatusBar().setErrorText(e.getMessage()); - } - } - }, null, true, "walking.png"); - return button; + mitgliedskontoList.sort(); } public Button getStartKontoauszugButton(final Object currentObject, @@ -1083,45 +685,6 @@ public void handleAction(Object context) return button; } - private void generiereRechnung(Object currentObject) throws IOException - { - saveDruckMailSettings(); - new Rechnungsausgabe(this); - } - - public Button getStartMahnungButton(final Object currentObject) - { - Button button = new Button("Starten", new Action() - { - - @Override - public void handleAction(Object context) - { - try - { - generiereMahnung(currentObject); - } - catch (RemoteException e) - { - Logger.error("", e); - GUI.getStatusBar().setErrorText(e.getMessage()); - } - catch (IOException e) - { - Logger.error("", e); - GUI.getStatusBar().setErrorText(e.getMessage()); - } - } - }, null, true, "walking.png"); - return button; - } - - private void generiereMahnung(Object currentObject) throws IOException - { - saveDruckMailSettings(); - new Mahnungsausgabe(this); - } - // Für Sollbuchungen View public void TabRefresh() { @@ -1137,7 +700,7 @@ public void TabRefresh() } } } - + // Für SollbuchungAuswahlDialog public void refreshMitgliedskontoList1() { @@ -1150,7 +713,7 @@ public void refreshMitgliedskontoList1() Logger.error("Fehler", e); } } - + // Für SollbuchungAuswahlDialog public void refreshMitgliedskontoList2() { @@ -1254,9 +817,8 @@ public void run() public String getInfoText(Object selection) { Mitglied[] mitglieder = null; - Mitgliedskonto[] sollbuchungen = null; String text = ""; - + if (selection instanceof Mitglied) { mitglieder = new Mitglied[] { (Mitglied) selection }; @@ -1265,48 +827,23 @@ else if (selection instanceof Mitglied[]) { mitglieder = (Mitglied[]) selection; } - else if (selection instanceof Mitgliedskonto) - { - sollbuchungen = new Mitgliedskonto[] { (Mitgliedskonto) selection }; - } - else if (selection instanceof Mitgliedskonto[]) - { - sollbuchungen = (Mitgliedskonto[]) selection; - } else { return ""; } - + try { // Aufruf aus Mitglieder View if (mitglieder != null) { - text = "Es wurden " + mitglieder.length + - " Mitglieder ausgewählt" + text = "Es wurden " + mitglieder.length + " Mitglieder ausgewählt" + "\nFolgende Mitglieder haben keine Mailadresse:"; - for (Mitglied m: mitglieder) + for (Mitglied m : mitglieder) { - if ( m.getEmail() == null || m.getEmail().isEmpty()) + if (m.getEmail() == null || m.getEmail().isEmpty()) { - text = text + "\n - " + m.getName() - + ", " + m.getVorname(); - } - } - } - else if (sollbuchungen != null) - { - text = "Es wurden " + sollbuchungen.length + - " Sollbuchungen ausgewählt" - + "\nFolgende Mitglieder haben keine Mailadresse:"; - for (Mitgliedskonto s: sollbuchungen) - { - Mitglied m = s.getMitglied(); - if (m != null && ( m.getEmail() == null || m.getEmail().isEmpty())) - { - text = text + "\n - " + m.getName() - + ", " + m.getVorname(); + text = text + "\n - " + m.getName() + ", " + m.getVorname(); } } } @@ -1327,8 +864,9 @@ public Input getMitglied() throws RemoteException if (getMitgliedskonto().getMitglied() != null) { - Mitglied[] mitgliedArray = {getMitgliedskonto().getMitglied()}; - mitglied = new SelectInput(mitgliedArray, getMitgliedskonto().getMitglied()); + Mitglied[] mitgliedArray = { getMitgliedskonto().getMitglied() }; + mitglied = new SelectInput(mitgliedArray, + getMitgliedskonto().getMitglied()); mitglied.setEnabled(false); } else @@ -1340,7 +878,7 @@ public Input getMitglied() throws RemoteException mitglied.setMandatory(true); return mitglied; } - + public class MitgliedListener implements Listener { @@ -1354,9 +892,10 @@ public void handleEvent(Event event) try { @SuppressWarnings("unchecked") - ArrayList list = (ArrayList) getZahlungsweg().getList(); + ArrayList list = (ArrayList) getZahlungsweg() + .getList(); list.remove(new Zahlungsweg(Zahlungsweg.VOLLZAHLER)); - if(((Mitglied) getMitglied().getValue()).getZahlerID() != null) + if (((Mitglied) getMitglied().getValue()).getZahlerID() != null) list.add(new Zahlungsweg(Zahlungsweg.VOLLZAHLER)); getZahlungsweg().setList(list); } @@ -1366,5 +905,23 @@ public void handleEvent(Event event) } } } - + + public boolean hasRechnung() throws RemoteException + { + if (getMitgliedskonto().getRechnung() != null) + { + GUI.getStatusBar().setErrorText( + "Sollbuchung kann nicht bearbeitet werden. Es wurde bereits eine Rechnung über diese Sollbuchung erstellt."); + return true; + } + return false; + } + + public Object[] getCVSExportGrenzen() throws RemoteException + { + return new Object[] { getSuchname().getValue(), getDifferenz().getValue(), + getOhneAbbucher().getValue(), getDatumvon().getValue(), + getDatumbis().getValue(), getMailauswahl().getValue() }; + } + } diff --git a/src/de/jost_net/JVerein/gui/control/MittelverwendungControl.java b/src/de/jost_net/JVerein/gui/control/MittelverwendungControl.java new file mode 100644 index 000000000..2ff931708 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/control/MittelverwendungControl.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.gui.control; + +import java.io.File; +import java.rmi.RemoteException; +import java.util.ArrayList; +import java.util.Date; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.FileDialog; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.gui.parts.MittelverwendungList; +import de.jost_net.JVerein.io.MittelverwendungExportCSV; +import de.jost_net.JVerein.io.MittelverwendungExportPDF; +import de.jost_net.JVerein.io.MittelverwendungZeile; +import de.jost_net.JVerein.util.Dateiname; +import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; +import de.willuhn.jameica.gui.AbstractView; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.Part; +import de.willuhn.jameica.gui.parts.Button; +import de.willuhn.jameica.system.Application; +import de.willuhn.jameica.system.BackgroundTask; +import de.willuhn.jameica.system.Settings; +import de.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +public class MittelverwendungControl extends SaldoControl +{ + + private MittelverwendungList saldoList; + + final static String ExportPDF = "PDF"; + + final static String ExportCSV = "CSV"; + + public MittelverwendungControl(AbstractView view) + { + super(view); + } + + public Button getPDFExportButton() + { + Button b = new Button("PDF", new Action() + { + @Override + public void handleAction(Object context) throws ApplicationException + { + starteExport(ExportPDF); + } + }, null, false, "file-pdf.png"); + // button + return b; + } + + public Button getCSVExportButton() + { + Button b = new Button("CSV", new Action() + { + @Override + public void handleAction(Object context) throws ApplicationException + { + starteExport(ExportCSV); + } + }, null, false, "xsd.png"); + // button + return b; + } + + public void handleStore() + { + // + } + + public Part getSaldoList() throws ApplicationException + { + try + { + if (getDatumvon().getDate() != null) + { + settings.setAttribute("von", + new JVDateFormatTTMMJJJJ().format(getDatumvon().getDate())); + settings.setAttribute("bis", + new JVDateFormatTTMMJJJJ().format(getDatumbis().getDate())); + } + + if (saldoList == null) + { + saldoList = new MittelverwendungList(null, + datumvon.getDate(), datumbis.getDate()); + } + else + { + settings.setAttribute("von", + new JVDateFormatTTMMJJJJ().format(getDatumvon().getDate())); + + saldoList.setDatumvon(datumvon.getDate()); + saldoList.setDatumbis(datumbis.getDate()); + ArrayList zeile = saldoList.getInfo(); + saldoList.removeAll(); + for (MittelverwendungZeile sz : zeile) + { + saldoList.addItem(sz); + } + } + } + catch (RemoteException e) + { + throw new ApplicationException( + String.format("Fehler aufgetreten %s", e.getMessage())); + } + return saldoList.getSaldoList(); + } + + private void starteExport(String type) throws ApplicationException + { + try + { + ArrayList zeilen = saldoList.getInfo(); + + FileDialog fd = new FileDialog(GUI.getShell(), SWT.SAVE); + fd.setText("Ausgabedatei wählen."); + // + Settings settings = new Settings(this.getClass()); + // + String path = settings.getString("lastdir", + System.getProperty("user.home")); + if (path != null && path.length() > 0) + { + fd.setFilterPath(path); + } + fd.setFileName(new Dateiname("mittelverwendungsrechnung", "", + Einstellungen.getEinstellung().getDateinamenmuster(), type).get()); + + final String s = fd.open(); + + if (s == null || s.length() == 0) + { + return; + } + + final File file = new File(s); + settings.setAttribute("lastdir", file.getParent()); + + exportSaldo(zeilen, file, getDatumvon().getDate(), + getDatumbis().getDate(), type); + } + catch (RemoteException e) + { + throw new ApplicationException( + String.format("Fehler beim Aufbau des Reports: %s", e.getMessage())); + } + } + + private void exportSaldo(final ArrayList zeile, + final File file, final Date datumvon, final Date datumbis, + final String type) + { + BackgroundTask t = new BackgroundTask() + { + @Override + public void run(ProgressMonitor monitor) throws ApplicationException + { + try + { + if (type.equals(ExportCSV)) + new MittelverwendungExportCSV(zeile, file, datumvon, datumbis); + else if (type.equals(ExportPDF)) + new MittelverwendungExportPDF(zeile, file, datumvon, datumbis); + GUI.getCurrentView().reload(); + } + catch (ApplicationException ae) + { + GUI.getStatusBar().setErrorText(ae.getMessage()); + throw ae; + } + } + + @Override + public void interrupt() + { + // + } + + @Override + public boolean isInterrupted() + { + return false; + } + }; + Application.getController().start(t); + } + +} diff --git a/src/de/jost_net/JVerein/gui/control/PreNotificationControl.java b/src/de/jost_net/JVerein/gui/control/PreNotificationControl.java index f89533c7b..088cada86 100644 --- a/src/de/jost_net/JVerein/gui/control/PreNotificationControl.java +++ b/src/de/jost_net/JVerein/gui/control/PreNotificationControl.java @@ -65,6 +65,7 @@ import de.willuhn.jameica.system.OperationCanceledException; import de.willuhn.jameica.system.Settings; import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; import de.willuhn.util.ProgressMonitor; public class PreNotificationControl extends DruckMailControl @@ -251,7 +252,7 @@ public void handleAction(Object context) } private void generierePDF(Object currentObject, boolean mitMail, - String pdfMode) throws IOException + String pdfMode) throws IOException, ApplicationException { ArrayList lastschriften = new ArrayList<>(); if (currentObject instanceof Abrechnungslauf) @@ -377,7 +378,7 @@ else if (currentObject instanceof Lastschrift[]) .createObject(Formular.class, form.getID()); if (!einzelnePdfs) { - fa = new FormularAufbereitung(file); + fa = new FormularAufbereitung(file, false); } int dateinummer = 0; @@ -404,7 +405,7 @@ else if (currentObject instanceof Lastschrift[]) sb.append(postfix); final File fx = new File(sb.toString()); - fa = new FormularAufbereitung(fx); + fa = new FormularAufbereitung(fx, false); } aufbereitenFormular(ls, fo); @@ -599,11 +600,12 @@ else if (currentObject instanceof Lastschrift[]) } private void aufbereitenFormular(Lastschrift ls, Formular fo) - throws RemoteException + throws RemoteException, ApplicationException { Map map = new LastschriftMap().getMap(ls, null); map = new AllgemeineMap().getMap(map); fa.writeForm(fo, map); + fo.store(); } private void sendeMail(final ArrayList lastschriften, final String betr, diff --git a/src/de/jost_net/JVerein/gui/control/ProjektControl.java b/src/de/jost_net/JVerein/gui/control/ProjektControl.java index a3e7fab9a..54b9fdb4f 100644 --- a/src/de/jost_net/JVerein/gui/control/ProjektControl.java +++ b/src/de/jost_net/JVerein/gui/control/ProjektControl.java @@ -25,11 +25,10 @@ import de.jost_net.JVerein.rmi.Projekt; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.datasource.rmi.DBIterator; -import de.willuhn.datasource.rmi.DBService; -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.DateFormatter; import de.willuhn.jameica.gui.input.DateInput; import de.willuhn.jameica.gui.input.Input; import de.willuhn.jameica.gui.input.TextInput; @@ -38,11 +37,9 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -public class ProjektControl extends AbstractControl +public class ProjektControl extends FilterControl { - private de.willuhn.jameica.system.Settings settings; - private TablePart projektList; private Input bezeichnung; @@ -77,6 +74,8 @@ public Input getBezeichnung() throws RemoteException return bezeichnung; } bezeichnung = new TextInput(getProjekt().getBezeichnung(), 50); + bezeichnung.setName("Bezeichnung"); + bezeichnung.setMandatory(true); return bezeichnung; } @@ -94,8 +93,6 @@ public Input getStartDatum() throws RemoteException } startDatum = new DateInput(d, new JVDateFormatTTMMJJJJ()); startDatum.setName("Startdatum"); - startDatum.setTitle("Startdatum"); - startDatum.setText("Bitte Startdatum w?hlen"); return startDatum; } @@ -113,8 +110,6 @@ public Input getEndeDatum() throws RemoteException } endeDatum = new DateInput(d, new JVDateFormatTTMMJJJJ()); endeDatum.setName("Endedatum"); - endeDatum.setTitle("Endedatum"); - endeDatum.setText("Bitte Endedatum w?hlen"); return endeDatum; } @@ -150,14 +145,16 @@ public void handleStore() public Part getProjektList() throws RemoteException { - DBService service = Einstellungen.getDBService(); - DBIterator projekte = service.createList(Projekt.class); - projekte.setOrder("ORDER BY bezeichnung"); - - projektList = new TablePart(projekte, new ProjektAction()); + if (projektList != null) + { + return projektList; + } + projektList = new TablePart(getProjekte(), new ProjektAction()); projektList.addColumn("Bezeichnung", "bezeichnung"); - projektList.addColumn("Startdatum", "startdatum"); - projektList.addColumn("Endedatum", "endedatum"); + projektList.addColumn("Startdatum", "startdatum", + new DateFormatter(new JVDateFormatTTMMJJJJ())); + projektList.addColumn("Endedatum", "endedatum", + new DateFormatter(new JVDateFormatTTMMJJJJ())); projektList.setContextMenu(new ProjektMenu()); projektList.setRememberColWidths(true); projektList.setRememberOrder(true); @@ -165,4 +162,63 @@ public Part getProjektList() throws RemoteException return projektList; } + public void TabRefresh() + { + if (projektList == null) + { + return; + } + projektList.removeAll(); + try + { + DBIterator projekte = getProjekte(); + while (projekte.hasNext()) + { + projektList.addItem(projekte.next()); + } + projektList.sort(); + } + catch (RemoteException e1) + { + Logger.error("Fehler", e1); + } + } + + private DBIterator getProjekte() throws RemoteException + { + DBIterator projekte = Einstellungen.getDBService() + .createList(Projekt.class); + + if (isSuchtextAktiv() && getSuchtext().getValue() != null) + { + String tmpSuchtext = (String) getSuchtext().getValue(); + if (tmpSuchtext.length() > 0) + { + projekte.addFilter("(lower(bezeichnung) like ?)", + new Object[] { "%" + tmpSuchtext.toLowerCase() + "%"}); + } + } + if (isDatumvonAktiv() && getDatumvon().getValue() != null) + { + projekte.addFilter("startdatum >= ?", + new Object[] { (Date) getDatumvon().getValue() }); + } + if (isDatumbisAktiv() && getDatumbis().getValue() != null) + { + projekte.addFilter("startdatum <= ?", + new Object[] { (Date) getDatumbis().getValue() }); + } + if (isEingabedatumvonAktiv() && getEingabedatumvon().getValue() != null) + { + projekte.addFilter("endedatum >= ?", + new Object[] { (Date) getEingabedatumvon().getValue() }); + } + if (isEingabedatumbisAktiv() && getEingabedatumbis().getValue() != null) + { + projekte.addFilter("endedatum <= ?", + new Object[] { (Date) getEingabedatumbis().getValue() }); + } + projekte.setOrder("ORDER BY bezeichnung"); + return projekte; + } } diff --git a/src/de/jost_net/JVerein/gui/control/QIFBuchungsImportControl.java b/src/de/jost_net/JVerein/gui/control/QIFBuchungsImportControl.java index 1e5294614..1c6849a96 100644 --- a/src/de/jost_net/JVerein/gui/control/QIFBuchungsImportControl.java +++ b/src/de/jost_net/JVerein/gui/control/QIFBuchungsImportControl.java @@ -790,7 +790,7 @@ private Buchung buchungUebernehmen(QIFImportPos importPos, Konto konto) Buchung buchung = BuchungNoCheck.getNewInstanze(); buchung.setArt(importPos.getBeleg()); buchung.setBetrag(importPos.getBetrag().doubleValue()); - buchung.setBuchungsart(importPos.getBuchungsartId()); + buchung.setBuchungsartId(importPos.getBuchungsartId()); buchung.setDatum(importPos.getDatum()); buchung.setKommentar("Importiert von externen Programm"); buchung.setKonto(konto); diff --git a/src/de/jost_net/JVerein/gui/control/RechnungControl.java b/src/de/jost_net/JVerein/gui/control/RechnungControl.java new file mode 100644 index 000000000..8f08dc8d3 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/control/RechnungControl.java @@ -0,0 +1,806 @@ +/********************************************************************** + * 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.control; + +import java.rmi.RemoteException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.List; + +import org.eclipse.swt.widgets.TreeItem; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.gui.action.RechnungAction; +import de.jost_net.JVerein.gui.control.MitgliedskontoControl.DIFFERENZ; +import de.jost_net.JVerein.gui.input.BICInput; +import de.jost_net.JVerein.gui.input.FormularInput; +import de.jost_net.JVerein.gui.input.GeschlechtInput; +import de.jost_net.JVerein.gui.input.IBANInput; +import de.jost_net.JVerein.gui.input.MailAuswertungInput; +import de.jost_net.JVerein.gui.input.PersonenartInput; +import de.jost_net.JVerein.gui.menu.RechnungMenu; +import de.jost_net.JVerein.io.Rechnungsausgabe; +import de.jost_net.JVerein.keys.FormularArt; +import de.jost_net.JVerein.keys.Zahlungsweg; +import de.jost_net.JVerein.rmi.Formular; +import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.Rechnung; +import de.jost_net.JVerein.server.RechnungNode; +import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; +import de.jost_net.JVerein.util.StringTool; +import de.willuhn.datasource.GenericIterator; +import de.willuhn.datasource.GenericObject; +import de.willuhn.datasource.pseudo.PseudoIterator; +import de.willuhn.datasource.rmi.DBIterator; +import de.willuhn.datasource.rmi.ResultSetExtractor; +import de.willuhn.jameica.gui.AbstractView; +import de.willuhn.jameica.gui.Action; +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.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; + + private TextInput mitglied; + + private DecimalInput betrag; + + private TablePart buchungList; + + private TextInput anrede; + + private TextInput titel; + + private TextInput name; + + private TextInput vorname; + + private TextInput strasse; + + private TextInput adressierungszusatz; + + private TextInput ort; + + private TextInput plz; + + private TextInput staat; + + private GeschlechtInput geschlecht; + + private FormularInput rechnungFormular; + + private TextInput nummer; + + private IBANInput iban; + + private BICInput bic; + + private TextInput mandatid; + + private DateInput mandatdatum; + + private TextInput personenart; + + private TextInput leitwegID; + + public enum TYP + { + RECHNUNG, MAHNUNG + } + + public RechnungControl(AbstractView view) + { + super(view); + settings = new de.willuhn.jameica.system.Settings(this.getClass()); + settings.setStoreWhenRead(true); + } + + @SuppressWarnings("unchecked") + public Part getRechnungList() throws RemoteException + { + if (rechnungList != null) + { + return rechnungList; + } + GenericIterator rechnungen = getRechnungIterator(); + rechnungList = new TablePart(rechnungen, new RechnungAction()); + rechnungList.addColumn("Nr", "id-int"); + rechnungList.addColumn("Rechnungsdatum", "datum", + new DateFormatter(new JVDateFormatTTMMJJJJ())); + rechnungList.addColumn("Mitglied", "mitglied"); + rechnungList.addColumn("Betrag", "betrag", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + + rechnungList.setRememberColWidths(true); + rechnungList.setContextMenu(new RechnungMenu()); + rechnungList.setRememberOrder(true); + rechnungList.addFeature(new FeatureSummary()); + rechnungList.setMulti(true); + 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; + Button button = new Button("Starten", new Action() + { + + @Override + public void handleAction(Object context) + { + try + { + saveDruckMailSettings(); + new Rechnungsausgabe(control,RechnungControl.TYP.RECHNUNG); + } + catch (Exception e) + { + Logger.error("", e); + GUI.getStatusBar().setErrorText(e.getMessage()); + } + } + }, null, true, "walking.png"); + return button; + } + + public Button getStartMahnungButton(final Object currentObject) + { + final RechnungControl control = this; + Button button = new Button("Starten", new Action() + { + + @Override + public void handleAction(Object context) + { + try + { + saveDruckMailSettings(); + new Rechnungsausgabe(control,RechnungControl.TYP.MAHNUNG); + } + catch (Exception e) + { + Logger.error("", e); + GUI.getStatusBar().setErrorText(e.getMessage()); + } + } + }, null, true, "walking.png"); + return button; + } + + @SuppressWarnings("unchecked") + public void TabRefresh() + { + try + { + if (rechnungList != null) + { + rechnungList.removeAll(); + GenericIterator rechnungen = getRechnungIterator(); + while (rechnungen.hasNext()) + { + rechnungList.addItem(rechnungen.next()); + } + rechnungList.sort(); + } + else if (rechnungTree != null) + { + rechnungTree.removeAll(); + rechnungTree.setList(Arrays.asList(new RechnungNode(this))); + } + } + catch (RemoteException e1) + { + Logger.error("Fehler", e1); + } + } + + @SuppressWarnings("rawtypes") + public GenericIterator getRechnungIterator() throws RemoteException + { + DBIterator rechnungenIt = Einstellungen.getDBService() + .createList(Rechnung.class); + + if (datumvon != null && datumvon.getValue() != null) + { + rechnungenIt.addFilter("rechnung.datum >= ? ", + new Object[] { datumvon.getValue() }); + } + if (datumbis != null && datumbis.getValue() != null) + { + rechnungenIt.addFilter("rechnung.datum <= ? ", + new Object[] { datumbis.getValue() }); + } + + // Wenn Filtern nach Name, Mail oder "Ohne Abbucher" JOIN mitglied + if ((suchname != null && suchname.getValue() != null + && !((String) suchname.getValue()).isEmpty()) + || (mailAuswahl != null + && (Integer) mailAuswahl.getValue() != MailAuswertungInput.ALLE) + || (ohneabbucher != null && (Boolean) ohneabbucher.getValue())) + { + rechnungenIt.join("mitglied"); + rechnungenIt.addFilter("mitglied.id = rechnung.mitglied"); + } + + if (suchname != null && suchname.getValue() != null + && !((String) suchname.getValue()).isEmpty()) + { + rechnungenIt.addFilter( + "((lower(mitglied.name) like ?) OR (lower(mitglied.vorname) like ?))", + new Object[] { ((String) suchname.getValue()).toLowerCase() + "%", + ((String) suchname.getValue()).toLowerCase() + "%" }); + } + + if (mailAuswahl != null + && (Integer) mailAuswahl.getValue() != MailAuswertungInput.ALLE) + { + if ((Integer) mailAuswahl.getValue() == MailAuswertungInput.OHNE) + rechnungenIt.addFilter( + "(mitglied.email is null or length(mitglied.email) = 0)"); + else + rechnungenIt.addFilter( + "(mitglied.email is not null and length(mitglied.email) > 0)"); + } + + if (ohneabbucher != null && (Boolean) ohneabbucher.getValue()) + { + rechnungenIt.addFilter("mitglied.zahlungsweg <> ?", + Zahlungsweg.BASISLASTSCHRIFT); + } + + if (isDifferenzAktiv() && getDifferenz().getValue() != DIFFERENZ.EGAL) + { + String sql = "SELECT DISTINCT mitgliedskonto.rechnung, mitgliedskonto.betrag, " + + "sum(buchung.betrag) FROM mitgliedskonto " + + "LEFT JOIN buchung on mitgliedskonto.id = buchung.mitgliedskonto " + + "WHERE mitgliedskonto.rechnung is not null " + + "group by mitgliedskonto.id "; + if (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 PseudoIterator.fromArray(new GenericObject[] {}); + rechnungenIt.addFilter("rechnung.id in (" + String.join(",", diffIds) + ")"); + } + + return rechnungenIt; + } + + public Button getRechnungErstellenButton() + { + Button b = new Button("Erstellen", new Action() + { + + @SuppressWarnings("rawtypes") + @Override + public void handleAction(Object context) throws ApplicationException + { + try + { + List items = rechnungTree.getItems(); + + if (items == null) + return; + + RechnungNode ren = (RechnungNode) items.get(0); + // Loop über die Mitglieder + GenericIterator it1 = ren.getChildren(); + + Formular form = (Formular) getFormular(FormularArt.RECHNUNG).getValue(); + if(form == null) + { + throw new ApplicationException( + "Kein Formular ausgewählt"); + } + while (it1.hasNext()) + { + RechnungNode sp1 = (RechnungNode) it1.next(); + Mitglied mitglied = sp1.getMitglied(); + Rechnung rechnung = (Rechnung) Einstellungen.getDBService() + .createObject(Rechnung.class, null); + rechnung.setMitglied(Integer.parseInt(mitglied.getID())); + rechnung.setFormular(form); + rechnung.setDatum(new Date()); + rechnung.setGeschlecht(mitglied.getGeschlecht()); + rechnung.setAnrede(mitglied.getAnrede()); + rechnung.setTitel(mitglied.getTitel()); + rechnung.setName(mitglied.getName()); + rechnung.setVorname(mitglied.getVorname()); + rechnung.setStrasse(mitglied.getStrasse()); + rechnung.setAdressierungszusatz(mitglied.getAdressierungszusatz()); + rechnung.setPlz(mitglied.getPlz()); + rechnung.setOrt(mitglied.getOrt()); + rechnung.setStaat(mitglied.getStaatCode()); + rechnung.setLeitwegID(mitglied.getLeitwegID()); + rechnung.setPersonenart(mitglied.getPersonenart()); + if(!mitglied.getMandatDatum().equals(Einstellungen.NODATE)) + rechnung.setMandatDatum(mitglied.getMandatDatum()); + rechnung.setMandatID(mitglied.getMandatID()); + rechnung.setBIC(mitglied.getBic()); + rechnung.setIBAN(mitglied.getIban()); + + double betrag = 0; + GenericIterator it2 = sp1.getChildren(); + while (it2.hasNext()) + { + RechnungNode re = (RechnungNode) it2.next(); + betrag += re.getBuchung().getBetrag(); + } + rechnung.setBetrag(betrag); + rechnung.store(); + + // Loop über die Buchungen eines Mitglieds + GenericIterator it3 = sp1.getChildren(); + while (it3.hasNext()) + { + RechnungNode re = (RechnungNode) it3.next(); + Mitgliedskonto b = (Mitgliedskonto) re.getBuchung(); + b.setRechnung(rechnung); + b.store(); + } + rechnungTree.removeAll(); + GUI.getStatusBar().setSuccessText("Rechnung(en) erstellt"); + } + } + catch (RemoteException e) + { + Logger.error(e.getMessage()); + throw new ApplicationException( + "Fehler bei der erstellen der Rechnungen"); + } + } + }, null, false, "document-save.png"); + return b; + } + + @Override + public String getInfoText(Object selection) + { + Rechnung[] rechnungen = null; + String text = ""; + + if (selection instanceof Rechnung) + { + rechnungen = new Rechnung[] { (Rechnung) selection }; + } + else if (selection instanceof Rechnung[]) + { + rechnungen = (Rechnung[]) selection; + } + else + { + return ""; + } + + try + { + if (rechnungen != null) + { + text = "Es wurden " + rechnungen.length + + " Rechnungen ausgewählt" + + "\nFolgende Mitglieder haben keine Mailadresse:"; + for (Rechnung re: rechnungen) + { + Mitglied m = re.getMitglied(); + if (m != null && ( m.getEmail() == null || m.getEmail().isEmpty())) + { + text = text + "\n - " + m.getName() + + ", " + m.getVorname(); + } + } + } + } + catch (Exception ex) + { + GUI.getStatusBar().setErrorText("Fehler beim Ermitteln der Info"); + } + return text; + } + + private Rechnung getRechnung() + { + if (rechnung != null) + { + return rechnung; + } + rechnung = (Rechnung) getCurrentObject(); + return rechnung; + } + + + public DateInput getRechnungsdatum() throws RemoteException + { + if (rechnungsDatum != null) + { + return rechnungsDatum; + } + + Date d = getRechnung().getDatum(); + if (d.equals( Einstellungen.NODATE )) + { + d = null; + } + rechnungsDatum = new DateInput(d, new JVDateFormatTTMMJJJJ()); + rechnungsDatum.setName("Rechnungsdatum"); + rechnungsDatum.disable(); + return rechnungsDatum; + } + + public TextInput getMitglied() throws RemoteException + { + if (mitglied != null) + { + return mitglied; + } + + mitglied = new TextInput(getRechnung().getMitglied().getName()+", "+getRechnung().getMitglied().getVorname()); + mitglied.setName("Mitglied"); + mitglied.disable(); + return mitglied; + } + + public FormularInput getRechnungFormular() throws RemoteException + { + if (rechnungFormular != null) + { + return rechnungFormular; + } + + rechnungFormular = new FormularInput(FormularArt.RECHNUNG, getRechnung().getFormular().getID()); + rechnungFormular.setName("Formular"); + rechnungFormular.disable(); + return rechnungFormular; + } + + public TextInput getNummer() throws RemoteException + { + if (nummer != null) + { + return nummer; + } + + nummer = new TextInput(StringTool.lpad(getRechnung().getID(), + Einstellungen.getEinstellung().getZaehlerLaenge(), "0")); + nummer.setName("Rechnungsnummer"); + nummer.disable();; + return nummer; + } + + public DecimalInput getBetrag() throws RemoteException + { + if (betrag != null) + { + return betrag; + } + + betrag = new DecimalInput(getRechnung().getBetrag(),Einstellungen.DECIMALFORMAT); + betrag.setName("Betrag"); + betrag.disable();; + return betrag; + } + + public TextInput getAnrede() throws RemoteException + { + if (anrede != null) + { + return anrede; + } + + anrede = new TextInput(getRechnung().getAnrede()); + anrede.setName("Anrede"); + anrede.disable(); + return anrede; + } + + public TextInput getTitel() throws RemoteException + { + if (titel != null) + { + return titel; + } + + titel = new TextInput(getRechnung().getTitel()); + titel.setName("Titel"); + titel.disable(); + return titel; + } + + public TextInput getName() throws RemoteException + { + if (name != null) + { + return name; + } + + name = new TextInput(getRechnung().getName()); + name.setName("Name"); + name.disable(); + return name; + } + + public TextInput getVorname() throws RemoteException + { + if (vorname != null) + { + return vorname; + } + + vorname = new TextInput(getRechnung().getVorname()); + vorname.setName("Vorname"); + vorname.disable(); + return vorname; + } + + public TextInput getStrasse() throws RemoteException + { + if (strasse != null) + { + return strasse; + } + + strasse = new TextInput(getRechnung().getStrasse()); + strasse.setName("Strasse"); + strasse.disable(); + return strasse; + } + + public TextInput getAdressierungszusatz() throws RemoteException + { + if (adressierungszusatz != null) + { + return adressierungszusatz; + } + + adressierungszusatz = new TextInput(getRechnung().getAdressierungszusatz()); + adressierungszusatz.setName("Adressierungszusatz"); + adressierungszusatz.disable(); + return adressierungszusatz; + } + + public TextInput getOrt() throws RemoteException + { + if (ort != null) + { + return ort; + } + + ort = new TextInput(getRechnung().getOrt()); + ort.setName("Ort"); + ort.disable(); + return ort; + } + + public TextInput getPlz() throws RemoteException + { + if (plz != null) + { + return plz; + } + + plz = new TextInput(getRechnung().getPlz()); + plz.setName("Plz"); + plz.disable(); + return plz; + } + + public TextInput getStaat() throws RemoteException + { + if (staat != null) + { + return staat; + } + + staat = new TextInput(getRechnung().getStaat()); + staat.setName("Staat"); + staat.disable(); + return staat; + } + + public GeschlechtInput getGeschlecht() throws RemoteException + { + if (geschlecht != null) + { + return geschlecht; + } + + geschlecht = new GeschlechtInput(getRechnung().getGeschlecht()); + geschlecht.setName("Geschlecht"); + geschlecht.disable(); + return geschlecht; + } + + public TextInput getPersonenart() throws RemoteException + { + if (personenart != null) + { + return personenart; + } + + 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.setName("Mandatdatum"); + mandatdatum.disable(); + return mandatdatum; + } + + public TextInput getMandatid() throws RemoteException + { + if (mandatid != null) + { + return mandatid; + } + + mandatid = new TextInput(getRechnung().getMandatID()); + mandatid.setName("Mandatid"); + mandatid.disable(); + return mandatid; + } + + public BICInput getBic() throws RemoteException + { + if (bic != null) + { + return bic; + } + + bic = new BICInput(getRechnung().getBIC()); + bic.setName("BIC"); + bic.disable(); + return bic; + } + + public IBANInput getIban() throws RemoteException + { + if (iban != null) + { + return iban; + } + + iban = new IBANInput(HBCIProperties.formatIban(getRechnung().getIBAN()), getBic()); + iban.setName("IBAN"); + iban.disable(); + return iban; + } + + public TextInput getLeitwegID() throws RemoteException + { + if (leitwegID != null) + { + return leitwegID; + } + leitwegID = new TextInput(getRechnung().getLeitwegID()); + leitwegID.setName("LeitwegID"); + leitwegID.disable(); + return leitwegID; + } + + public Part getBuchungenList() throws RemoteException + { + if (buchungList != null) + { + return buchungList; + } + DBIterator mks = Einstellungen.getDBService().createList(Mitgliedskonto.class); + mks.addFilter("rechnung = ?",getRechnung().getID()); + + buchungList = new TablePart(mks, null); + buchungList.addColumn("Datum", "datum", + new DateFormatter(new JVDateFormatTTMMJJJJ())); + buchungList.addColumn("Abrechnungslauf", "abrechnungslauf"); + buchungList.addColumn("Name", "mitglied"); + buchungList.addColumn("Zweck", "zweck1"); + buchungList.addColumn("Betrag", "betrag", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + buchungList.addColumn("Zahlungseingang", "istsumme", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + + buchungList.setRememberColWidths(true); + buchungList.setRememberOrder(true); + buchungList.addFeature(new FeatureSummary()); + return buchungList; + } +} diff --git a/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungAutoNeuControl.java b/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungAutoNeuControl.java index 71903e879..947cd94f1 100644 --- a/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungAutoNeuControl.java +++ b/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungAutoNeuControl.java @@ -17,7 +17,6 @@ package de.jost_net.JVerein.gui.control; import java.rmi.RemoteException; -import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; @@ -27,6 +26,7 @@ import org.eclipse.swt.widgets.TreeItem; import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.gui.input.FormularInput; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.FormularArt; import de.jost_net.JVerein.keys.Spendenart; @@ -34,7 +34,6 @@ import de.jost_net.JVerein.rmi.Spendenbescheinigung; import de.jost_net.JVerein.server.SpendenbescheinigungNode; import de.willuhn.datasource.GenericIterator; -import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.jameica.gui.AbstractControl; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; @@ -61,6 +60,7 @@ public class SpendenbescheinigungAutoNeuControl extends AbstractControl private SelectInput formularSammel; + public SpendenbescheinigungAutoNeuControl(AbstractView view) { super(view); @@ -76,12 +76,8 @@ public SelectInput getJahr() } Calendar cal = Calendar.getInstance(); jahr = new SelectInput( - new Object[] { - cal.get(Calendar.YEAR), - cal.get(Calendar.YEAR) - 1, - cal.get(Calendar.YEAR) - 2, - cal.get(Calendar.YEAR) - 3 - }, + new Object[] { cal.get(Calendar.YEAR), cal.get(Calendar.YEAR) - 1, + cal.get(Calendar.YEAR) - 2, cal.get(Calendar.YEAR) - 3 }, cal.get(Calendar.YEAR)); jahr.addListener(new Listener() { @@ -111,20 +107,7 @@ public SelectInput getFormular() throws RemoteException return formularEinzel; } String tmp = settings.getString("formular.einzel", ""); - DBIterator it = Einstellungen.getDBService() - .createList(Formular.class); - it.addFilter("art = ?", - new Object[] { FormularArt.SPENDENBESCHEINIGUNG.getKey() }); - ArrayList list = new ArrayList<>(); - Formular preset = null; - while (it.hasNext()) - { - Formular f = (Formular) it.next(); - list.add(f); - if (tmp != null && !tmp.isEmpty() && f.getID().equalsIgnoreCase(tmp) ) - preset = f; - } - formularEinzel = new SelectInput(list, preset); + formularEinzel = new FormularInput(FormularArt.SPENDENBESCHEINIGUNG, tmp); formularEinzel.setPleaseChoose("Standard"); return formularEinzel; } @@ -136,20 +119,7 @@ public SelectInput getFormularSammelbestaetigung() throws RemoteException return formularSammel; } String tmp = settings.getString("formular.sammel", ""); - DBIterator it = Einstellungen.getDBService() - .createList(Formular.class); - it.addFilter("art = ?", - new Object[] { FormularArt.SAMMELSPENDENBESCHEINIGUNG.getKey() }); - ArrayList list = new ArrayList<>(); - Formular preset = null; - while (it.hasNext()) - { - Formular f = (Formular) it.next(); - list.add(f); - if (tmp != null && !tmp.isEmpty() && f.getID().equalsIgnoreCase(tmp) ) - preset = f; - } - formularSammel = new SelectInput(list, preset); + formularSammel = new FormularInput(FormularArt.SAMMELSPENDENBESCHEINIGUNG, tmp); formularSammel.setPleaseChoose("Standard"); return formularSammel; } @@ -172,7 +142,7 @@ public void handleAction(Object context) throws ApplicationException { try { - if (formularEinzel != null ) + if (formularEinzel != null) { Formular aa = (Formular) getFormular().getValue(); if (aa != null) @@ -180,21 +150,22 @@ public void handleAction(Object context) throws ApplicationException else settings.setAttribute("formular.einzel", ""); } - if (formularSammel != null ) + if (formularSammel != null) { - Formular aa = (Formular) getFormularSammelbestaetigung().getValue(); + Formular aa = (Formular) getFormularSammelbestaetigung() + .getValue(); if (aa != null) settings.setAttribute("formular.sammel", aa.getID()); else settings.setAttribute("formular.sammel", ""); - } - + } + @SuppressWarnings("rawtypes") List items = spbTree.getItems(); - - //Baum Spendenbescheinigungen enthält keine Einträge + + // Baum Spendenbescheinigungen enthält keine Einträge if (items == null) - return; + return; SpendenbescheinigungNode spn = (SpendenbescheinigungNode) items .get(0); @@ -240,11 +211,11 @@ public void handleAction(Object context) throws ApplicationException { spbescheinigung.setFormular((Formular) getFormular().getValue()); } - //Spendenbescheinigungen erfolgreich erstellt + // Spendenbescheinigungen erfolgreich erstellt spbescheinigung.store(); spbTree.removeAll(); GUI.getStatusBar() - .setSuccessText("Spendenbescheinigung(en) erstellt"); + .setSuccessText("Spendenbescheinigung(en) erstellt"); } } catch (RemoteException e) @@ -267,15 +238,16 @@ public Part getSpendenbescheinigungTree() throws RemoteException @Override public void format(TreeItem item) { - SpendenbescheinigungNode spbn = (SpendenbescheinigungNode) item.getData(); + SpendenbescheinigungNode spbn = (SpendenbescheinigungNode) item + .getData(); try { - if (spbn.getNodeType() == SpendenbescheinigungNode.ROOT) - item.setImage(SWTUtil.getImage("file-invoice.png")); - if (spbn.getNodeType() == SpendenbescheinigungNode.MITGLIED) - item.setImage(SWTUtil.getImage("user.png")); - if (spbn.getNodeType() == SpendenbescheinigungNode.BUCHUNG) - item.setImage(SWTUtil.getImage("euro-sign.png")); + if (spbn.getNodeType() == SpendenbescheinigungNode.ROOT) + item.setImage(SWTUtil.getImage("file-invoice.png")); + if (spbn.getNodeType() == SpendenbescheinigungNode.MITGLIED) + item.setImage(SWTUtil.getImage("user.png")); + if (spbn.getNodeType() == SpendenbescheinigungNode.BUCHUNG) + item.setImage(SWTUtil.getImage("euro-sign.png")); } catch (Exception e) { diff --git a/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungControl.java b/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungControl.java index 71699464c..304508353 100644 --- a/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungControl.java +++ b/src/de/jost_net/JVerein/gui/control/SpendenbescheinigungControl.java @@ -29,9 +29,12 @@ import java.util.Map; import java.util.TreeSet; +import org.apache.commons.lang.StringUtils; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; +import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.FileDialog; import org.eclipse.swt.widgets.Listener; import de.jost_net.JVerein.Einstellungen; @@ -48,12 +51,16 @@ import de.jost_net.JVerein.gui.menu.SpendenbescheinigungMenu; import de.jost_net.JVerein.gui.parts.BuchungListTablePart; import de.jost_net.JVerein.gui.view.SpendenbescheinigungMailView; +import de.jost_net.JVerein.io.FileViewer; import de.jost_net.JVerein.io.MailSender; +import de.jost_net.JVerein.io.SpendenbescheinigungExportCSV; +import de.jost_net.JVerein.io.SpendenbescheinigungExportPDF; import de.jost_net.JVerein.keys.Adressblatt; import de.jost_net.JVerein.keys.Ausgabeart; import de.jost_net.JVerein.keys.FormularArt; import de.jost_net.JVerein.keys.HerkunftSpende; import de.jost_net.JVerein.keys.Spendenart; +import de.jost_net.JVerein.keys.SuchSpendenart; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Formular; import de.jost_net.JVerein.rmi.Konto; @@ -64,6 +71,8 @@ import de.jost_net.JVerein.rmi.Spendenbescheinigung; import de.jost_net.JVerein.util.Dateiname; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; +import de.willuhn.datasource.pseudo.PseudoIterator; +import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBService; import de.willuhn.datasource.rmi.ResultSetExtractor; import de.willuhn.jameica.gui.AbstractView; @@ -133,6 +142,9 @@ public class SpendenbescheinigungControl extends DruckMailControl private String sql = ""; + final static String ExportPDF = "PDF"; + + final static String ExportCSV = "CSV"; public SpendenbescheinigungControl(AbstractView view) { @@ -581,6 +593,7 @@ public void TabRefresh() { spbList.addItem(spb); } + spbList.sort(); } catch (RemoteException e1) { @@ -590,36 +603,129 @@ public void TabRefresh() } @SuppressWarnings("unchecked") - private ArrayList getSpendenbescheinigungen() throws RemoteException + private ArrayList getSpendenbescheinigungen() + throws RemoteException + { + SuchSpendenart suchSpendenart = SuchSpendenart.ALLE; + if (isSuchSpendenartAktiv()) + { + suchSpendenart = (SuchSpendenart) getSuchSpendenart().getValue(); + } + ArrayList ids = new ArrayList<>(); + ArrayList queryIds = querySpendenbescheinigungen(suchSpendenart); + + // Bei GELDSPENDE_ECHT liefert das Query auch Splittbuchungen die neben + // echten Geldbuchungen auch Geldbuchungen mit Verzicht haben. + // Darum lesen wir nochmal mit ERSTATTUNGSVERZICHT. Wenn eine Id da + // auch dabei ist dürfen wir die Splittbuchung nicht nehmen + if (suchSpendenart == SuchSpendenart.GELDSPENDE_ECHT) + { + ArrayList erstattungsIds = querySpendenbescheinigungen( + SuchSpendenart.ERSTATTUNGSVERZICHT); + for (Long id : queryIds) + { + if (!erstattungsIds.contains(id)) + { + ids.add(id); + } + } + } + else + { + ids = queryIds; + } + + if (ids.size() == 0) + return new ArrayList(); + + DBIterator list = Einstellungen.getDBService() + .createList(Spendenbescheinigung.class); + list.addFilter("id in (" + StringUtils.join(ids, ",") + ")"); + list.setOrder(" ORDER BY bescheinigungsdatum desc "); + ArrayList spendenbescheinigungen = list != null + ? (ArrayList) PseudoIterator.asList(list) + : null; + return spendenbescheinigungen; + } + + @SuppressWarnings("unchecked") + private ArrayList querySpendenbescheinigungen( + SuchSpendenart suchSpendenart) throws RemoteException { final DBService service = Einstellungen.getDBService(); ArrayList bedingungen = new ArrayList<>(); and = false; - - sql = "select spendenbescheinigung.* from spendenbescheinigung "; - sql += "left join mitglied on (spendenbescheinigung.mitglied = mitglied.id) "; - - if (isSuchnameAktiv() && getSuchname().getValue() != null) + + sql = "select DISTINCT spendenbescheinigung.id, bescheinigungsdatum from spendenbescheinigung "; + int mailauswahl = MailAuswertungInput.ALLE; + if (isMailauswahlAktiv()) { - String tmpSuchname = (String) getSuchname().getValue(); - if (tmpSuchname.length() > 0) + mailauswahl = (Integer) getMailauswahl().getValue(); + if (mailauswahl != MailAuswertungInput.ALLE) { - addCondition("(lower(zeile2) like ?)"); - bedingungen.add("%" + tmpSuchname.toLowerCase() + "%"); + sql += "left join mitglied on (spendenbescheinigung.mitglied = mitglied.id) "; } } + if (suchSpendenart != SuchSpendenart.ALLE + && suchSpendenart != SuchSpendenart.GELDSPENDE + && suchSpendenart != SuchSpendenart.SACHSPENDE) + { + sql += "left join buchung on (spendenbescheinigung.id = buchung.spendenbescheinigung) "; + } + if (isMailauswahlAktiv()) { - int mailauswahl = (Integer) getMailauswahl().getValue(); if (mailauswahl == MailAuswertungInput.OHNE) { - addCondition("(email is null or length(email) = 0)"); + addCondition("(email is null or length(email) = 0) "); } if (mailauswahl == MailAuswertungInput.MIT) { - addCondition("(email is not null and length(email) > 0)"); + addCondition("(email is not null and length(email) > 0) "); } } + + if (isSuchSpendenartAktiv()) + { + switch (suchSpendenart) + { + case ALLE: + break; + case GELDSPENDE: + addCondition("spendenart = ?"); + bedingungen.add(Spendenart.GELDSPENDE); + break; + case SACHSPENDE: + addCondition("spendenart = ?"); + bedingungen.add(Spendenart.SACHSPENDE); + break; + case ERSTATTUNGSVERZICHT: + addCondition("buchung.verzicht = 1"); + break; + case GELDSPENDE_ECHT: + addCondition( + "(buchung.verzicht != 1 or buchung.verzicht is null) AND spendenart = ?"); + bedingungen.add(Spendenart.GELDSPENDE); + break; + case SACHSPENDE_ERSTATTUNGSVERZICHT: + addCondition("(buchung.verzicht = 1 OR spendenart = ?)"); + bedingungen.add(Spendenart.SACHSPENDE); + break; + default: + break; + } + } + + if (isSuchnameAktiv() && getSuchname().getValue() != null) + { + String tmpSuchname = (String) getSuchname().getValue(); + if (tmpSuchname.length() > 0) + { + addCondition("(lower(zeile2) like ?)"); + bedingungen.add("%" + tmpSuchname.toLowerCase() + "%"); + } + } + if (isDatumvonAktiv() && getDatumvon().getValue() != null) { addCondition("bescheinigungsdatum >= ?"); @@ -644,27 +750,24 @@ private ArrayList getSpendenbescheinigungen() throws Remot Date d = (Date) getEingabedatumbis().getValue(); bedingungen.add(new java.sql.Date(d.getTime())); } - sql += " ORDER BY bescheinigungsdatum desc "; - + ResultSetExtractor rs = new ResultSetExtractor() { @Override public Object extract(ResultSet rs) throws RemoteException, SQLException { - ArrayList list = new ArrayList<>(); + ArrayList list = new ArrayList<>(); while (rs.next()) { - list.add( - (Spendenbescheinigung) service.createObject(Spendenbescheinigung.class, rs.getString(1))); + list.add(rs.getLong(1)); } return list; } }; - return (ArrayList) service.execute(sql, bedingungen.toArray(), - rs); + return (ArrayList) service.execute(sql, bedingungen.toArray(), rs); } - + private void addCondition(String condition) { if (and) @@ -678,7 +781,7 @@ private void addCondition(String condition) and = true; sql += condition; } - + // Mail/Drucken View @Override public String getInfoText(Object spbArray) @@ -934,5 +1037,113 @@ public boolean isInterrupted() }; Application.getController().start(t); } + + public Button getPDFExportButton() + { + Button b = new Button("PDF", new Action() + { + + @Override + public void handleAction(Object context) throws ApplicationException + { + starteExport(ExportPDF); + } + }, null, false, "file-pdf.png"); + // button + return b; + } + + public Button getCSVExportButton() + { + Button b = new Button("CSV", new Action() + { + @Override + public void handleAction(Object context) throws ApplicationException + { + starteExport(ExportCSV); + } + }, null, false, "xsd.png"); + // button + return b; + } + + private void starteExport(String type) throws ApplicationException + { + try + { + FileDialog fd = new FileDialog(GUI.getShell(), SWT.SAVE); + fd.setText("Ausgabedatei wählen."); + String path = settings.getString("lastdir", + System.getProperty("user.home")); + if (path != null && path.length() > 0) + { + fd.setFilterPath(path); + } + fd.setFileName(new Dateiname("spendenbescheinigungen", "", + Einstellungen.getEinstellung().getDateinamenmuster(), type).get()); + + final String s = fd.open(); + + if (s == null || s.length() == 0) + { + return; + } + + final File file = new File(s); + settings.setAttribute("lastdir", file.getParent()); + ArrayList spbList = getSpendenbescheinigungen(); + ausgabe(type, file, spbList); + } + catch (RemoteException e) + { + throw new ApplicationException( + String.format("Fehler beim Aufbau des Reports: %s", e.getMessage())); + } + } + + private void ausgabe(final String type, final File file, + final ArrayList spbList) + { + BackgroundTask t = new BackgroundTask() + { + @Override + public void run(ProgressMonitor monitor) throws ApplicationException + { + try + { + switch (type) + { + case ExportCSV: + new SpendenbescheinigungExportCSV(file, spbList); + break; + case ExportPDF: + new SpendenbescheinigungExportPDF(file, spbList); + break; + } + GUI.getCurrentView().reload(); + } + catch (Exception e) + { + Logger.error("Fehler", e); + GUI.getStatusBar().setErrorText(e.getMessage()); + throw new ApplicationException(e); + } + FileViewer.show(file); + } + + @Override + public void interrupt() + { + // + } + + @Override + public boolean isInterrupted() + { + return false; + } + }; + Application.getController().start(t); + } } diff --git a/src/de/jost_net/JVerein/gui/control/ZusatzbetragControl.java b/src/de/jost_net/JVerein/gui/control/ZusatzbetragControl.java index 8cdb34409..b8af4aa93 100644 --- a/src/de/jost_net/JVerein/gui/control/ZusatzbetragControl.java +++ b/src/de/jost_net/JVerein/gui/control/ZusatzbetragControl.java @@ -45,6 +45,7 @@ import de.jost_net.JVerein.io.Reporter; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Zusatzbetrag; @@ -61,6 +62,7 @@ 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.Formatter; import de.willuhn.jameica.gui.input.SelectInput; import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.TablePart; @@ -212,6 +214,7 @@ public void handleStore() (Buchungsart) getZusatzbetragPart().getBuchungsart().getValue()); z.setBuchungsklasseId(getZusatzbetragPart().getSelectedBuchungsKlasseId()); z.setBetrag((Double) getZusatzbetragPart().getBetrag().getValue()); + z.setZahlungsweg((Zahlungsweg) getZusatzbetragPart().getZahlungsweg().getValue()); z.store(); if (getVorlage().getValue().equals(MITDATUM) || getVorlage().getValue().equals(OHNEDATUM)) @@ -229,6 +232,7 @@ public void handleStore() } zv.setBuchungsart(z.getBuchungsart()); zv.setBuchungsklasseId(z.getBuchungsklasseId()); + zv.setZahlungsweg(z.getZahlungsweg()); zv.store(); } GUI.getStatusBar().setSuccessText("Zusatzbetrag gespeichert"); @@ -266,6 +270,13 @@ public Part getZusatzbetraegeList() throws RemoteException zusatzbetraegeList.addColumn("Buchungstext", "buchungstext"); zusatzbetraegeList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + zusatzbetraegeList.addColumn("Zahlungsweg", "zahlungsweg", new Formatter() { + @Override + public String format(Object o) + { + return new Zahlungsweg((Integer)o).getText(); + } + }); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { zusatzbetraegeList.addColumn("Buchungsklasse", "buchungsklasse", @@ -287,6 +298,7 @@ public Part getZusatzbetraegeList() throws RemoteException { zusatzbetraegeList.addItem(zusatzbetraege.next()); } + zusatzbetraegeList.sort(); } if (this.ausfuehrungSuch.getText().equals("Aktive")) { @@ -339,7 +351,7 @@ private void nichtAktiveEliminieren(TablePart table) throws RemoteException while (it.hasNext()) { Zusatzbetrag z = (Zusatzbetrag) it.next(); - if (!z.isAktiv(new Date())) + if (!z.isOffen(new Date())) { table.removeItem(z); } @@ -409,9 +421,9 @@ public void run(ProgressMonitor monitor) throws ApplicationException BaseColor.LIGHT_GRAY); reporter.addHeaderColumn("Startdatum", Element.ALIGN_LEFT, 30, BaseColor.LIGHT_GRAY); - reporter.addHeaderColumn("nächste Fälligkeit", Element.ALIGN_LEFT, 30, + reporter.addHeaderColumn("Nächste Fälligkeit", Element.ALIGN_LEFT, 30, BaseColor.LIGHT_GRAY); - reporter.addHeaderColumn("letzte Ausführung", Element.ALIGN_LEFT, 30, + reporter.addHeaderColumn("Letzte Ausführung", Element.ALIGN_LEFT, 30, BaseColor.LIGHT_GRAY); reporter.addHeaderColumn("Intervall", Element.ALIGN_LEFT, 30, BaseColor.LIGHT_GRAY); diff --git a/src/de/jost_net/JVerein/gui/control/ZusatzbetragVorlageControl.java b/src/de/jost_net/JVerein/gui/control/ZusatzbetragVorlageControl.java index 6e7172a1a..2aa74a6d4 100644 --- a/src/de/jost_net/JVerein/gui/control/ZusatzbetragVorlageControl.java +++ b/src/de/jost_net/JVerein/gui/control/ZusatzbetragVorlageControl.java @@ -1,16 +1,16 @@ /********************************************************************** * 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 + * 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 + * 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, + * 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 **********************************************************************/ @@ -26,6 +26,7 @@ import de.jost_net.JVerein.gui.input.BuchungsartInput; import de.jost_net.JVerein.gui.input.BuchungsartInput.buchungsarttyp; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.ZusatzbetragVorlage; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; @@ -37,6 +38,7 @@ 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.Formatter; import de.willuhn.jameica.gui.input.AbstractInput; import de.willuhn.jameica.gui.input.DateInput; import de.willuhn.jameica.gui.input.DecimalInput; @@ -73,6 +75,8 @@ public class ZusatzbetragVorlageControl extends AbstractControl public ZusatzbetragVorlage auswahl; + private SelectInput zahlungsweg; + public ZusatzbetragVorlageControl(AbstractView view) { super(view); @@ -200,12 +204,24 @@ public AbstractInput getBuchungsart() throws RemoteException return buchungsart; } buchungsart = new BuchungsartInput().getBuchungsartInput(buchungsart, - getZusatzbetragVorlage().getBuchungsart(), buchungsarttyp.BUCHUNGSART, - Einstellungen.getEinstellung().getBuchungBuchungsartAuswahl()); + getZusatzbetragVorlage().getBuchungsart(), buchungsarttyp.BUCHUNGSART, + Einstellungen.getEinstellung().getBuchungBuchungsartAuswahl()); return buchungsart; } + public SelectInput getZahlungsweg() throws RemoteException + { + if (zahlungsweg != null) + { + return zahlungsweg; + } + zahlungsweg = new SelectInput(Zahlungsweg.getArray(false), + getZusatzbetragVorlage().getZahlungsweg()); + zahlungsweg.setPleaseChoose("Standard"); + return zahlungsweg; + } + public DateInput getEndedatum() throws RemoteException { if (endedatum != null) @@ -250,6 +266,7 @@ public void handleStore() { z.setBuchungsart((Buchungsart) getBuchungsart().getValue()); } + z.setZahlungsweg((Zahlungsweg) getZahlungsweg().getValue()); z.store(); GUI.getStatusBar().setSuccessText("Zusatzbetrag-Vorlage gespeichert"); @@ -292,6 +309,18 @@ public void handleAction(Object context) throws ApplicationException zusatzbetraegeList.addColumn("Buchungstext", "buchungstext"); zusatzbetraegeList.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); + zusatzbetraegeList.addColumn("Zahlungsweg", "zahlungsweg", new Formatter() + { + @Override + public String format(Object o) + { + if (o == null) + { + return ""; + } + return new Zahlungsweg((Integer) o).getText(); + } + }); // zusatzbetraegeList.setContextMenu(new ZusatzbetraegeMenu( // zusatzbetraegeList)); zusatzbetraegeList.setRememberColWidths(true); @@ -306,6 +335,7 @@ public void handleAction(Object context) throws ApplicationException { zusatzbetraegeList.addItem(zusatzbetragsvorlagen.next()); } + zusatzbetraegeList.sort(); } return zusatzbetraegeList; } diff --git a/src/de/jost_net/JVerein/gui/dialogs/AnlagenkontoNeuDialog.java b/src/de/jost_net/JVerein/gui/dialogs/AnlagenkontoNeuDialog.java index 3981c06bb..41f3ab324 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/AnlagenkontoNeuDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/AnlagenkontoNeuDialog.java @@ -28,11 +28,12 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.control.KontoControl; import de.jost_net.JVerein.gui.control.BuchungsControl; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.gui.input.BuchungsartInput; import de.jost_net.JVerein.gui.input.IntegerNullInput; import de.jost_net.JVerein.gui.input.BuchungsartInput.buchungsarttyp; import de.jost_net.JVerein.keys.AfaMode; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Buchungsklasse; @@ -155,7 +156,7 @@ private void handleStore() throws ApplicationException konto.setNummer((String) getNummer().getValue()); konto.setBezeichnung((String) getBezeichnung().getValue()); konto.setEroeffnung(buchung.getDatum()); - konto.setAnlagenkonto(true); + konto.setKontoArt(Kontoart.ANLAGE); konto.setHibiscusId(-1); konto.setAnlagenartId(getSelectedAnlagenartId()); konto.setAnlagenklasseId(getSelectedAnlagenklasseId()); @@ -165,7 +166,7 @@ private void handleStore() throws ApplicationException konto.setNutzungsdauer((Integer)getNutzungsdauer().getValue()); konto.setKommentar(buchung.getKommentar()); konto.store(); - BuchungsControl bcontrol = new BuchungsControl(null, Kontenart.ANLAGEKONTO); + BuchungsControl bcontrol = new BuchungsControl(null, Kontenfilter.ANLAGEKONTO); bcontrol.getSettings().setAttribute("anlagenkonto.kontoid", konto.getID()); } catch (RemoteException e) @@ -312,9 +313,9 @@ private LabelInput getMessage() throws RemoteException } DBService service = Einstellungen.getDBService(); String sql = "SELECT DISTINCT konto.id from konto " - + "WHERE (anlagenkonto = TRUE) "; + + "WHERE (kontoart = ?) "; boolean exist = (boolean) service.execute(sql, - new Object[] { }, new ResultSetExtractor() + new Object[] { Kontoart.ANLAGE.getKey() }, new ResultSetExtractor() { @Override public Object extract(ResultSet rs) diff --git a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java index 90f1626c0..52b8ec0d5 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/BuchungenSollbuchungZuordnungVorschauDialog.java @@ -26,6 +26,8 @@ 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.rmi.Buchung; +import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; @@ -36,11 +38,8 @@ import de.willuhn.jameica.gui.parts.ButtonArea; import de.willuhn.jameica.gui.parts.TablePart; import de.willuhn.jameica.hbci.gui.formatter.IbanFormatter; -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; /** * Ein Dialog, der die automatisch ermittelten Zuordnungen zwischen Buchung @@ -105,7 +104,7 @@ public String format(Object value) b.addButton("Zuordnen", new Action() { @Override - public void handleAction(Object context) + public void handleAction(Object context) throws ApplicationException { persistAssignment(); } @@ -122,49 +121,34 @@ public void handleAction(Object context) b.paint(parent); } - protected void persistAssignment() + protected void persistAssignment() throws ApplicationException { - - BackgroundTask t = new BackgroundTask() + try { - - @Override - public void run(ProgressMonitor monitor) throws ApplicationException + for(BookingMemberAccountEntry dao : assignedBooking) { - - try + Mitgliedskonto mk = dao.getMitgliedskonto(); + Buchung buchung = dao.getBuchung(); + buchung.setMitgliedskonto(dao.getMitgliedskonto()); + if (mk != null) { - for(BookingMemberAccountEntry dao : assignedBooking) - { - dao.getBuchung().setMitgliedskonto(dao.getMitgliedskonto()); - dao.getBuchung().store(); - } - - //Darstellung aktualisieren - new BuchungsListeAction().handleAction(this); - - GUI.getStatusBar().setSuccessText("Die Zuordnung wurde erfolgreich durchgeführt"); - } - catch (RemoteException e) { - Logger.error("error while assignment", e); - throw new ApplicationException("Fehler bei der Durchführung der Zuordnung", e); + if (buchung.getBuchungsartId() == null) + buchung.setBuchungsartId(mk.getBuchungsartId()); + if (buchung.getBuchungsklasseId() == null) + buchung.setBuchungsklasseId(mk.getBuchungsklasseId()); } - } - - @Override - public void interrupt() - { - // + buchung.store(); } - @Override - public boolean isInterrupted() - { - return false; - } - }; + //Darstellung aktualisieren + new BuchungsListeAction().handleAction(this); - Application.getController().start(t); + GUI.getStatusBar().setSuccessText("Die Zuordnung wurde erfolgreich durchgeführt"); + } + catch (RemoteException e) { + Logger.error("error while assignment", e); + throw new ApplicationException("Fehler bei der Durchführung der Zuordnung", e); + } close(); } diff --git a/src/de/jost_net/JVerein/gui/view/BuchungsuebernahmeView.java b/src/de/jost_net/JVerein/gui/dialogs/BuchungsuebernahmeDialog.java similarity index 59% rename from src/de/jost_net/JVerein/gui/view/BuchungsuebernahmeView.java rename to src/de/jost_net/JVerein/gui/dialogs/BuchungsuebernahmeDialog.java index 811d5d5e1..3b36c75b7 100644 --- a/src/de/jost_net/JVerein/gui/view/BuchungsuebernahmeView.java +++ b/src/de/jost_net/JVerein/gui/dialogs/BuchungsuebernahmeDialog.java @@ -14,40 +14,62 @@ * heiner@jverein.de * www.jverein.de **********************************************************************/ -package de.jost_net.JVerein.gui.view; +package de.jost_net.JVerein.gui.dialogs; + +import org.eclipse.swt.widgets.Composite; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.BuchungsuebernahmeControl; -import de.jost_net.JVerein.io.Buchungsuebernahme; -import de.willuhn.jameica.gui.AbstractView; +import de.jost_net.JVerein.gui.view.DokumentationUtil; import de.willuhn.jameica.gui.Action; -import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.dialogs.AbstractDialog; import de.willuhn.jameica.gui.parts.ButtonArea; -public class BuchungsuebernahmeView extends AbstractView +public class BuchungsuebernahmeDialog extends AbstractDialog { - @Override - public void bind() throws Exception + Boolean start = false; + + public BuchungsuebernahmeDialog(int position) { - GUI.getView().setTitle("Hibiscus-Buchungen übernehmen"); + super(position); + setTitle("Hibiscus-Buchungen-Import"); + setSize(900, 600); + } - final BuchungsuebernahmeControl control = new BuchungsuebernahmeControl( - this); + @Override + public void paint(Composite parent) throws Exception + { + final BuchungsuebernahmeControl control = new BuchungsuebernahmeControl(); - control.getKontenList().paint(this.getParent()); + control.getKontenList().paint(parent); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.BUCHUNGSUEBERNAHME, false, "question-circle.png"); - buttons.addButton("Übernahme", new Action() + buttons.addButton("Import starten", new Action() + { + @Override + public void handleAction(Object context) + { + start = true; + close(); + } + }, null, true, "file-import.png"); + buttons.addButton("Abbrechen", new Action() { @Override public void handleAction(Object context) { - new Buchungsuebernahme(); + close(); } - }, null, true, "document-save.png"); - buttons.paint(this.getParent()); + }, null, false, "process-stop.png"); + buttons.paint(parent); + } + + @Override + protected Boolean getData() throws Exception + { + return start; } } diff --git a/src/de/jost_net/JVerein/gui/dialogs/EigenschaftenAuswahlDialog.java b/src/de/jost_net/JVerein/gui/dialogs/EigenschaftenAuswahlDialog.java index 9a1b96e2a..2919e02af 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/EigenschaftenAuswahlDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/EigenschaftenAuswahlDialog.java @@ -18,10 +18,12 @@ import java.rmi.RemoteException; import java.util.ArrayList; +import java.util.HashMap; import org.eclipse.swt.widgets.Composite; import de.jost_net.JVerein.gui.control.FilterControl; +import de.jost_net.JVerein.rmi.EigenschaftGruppe; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.server.EigenschaftenNode; import de.willuhn.jameica.gui.Action; @@ -32,6 +34,7 @@ import de.willuhn.jameica.gui.util.LabelGroup; import de.willuhn.jameica.system.OperationCanceledException; import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; /** * Dialog, zur Auswahl von Eigenschaften eines Mitglied. @@ -46,8 +49,6 @@ public class EigenschaftenAuswahlDialog private String defaults = null; - private boolean ohnePflicht; - private boolean verknuepfung; private boolean onlyChecked; @@ -75,18 +76,17 @@ public class EigenschaftenAuswahlDialog * @param mitglieder * Liste der Mitglieder welche selektiert wurden. */ - public EigenschaftenAuswahlDialog(String defaults, boolean ohnePflicht, + public EigenschaftenAuswahlDialog(String defaults, boolean verknuepfung, FilterControl control, boolean onlyChecked) { - this(defaults, ohnePflicht, verknuepfung, control, onlyChecked, null); + this(defaults, verknuepfung, control, onlyChecked, null); } - public EigenschaftenAuswahlDialog(String defaults, boolean ohnePflicht, - boolean verknuepfung, FilterControl control, boolean onlyChecked, Mitglied[] mitglieder) + public EigenschaftenAuswahlDialog(String defaults, boolean verknuepfung, + FilterControl control, boolean onlyChecked, Mitglied[] mitglieder) { super(EigenschaftenAuswahlDialog.POSITION_CENTER); this.setSize(400, 400); - this.ohnePflicht = ohnePflicht; this.verknuepfung = verknuepfung; setTitle("Eigenschaften auswählen "); this.control = control; @@ -110,7 +110,7 @@ public void setDefaults(String defaults) protected void paint(Composite parent) throws RemoteException { final TreePart tree = control.getEigenschaftenAuswahlTree(this.defaults, - ohnePflicht, onlyChecked, mitglieder); + onlyChecked, mitglieder); LabelGroup group = new LabelGroup(parent, "Eigenschaften", true); group.addPart(tree); @@ -122,13 +122,17 @@ protected void paint(Composite parent) throws RemoteException buttons.addButton("OK", new Action() { @Override - public void handleAction(Object context) + public void handleAction(Object context) throws ApplicationException { try { param = new EigenschaftenAuswahlParameter(); ArrayList rootNodes = (ArrayList) tree.getItems(); // liefert nur den Root EigenschaftenNode root = (EigenschaftenNode) rootNodes.get(0); + if (mitglieder != null) + { + checkRestrictions(root, mitglieder); + } for (EigenschaftenNode checkedNode : root.getCheckedNodes()) { param.add(checkedNode); @@ -179,5 +183,123 @@ private SelectInput getEigenschaftenVerknuepfung() eigenschaftenverknuepfung.setName("Gruppen-Verknüpfung"); return eigenschaftenverknuepfung; } + + private boolean checkRestrictions(EigenschaftenNode root, Mitglied[] mitglieder) + throws RemoteException, ApplicationException + { + HashMap pflichtgruppenMap = new HashMap<>(); + HashMap max1gruppenMap = new HashMap<>(); + ArrayList pflichtgruppen = root.getPflichtGruppen(); + ArrayList max1gruppen = root.getMax1Gruppen(); + if (!pflichtgruppen.isEmpty()) + { + for (Mitglied mitglied : mitglieder) + { + // 1. Prüfen auf Pflicht + // Erst alle Pflicht Gruppen auf false setzten + pflichtgruppenMap.clear(); + for (EigenschaftGruppe eg : pflichtgruppen) + { + pflichtgruppenMap.put(eg.getID(), Boolean.valueOf(false)); + } + // Gesetzte Eigenschaften Gruppen bestimmen + // Es muss die Eigenschaft im Mitglied gesetzt sein + // und darf nicht im Dialog auf "-" stehen + for (Long[] eigenschaften : root.getEigenschaften()) + { + EigenschaftenNode node = root.getEigenschaftenNode(eigenschaften[1].toString()); + String gruppenId = node.getEigenschaftGruppe().getID(); + if (eigenschaften[0].toString().equals(mitglied.getID()) && + !node.getPreset().equals(EigenschaftenNode.MINUS)) + { + pflichtgruppenMap.put(gruppenId, Boolean.valueOf(true)); + } + } + // Check ob ein Wert neu mit "+" gesetzt wird + for (EigenschaftenNode node : root.getCheckedNodes()) + { + String gruppenId = node.getEigenschaftGruppe().getID().toString(); + if (node.getPreset().equals(EigenschaftenNode.PLUS)) + { + pflichtgruppenMap.put(gruppenId, Boolean.valueOf(true)); + } + } + for (String key : pflichtgruppenMap.keySet()) + { + if (!pflichtgruppenMap.get(key)) + { + EigenschaftGruppe eg = root.getEigenschaftGruppe(key); + throw new ApplicationException(String.format( + "In der Eigenschaftengruppe \"%s\" fehlt ein Eintrag bei Mitglied %s!", + eg.getBezeichnung(), mitglied.getAttribute("namevorname"))); + } + } + } + } + + if (!max1gruppen.isEmpty()) + { + for (Mitglied mitglied : mitglieder) + { + // 2. Prüfen auf Max1 + // Max eine Eigenschaft pro Gruppe + max1gruppenMap.clear(); + for (EigenschaftGruppe eg : max1gruppen) + { + max1gruppenMap.put(eg.getID(), Boolean.valueOf(false)); + } + // Gesetzte Eigenschaften Gruppen bestimmen + // Es darf höchstens eine Eigenschaft im Mitglied gesetzt sein + // Hier nur gesetzte Werte ohne "+" und "-", "+" kommt nachher + for (Long[] eigenschaften : root.getEigenschaften()) + { + EigenschaftenNode node = root.getEigenschaftenNode(eigenschaften[1].toString()); + if (eigenschaften[0].toString().equals(mitglied.getID()) && + !node.getPreset().equals(EigenschaftenNode.MINUS) && + !node.getPreset().equals(EigenschaftenNode.PLUS)) + { + EigenschaftGruppe gruppe = node.getEigenschaftGruppe(); + Boolean m1 = max1gruppenMap.get(gruppe.getID()); + if (m1 != null) + { + if (m1) + { + throw new ApplicationException(String.format( + "In der Eigenschaftengruppe \"%s\" ist bei Mitglied %s mehr als ein Eintrag markiert!", + gruppe.getBezeichnung(), mitglied.getAttribute("namevorname"))); + } + else + { + max1gruppenMap.put(gruppe.getID(), Boolean.valueOf(true)); + } + } + } + } + // Check ob ein Wert neu mit "+" gesetzt wird + for (EigenschaftenNode node : root.getCheckedNodes()) + { + if (node.getPreset().equals(EigenschaftenNode.PLUS)) + { + EigenschaftGruppe gruppe = node.getEigenschaftGruppe(); + Boolean m1 = max1gruppenMap.get(gruppe.getID()); + if (m1 != null) + { + if (m1) + { + throw new ApplicationException(String.format( + "In der Eigenschaftengruppe '%s' ist bei Mitglied %s mehr als ein Eintrag markiert!", + gruppe.getBezeichnung(), mitglied.getAttribute("namevorname"))); + } + else + { + max1gruppenMap.put(gruppe.getID(), Boolean.valueOf(true)); + } + } + } + } + } + } + return true; + } } diff --git a/src/de/jost_net/JVerein/gui/dialogs/ImportDialog.java b/src/de/jost_net/JVerein/gui/dialogs/ImportDialog.java index bf152f8f5..47fa088cf 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/ImportDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/ImportDialog.java @@ -234,8 +234,6 @@ public void run(ProgressMonitor monitor) throws ApplicationException } catch (ApplicationException ae) { - monitor.setStatus(ProgressMonitor.STATUS_ERROR); - monitor.setStatusText(ae.getMessage()); GUI.getStatusBar().setErrorText(ae.getMessage()); throw ae; } diff --git a/src/de/jost_net/JVerein/gui/dialogs/KontoAuswahlDialog.java b/src/de/jost_net/JVerein/gui/dialogs/KontoAuswahlDialog.java index 1f4f30f00..f43e1b99c 100755 --- a/src/de/jost_net/JVerein/gui/dialogs/KontoAuswahlDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/KontoAuswahlDialog.java @@ -23,7 +23,7 @@ import org.eclipse.swt.widgets.Event; import org.eclipse.swt.widgets.Listener; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.gui.parts.KontoList; import de.jost_net.JVerein.rmi.Konto; import de.willuhn.jameica.gui.Action; @@ -50,7 +50,7 @@ public class KontoAuswahlDialog extends AbstractDialog private boolean nurAktuelleKonten; - private Kontenart art; + private Kontenfilter art; private CheckboxInput box = null; @@ -65,7 +65,7 @@ public class KontoAuswahlDialog extends AbstractDialog * @param abschreibung Es sollen nur Anlagekonten angezeigt werden */ public KontoAuswahlDialog(int position, boolean keinkonto, - boolean nurHibiscus, boolean nurAktuelleKonten, Kontenart art) + boolean nurHibiscus, boolean nurAktuelleKonten, Kontenfilter art) { super(position); super.setSize(400, SWT.DEFAULT); diff --git a/src/de/jost_net/JVerein/gui/dialogs/MailEmpfaengerAuswahlDialog.java b/src/de/jost_net/JVerein/gui/dialogs/MailEmpfaengerAuswahlDialog.java index 5efcc5615..19e0d44ec 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/MailEmpfaengerAuswahlDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/MailEmpfaengerAuswahlDialog.java @@ -72,7 +72,7 @@ public void handleAction(Object context) throws ApplicationException try { EigenschaftenAuswahlDialog ead = new EigenschaftenAuswahlDialog(null, - false, false, new MitgliedControl(null), true); + false, new MitgliedControl(null), true); EigenschaftenAuswahlParameter param = ead.open(); if (param == null) return; diff --git a/src/de/jost_net/JVerein/gui/dialogs/MailVorschauDialog.java b/src/de/jost_net/JVerein/gui/dialogs/MailVorschauDialog.java index 6e955bf8f..c376a501e 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/MailVorschauDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/MailVorschauDialog.java @@ -10,7 +10,7 @@ * * 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 **********************************************************************/ @@ -21,6 +21,10 @@ import java.util.ArrayList; import java.util.HashMap; +import de.jost_net.JVerein.gui.control.MailVorlageControl; +import de.jost_net.JVerein.rmi.Mitglied; +import de.willuhn.jameica.gui.AbstractControl; +import de.willuhn.util.ApplicationException; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; @@ -28,7 +32,7 @@ import org.eclipse.swt.widgets.Text; import de.jost_net.JVerein.gui.control.MailControl; -import de.jost_net.JVerein.gui.control.MailControl.EvalMail; +import de.jost_net.JVerein.gui.util.EvalMail; import de.jost_net.JVerein.gui.formatter.DateiGroesseFormatter; import de.jost_net.JVerein.rmi.MailAnhang; import de.jost_net.JVerein.rmi.MailEmpfaenger; @@ -51,19 +55,25 @@ public class MailVorschauDialog extends AbstractDialog { - private MailControl control; + private final AbstractControl control; - private MailEmpfaenger empf; + private final Mitglied empfaenger; - private de.willuhn.jameica.system.Settings settings; + private final de.willuhn.jameica.system.Settings settings; public MailVorschauDialog(MailControl control, MailEmpfaenger mitglied, + int position) throws RemoteException + { + this(control, mitglied.getMitglied(), position); + } + + public MailVorschauDialog(AbstractControl control, Mitglied mitglied, int position) { super(position); settings = new de.willuhn.jameica.system.Settings(this.getClass()); this.control = control; - this.empf = mitglied; + this.empfaenger = mitglied; setTitle("Mail-Vorschau"); setSize(settings.getInt("width", 550), settings.getInt("height", 450)); @@ -89,23 +99,39 @@ protected void paint(Composite parent) throws Exception // ScrolledContainer scrolled = new ScrolledContainer(parent, 1); SimpleContainer container = new SimpleContainer(parent, true, 2); - EvalMail em = control.new EvalMail(empf); + EvalMail em = new EvalMail(empfaenger); - TextInput empfaenger = new TextInput(empf.getMailAdresse()); + TextInput empfaenger = new TextInput(this.empfaenger.getEmail()); empfaenger.setEnabled(false); container.addLabelPair("Empfänger", empfaenger); - TextInput betreff = new TextInput( - em.evalBetreff(control.getBetreffString())); + String betreffString; + String text; + if (control instanceof MailControl) + { + betreffString = ((MailControl) control).getBetreffString(); + text = ((MailControl) control).getTxtString(); + } + else if (control instanceof MailVorlageControl) + { + betreffString = ((MailVorlageControl) control).getBetreffString(); + text = ((MailVorlageControl) control).getTxtString(); + } + else + { + throw new ApplicationException("Fehler beim Anzeigen der Vorschau"); + } + TextInput betreff = new TextInput(em.evalBetreff(betreffString)); betreff.setEnabled(false); container.addLabelPair("Betreff", betreff); - TextAreaInput body = new TextAreaInput(em.evalText(control.getTxtString())); + TextAreaInput body = new TextAreaInput(em.evalText(text)); body.setEnabled(false); container.addInput(body); - if (control.getAnhang().getItems().size() > 0) + if (control instanceof MailControl && ((MailControl) control).getAnhang() + .getItems().size() > 0) { ArrayList anhang2 = new ArrayList<>(); - for (Object o : control.getAnhang().getItems()) + for (Object o : ((MailControl) control).getAnhang().getItems()) { MailAnhang a = (MailAnhang) o; if (a == null) @@ -138,15 +164,8 @@ protected void paint(Composite parent) throws Exception } ButtonArea b = new ButtonArea(); - b.addButton("Schließen", new Action() - { - - @Override - public void handleAction(Object context) - { - close(); - } - }, null, false, "process-stop.png"); + b.addButton("Schließen", context -> close(), null, false, + "process-stop.png"); b.paint(parent); } diff --git a/src/de/jost_net/JVerein/gui/dialogs/MitgliedZusatzbetragZuordnungDialog.java b/src/de/jost_net/JVerein/gui/dialogs/MitgliedZusatzbetragZuordnungDialog.java index c8883e24d..61d65b6a6 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/MitgliedZusatzbetragZuordnungDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/MitgliedZusatzbetragZuordnungDialog.java @@ -26,6 +26,7 @@ import de.jost_net.JVerein.gui.action.ZusatzbetragVorlageAuswahlAction; import de.jost_net.JVerein.gui.parts.ZusatzbetragPart; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Zusatzbetrag; @@ -95,6 +96,7 @@ public void handleAction(Object context) zb.setStartdatum((Date) part.getStartdatum(true).getValue()); zb.setBuchungsart((Buchungsart) part.getBuchungsart().getValue()); zb.setBuchungsklasseId(part.getSelectedBuchungsKlasseId()); + zb.setZahlungsweg((Zahlungsweg) part.getZahlungsweg().getValue()); zb.store(); count++; } diff --git a/src/de/jost_net/JVerein/gui/dialogs/ShowVariablesDialog.java b/src/de/jost_net/JVerein/gui/dialogs/ShowVariablesDialog.java index f8fa090cc..de451f87c 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/ShowVariablesDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/ShowVariablesDialog.java @@ -10,7 +10,7 @@ * * 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 **********************************************************************/ @@ -21,6 +21,10 @@ import java.util.Map; import java.util.Map.Entry; +import de.willuhn.jameica.gui.GUI; +import org.eclipse.swt.dnd.Clipboard; +import org.eclipse.swt.dnd.TextTransfer; +import org.eclipse.swt.dnd.Transfer; import org.eclipse.swt.widgets.Composite; import de.jost_net.JVerein.gui.menu.ShowVariablesMenu; @@ -46,17 +50,30 @@ public class ShowVariablesDialog extends AbstractDialog private Action doubleClickAction = null; + private final Clipboard clipboard; + + private final String prependCopyText, appendCopyText; + public ShowVariablesDialog(Map vars) { this(vars, true); } public ShowVariablesDialog(Map vars, boolean open) + { + this(vars, open, "", ""); + } + + public ShowVariablesDialog(Map vars, boolean open, + String prependCopyText, String appendCopyText) { super(AbstractDialog.POSITION_CENTER); setTitle("Liste der Variablen"); setSize(400, 400); + this.clipboard = new Clipboard(GUI.getDisplay()); this.vars = vars; + this.prependCopyText = prependCopyText; + this.appendCopyText = appendCopyText; // default context menu contextMenu = new ShowVariablesMenu(); if (open) @@ -90,21 +107,34 @@ protected void paint(Composite parent) throws Exception tab.paint(parent); ButtonArea buttons = new ButtonArea(); - buttons.addButton("OK", new Action() + buttons.addButton("In Zwischenablage kopieren", new Action() { @Override public void handleAction(Object context) { + if (tab.getSelection() instanceof Var) + { + Var v = (Var) tab.getSelection(); + String textData = (String) v.getAttribute("name"); + if (textData.length() > 0) + { + TextTransfer textTransfer = TextTransfer.getInstance(); + clipboard.setContents( + new Object[] { prependCopyText + textData + appendCopyText }, + new Transfer[] { textTransfer }); + } + } + close(); } - }, null, true, "ok.png"); + }, null, true, "edit-copy.png"); buttons.paint(parent); } /** * Setze ContextMenu für Tabelle. - * + * * @param newContextMenu */ public void setContextMenu(ContextMenu newContextMenu) @@ -115,7 +145,7 @@ public void setContextMenu(ContextMenu newContextMenu) /** * Setze Action, die ausgelöst wird, wenn Nutzer doppelt auf Eintrag in * Tabelle klickt. - * + * * @param newDoubleClickAction */ public void setDoubleClickAction(Action newDoubleClickAction) diff --git a/src/de/jost_net/JVerein/gui/dialogs/ZusatzbetragVorlageDialog.java b/src/de/jost_net/JVerein/gui/dialogs/ZusatzbetragVorlageDialog.java index 454132b74..36c4b8526 100644 --- a/src/de/jost_net/JVerein/gui/dialogs/ZusatzbetragVorlageDialog.java +++ b/src/de/jost_net/JVerein/gui/dialogs/ZusatzbetragVorlageDialog.java @@ -1,16 +1,16 @@ /********************************************************************** * 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 + * 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 + * 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, + * 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 **********************************************************************/ @@ -25,6 +25,7 @@ import de.jost_net.JVerein.gui.formatter.BuchungsartFormatter; import de.jost_net.JVerein.gui.formatter.BuchungsklasseFormatter; import de.jost_net.JVerein.gui.menu.ZusatzbetragVorlageMenu; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.ZusatzbetragVorlage; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.willuhn.datasource.rmi.DBIterator; @@ -32,6 +33,7 @@ import de.willuhn.jameica.gui.dialogs.AbstractDialog; import de.willuhn.jameica.gui.formatter.CurrencyFormatter; import de.willuhn.jameica.gui.formatter.DateFormatter; +import de.willuhn.jameica.gui.formatter.Formatter; import de.willuhn.jameica.gui.parts.ButtonArea; import de.willuhn.jameica.gui.parts.TablePart; import de.willuhn.jameica.gui.parts.table.FeatureSummary; @@ -117,10 +119,23 @@ public void handleAction(Object context) tab.addColumn("Betrag", "betrag", new CurrencyFormatter("", Einstellungen.DECIMALFORMAT)); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) - tab.addColumn("Buchungsklasse", "buchungsklasse", + { + tab.addColumn("Buchungsklasse", "buchungsklasse", new BuchungsklasseFormatter()); - tab.addColumn("Buchungsart", "buchungsart", - new BuchungsartFormatter()); + } + tab.addColumn("Buchungsart", "buchungsart", new BuchungsartFormatter()); + tab.addColumn("Zahlungsweg", "zahlungsweg", new Formatter() + { + @Override + public String format(Object o) + { + if (o == null) + { + return ""; + } + return new Zahlungsweg((Integer) o).getText(); + } + }); tab.setContextMenu(new ZusatzbetragVorlageMenu()); tab.setRememberColWidths(true); tab.setRememberOrder(true); diff --git a/src/de/jost_net/JVerein/gui/input/FormularInput.java b/src/de/jost_net/JVerein/gui/input/FormularInput.java index 9b91bdd19..883be4934 100644 --- a/src/de/jost_net/JVerein/gui/input/FormularInput.java +++ b/src/de/jost_net/JVerein/gui/input/FormularInput.java @@ -46,25 +46,36 @@ public FormularInput(FormularArt mahnung) throws RemoteException * @return initialisiert die Liste der Optionen. * @throws RemoteException */ - private static GenericIterator init(FormularArt mahnung) + private static GenericIterator init(FormularArt art) throws RemoteException { DBIterator it = Einstellungen.getDBService() .createList(Formular.class); // Add filter only if needed - if (mahnung == null) + if (art == null) { return it; } - it.addFilter("art = ?", mahnung.getKey()); + it.addFilter("art = ?", art.getKey()); return it; } - private static Object initdefault(String id) throws RemoteException + private static Object initdefault(String id) { - Formular f = (Formular) Einstellungen.getDBService() - .createObject(Formular.class, id); - return f; + if (id == null || id.isEmpty()) + { + return null; + } + try + { + Formular f = (Formular) Einstellungen.getDBService() + .createObject(Formular.class, id); + return f; + } + catch (Exception ex) + { + return null; + } } } diff --git a/src/de/jost_net/JVerein/gui/input/KontoauswahlInput.java b/src/de/jost_net/JVerein/gui/input/KontoauswahlInput.java index 259c5f11d..d356cc928 100644 --- a/src/de/jost_net/JVerein/gui/input/KontoauswahlInput.java +++ b/src/de/jost_net/JVerein/gui/input/KontoauswahlInput.java @@ -23,7 +23,7 @@ import org.eclipse.swt.widgets.Listener; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.gui.dialogs.KontoAuswahlDialog; import de.jost_net.JVerein.rmi.Konto; import de.willuhn.datasource.rmi.ObjectNotFoundException; @@ -69,7 +69,7 @@ public KontoauswahlInput(Konto konto) * @throws RemoteException */ public DialogInput getKontoAuswahl(boolean keinkonto, String kontoid, - boolean onlyHibiscus, boolean nurAktuelleKonten, Kontenart art) throws RemoteException + boolean onlyHibiscus, boolean nurAktuelleKonten, Kontenfilter art) throws RemoteException { if (kontoAuswahl != null) { @@ -133,8 +133,8 @@ public void handleEvent(Event event) try { // TODO warum wird das doppelt aufgerufen? - getKontoAuswahl(keinkonto, "", false, false, Kontenart.ALLE).setText(""); - getKontoAuswahl(keinkonto, "", false, false, Kontenart.ALLE).setComment(""); + getKontoAuswahl(keinkonto, "", false, false, Kontenfilter.ALLE).setText(""); + getKontoAuswahl(keinkonto, "", false, false, Kontenfilter.ALLE).setComment(""); settings.setAttribute("kontoid", ""); } catch (RemoteException e) @@ -148,8 +148,8 @@ public void handleEvent(Event event) try { String b = konto.getBezeichnung(); - getKontoAuswahl(keinkonto, "", false, false, Kontenart.ALLE).setText(konto.getNummer()); - getKontoAuswahl(keinkonto, "", false, false, Kontenart.ALLE).setComment( + getKontoAuswahl(keinkonto, "", false, false, Kontenfilter.ALLE).setText(konto.getNummer()); + getKontoAuswahl(keinkonto, "", false, false, Kontenfilter.ALLE).setComment( b == null ? "" : b); settings.setAttribute("kontoid", konto.getID()); } diff --git a/src/de/jost_net/JVerein/gui/input/MailAuswertungInput.java b/src/de/jost_net/JVerein/gui/input/MailAuswertungInput.java index fef8ee83b..3a6ca6431 100644 --- a/src/de/jost_net/JVerein/gui/input/MailAuswertungInput.java +++ b/src/de/jost_net/JVerein/gui/input/MailAuswertungInput.java @@ -71,14 +71,14 @@ public Object getValue() /** * Hilfs-Objekt zur Anzeige der Labels. */ - private static class MailAuswertungObject implements GenericObject + public static class MailAuswertungObject implements GenericObject { public int mailauswertung; private String label = null; - private MailAuswertungObject(int mail) + public MailAuswertungObject(int mail) { this.mailauswertung = mail; if (mail == 0) diff --git a/src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java b/src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java index a33297b9a..c61b7cce1 100644 --- a/src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java +++ b/src/de/jost_net/JVerein/gui/input/SollbuchungAuswahlInput.java @@ -132,8 +132,7 @@ public void handleEvent(Event event) buchungen[0].setZweck(konto.getZweck1()); buchungen[0].setBetrag(konto.getBetrag()); buchungen[0].setDatum(new Date()); - buchungen[0] - .setBuchungsart(Long.valueOf(konto.getBuchungsart().getID())); + buchungen[0].setBuchungsartId(konto.getBuchungsartId()); buchungen[0].setBuchungsklasseId(konto.getBuchungsklasseId()); } } diff --git a/src/de/jost_net/JVerein/gui/menu/BuchungMenu.java b/src/de/jost_net/JVerein/gui/menu/BuchungMenu.java index 67f73e662..f2c552bb7 100644 --- a/src/de/jost_net/JVerein/gui/menu/BuchungMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/BuchungMenu.java @@ -18,17 +18,18 @@ import java.rmi.RemoteException; -import de.jost_net.JVerein.gui.action.AnlagenkontoNeuAction; import de.jost_net.JVerein.gui.action.BuchungAction; -import de.jost_net.JVerein.gui.action.BuchungBuchungsartZuordnungAction; -import de.jost_net.JVerein.gui.action.BuchungDeleteAction; import de.jost_net.JVerein.gui.action.BuchungDuplizierenAction; import de.jost_net.JVerein.gui.action.BuchungGegenbuchungAction; -import de.jost_net.JVerein.gui.action.BuchungKontoauszugZuordnungAction; -import de.jost_net.JVerein.gui.action.BuchungSollbuchungZuordnungAction; -import de.jost_net.JVerein.gui.action.BuchungProjektZuordnungAction; import de.jost_net.JVerein.gui.action.SplitBuchungAction; import de.jost_net.JVerein.gui.action.SplitbuchungBulkAufloesenAction; +import de.jost_net.JVerein.gui.action.AnlagenkontoNeuAction; +import de.jost_net.JVerein.gui.action.BuchungBuchungsartZuordnungAction; +import de.jost_net.JVerein.gui.action.BuchungSollbuchungZuordnungAction; +import de.jost_net.JVerein.gui.action.MitgliedDetailAction; +import de.jost_net.JVerein.gui.action.BuchungProjektZuordnungAction; +import de.jost_net.JVerein.gui.action.BuchungKontoauszugZuordnungAction; +import de.jost_net.JVerein.gui.action.BuchungDeleteAction; import de.jost_net.JVerein.gui.control.BuchungsControl; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.keys.ArtBuchungsart; @@ -37,6 +38,7 @@ import de.willuhn.jameica.gui.parts.CheckedContextMenuItem; import de.willuhn.jameica.gui.parts.CheckedSingleContextMenuItem; import de.willuhn.jameica.gui.parts.ContextMenu; +import de.willuhn.jameica.gui.parts.ContextMenuItem; import de.willuhn.logging.Logger; /** @@ -64,23 +66,27 @@ public BuchungMenu(BuchungsControl control) "edit-copy.png")); addItem(new AufloesenItem("Auflösen", new SplitbuchungBulkAufloesenAction(), "unlocked.png")); + addItem(new BuchungItem("Löschen", new BuchungDeleteAction(false), + "user-trash-full.png")); + addItem(ContextMenuItem.SEPARATOR); if (geldkonto) { + addItem(new MitgliedOeffnenItem("Mitglied anzeigen", + new MitgliedDetailAction(), "user-friends.png")); addItem(new SingleGegenBuchungItem("Neues Anlagenkonto", new AnlagenkontoNeuAction(), "document-new.png")); } addItem(new CheckedContextMenuItem("Buchungsart zuordnen", new BuchungBuchungsartZuordnungAction(control), "view-refresh.png")); - if (geldkonto) + if (geldkonto) { addItem(new CheckedContextMenuItem("Sollbuchung zuordnen", - new BuchungSollbuchungZuordnungAction(control), "view-refresh.png")); + new BuchungSollbuchungZuordnungAction(control), "view-refresh.png")); + } addItem(new CheckedContextMenuItem("Projekt zuordnen", new BuchungProjektZuordnungAction(control), "view-refresh.png")); if (geldkonto) addItem(new CheckedContextMenuItem("Kontoauszug zuordnen", new BuchungKontoauszugZuordnungAction(control), "view-refresh.png")); - addItem(new BuchungItem("Löschen", new BuchungDeleteAction(false), - "user-trash-full.png")); } private static class SingleBuchungItem extends CheckedSingleContextMenuItem @@ -250,4 +256,24 @@ public boolean isEnabledFor(Object o) return false; } } + + private static class MitgliedOeffnenItem extends CheckedContextMenuItem + { + private MitgliedOeffnenItem(String text, Action action, String icon) { super(text, action, icon); } + + @Override + public boolean isEnabledFor(Object o) { + try + { + if (o instanceof Buchung) + { + return ((Buchung) o).getMitgliedskonto() != null; + } + } + catch (RemoteException e) { + Logger.error("Fehler", e); + } + return false; + } + } } diff --git a/src/de/jost_net/JVerein/gui/menu/FormularMenu.java b/src/de/jost_net/JVerein/gui/menu/FormularMenu.java index 9e5736cf3..9ff849749 100644 --- a/src/de/jost_net/JVerein/gui/menu/FormularMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/FormularMenu.java @@ -20,6 +20,7 @@ import de.jost_net.JVerein.gui.action.FormularAnzeigeAction; import de.jost_net.JVerein.gui.action.FormularDeleteAction; import de.jost_net.JVerein.gui.action.FormularDuplizierenAction; +import de.jost_net.JVerein.gui.action.FormularExportAction; import de.jost_net.JVerein.gui.control.FormularControl; import de.willuhn.jameica.gui.parts.CheckedContextMenuItem; import de.willuhn.jameica.gui.parts.CheckedSingleContextMenuItem; @@ -38,11 +39,16 @@ public FormularMenu(FormularControl control) { addItem(new CheckedSingleContextMenuItem("Bearbeiten", new FormularAction(), "text-x-generic.png")); - addItem(new CheckedContextMenuItem("Anzeigen", new FormularAnzeigeAction(), + addItem(new CheckedSingleContextMenuItem("Anzeigen", + new FormularAnzeigeAction(), "edit-copy.png")); addItem(new CheckedSingleContextMenuItem("Duplizieren", new FormularDuplizierenAction(control), "edit-copy.png")); - addItem(new CheckedContextMenuItem("Löschen", new FormularDeleteAction(), + addItem(new CheckedSingleContextMenuItem("Löschen", + new FormularDeleteAction(), "user-trash-full.png")); + addItem( + new CheckedContextMenuItem("Exportieren", + new FormularExportAction(), "document-save.png")); } } diff --git a/src/de/jost_net/JVerein/gui/menu/MailAuswahlMenu.java b/src/de/jost_net/JVerein/gui/menu/MailAuswahlMenu.java index b28e37ec4..c742adc9b 100644 --- a/src/de/jost_net/JVerein/gui/menu/MailAuswahlMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/MailAuswahlMenu.java @@ -10,26 +10,19 @@ * * 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.menu; -import java.rmi.RemoteException; - import de.jost_net.JVerein.gui.action.MailAuswahlDeleteAction; +import de.jost_net.JVerein.gui.action.MailVorschauAction; +import de.jost_net.JVerein.gui.action.OpenInsertVariableDialogAction; import de.jost_net.JVerein.gui.control.MailControl; -import de.jost_net.JVerein.gui.dialogs.MailEmpfaengerAuswahlDialog; -import de.jost_net.JVerein.gui.dialogs.MailVorschauDialog; -import de.jost_net.JVerein.gui.dialogs.ShowVariablesDialog; -import de.jost_net.JVerein.rmi.MailEmpfaenger; -import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.parts.CheckedContextMenuItem; import de.willuhn.jameica.gui.parts.CheckedSingleContextMenuItem; import de.willuhn.jameica.gui.parts.ContextMenu; -import de.willuhn.logging.Logger; -import de.willuhn.util.ApplicationException; /** * Kontext-Menu zur MailEmpfänger-Auswahl. @@ -39,60 +32,11 @@ public class MailAuswahlMenu extends ContextMenu public MailAuswahlMenu(MailControl control) { - final MailControl contr = control; - addItem(new CheckedSingleContextMenuItem("Variable", new Action() - { - - @Override - public void handleAction(Object context) throws ApplicationException - { - if (context instanceof MailEmpfaenger) - { - MailEmpfaenger m = (MailEmpfaenger) context; - try - { - new ShowVariablesDialog(contr.getVariables(m.getMitglied())); - } - catch (RemoteException e) - { - Logger.error("Fehler", e); - throw new ApplicationException(e); - } - } - else - { - Logger.error("ShowVariablesDiaglog: Ungültige Klasse: " - + context.getClass().getCanonicalName()); - } - - } - - }, "bookmark.png")); - addItem(new CheckedSingleContextMenuItem("Vorschau", new Action() - { - - @Override - public void handleAction(Object context) - { - if (context != null && context instanceof MailEmpfaenger) - { - MailEmpfaenger m = (MailEmpfaenger) context; - new MailVorschauDialog(contr, m, - MailEmpfaengerAuswahlDialog.POSITION_CENTER); - } - else - { - String name = ""; - if (context != null && context.getClass() != null) - { - name = context.getClass().getCanonicalName(); - } - Logger.error("ShowVariablesDiaglog: Ungültige Klasse: " + name); - } - - } - - }, "edit-copy.png" /* "mail-message-new.png" */)); + addItem(new CheckedSingleContextMenuItem("Variablen anzeigen", + new OpenInsertVariableDialogAction(), "bookmark.png")); + addItem(new CheckedSingleContextMenuItem("Vorschau", + new MailVorschauAction(control), + "edit-copy.png" /* "mail-message-new.png" */)); addItem(new CheckedContextMenuItem("Entfernen", new MailAuswahlDeleteAction(control), "user-trash-full.png")); } diff --git a/src/de/jost_net/JVerein/gui/menu/MitgliedMenu.java b/src/de/jost_net/JVerein/gui/menu/MitgliedMenu.java index ca2d977a6..cc17bc064 100644 --- a/src/de/jost_net/JVerein/gui/menu/MitgliedMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/MitgliedMenu.java @@ -150,10 +150,11 @@ public void handleAction(Object context) throws ApplicationException m.setEingabedatum(); m.setBeitragsgruppe(null); m.setExterneMitgliedsnummer(null); - m.setIndividuellerBeitrag(0.0d); + m.setIndividuellerBeitrag(null); m.setEintritt(""); m.setAustritt(""); m.setKuendigung(""); + m.setZahlerID(null); DBService service = Einstellungen.getDBService(); // Sekundäre Beitragsgruppen löschen DBIterator sit = service diff --git a/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java b/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java index e0e508db7..594160e81 100755 --- a/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java +++ b/src/de/jost_net/JVerein/gui/menu/MitgliedskontoMenu.java @@ -19,11 +19,11 @@ import java.rmi.RemoteException; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.action.MitgliedskontoSollbuchungEditAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoSollbuchungLoeschenAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoSollbuchungNeuAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoIstbuchungEditAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoIstbuchungLoesenAction; +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.SpendenbescheinigungAction; import de.jost_net.JVerein.gui.control.MitgliedskontoNode; import de.jost_net.JVerein.keys.Spendenart; @@ -47,16 +47,16 @@ public class MitgliedskontoMenu extends ContextMenu public MitgliedskontoMenu() { addItem(new MitgliedItem("Neue Sollbuchung", - new MitgliedskontoSollbuchungNeuAction(), "document-new.png")); + new SollbuchungNeuAction(), "document-new.png")); addItem(new SollItem("Sollbuchung bearbeiten", - new MitgliedskontoSollbuchungEditAction(), "text-x-generic.png")); + new SollbuchungEditAction(), "text-x-generic.png")); addItem(new SollOhneIstItem("Sollbuchung löschen", - new MitgliedskontoSollbuchungLoeschenAction(), "user-trash-full.png")); + new SollbuchungLoeschenAction(), "user-trash-full.png")); addItem(ContextMenuItem.SEPARATOR); addItem(new SollMitIstItem("Istbuchung bearbeiten", - new MitgliedskontoIstbuchungEditAction(), "text-x-generic.png")); + new IstbuchungEditAction(), "text-x-generic.png")); addItem(new SollMitIstItem("Istbuchung von Sollbuchung lösen", - new MitgliedskontoIstbuchungLoesenAction(), "unlocked.png")); + new IstbuchungLoesenAction(), "unlocked.png")); addItem(ContextMenuItem.SEPARATOR); addItem(new SpendenbescheinigungItem("Geldspendenbescheinigung", new SpendenbescheinigungAction(Spendenart.GELDSPENDE), "file-invoice.png")); diff --git a/src/de/jost_net/JVerein/gui/menu/RechnungMenu.java b/src/de/jost_net/JVerein/gui/menu/RechnungMenu.java new file mode 100644 index 000000000..891db0755 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/menu/RechnungMenu.java @@ -0,0 +1,50 @@ +/********************************************************************** + * 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.menu; + +import de.jost_net.JVerein.gui.action.MahnungSendAction; +import de.jost_net.JVerein.gui.action.RechnungAction; +import de.jost_net.JVerein.gui.action.RechnungDeleteAction; +import de.jost_net.JVerein.gui.action.RechnungSendAction; +import de.willuhn.jameica.gui.parts.CheckedContextMenuItem; +import de.willuhn.jameica.gui.parts.CheckedSingleContextMenuItem; +import de.willuhn.jameica.gui.parts.ContextMenu; +import de.willuhn.jameica.gui.parts.ContextMenuItem; + +/** + * Kontext-Menu zu den Spendenbescheinigungen. + */ +public class RechnungMenu extends ContextMenu +{ + + /** + * Erzeugt ein Kontext-Menu fuer die Liste der Spendenbescheinigungen. + */ + public RechnungMenu() + { + addItem(new CheckedSingleContextMenuItem("Anzeigen", + new RechnungAction(), "text-x-generic.png")); + addItem(new CheckedContextMenuItem("Löschen", + new RechnungDeleteAction(), "user-trash-full.png")); + addItem(ContextMenuItem.SEPARATOR); + addItem(new CheckedContextMenuItem("Druck und Mail", + new RechnungSendAction(), "document-print.png")); + addItem(new CheckedContextMenuItem("Mahnung Druck und Mail", + new MahnungSendAction(), "document-print.png")); + } + +} diff --git a/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java b/src/de/jost_net/JVerein/gui/menu/SollbuchungMenu.java index 9a349efb1..304e58c56 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.MitgliedskontoMahnungAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoRechnungAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoSollbuchungEditAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoSollbuchungLoeschenAction; +import de.jost_net.JVerein.gui.action.SollbuchungMahnungAction; +import de.jost_net.JVerein.gui.action.SollbuchungRechnungAction; +import de.jost_net.JVerein.gui.action.SollbuchungEditAction; +import de.jost_net.JVerein.gui.action.SollbuchungLoeschenAction; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.willuhn.datasource.rmi.DBIterator; @@ -47,16 +47,17 @@ public class SollbuchungMenu extends ContextMenu public SollbuchungMenu() { addItem(new CheckedSingleContextMenuItem("Bearbeiten", - new MitgliedskontoSollbuchungEditAction(), "text-x-generic.png")); + new SollbuchungEditAction(), "text-x-generic.png")); addItem(new SollOhneIstItem("Löschen", - new MitgliedskontoSollbuchungLoeschenAction(), "user-trash-full.png")); + new SollbuchungLoeschenAction(), "user-trash-full.png")); addItem(ContextMenuItem.SEPARATOR); addItem(new CheckedSingleContextMenuItem("Mitglied anzeigen", new MitgliedDetailAction(), "user-friends.png")); - addItem(new CheckedContextMenuItem("Rechnung erstellen", - new MitgliedskontoRechnungAction(), "file-invoice.png")); + /*addItem(new CheckedContextMenuItem("Rechnung erstellen", + new SollbuchungRechnungAction(), "file-invoice.png")); addItem(new CheckedContextMenuItem("Mahnung erstellen", - new MitgliedskontoMahnungAction(), "file-invoice.png")); + new SollbuchungMahnungAction(), "file-invoice.png")); + */ } private static class SollOhneIstItem extends CheckedContextMenuItem diff --git a/src/de/jost_net/JVerein/gui/navigation/MyExtension.java b/src/de/jost_net/JVerein/gui/navigation/MyExtension.java index 33ab1f947..f53604a6d 100644 --- a/src/de/jost_net/JVerein/gui/navigation/MyExtension.java +++ b/src/de/jost_net/JVerein/gui/navigation/MyExtension.java @@ -24,7 +24,6 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.gui.action.AboutAction; -import de.jost_net.JVerein.gui.action.AbrechnungSEPAAction; import de.jost_net.JVerein.gui.action.AbrechnunslaufListAction; import de.jost_net.JVerein.gui.action.AbschreibungsListeAction; import de.jost_net.JVerein.gui.action.AdministrationEinstellungenAbrechnungAction; @@ -41,6 +40,7 @@ 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; @@ -55,7 +55,6 @@ import de.jost_net.JVerein.gui.action.BuchungsartListAction; import de.jost_net.JVerein.gui.action.BuchungsklasseListAction; import de.jost_net.JVerein.gui.action.BuchungsklasseSaldoAction; -import de.jost_net.JVerein.gui.action.BuchungsuebernahmeAction; import de.jost_net.JVerein.gui.action.DbBereinigenAction; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.EigenschaftGruppeListeAction; @@ -81,11 +80,12 @@ 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.MitgliedskontoMahnungAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoRechnungAction; +import de.jost_net.JVerein.gui.action.SollbuchungMahnungAction; +import de.jost_net.JVerein.gui.action.SollbuchungRechnungAction; 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.SpendenbescheinigungListeAction; import de.jost_net.JVerein.gui.action.SpendenbescheinigungSendAction; import de.jost_net.JVerein.gui.action.StatistikJahrgaengeAction; @@ -93,6 +93,7 @@ import de.jost_net.JVerein.gui.action.WiedervorlageListeAction; import de.jost_net.JVerein.gui.action.ZusatzbetraegeListeAction; import de.jost_net.JVerein.keys.ArtBeitragsart; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Beitragsgruppe; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBService; @@ -118,10 +119,10 @@ public void extend(Extendable extendable) try { DBService service = Einstellungen.getDBService(); - String sql = "SELECT konto.anlagenkonto from konto " - + "WHERE (anlagenkonto = true) "; + String sql = "SELECT konto.id from konto " + + "WHERE (kontoart = ?) "; anlagenkonto = (boolean) service.execute(sql, - new Object[] { }, new ResultSetExtractor() + new Object[] { Kontoart.ANLAGE.getKey() }, new ResultSetExtractor() { @Override public Object extract(ResultSet rs) @@ -168,6 +169,8 @@ public Object extract(ResultSet rs) mitglieder.addChild(new MyItem(mitglieder, "Sollbuchungen", new SollbuchungListeAction(), "calculator.png")); + mitglieder.addChild(new MyItem(mitglieder, "Rechnungen", + new RechnungListeAction(), "file-invoice.png")); mitglieder.addChild(new MyItem(mitglieder, "Spendenbescheinigungen", new SpendenbescheinigungListeAction(), "file-invoice.png")); if (Einstellungen.getEinstellung().getZusatzbetrag()) @@ -177,7 +180,7 @@ public Object extract(ResultSet rs) } if (Einstellungen.getEinstellung().getWiedervorlage()) { - mitglieder.addChild(new MyItem(mitglieder, "Wiedervorlage", + mitglieder.addChild(new MyItem(mitglieder, "Wiedervorlagen", new WiedervorlageListeAction(), "office-calendar.png")); } if (Einstellungen.getEinstellung().getLehrgaenge()) @@ -198,8 +201,6 @@ public Object extract(ResultSet rs) new KontoListAction(), "list.png")); buchfuehrung.addChild(new MyItem(buchfuehrung, "Anfangsbestände", new AnfangsbestandListAction(), "euro-sign.png")); - buchfuehrung.addChild(new MyItem(buchfuehrung, "Hibiscus-Buchungen", - new BuchungsuebernahmeAction(), "hibiscus-icon-64x64.png")); buchfuehrung.addChild(new MyItem(buchfuehrung, "Buchungen", new BuchungsListeAction(), "euro-sign.png")); if (anlagenkonto) @@ -213,6 +214,11 @@ public Object extract(ResultSet rs) new ProjektSaldoAction(), "euro-sign.png")); buchfuehrung.addChild(new MyItem(buchfuehrung, "Kontensaldo", new KontensaldoAction(), "euro-sign.png")); + if (Einstellungen.getEinstellung().getMittelverwendung()) + { + buchfuehrung.addChild(new MyItem(buchfuehrung, "Mittelverwendung", + new MittelverwendungListeAction(), "euro-sign.png")); + } if (anlagenkonto) buchfuehrung.addChild(new MyItem(buchfuehrung, "Anlagenverzeichnis", new AnlagenlisteAction(), "euro-sign.png")); @@ -222,9 +228,7 @@ public Object extract(ResultSet rs) NavigationItem abrechnung = null; abrechnung = new MyItem(abrechnung, "Abrechnung", null); - abrechnung.addChild(new MyItem(abrechnung, "Abrechnung", - new AbrechnungSEPAAction(), "calculator.png")); - abrechnung.addChild(new MyItem(abrechnung, "Abrechnungslauf", + abrechnung.addChild(new MyItem(abrechnung, "Abrechnungsläufe", new AbrechnunslaufListAction(), "calculator.png")); abrechnung.addChild(new MyItem(abrechnung, "Lastschriften", new LastschriftListAction(), "file-invoice.png")); @@ -243,9 +247,9 @@ public Object extract(ResultSet rs) auswertung.addChild(new MyItem(auswertung, "Kursteilnehmer", new AuswertungKursteilnehmerAction(), "receipt.png")); } - auswertung.addChild(new MyItem(auswertung, "Statistik", + auswertung.addChild(new MyItem(auswertung, "Mitgliederstatistik", new StatistikMitgliedAction(), "chart-line.png")); - auswertung.addChild(new MyItem(auswertung, "Statistik Jahrgänge", + auswertung.addChild(new MyItem(auswertung, "Jahrgangsstatistik", new StatistikJahrgaengeAction(), "chart-line.png")); if (Einstellungen.getEinstellung().getArbeitseinsatz()) { @@ -257,9 +261,9 @@ public Object extract(ResultSet rs) NavigationItem mail = null; mail = new MyItem(mail, "Druck & Mail", null); mail.addChild(new MyItem(mail, "Rechnungen", - new MitgliedskontoRechnungAction(), "document-print.png")); + new SollbuchungRechnungAction(), "document-print.png")); mail.addChild(new MyItem(mail, "Mahnungen", - new MitgliedskontoMahnungAction(), "document-print.png")); + new SollbuchungMahnungAction(), "document-print.png")); mail.addChild(new MyItem(mail, "Kontoauszüge", new KontoauszugAction(), "document-print.png")); mail.addChild(new MyItem(mail, "Freie Formulare", @@ -324,7 +328,7 @@ public Object extract(ResultSet rs) einstellungenmitglieder.addChild(new MyItem(einstellungenmitglieder, "Beitragsgruppen", new BeitragsgruppeSucheAction(), "clone.png")); einstellungenmitglieder - .addChild(new MyItem(einstellungenmitglieder, "Eigenschaften-Gruppen", + .addChild(new MyItem(einstellungenmitglieder, "Eigenschaftengruppen", new EigenschaftGruppeListeAction(), "document-properties.png")); einstellungenmitglieder.addChild(new MyItem(einstellungenmitglieder, "Eigenschaften", new EigenschaftListeAction(), "document-properties.png")); @@ -373,14 +377,14 @@ public Object extract(ResultSet rs) einstellungenerweitert.addChild(new MyItem(einstellungenerweitert, "Migration", new MitgliedMigrationAction(), "file-import.png")); einstellungenerweitert - .addChild(new MyItem(einstellungenerweitert, "QIF Datei-Import", + .addChild(new MyItem(einstellungenerweitert, "QIF-Datei-Import", new QIFBuchungsImportViewAction(), "file-import.png")); einstellungenerweitert.addChild(new MyItem(einstellungenerweitert, - "Datenbank bereinigen", new DbBereinigenAction(), "placeholder-loading.png")); + "Datenbank-Bereinigung", new DbBereinigenAction(), "placeholder-loading.png")); einstellungenerweitert.addChild(new MyItem(einstellungenerweitert, - "Diagnose-Backup erstellen", new BackupCreateAction(), "document-save.png")); + "Diagnose-Backup-Export", new BackupCreateAction(), "document-save.png")); einstellungenerweitert.addChild( - new MyItem(einstellungenerweitert, "Diagnose-Backup importieren", + new MyItem(einstellungenerweitert, "Diagnose-Backup-Import", new BackupRestoreAction(), "file-import.png")); administration.addChild(einstellungenerweitert); jverein.addChild(administration); diff --git a/src/de/jost_net/JVerein/gui/navigation/MyItem.java b/src/de/jost_net/JVerein/gui/navigation/MyItem.java index f46dfec93..019816b04 100644 --- a/src/de/jost_net/JVerein/gui/navigation/MyItem.java +++ b/src/de/jost_net/JVerein/gui/navigation/MyItem.java @@ -46,6 +46,10 @@ public class MyItem implements NavigationItem private String icon; + private static int maxId = 0; + + private int id; + public MyItem(NavigationItem item, String navitext, Action action) { this(item, navitext, action, null); @@ -54,6 +58,7 @@ public MyItem(NavigationItem item, String navitext, Action action) public MyItem(NavigationItem item, String navitext, Action action, String icon) { + this.id = maxId++; this.parent = item; this.action = action; this.navitext = navitext; @@ -239,7 +244,7 @@ public String[] getAttributeNames() @Override public String getID() { - return getClass().getName() + "." + getName(); + return getClass().getName() + "." + id + "." + getName(); } /** diff --git a/src/de/jost_net/JVerein/gui/parts/AnlagenList.java b/src/de/jost_net/JVerein/gui/parts/AnlagenList.java index fac236e55..e3eee2f10 100644 --- a/src/de/jost_net/JVerein/gui/parts/AnlagenList.java +++ b/src/de/jost_net/JVerein/gui/parts/AnlagenList.java @@ -26,6 +26,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.io.AnlagenlisteZeile; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Anfangsbestand; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Buchungsart; @@ -182,13 +183,13 @@ public Object extract(ResultSet rs) throws SQLException { buchungsart = (Buchungsart) buchungsartenIt.next(); String sqlc = "select count(*) from konto " - + "where anlagenkonto = TRUE " + + "where kontoart = ? " + "and (aufloesung IS NULL OR aufloesung >= ?) " + "and (eroeffnung IS NULL OR eroeffnung <= ?) " + "and anlagenklasse = ? " + "and anlagenart = ? "; int anz = (Integer) service.execute(sqlc, - new Object[] { datumvon, datumbis, buchungsklasse.getID(), + new Object[] { Kontoart.ANLAGE.getKey(), datumvon, datumbis, buchungsklasse.getID(), buchungsart.getID() }, rsi); if (anz == 0) { @@ -200,7 +201,8 @@ public Object extract(ResultSet rs) throws SQLException DBIterator kontenIt = service .createList(Konto.class); - kontenIt.addFilter("anlagenkonto = TRUE"); + kontenIt.addFilter("kontoart = ?", + new Object[] { Kontoart.ANLAGE.getKey() }); kontenIt.addFilter("anlagenklasse = ?", new Object[] { buchungsklasse.getID() }); kontenIt.addFilter("anlagenart = ?", diff --git a/src/de/jost_net/JVerein/gui/parts/ArbeitseinsatzUeberpruefungList.java b/src/de/jost_net/JVerein/gui/parts/ArbeitseinsatzUeberpruefungList.java index 97dd50113..9dd7d544e 100644 --- a/src/de/jost_net/JVerein/gui/parts/ArbeitseinsatzUeberpruefungList.java +++ b/src/de/jost_net/JVerein/gui/parts/ArbeitseinsatzUeberpruefungList.java @@ -92,6 +92,7 @@ public Part getArbeitseinsatzUeberpruefungList() throws ApplicationException { arbeitseinsatzueberpruefungList.addItem(az); } + arbeitseinsatzueberpruefungList.sort(); } } catch (RemoteException e) diff --git a/src/de/jost_net/JVerein/gui/parts/BuchungsklasseSaldoList.java b/src/de/jost_net/JVerein/gui/parts/BuchungsklasseSaldoList.java index 34a8393fe..935d134d3 100644 --- a/src/de/jost_net/JVerein/gui/parts/BuchungsklasseSaldoList.java +++ b/src/de/jost_net/JVerein/gui/parts/BuchungsklasseSaldoList.java @@ -27,6 +27,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.io.BuchungsklasseSaldoZeile; import de.jost_net.JVerein.keys.ArtBuchungsart; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Buchungsklasse; import de.willuhn.datasource.rmi.DBIterator; @@ -326,38 +327,43 @@ else if (buchungsart.getArt() == ArtBuchungsart.AUSGABE) int anz = 0; if (!Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { - sqlc = "select count(*) from buchung, buchungsart " + sqlc = "select count(*) from buchung, buchungsart, konto " + "where datum >= ? and datum <= ? " + "and buchung.buchungsart = buchungsart.id " - + "and buchungsart.id = ?"; - anz = (Integer) service.execute(sqlc, - new Object[] { datumvon, datumbis, buchungsart.getID() }, rsi); + + "and buchungsart.id = ? " + + "and buchung.konto = konto.id " + + "and konto.kontoart < ? "; + anz = (Integer) service.execute(sqlc, new Object[] { datumvon, datumbis, + buchungsart.getID(), Kontoart.LIMIT.getKey() }, rsi); } else { if (buchungsklasseId != null) { // Buchungen der Buchungsklasse - sqlc = "select count(*) from buchung, buchungsart " + sqlc = "select count(*) from buchung, buchungsart, konto " + "where datum >= ? and datum <= ? " + "and buchung.buchungsart = buchungsart.id " + "and buchungsart.id = ? " - + "and buchung.buchungsklasse = ? "; + + "and buchung.buchungsklasse = ? " + + "and buchung.konto = konto.id " + + "and konto.kontoart < ? "; anz = (Integer) service.execute(sqlc, new Object[] { datumvon, datumbis, buchungsart.getID(), - buchungsklasseId }, rsi); + buchungsklasseId, Kontoart.LIMIT.getKey() }, rsi); } else { // Buchungen ohne Buchungsklasse - sqlc = "select count(*) from buchung, buchungsart " + sqlc = "select count(*) from buchung, buchungsart, konto " + "where datum >= ? and datum <= ? " + "and buchung.buchungsart = buchungsart.id " + "and buchungsart.id = ? " - + "and buchung.buchungsklasse is null "; - anz = (Integer) service.execute(sqlc, - new Object[] { datumvon, datumbis, buchungsart.getID() - }, rsi); + + "and buchung.buchungsklasse is null " + + "and buchung.konto = konto.id " + + "and konto.kontoart < ? "; + anz = (Integer) service.execute(sqlc, new Object[] { datumvon, + datumbis, buchungsart.getID(), Kontoart.LIMIT.getKey() }, rsi); } } @@ -370,18 +376,20 @@ else if (buchungsart.getArt() == ArtBuchungsart.AUSGABE) if (!Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) { // Buchungsklasse steht in Buchungsart - sql = "select sum(betrag) from buchung, buchungsart " + sql = "select sum(buchung.betrag) from buchung, konto, buchungsart " + "where datum >= ? and datum <= ? " + + "and buchung.konto = konto.id " + + "and konto.kontoart < ? " + "and buchung.buchungsart = buchungsart.id " + "and buchungsart.id = ? " + "and buchungsart.art = ?"; - einnahmen = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 0 }, rsd); + einnahmen = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.LIMIT.getKey(), buchungsart.getID(), 0 }, rsd); suBukEinnahmen += einnahmen; - ausgaben = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 1 }, rsd); + ausgaben = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.LIMIT.getKey(), buchungsart.getID(), 1 }, rsd); suBukAusgaben += ausgaben; - umbuchungen = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 2 }, rsd); + umbuchungen = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.LIMIT.getKey(), buchungsart.getID(), 2 }, rsd); suBukUmbuchungen += umbuchungen; } else @@ -390,43 +398,50 @@ else if (buchungsart.getArt() == ArtBuchungsart.AUSGABE) if (buchungsklasseId != null) { // Buchungen der Buchungsklasse - sql = "select sum(betrag) from buchung, buchungsart " + sql = "select sum(buchung.betrag) from buchung, konto, buchungsart " + "where datum >= ? and datum <= ? " + + "and buchung.konto = konto.id " + + "and konto.kontoart < ? " + "and buchung.buchungsart = buchungsart.id " + "and buchungsart.id = ? " + "and buchungsart.art = ? " + "and buchung.buchungsklasse = ? "; einnahmen = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 0, - buchungsklasseId }, rsd); + new Object[] { datumvon, datumbis, Kontoart.LIMIT.getKey(), + buchungsart.getID(), 0, buchungsklasseId }, + rsd); suBukEinnahmen += einnahmen; ausgaben = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 1, - buchungsklasseId }, rsd); + new Object[] { datumvon, datumbis, Kontoart.LIMIT.getKey(), + buchungsart.getID(), 1, buchungsklasseId }, + rsd); suBukAusgaben += ausgaben; umbuchungen = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 2, - buchungsklasseId }, rsd); + new Object[] { datumvon, datumbis, Kontoart.LIMIT.getKey(), + buchungsart.getID(), 2, buchungsklasseId }, + rsd); suBukUmbuchungen += umbuchungen; } else { // Buchungen ohne Buchungsklasse - sql = "select sum(betrag) from buchung, buchungsart " + sql = "select sum(buchung.betrag) from buchung, konto, buchungsart " + "where datum >= ? and datum <= ? " + + "and buchung.konto = konto.id " + + "and konto.kontoart < ? " + "and buchung.buchungsart = buchungsart.id " + "and buchungsart.id = ? " + "and buchungsart.art = ? " + "and buchung.buchungsklasse is null "; - einnahmen = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 0 - }, rsd); + einnahmen = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.LIMIT.getKey(), buchungsart.getID(), 0 }, + rsd); suBukEinnahmen += einnahmen; - ausgaben = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 1 - }, rsd); + ausgaben = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.LIMIT.getKey(), buchungsart.getID(), 1 }, + rsd); suBukAusgaben += ausgaben; - umbuchungen = (Double) service.execute(sql, - new Object[] { datumvon, datumbis, buchungsart.getID(), 2 - }, rsd); + umbuchungen = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.LIMIT.getKey(), buchungsart.getID(), 2 }, + rsd); suBukUmbuchungen += umbuchungen; } } diff --git a/src/de/jost_net/JVerein/gui/parts/KontensaldoList.java b/src/de/jost_net/JVerein/gui/parts/KontensaldoList.java index db351e1da..84df39af0 100644 --- a/src/de/jost_net/JVerein/gui/parts/KontensaldoList.java +++ b/src/de/jost_net/JVerein/gui/parts/KontensaldoList.java @@ -24,6 +24,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.io.SaldoZeile; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Konto; import de.jost_net.JVerein.util.Geschaeftsjahr; import de.willuhn.datasource.rmi.DBIterator; @@ -67,7 +68,14 @@ public Part getSaldoList() throws ApplicationException if (saldoList == null) { - saldoList = new TablePart(zeile, null); + saldoList = new TablePart(zeile, null) + { + @Override + protected void orderBy(int index) + { + return; + } + }; saldoList.addColumn("Kontonummer", "kontonummer", null, false, Column.ALIGN_RIGHT); saldoList.addColumn("Bezeichnung", "kontobezeichnung"); @@ -112,6 +120,7 @@ public ArrayList getInfo(boolean summensaldo) throws RemoteException Konto k = (Konto) Einstellungen.getDBService().createObject(Konto.class, null); DBIterator konten = k.getKontenVonBis(von, bis); + konten.addFilter("kontoart < ?", Kontoart.LIMIT.getKey()); double anfangsbestand = 0; double einnahmen = 0; double ausgaben = 0; @@ -132,7 +141,7 @@ public ArrayList getInfo(boolean summensaldo) throws RemoteException { konto = konten.next(); sz = new SaldoZeile(von, bis, konto); - if (summensaldo && konto.getAnlagenkonto()) + if (summensaldo && konto.getKontoArt() == Kontoart.ANLAGE) { sanfangsbestand += (Double) sz.getAttribute("anfangsbestand"); seinnahmen += (Double) sz.getAttribute("einnahmen"); @@ -173,6 +182,33 @@ public ArrayList getInfo(boolean summensaldo) throws RemoteException k.setBezeichnung("Überschuss/Verlust(-)"); zeile.add(new SaldoZeile(k, null, null, null, null, jahressaldo)); + // Konten ohne Berücksichtigung im Saldo + k = (Konto) Einstellungen.getDBService().createObject(Konto.class, + null); + konten = k.getKontenVonBis(von, bis); + konten.addFilter("kontoart > ?", Kontoart.LIMIT.getKey()); + if (von != null && konten.hasNext()) + { + SaldoZeile sz = null; + // Leerzeile als Trenner + k = (Konto) Einstellungen.getDBService().createObject(Konto.class, null); + k.setNummer(""); + k.setBezeichnung(""); + zeile.add(new SaldoZeile(k, null, null, null, null, null)); + // Überschrift + k = (Konto) Einstellungen.getDBService().createObject(Konto.class, null); + k.setNummer(""); + k.setBezeichnung("Konten ohne Berücksichtigung im Saldo:"); + zeile.add(new SaldoZeile(k, null, null, null, null, null)); + // Jetzt die Konten + while (konten.hasNext()) + { + konto = konten.next(); + sz = new SaldoZeile(von, bis, konto); + zeile.add(sz); + } + } + // Leerzeile am Ende wegen Scrollbar k = (Konto) Einstellungen.getDBService().createObject(Konto.class, null); k.setNummer(""); diff --git a/src/de/jost_net/JVerein/gui/parts/KontoList.java b/src/de/jost_net/JVerein/gui/parts/KontoList.java index b63388832..14afc2e0e 100644 --- a/src/de/jost_net/JVerein/gui/parts/KontoList.java +++ b/src/de/jost_net/JVerein/gui/parts/KontoList.java @@ -25,7 +25,8 @@ import org.eclipse.swt.widgets.Composite; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Konto; import de.willuhn.datasource.pseudo.PseudoIterator; import de.willuhn.datasource.rmi.DBIterator; @@ -39,7 +40,7 @@ public class KontoList extends TablePart implements Part { public KontoList(Action action, boolean onlyHibiscus, - boolean nurAktuelleKonten, Kontenart art) throws RemoteException + boolean nurAktuelleKonten, Kontenfilter art) throws RemoteException { this(init(onlyHibiscus, nurAktuelleKonten, art), action); } @@ -71,7 +72,7 @@ public synchronized void paint(Composite parent) throws RemoteException * @throws RemoteException */ public synchronized void update(boolean onlyHibiscus, - boolean nurAktuelleKonten, Kontenart art) throws RemoteException + boolean nurAktuelleKonten, Kontenfilter art) throws RemoteException { super.removeAll(); List list = init(onlyHibiscus, nurAktuelleKonten, art); @@ -89,7 +90,7 @@ public synchronized void update(boolean onlyHibiscus, */ @SuppressWarnings("unchecked") private static List init(boolean onlyHibiscus, - boolean nurAktuelleKonten, Kontenart art) throws RemoteException + boolean nurAktuelleKonten, Kontenfilter art) throws RemoteException { DBIterator i = Einstellungen.getDBService().createList(Konto.class); if (onlyHibiscus) @@ -103,10 +104,12 @@ private static List init(boolean onlyHibiscus, year = year - Einstellungen.getEinstellung().getUnterdrueckungKonten(); i.addFilter("(aufloesung is null or year(aufloesung) >= ?)", year); } - if (art == Kontenart.GELDKONTO) - i.addFilter("anlagenkonto = false"); - if (art == Kontenart.ANLAGEKONTO) - i.addFilter("anlagenkonto = true"); + if (art == Kontenfilter.GELDKONTO) + i.addFilter("kontoart != ?", + new Object[] { Kontoart.ANLAGE.getKey() }); + if (art == Kontenfilter.ANLAGEKONTO) + i.addFilter("kontoart = ?", + new Object[] { Kontoart.ANLAGE.getKey() }); i.setOrder("ORDER BY nummer, bezeichnung"); return i != null ? PseudoIterator.asList(i) : null; } diff --git a/src/de/jost_net/JVerein/gui/parts/MittelverwendungList.java b/src/de/jost_net/JVerein/gui/parts/MittelverwendungList.java new file mode 100644 index 000000000..7a228296e --- /dev/null +++ b/src/de/jost_net/JVerein/gui/parts/MittelverwendungList.java @@ -0,0 +1,422 @@ +/********************************************************************** + * 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.parts; + +import java.rmi.RemoteException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; + +import org.eclipse.swt.widgets.Composite; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.io.MittelverwendungZeile; +import de.jost_net.JVerein.keys.ArtBuchungsart; +import de.jost_net.JVerein.keys.Kontoart; +import de.willuhn.datasource.rmi.DBService; +import de.willuhn.datasource.rmi.ResultSetExtractor; +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.Part; +import de.willuhn.jameica.gui.formatter.CurrencyFormatter; +import de.willuhn.jameica.gui.parts.Column; +import de.willuhn.jameica.gui.parts.TablePart; +import de.willuhn.jameica.gui.parts.table.FeatureSummary; +import de.willuhn.util.ApplicationException; + +public class MittelverwendungList extends TablePart +{ + + private TablePart saldoList; + + private Date datumvon = null; + + private Date datumbis = null; + + public MittelverwendungList(Action action, Date datumvon, Date datumbis) + { + super(action); + this.datumvon = datumvon; + this.datumbis = datumbis; + } + + public Part getSaldoList() throws ApplicationException + { + ArrayList zeilen = null; + try + { + zeilen = getInfo(); + + if (saldoList == null) + { + saldoList = new TablePart(zeilen, null) + { + @Override + protected void orderBy(int index) + { + return; + } + }; + saldoList.addColumn("Nr", "position"); + saldoList.addColumn("Mittel", "bezeichnung"); + saldoList.addColumn("Betrag", "betrag", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT), false, + Column.ALIGN_RIGHT); + saldoList.addColumn("Summe", "summe", + new CurrencyFormatter("", Einstellungen.DECIMALFORMAT), false, + Column.ALIGN_LEFT); + saldoList.setRememberColWidths(true); + saldoList.removeFeature(FeatureSummary.class); + } + else + { + saldoList.removeAll(); + for (MittelverwendungZeile sz : zeilen) + { + saldoList.addItem(sz); + } + } + } + catch (RemoteException e) + { + throw new ApplicationException("Fehler aufgetreten" + e.getMessage()); + } + return saldoList; + } + + public ArrayList getInfo() throws RemoteException + { + DBService service = Einstellungen.getDBService(); + String sql; + ArrayList zeilen = new ArrayList<>(); + String bezeichnung = ""; + Integer pos = 1; + + ResultSetExtractor rsbk = new ResultSetExtractor() + { + @Override + public HashMap extract(ResultSet rs) throws SQLException + { + HashMap map = new HashMap<>(); + while (rs.next()) + { + map.put(Integer.valueOf(rs.getInt(1)), rs.getString(3)); + } + return map; + } + }; + + // Ids der Buchunsklassen + sql = "SELECT buchungsklasse.* FROM buchungsklasse" + " ORDER BY nummer"; + @SuppressWarnings("unchecked") + HashMap bkMap = (HashMap) service + .execute(sql, new Object[] {}, rsbk); + + ResultSetExtractor rsd = new ResultSetExtractor() + { + @Override + public Object extract(ResultSet rs) throws SQLException + { + if (!rs.next()) + { + return Double.valueOf(0); + } + return Double.valueOf(rs.getDouble(1)); + } + }; + + bezeichnung = "Vorhandene Mittel zum Ende des letzten GJ"; + sql = "SELECT SUM(anfangsbestand.betrag) FROM anfangsbestand, konto" + + " WHERE anfangsbestand.datum = ?" + + " AND anfangsbestand.konto = konto.id " + " AND konto.kontoart = ? "; + Double pos1 = (Double) service.execute(sql, + new Object[] { datumvon, Kontoart.GELD.getKey() }, rsd); + addZeile(zeilen, MittelverwendungZeile.EINNAHME, pos++, bezeichnung, pos1, + null); + + bezeichnung = "Nicht der zeitnahen Mittelverwendung unterliegende Mittel zum Ende des letzten GJ"; + sql = "SELECT SUM(anfangsbestand.betrag) FROM anfangsbestand, konto" + + " WHERE anfangsbestand.datum = ?" + + " AND anfangsbestand.konto = konto.id " + + " AND (konto.kontoart = ? OR konto.kontoart = ? OR konto.kontoart = ?)"; + Double pos2 = (Double) service.execute(sql, + new Object[] { datumvon, Kontoart.RUECKLAGE.getKey(), + Kontoart.VERMOEGEN.getKey(), + Kontoart.SONSTIGE_RUECKLAGEN.getKey() }, + rsd); + addZeile(zeilen, MittelverwendungZeile.AUSGABE, pos++, bezeichnung, null, + pos2); + + bezeichnung = " Verwendungsüberhang/Rückstand Ende des letzten GJ"; + addZeile(zeilen, MittelverwendungZeile.SUMME, pos++, bezeichnung, pos1, + -pos2); + + Double zufuehrung = 0d; + Double verwendung = 0d; + // Mittel Zufluss und Abfluss für alle Buchungsklassen + for (Integer bkId : bkMap.keySet()) + { + // Mittel Zufluss + // Summe der Buchungen bei Einnahmen + sql = getSummenBuchungSql(); + Double zuf = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.GELD.getKey(), bkId, ArtBuchungsart.EINNAHME }, + rsd); + // Summe der positiven Buchungen bei Umbuchung + sql = getSummenUmbuchungSql() + " AND buchung.betrag < 0"; + Double um = (Double) service.execute(sql, + new Object[] { datumvon, datumbis, + Kontoart.VERBINDLICHKEITEN.getKey(), Kontoart.ANLAGE.getKey(), + bkId, ArtBuchungsart.UMBUCHUNG }, + rsd); + zuf -= um; + zufuehrung += zuf; + + // Mittel Abfluss + // Summe der Buchungen bei Ausgaben + sql = getSummenBuchungSql(); + Double verw = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.GELD.getKey(), bkId, ArtBuchungsart.AUSGABE }, + rsd); + // Summe der negativen Buchungen bei Umbuchung + sql = getSummenUmbuchungSql() + " AND buchung.betrag > 0"; + Double um2 = (Double) service.execute(sql, + new Object[] { datumvon, datumbis, + Kontoart.VERBINDLICHKEITEN.getKey(), Kontoart.ANLAGE.getKey(), + bkId, ArtBuchungsart.UMBUCHUNG }, + rsd); + verw -= um2; + verwendung += verw; + + if (zuf != 0d || verw != 0d + || !Einstellungen.getEinstellung().getUnterdrueckungOhneBuchung()) + { + bezeichnung = "Mittel Zufluss aus " + bkMap.get(bkId); + addZeile(zeilen, MittelverwendungZeile.EINNAHME, pos++, bezeichnung, + zuf, null); + bezeichnung = "Verwendete Mittel aus " + bkMap.get(bkId); + addZeile(zeilen, MittelverwendungZeile.AUSGABE, pos++, bezeichnung, + null, verw); + bezeichnung = " Überschuss/Verlust aus " + bkMap.get(bkId); + addZeile(zeilen, MittelverwendungZeile.SUMME, pos++, bezeichnung, zuf, + verw); + } + } + + // Summen über alle Sphären + bezeichnung = "Mittel Zufluss aus allen Sphären"; + addZeile(zeilen, MittelverwendungZeile.EINNAHME, pos++, bezeichnung, + zufuehrung, 0d); + bezeichnung = "Verwendete Mittel aus allen Sphären"; + addZeile(zeilen, MittelverwendungZeile.AUSGABE, pos++, bezeichnung, 0d, + verwendung); + bezeichnung = " Überschuss/Verlust aus allen Sphären"; + addZeile(zeilen, MittelverwendungZeile.SUMME, pos++, bezeichnung, + zufuehrung, verwendung); + + // Rücklagen nach § 62 Abs. 1 AO + sql = getSummenRuecklagenSql(); + Double zuRuecklagen = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.RUECKLAGE.getKey(), ArtBuchungsart.EINNAHME }, rsd); + + sql = getSummenRuecklagenSql(); + Double entRuecklagen = (Double) service.execute(sql, + new Object[] { datumvon, datumbis, Kontoart.RUECKLAGE.getKey(), + ArtBuchungsart.AUSGABE }, + rsd); + + if (zuRuecklagen != 0d || entRuecklagen != 0d + || !Einstellungen.getEinstellung().getUnterdrueckungOhneBuchung()) + { + bezeichnung = "Zuführung zu Rücklagen nach § 62 Abs. 1 AO"; + addZeile(zeilen, MittelverwendungZeile.AUSGABE, pos++, bezeichnung, null, + zuRuecklagen); + bezeichnung = "Entnahme aus Rücklagen nach § 62 Abs. 1 AO"; + addZeile(zeilen, MittelverwendungZeile.EINNAHME, pos++, bezeichnung, + entRuecklagen, null); + bezeichnung = " Summe der Buchungen zu Rücklagen nach § 62 Abs. 1 AO"; + addZeile(zeilen, MittelverwendungZeile.SUMME, pos++, bezeichnung, + entRuecklagen, zuRuecklagen); + } + + // Vermögen nach § 62 Abs. 3 und 4 AO + sql = getSummenRuecklagenSql(); + Double zuVermoegen = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.VERMOEGEN.getKey(), ArtBuchungsart.EINNAHME }, rsd); + + sql = getSummenRuecklagenSql(); + Double entVermoegen = (Double) service.execute(sql, new Object[] { datumvon, + datumbis, Kontoart.VERMOEGEN.getKey(), ArtBuchungsart.AUSGABE }, rsd); + + if (zuVermoegen != 0d || entVermoegen != 0d + || !Einstellungen.getEinstellung().getUnterdrueckungOhneBuchung()) + { + bezeichnung = "Zuführung zum Vermögen nach § 62 Abs. 3 und 4 AO"; + addZeile(zeilen, MittelverwendungZeile.AUSGABE, pos++, bezeichnung, null, + zuVermoegen); + bezeichnung = "Entnahme aus Vermögen nach § 62 Abs. 3 und 4 AO"; + addZeile(zeilen, MittelverwendungZeile.EINNAHME, pos++, bezeichnung, + entVermoegen, null); + bezeichnung = " Summe der Buchungen zum Vermögen nach § 62 Abs. 3 und 4 AO"; + addZeile(zeilen, MittelverwendungZeile.SUMME, pos++, bezeichnung, + entVermoegen, zuVermoegen); + } + + // Sonstige Rücklagen + sql = getSummenRuecklagenSql(); + Double zuSonstig = (Double) service.execute(sql, + new Object[] { datumvon, datumbis, + Kontoart.SONSTIGE_RUECKLAGEN.getKey(), ArtBuchungsart.EINNAHME }, + rsd); + + sql = getSummenRuecklagenSql(); + Double entSonstig = (Double) service.execute(sql, + new Object[] { datumvon, datumbis, + Kontoart.SONSTIGE_RUECKLAGEN.getKey(), ArtBuchungsart.AUSGABE }, + rsd); + + if (zuSonstig != 0d || entSonstig != 0d + || !Einstellungen.getEinstellung().getUnterdrueckungOhneBuchung()) + { + bezeichnung = "Zuführung zu sonstigen Rücklagen"; + addZeile(zeilen, MittelverwendungZeile.AUSGABE, pos++, bezeichnung, null, + zuSonstig); + bezeichnung = "Entnahme aus sonstigen Rücklagen"; + addZeile(zeilen, MittelverwendungZeile.EINNAHME, pos++, bezeichnung, + entSonstig, null); + bezeichnung = " Summe der Buchungen aus sonstigen Rücklagen"; + addZeile(zeilen, MittelverwendungZeile.SUMME, pos++, bezeichnung, + entSonstig, zuSonstig); + } + + bezeichnung = "Vorhandene Mittel zum Ende des aktuellen GJ"; + Double einnahmen = pos1 + zufuehrung + verwendung; + addZeile(zeilen, MittelverwendungZeile.EINNAHME, pos++, bezeichnung, + einnahmen, null); + bezeichnung = "Nicht der zeitnahen Mittelverwendung unterliegende Mittel zum Ende aktuellen GJ"; + Double ausgaben = pos2 + zuRuecklagen + entRuecklagen + zuVermoegen + + entVermoegen + zuSonstig + entSonstig; + addZeile(zeilen, MittelverwendungZeile.AUSGABE, pos++, bezeichnung, null, + ausgaben); + bezeichnung = " Verwendungsüberhang/Rückstand zum Ende des aktuellen GJ"; + addZeile(zeilen, MittelverwendungZeile.SUMME, pos++, bezeichnung, + einnahmen, -ausgaben); + + // Leerzeile am Ende wegen Scrollbar + zeilen.add(new MittelverwendungZeile(MittelverwendungZeile.UNDEFINED, + null, null, null, null)); + return zeilen; + } + + public void setDatumvon(Date datumvon) + { + this.datumvon = datumvon; + } + + public void setDatumbis(Date datumbis) + { + this.datumbis = datumbis; + } + + @Override + public void removeAll() + { + saldoList.removeAll(); + } + + @Override + public synchronized void paint(Composite parent) throws RemoteException + { + super.paint(parent); + } + + private String getSummenBuchungSql() throws RemoteException + { + String sql = ""; + if (!Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) + { + sql = "SELECT sum(buchung.betrag) FROM buchung, konto, buchungsart" + + " WHERE datum >= ? AND datum <= ?" + + " AND buchung.konto = konto.id" + " AND konto.kontoart = ?" + + " AND buchung.buchungsart = buchungsart.id" + + " AND buchungsart.buchungsklasse = ? " + "AND buchungsart.art = ?"; + } + else + { + sql = "SELECT sum(buchung.betrag) FROM buchung, konto, buchungsart" + + " WHERE datum >= ? AND datum <= ?" + + " AND buchung.konto = konto.id" + " AND konto.kontoart = ?" + + " AND buchung.buchungsart = buchungsart.id" + + " AND buchung.buchungsklasse = ? " + "AND buchungsart.art = ?"; + } + return sql; + } + + private String getSummenUmbuchungSql() throws RemoteException + { + String sql = ""; + if (!Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) + { + sql = "SELECT sum(buchung.betrag) FROM buchung, konto, buchungsart" + + " WHERE datum >= ? AND datum <= ?" + " AND buchung.konto = konto.id" + + " AND (konto.kontoart = ? OR konto.kontoart = ?)" + + " AND buchung.buchungsart = buchungsart.id" + + " AND buchungsart.buchungsklasse = ?" + " AND buchungsart.art = ?"; + } + else + { + sql = "SELECT sum(buchung.betrag) FROM buchung, konto, buchungsart" + + " WHERE datum >= ? AND datum <= ?" + " AND buchung.konto = konto.id" + + " AND (konto.kontoart = ? OR konto.kontoart = ?)" + + " AND buchung.buchungsart = buchungsart.id" + + " AND buchung.buchungsklasse = ?" + " AND buchungsart.art = ?"; + } + return sql; + } + + private String getSummenRuecklagenSql() + { + return "SELECT sum(buchung.betrag) FROM buchung, konto, buchungsart" + + " WHERE datum >= ? AND datum <= ? " + "AND buchung.konto = konto.id" + + " AND konto.kontoart = ?" + + " AND buchung.buchungsart = buchungsart.id" + + " AND buchungsart.art = ?"; + } + + private void addZeile(ArrayList zeilen, int status, + Integer position, String bezeichnung, Double einnahme, Double ausgabe) + throws RemoteException + { + switch (status) + { + case MittelverwendungZeile.EINNAHME: + zeilen.add(new MittelverwendungZeile(status, position, bezeichnung, + einnahme, null)); + break; + case MittelverwendungZeile.AUSGABE: + zeilen.add(new MittelverwendungZeile(status, position, bezeichnung, + ausgabe, null)); + break; + case MittelverwendungZeile.SUMME: + zeilen.add(new MittelverwendungZeile(status, position, bezeichnung, + null, einnahme + ausgabe)); + break; + } + } + +} diff --git a/src/de/jost_net/JVerein/gui/parts/SollbuchungListTablePart.java b/src/de/jost_net/JVerein/gui/parts/SollbuchungListTablePart.java index 4d11d573b..6bb0802b8 100644 --- a/src/de/jost_net/JVerein/gui/parts/SollbuchungListTablePart.java +++ b/src/de/jost_net/JVerein/gui/parts/SollbuchungListTablePart.java @@ -64,7 +64,10 @@ protected Context createFeatureEventContext(Feature.Event e, Object data) for (int i = 0; i < l.size(); i++) { Mitgliedskonto b = (Mitgliedskonto) l.get(i); - sumBetrag += b.getBetrag(); + if (b.getBetrag() != null) + { + sumBetrag += b.getBetrag(); + } } summary += " / " + "Gesamtbetrag:" + " " + Einstellungen.DECIMALFORMAT.format(sumBetrag) + " " diff --git a/src/de/jost_net/JVerein/gui/parts/ToolTipButton.java b/src/de/jost_net/JVerein/gui/parts/ToolTipButton.java new file mode 100644 index 000000000..4681606e4 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/parts/ToolTipButton.java @@ -0,0 +1,24 @@ +package de.jost_net.JVerein.gui.parts; + +import de.willuhn.jameica.gui.Action; +import de.willuhn.jameica.gui.parts.Button; + +public class ToolTipButton extends Button +{ + /** + * @param title + * Beschriftung. + * @param action + * Action, die beim Klick ausgefuehrt werden soll. + */ + public ToolTipButton(String title, Action action, Object context, + boolean defaultButton, String icon) + { + super(title, action, context, defaultButton, icon); + } + + public void setToolTipText(String text) + { + this.button.setToolTipText(text); + } +} diff --git a/src/de/jost_net/JVerein/gui/parts/WiedervorlageList.java b/src/de/jost_net/JVerein/gui/parts/WiedervorlageList.java index 82bf07cbf..a280694c0 100644 --- a/src/de/jost_net/JVerein/gui/parts/WiedervorlageList.java +++ b/src/de/jost_net/JVerein/gui/parts/WiedervorlageList.java @@ -75,6 +75,7 @@ public Part getWiedervorlageList() throws RemoteException { wiedervorlageList.addItem(wiedervorlagen.next()); } + wiedervorlageList.sort(); } return wiedervorlageList; } diff --git a/src/de/jost_net/JVerein/gui/parts/ZusatzbetragPart.java b/src/de/jost_net/JVerein/gui/parts/ZusatzbetragPart.java index 2d8449ff8..354ec0e91 100644 --- a/src/de/jost_net/JVerein/gui/parts/ZusatzbetragPart.java +++ b/src/de/jost_net/JVerein/gui/parts/ZusatzbetragPart.java @@ -29,6 +29,7 @@ import de.jost_net.JVerein.gui.input.MitgliedInput; import de.jost_net.JVerein.gui.input.BuchungsartInput.buchungsarttyp; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Mitglied; @@ -71,6 +72,8 @@ public class ZusatzbetragPart implements Part private boolean mitMitglied; + private SelectInput zahlungsweg; + public ZusatzbetragPart(Zusatzbetrag zusatzbetrag, boolean mitMitglied) { this.zusatzbetrag = zusatzbetrag; @@ -94,6 +97,7 @@ public void paint(Composite parent) throws RemoteException group.addLabelPair("Buchungsart", getBuchungsart()); if (Einstellungen.getEinstellung().getBuchungsklasseInBuchung()) group.addLabelPair("Buchungsklasse", getBuchungsklasse()); + group.addLabelPair("Zahlungsweg", getZahlungsweg()); } public DateInput getFaelligkeit() throws RemoteException @@ -302,7 +306,7 @@ public boolean isBuchungsklasseActive() { return buchungsklasse != null; } - + public Long getSelectedBuchungsKlasseId() throws ApplicationException { try @@ -323,6 +327,18 @@ public Long getSelectedBuchungsKlasseId() throws ApplicationException } } + + public SelectInput getZahlungsweg() throws RemoteException + { + if (zahlungsweg != null) + { + return zahlungsweg; + } + zahlungsweg = new SelectInput(Zahlungsweg.getArray(false),zusatzbetrag.getZahlungsweg()); + zahlungsweg.setPleaseChoose("Standard"); + return zahlungsweg; + } + public Input getMitglied() throws RemoteException { if (mitglied != null) diff --git a/src/de/jost_net/JVerein/gui/util/AfaUtil.java b/src/de/jost_net/JVerein/gui/util/AfaUtil.java index a099d7001..77993dd2a 100644 --- a/src/de/jost_net/JVerein/gui/util/AfaUtil.java +++ b/src/de/jost_net/JVerein/gui/util/AfaUtil.java @@ -24,6 +24,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.keys.AfaMode; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Anfangsbestand; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Jahresabschluss; @@ -58,7 +59,6 @@ public void run(ProgressMonitor monitor) throws ApplicationException DBService service; Calendar calendar = Calendar.getInstance(); // Aktuelles Geschäftsjahr bestimmen - int aktuellesJahr = aktuellesGJ.getBeginnGeschaeftsjahrjahr(); calendar.setTime(aktuellesGJ.getBeginnGeschaeftsjahr()); int ersterMonatAktuellesGJ = calendar.get(Calendar.MONTH); // AfA Buchungen zu Ende des aktuellen GJ @@ -66,7 +66,8 @@ public void run(ProgressMonitor monitor) throws ApplicationException service = Einstellungen.getDBService(); DBIterator kontenIt = service.createList(Konto.class); - kontenIt.addFilter("anlagenkonto = TRUE"); + kontenIt.addFilter("kontoart = ?", + new Object[] { Kontoart.ANLAGE.getKey() }); kontenIt.addFilter("(eroeffnung IS NULL OR eroeffnung <= ?)", new Object[] { new java.sql.Date(aktuellesGJ.getEndeGeschaeftsjahr().getTime()) }); kontenIt.addFilter("(aufloesung IS NULL OR aufloesung >= ?)", @@ -87,12 +88,12 @@ public void run(ProgressMonitor monitor) throws ApplicationException switch(konto.getAfaMode()) { case AfaMode.ANGEPASST: - anzahlBuchungen += doAbschreibungAngepasst(konto, aktuellesJahr, + anzahlBuchungen += doAbschreibungAngepasst(konto, aktuellesGJ, ersterMonatAktuellesGJ, afaBuchungDatum, abschluss, monitor); break; case AfaMode.AUTO: - anzahlBuchungen += doAbschreibungAuto(konto, aktuellesJahr, - ersterMonatAktuellesGJ, afaBuchungDatum, aktuellesGJ, abschluss, monitor); + anzahlBuchungen += doAbschreibungAuto(konto, aktuellesGJ, + ersterMonatAktuellesGJ, afaBuchungDatum, abschluss, monitor); break; } } @@ -127,7 +128,7 @@ public boolean isInterrupted() Application.getController().start(t); } - private int doAbschreibungAngepasst(Konto konto, int aktuellesJahr, + private int doAbschreibungAngepasst(Konto konto, Geschaeftsjahr aktuellesGJ, int ersterMonatAktuellesGJ, Date afaBuchungDatum, Jahresabschluss abschluss, ProgressMonitor monitor) throws RemoteException, ParseException, ApplicationException @@ -143,11 +144,12 @@ private int doAbschreibungAngepasst(Konto konto, int aktuellesJahr, anschaffungsJahr = anschaffungGJ.getBeginnGeschaeftsjahrjahr(); calendar.setTime(konto.getAnschaffung()); monatAnschaffung = calendar.get(Calendar.MONTH); + int aktuellesJahr = aktuellesGJ.getBeginnGeschaeftsjahrjahr(); // Check ob ausserhalb des Abschreibungszeitraums if (aktuellesJahr < anschaffungsJahr || aktuellesJahr > anschaffungsJahr + konto.getNutzungsdauer()) return 0; - // Check ob Anschaffung im ersten Monaz des GJ, dann keine Restabschreibung + // Check ob Anschaffung im ersten Monat des GJ, dann keine Restabschreibung // Wenn Nutzungsdauer 0 dann direktabschreibung if ((aktuellesJahr == anschaffungsJahr + konto.getNutzungsdauer() && ersterMonatAktuellesGJ == monatAnschaffung) && @@ -159,44 +161,45 @@ private int doAbschreibungAngepasst(Konto konto, int aktuellesJahr, Buchung buchung = (Buchung) Einstellungen.getDBService(). createObject(Buchung.class, null); - double restwert = getRestwert(konto, monitor); - double restbuchungswert = konto.getAfaRestwert(); + double buchwert = getBuchwert(konto, anschaffungsJahr, aktuellesJahr, + aktuellesGJ, monitor); + double restbuchwert = konto.getAfaRestwert(); double betrag = 0d; // GWGs voll abschreiben if (aktuellesJahr == anschaffungsJahr && konto.getNutzungsdauer() == 0) { - if (restwert <= 0d) + if (buchwert <= 0d) return 0; // bereits abgeschrieben betrag = konto.getBetrag(); - if (betrag > restwert) - betrag = restwert; + if (betrag > buchwert) + betrag = buchwert; buchung.setBetrag(-betrag); buchung.setZweck("GWG-Abschreibung"); } if (konto.getNutzungsdauer() > 0) { - if (restwert <= konto.getAfaRestwert()) + if (buchwert <= konto.getAfaRestwert()) return 0; // bereits abgeschrieben if (aktuellesJahr == anschaffungsJahr) { betrag = konto.getAfaStart(); - if ((restwert - restbuchungswert) < betrag) - betrag = restwert - restbuchungswert; + if ((buchwert - restbuchwert) < betrag) + betrag = buchwert - restbuchwert; buchung.setZweck("Anteilige Abschreibung für " + monate + " Monate"); } else { betrag = konto.getAfaDauer(); - if (betrag < restwert - restbuchungswert) + if (betrag < buchwert - restbuchwert) { buchung.setZweck("Abschreibung"); } else { - betrag = restwert - restbuchungswert; + betrag = buchwert - restbuchwert; buchung.setZweck("Restwertbuchung"); } } @@ -205,7 +208,7 @@ private int doAbschreibungAngepasst(Konto konto, int aktuellesJahr, buchung.setName(Einstellungen.getEinstellung().getName()); buchung.setDatum(afaBuchungDatum); buchung.setBetrag(-betrag); - buchung.setBuchungsart(konto.getAfaartId()); + buchung.setBuchungsartId(konto.getAfaartId()); buchung.setAbschluss(abschluss); if (abschluss == null) buchung.store(true); @@ -215,9 +218,9 @@ private int doAbschreibungAngepasst(Konto konto, int aktuellesJahr, return 1; } - private int doAbschreibungAuto(Konto konto, int aktuellesJahr, + private int doAbschreibungAuto(Konto konto, Geschaeftsjahr aktuellesGJ, int ersterMonatAktuellesGJ, Date afaBuchungDatum, - Geschaeftsjahr jahr, Jahresabschluss abschluss, ProgressMonitor monitor) + Jahresabschluss abschluss, ProgressMonitor monitor) throws RemoteException, ParseException, ApplicationException { if (checkKonto(konto, monitor)) @@ -229,6 +232,7 @@ private int doAbschreibungAuto(Konto konto, int aktuellesJahr, anschaffungsJahr = anschaffungGJ.getBeginnGeschaeftsjahrjahr(); calendar.setTime(konto.getAnschaffung()); monatAnschaffung = calendar.get(Calendar.MONTH); + int aktuellesJahr = aktuellesGJ.getBeginnGeschaeftsjahrjahr(); // Check ob ausserhalb des Abschreibungszeitraums if (aktuellesJahr < anschaffungsJahr || aktuellesJahr > anschaffungsJahr + konto.getNutzungsdauer()) @@ -240,8 +244,9 @@ private int doAbschreibungAuto(Konto konto, int aktuellesJahr, konto.getNutzungsdauer() != 0) return 0; - double restwert = getRestwert(konto, monitor); - double restbuchungswert = konto.getAfaRestwert(); + double buchwert = getBuchwert(konto, anschaffungsJahr, aktuellesJahr, + aktuellesGJ, monitor); + double restbuchswert = konto.getAfaRestwert(); double betrag = 0d; String zweck = "Abschreibung"; @@ -254,16 +259,16 @@ private int doAbschreibungAuto(Konto konto, int aktuellesJahr, // GWGs voll abschreiben if (konto.getNutzungsdauer() == 0) { - if (restwert <= 0d) + if (buchwert <= 0d) return 0; // bereits abgeschrieben zweck = "GWG-Abschreibung"; betrag = konto.getBetrag(); - if (betrag > restwert) - betrag = restwert; + if (betrag > buchwert) + betrag = buchwert; } else { - if (restwert <= restbuchungswert) + if (buchwert <= restbuchswert) return 0; // bereits abgeschrieben // Im Anschaffungsjahr haben wir die volle Restlaufzeit. @@ -275,30 +280,30 @@ private int doAbschreibungAuto(Konto konto, int aktuellesJahr, } else { - restnutzungsdauer = Math.max(getMonths(jahr.getBeginnGeschaeftsjahr(),nutzungsende) - 1,0); + restnutzungsdauer = Math.max(getMonths(aktuellesGJ.getBeginnGeschaeftsjahr(),nutzungsende) - 1,0); // Ein Monat abziehen, weil der letzte nicht mitzaehlt } - double abbetrag = (restwert - restbuchungswert) / (restnutzungsdauer / 12d); + double abbetrag = (buchwert - restbuchswert) / (restnutzungsdauer / 12d); betrag = Math.ceil(abbetrag); // Anteilig abschreiben, wenn wir uns im Anschaffungsjahr befinden if (aktuellesJahr == anschaffungsJahr) { - int months = getMonths(konto.getAnschaffung(),jahr.getEndeGeschaeftsjahr()); + int months = getMonths(konto.getAnschaffung(),aktuellesGJ.getEndeGeschaeftsjahr()); zweck = "Anteilige Abschreibung für " + months + " Monate"; betrag = Math.ceil((abbetrag / 12d) * months); - double startwert = getStartwert(konto, monitor); + double kosten = konto.getBetrag(); // Nachkommastellen der Anschaffungskosten addieren, das ergiebt einen - // geraden Betrag für den neuen Anlagenwert - betrag = betrag + (startwert - (int)startwert); + // geraden Betrag für den neuen Buchwert + betrag = betrag + (kosten - (int)kosten); } // Abzuschreibender Betrag >= Restwert -> Restwertbuchung - if (abbetrag >= restwert - restbuchungswert) + if (abbetrag >= buchwert - restbuchswert) { zweck = "Restwertbuchung"; - betrag = restwert - restbuchungswert; + betrag = buchwert - restbuchswert; } } @@ -308,7 +313,7 @@ private int doAbschreibungAuto(Konto konto, int aktuellesJahr, buchung.setName(Einstellungen.getEinstellung().getName()); buchung.setZweck(zweck); buchung.setDatum(afaBuchungDatum); - buchung.setBuchungsart(konto.getAfaartId()); + buchung.setBuchungsartId(konto.getAfaartId()); buchung.setBetrag(-betrag); buchung.setAbschluss(abschluss); if (abschluss == null) @@ -319,52 +324,47 @@ private int doAbschreibungAuto(Konto konto, int aktuellesJahr, return 1; } - private double getRestwert(Konto konto, ProgressMonitor monitor) throws RemoteException + private double getBuchwert(Konto konto, int anschaffungsJahr, int aktuellesJahr, + Geschaeftsjahr aktuellesGJ, ProgressMonitor monitor) throws RemoteException { - double restwert = getStartwert(konto, monitor); + double buchwert = 0d; + if (anschaffungsJahr == aktuellesJahr) + { + buchwert = konto.getBetrag(); + } + else + { + DBIterator anfangsbestand = Einstellungen + .getDBService().createList(Anfangsbestand.class); + anfangsbestand.addFilter("konto = ?", new Object[] { konto.getID() }); + anfangsbestand.addFilter("datum = ?", new Object[] { aktuellesGJ.getBeginnGeschaeftsjahr() }); + if (!anfangsbestand.hasNext()) + { + monitor.setStatusText("Konto " + konto.getNummer() + ": " + + "Für das Konto existiert kein Anfangsbestand für das Geschäftsjahr"); + return 0d; + } + else + { + buchwert = ((Anfangsbestand) anfangsbestand.next()).getBetrag(); + } + } + + // Jetzt noch AfA Buchungen des aktuellen GJ addieren DBIterator buchungsIt = Einstellungen.getDBService().createList(Buchung.class); buchungsIt.addFilter("konto = ?", konto.getID()); buchungsIt.join("buchungsart"); buchungsIt.addFilter("buchungsart.id = buchung.buchungsart"); buchungsIt.addFilter("buchungsart.abschreibung = ?", true); + buchungsIt.addFilter("datum >= ?", aktuellesGJ.getBeginnGeschaeftsjahr()); while (buchungsIt.hasNext()) { Buchung afa = (Buchung) buchungsIt.next(); - restwert += afa.getBetrag(); + buchwert += afa.getBetrag(); } - - return restwert; - } - - private double getStartwert(Konto konto, ProgressMonitor monitor) throws RemoteException - { - double startwert = konto.getBetrag(); - Anfangsbestand anfangsbestand = null; - - // Bestimmen ob ein Anfangsbetrag zur Konto Eröffnung existiert - DBIterator anfangsbestandsIt = Einstellungen.getDBService().createList(Anfangsbestand.class); - anfangsbestandsIt.addFilter("konto = ?", konto.getID()); - anfangsbestandsIt.setOrder("ORDER BY datum"); - if (anfangsbestandsIt.hasNext()) - anfangsbestand = (Anfangsbestand) anfangsbestandsIt.next(); - if (anfangsbestand == null) - { - monitor.setStatusText("Konto " + konto.getNummer() + ": " - + "Für das Konto existieren keine Anfangsbestände"); - return 0d; - } - if (!anfangsbestand.getDatum().equals(konto.getEroeffnung())) - { - monitor.setStatusText("Konto " + konto.getNummer() + ": " - + "Für das Konto existiert kein Anfangsbestand zum Eröffnungsdatum"); - return 0d; - } - Double anfangsbetrag = anfangsbestand.getBetrag(); - // Es existiert ein Anfangsbetrag zur Konto Eröffnung, dann ab diesem Wert rechnen - if (anfangsbetrag != null && anfangsbetrag != 0) - startwert = anfangsbetrag; - return startwert; + + return buchwert; } private boolean checkKonto(Konto konto, ProgressMonitor monitor) throws RemoteException diff --git a/src/de/jost_net/JVerein/gui/util/EvalMail.java b/src/de/jost_net/JVerein/gui/util/EvalMail.java new file mode 100644 index 000000000..c5b8e1b43 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/util/EvalMail.java @@ -0,0 +1,81 @@ +/********************************************************************** + * 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.util; + +import java.io.StringWriter; +import java.rmi.RemoteException; +import java.util.Map; + +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.apache.velocity.exception.MethodInvocationException; +import org.apache.velocity.exception.ParseErrorException; +import org.apache.velocity.exception.ResourceNotFoundException; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.Variable.AllgemeineMap; +import de.jost_net.JVerein.Variable.MitgliedMap; +import de.jost_net.JVerein.Variable.VarTools; +import de.jost_net.JVerein.rmi.MailEmpfaenger; +import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; + +public class EvalMail +{ + + VelocityContext context; + + public EvalMail(MailEmpfaenger empfaenger) throws RemoteException + { + this(empfaenger.getMitglied()); + } + + public EvalMail(Mitglied mitglied) throws RemoteException + { + context = new VelocityContext(); + context.put("dateformat", new JVDateFormatTTMMJJJJ()); + context.put("decimalformat", Einstellungen.DECIMALFORMAT); + context.put("email", mitglied.getEmail()); + context.put("empf", mitglied); + Map map = new MitgliedMap().getMap(mitglied, + new AllgemeineMap().getMap(null)); + VarTools.add(context, map); + } + + public String evalBetreff(String betr) + throws ParseErrorException, MethodInvocationException, + ResourceNotFoundException + { + if (context == null) + return null; + StringWriter wbetr = new StringWriter(); + Velocity.evaluate(context, wbetr, "LOG", betr); + return wbetr.getBuffer().toString(); + } + + public String evalText(String txt) + throws ParseErrorException, MethodInvocationException, + ResourceNotFoundException + { + if (context == null) + return null; + StringWriter wtext = new StringWriter(); + Velocity.evaluate(context, wtext, "LOG", txt); + return wtext.getBuffer().toString(); + } +} diff --git a/src/de/jost_net/JVerein/gui/view/AbrechnungslaufListView.java b/src/de/jost_net/JVerein/gui/view/AbrechnungslaufListView.java index 35b7fafb2..13fb91540 100644 --- a/src/de/jost_net/JVerein/gui/view/AbrechnungslaufListView.java +++ b/src/de/jost_net/JVerein/gui/view/AbrechnungslaufListView.java @@ -16,8 +16,10 @@ **********************************************************************/ package de.jost_net.JVerein.gui.view; +import de.jost_net.JVerein.gui.action.AbrechnungSEPAAction; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.AbrechnungslaufControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; @@ -45,15 +47,25 @@ public void bind() throws Exception right.addInput(control.getDatumbis()); ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); - control.getAbrechungslaeufeList().paint(this.getParent()); + control.getAbrechnungslaeufeList().paint(this.getParent()); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.ABRECHNUNGSLAUF, false, "question-circle.png"); + buttons.addButton("Neu", new AbrechnungSEPAAction(), + null, false, "document-new.png"); buttons.paint(this.getParent()); } } diff --git a/src/de/jost_net/JVerein/gui/view/AbstractMitgliedDetailView.java b/src/de/jost_net/JVerein/gui/view/AbstractMitgliedDetailView.java index 31d944854..e533c21da 100644 --- a/src/de/jost_net/JVerein/gui/view/AbstractMitgliedDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/AbstractMitgliedDetailView.java @@ -639,6 +639,10 @@ private void zeicheStammdaten(Composite parentComposite, int spaltenanzahl) cols.addInput(control.getGeburtsdatum()); cols.addInput(control.getGeschlecht()); } + else + { + cols.addInput(control.getLeitwegID()); + } if (Einstellungen.getEinstellung().getKommunikationsdaten()) { diff --git a/src/de/jost_net/JVerein/gui/view/AnfangsbestandListView.java b/src/de/jost_net/JVerein/gui/view/AnfangsbestandListView.java index 1447cb0cd..ef907b8d1 100644 --- a/src/de/jost_net/JVerein/gui/view/AnfangsbestandListView.java +++ b/src/de/jost_net/JVerein/gui/view/AnfangsbestandListView.java @@ -19,6 +19,7 @@ import de.jost_net.JVerein.gui.action.AnfangsbestandNeuAction; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.AnfangsbestandControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; @@ -48,9 +49,17 @@ public void bind() throws Exception right.addInput(control.getDatumbis()); ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); control.getAnfangsbestandList().paint(this.getParent()); diff --git a/src/de/jost_net/JVerein/gui/view/AnlagenbuchungenListeView.java b/src/de/jost_net/JVerein/gui/view/AnlagenbuchungenListeView.java index d1a3d1960..972b1e7dc 100644 --- a/src/de/jost_net/JVerein/gui/view/AnlagenbuchungenListeView.java +++ b/src/de/jost_net/JVerein/gui/view/AnlagenbuchungenListeView.java @@ -26,7 +26,8 @@ import de.jost_net.JVerein.gui.action.BuchungNeuAction; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.BuchungsControl; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.jost_net.JVerein.gui.control.BuchungsHeaderControl; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; @@ -49,7 +50,7 @@ public void bind() throws Exception { GUI.getView().setTitle("Anlagenbuchungen"); - final BuchungsControl control = new BuchungsControl(this, Kontenart.ANLAGEKONTO); + final BuchungsControl control = new BuchungsControl(this, Kontenfilter.ANLAGEKONTO); LabelGroup group = new LabelGroup(getParent(), "Konto"); group.addLabelPair("Konto", control.getSuchKonto()); @@ -67,13 +68,15 @@ public void bind() throws Exception left.addLabelPair("Buchungsart", control.getSuchBuchungsart()); left.addLabelPair("Projekt", control.getSuchProjekt()); left.addLabelPair("Betrag", control.getSuchBetrag()); - right.addLabelPair("Von Datum", control.getVondatum()); - right.addLabelPair("Bis Datum", control.getBisdatum()); + right.addLabelPair("Datum von", control.getVondatum()); + right.addLabelPair("Datum bis", control.getBisdatum()); right.addLabelPair("Enthaltener Text", control.getSuchtext()); ButtonArea buttons1 = new ButtonArea(); - buttons1.addButton(control.getZurueckButton()); - buttons1.addButton(control.getVorButton()); + ToolTipButton zurueck = control.getZurueckButton(); + buttons1.addButton(zurueck); + ToolTipButton vor = control.getVorButton(); + buttons1.addButton(vor); Button reset = new Button("Filter-Reset", new Action() { @Override @@ -94,6 +97,8 @@ public void handleAction(Object context) throws ApplicationException }, null, true, "search.png"); buttons1.addButton(suchen); labelgroup1.addButtonArea(buttons1); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); // Zweiter Tab final BuchungsHeaderControl headerControl = new BuchungsHeaderControl( diff --git a/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzListeView.java b/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzListeView.java index 8b5633a1c..5fbd0470c 100644 --- a/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzListeView.java +++ b/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzListeView.java @@ -20,6 +20,7 @@ import de.jost_net.JVerein.gui.action.ArbeitseinsatzUeberpruefungAction; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.ArbeitseinsatzControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; @@ -49,9 +50,17 @@ public void bind() throws Exception right.addInput(control.getDatumbis()); ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); control.getArbeitseinsatzTable().paint(this.getParent()); diff --git a/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzUeberpruefungView.java b/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzUeberpruefungView.java index 7919d7b5a..1f860a1a5 100644 --- a/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzUeberpruefungView.java +++ b/src/de/jost_net/JVerein/gui/view/ArbeitseinsatzUeberpruefungView.java @@ -37,7 +37,7 @@ public class ArbeitseinsatzUeberpruefungView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Arbeitseinsätze auswerten"); + GUI.getView().setTitle("Auswertung Arbeitseinsätze"); final ArbeitseinsatzControl control = new ArbeitseinsatzControl(this); butArbeitseinsaetze = control.getArbeitseinsatzAusgabeButton(); diff --git a/src/de/jost_net/JVerein/gui/view/AuswertungMitgliedView.java b/src/de/jost_net/JVerein/gui/view/AuswertungMitgliedView.java index 60b479f43..a6121cf73 100644 --- a/src/de/jost_net/JVerein/gui/view/AuswertungMitgliedView.java +++ b/src/de/jost_net/JVerein/gui/view/AuswertungMitgliedView.java @@ -41,7 +41,7 @@ public AuswertungMitgliedView() throws RemoteException @Override public void bind() throws Exception { - GUI.getView().setTitle("Auswertung Mitgliedsdaten"); + GUI.getView().setTitle("Auswertung Mitglieder"); LabelGroup group = new LabelGroup(getParent(), "Filter"); diff --git a/src/de/jost_net/JVerein/gui/view/AuswertungNichtMitgliedView.java b/src/de/jost_net/JVerein/gui/view/AuswertungNichtMitgliedView.java index 35b7ee8c8..71e091933 100644 --- a/src/de/jost_net/JVerein/gui/view/AuswertungNichtMitgliedView.java +++ b/src/de/jost_net/JVerein/gui/view/AuswertungNichtMitgliedView.java @@ -42,7 +42,7 @@ public AuswertungNichtMitgliedView() throws RemoteException @Override public void bind() throws Exception { - GUI.getView().setTitle("Auswertung Nicht-Mitgliederdaten"); + GUI.getView().setTitle("Auswertung Nicht-Mitglieder"); LabelGroup group = new LabelGroup(getParent(), "Filter"); diff --git a/src/de/jost_net/JVerein/gui/view/BuchungView.java b/src/de/jost_net/JVerein/gui/view/BuchungView.java index 6b7f1b9b8..f6d99e9ff 100644 --- a/src/de/jost_net/JVerein/gui/view/BuchungView.java +++ b/src/de/jost_net/JVerein/gui/view/BuchungView.java @@ -19,8 +19,9 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.SplitbuchungNeuAction; import de.jost_net.JVerein.gui.control.BuchungsControl; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.io.SplitbuchungsContainer; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.keys.SplitbuchungTyp; import de.jost_net.JVerein.gui.parts.BuchungPart; import de.jost_net.JVerein.rmi.Buchung; @@ -36,12 +37,12 @@ public class BuchungView extends AbstractView @Override public void bind() throws Exception { - Kontenart art = Kontenart.GELDKONTO; + Kontenfilter art = Kontenfilter.GELDKONTO; if (this.getCurrentObject() != null && this.getCurrentObject() instanceof Buchung) { Buchung bu = (Buchung) this.getCurrentObject(); - if (bu.getKonto() != null && bu.getKonto().getAnlagenkonto()) - art = Kontenart.ANLAGEKONTO; + if (bu.getKonto() != null && bu.getKonto().getKontoArt() == Kontoart.ANLAGE) + art = Kontenfilter.ANLAGEKONTO; } final BuchungsControl control = new BuchungsControl(this, art); GUI.getView().setTitle(control.getTitleBuchungsView()); diff --git a/src/de/jost_net/JVerein/gui/view/BuchungsartListView.java b/src/de/jost_net/JVerein/gui/view/BuchungsartListView.java index 115b2815b..ebbd1335d 100644 --- a/src/de/jost_net/JVerein/gui/view/BuchungsartListView.java +++ b/src/de/jost_net/JVerein/gui/view/BuchungsartListView.java @@ -16,18 +16,15 @@ **********************************************************************/ package de.jost_net.JVerein.gui.view; -import java.rmi.RemoteException; - import de.jost_net.JVerein.gui.action.BuchungsartAction; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.BuchungsartControl; import de.willuhn.jameica.gui.AbstractView; -import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; -import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.ButtonArea; +import de.willuhn.jameica.gui.util.ColumnLayout; import de.willuhn.jameica.gui.util.LabelGroup; -import de.willuhn.util.ApplicationException; +import de.willuhn.jameica.gui.util.SimpleContainer; public class BuchungsartListView extends AbstractView { @@ -40,37 +37,30 @@ public void bind() throws Exception final BuchungsartControl control = new BuchungsartControl(this); LabelGroup group = new LabelGroup(getParent(), "Filter"); - group.addLabelPair("Suche", control.getSuchtext()); - group.addLabelPair("Status", control.getSuchStatus()); + ColumnLayout cl = new ColumnLayout(group.getComposite(), 2); + + SimpleContainer left = new SimpleContainer(cl.getComposite()); + left.addLabelPair("Nummer", control.getSuchname()); + left.addLabelPair("Bezeichnung", control.getSuchtext()); + left.addInput(control.getSuchBuchungsklasse()); + + SimpleContainer right = new SimpleContainer(cl.getComposite()); + right.addInput(control.getSuchBuchungsartArt()); + right.addLabelPair("Status", control.getSuchStatus()); - ButtonArea buttons1 = new ButtonArea(); - Button button = new Button("Suchen", new Action() - { - @Override - public void handleAction(Object context) throws ApplicationException - { - try - { - control.getBuchungsartList(); - } - catch (RemoteException e) - { - // TODO Auto-generated catch block - GUI.getStatusBar().setErrorText(e.getMessage()); - } - } - }, null, true, "search.png"); - buttons1.addButton(button); - group.addButtonArea(buttons1); + ButtonArea fbuttons = new ButtonArea(); + fbuttons.addButton(control.getResetButton()); + fbuttons.addButton(control.getSuchenButton()); + group.addButtonArea(fbuttons); - LabelGroup group2 = new LabelGroup(getParent(), "Liste", true); - group2.addPart(control.getBuchungsartList()); + control.getBuchungsartList().paint(this.getParent()); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.BUCHUNGSART, false, "question-circle.png"); buttons.addButton(control.getPDFAusgabeButton()); - buttons.addButton("Neu", new BuchungsartAction(), null, false, "document-new.png"); + buttons.addButton("Neu", new BuchungsartAction(), null, false, + "document-new.png"); buttons.paint(this.getParent()); } } diff --git a/src/de/jost_net/JVerein/gui/view/BuchungsklasseSaldoView.java b/src/de/jost_net/JVerein/gui/view/BuchungsklasseSaldoView.java index 7da70c49d..4327d9c26 100644 --- a/src/de/jost_net/JVerein/gui/view/BuchungsklasseSaldoView.java +++ b/src/de/jost_net/JVerein/gui/view/BuchungsklasseSaldoView.java @@ -30,7 +30,7 @@ public class BuchungsklasseSaldoView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Buchungsklassen-Saldo"); + GUI.getView().setTitle("Buchungsklassensaldo"); final BuchungsklasseSaldoControl control = new BuchungsklasseSaldoControl( this); diff --git a/src/de/jost_net/JVerein/gui/view/BuchungslisteView.java b/src/de/jost_net/JVerein/gui/view/BuchungslisteView.java index bb06fd33a..a4a2895c7 100644 --- a/src/de/jost_net/JVerein/gui/view/BuchungslisteView.java +++ b/src/de/jost_net/JVerein/gui/view/BuchungslisteView.java @@ -23,9 +23,11 @@ import de.jost_net.JVerein.gui.action.BuchungImportAction; import de.jost_net.JVerein.gui.action.BuchungNeuAction; +import de.jost_net.JVerein.gui.action.BuchungsuebernahmeAction; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.BuchungsControl; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.jost_net.JVerein.gui.control.BuchungsHeaderControl; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; @@ -48,7 +50,7 @@ public void bind() throws Exception { GUI.getView().setTitle("Buchungen"); - final BuchungsControl control = new BuchungsControl(this, Kontenart.GELDKONTO); + final BuchungsControl control = new BuchungsControl(this, Kontenfilter.GELDKONTO); LabelGroup group = new LabelGroup(getParent(), "Konto"); group.addLabelPair("Konto", control.getSuchKonto()); @@ -67,14 +69,16 @@ public void bind() throws Exception left.addLabelPair("Projekt", control.getSuchProjekt()); left.addLabelPair("Betrag", control.getSuchBetrag()); left.addLabelPair("Mitglied zugeordnet?", control.getSuchMitgliedZugeordnet()); - right.addLabelPair("Von Datum", control.getVondatum()); - right.addLabelPair("Bis Datum", control.getBisdatum()); + right.addLabelPair("Datum von", control.getVondatum()); + right.addLabelPair("Datum bis", control.getBisdatum()); right.addLabelPair("Enthaltener Text", control.getSuchtext()); right.addLabelPair("Mitglied Name", control.getMitglied()); ButtonArea buttons1 = new ButtonArea(); - buttons1.addButton(control.getZurueckButton()); - buttons1.addButton(control.getVorButton()); + ToolTipButton zurueck = control.getZurueckButton(); + buttons1.addButton(zurueck); + ToolTipButton vor = control.getVorButton(); + buttons1.addButton(vor); Button reset = new Button("Filter-Reset", new Action() { @Override @@ -95,6 +99,8 @@ public void handleAction(Object context) throws ApplicationException }, null, true, "search.png"); buttons1.addButton(suchen); labelgroup1.addButtonArea(buttons1); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); // Zweiter Tab final BuchungsHeaderControl headerControl = new BuchungsHeaderControl( @@ -126,6 +132,8 @@ public void handleAction(Object context) throws ApplicationException ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.BUCHUNGEN, false, "question-circle.png"); + buttons.addButton("Hibiscus-Import", new BuchungsuebernahmeAction(), null, false, + "file-import.png"); buttons.addButton("Import", new BuchungImportAction(), null, false, "file-import.png"); buttons.addButton(control.getStartCSVAuswertungButton()); diff --git a/src/de/jost_net/JVerein/gui/view/DbBereinigenView.java b/src/de/jost_net/JVerein/gui/view/DbBereinigenView.java index b1abbcd7d..945cadab3 100644 --- a/src/de/jost_net/JVerein/gui/view/DbBereinigenView.java +++ b/src/de/jost_net/JVerein/gui/view/DbBereinigenView.java @@ -31,10 +31,17 @@ public class DbBereinigenView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Datenbank bereinigen"); + GUI.getView().setTitle("Datenbank-Bereinigung"); final DbBereinigenControl control = new DbBereinigenControl(this); + LabelGroup grouprechnungen = new LabelGroup(getParent(), "Rechnungen"); + ColumnLayout rcl = new ColumnLayout(grouprechnungen.getComposite(), 2); + SimpleContainer rleft = new SimpleContainer(rcl.getComposite()); + rleft.addLabelPair("Löschen", control.getRechnungenLoeschen()); + SimpleContainer rright = new SimpleContainer(rcl.getComposite()); + rright.addLabelPair("Rechnungsdatum älter als", control.getDatumAuswahlRechnungen()); + LabelGroup groupspendenbescheinigungen = new LabelGroup(getParent(), "Spendenbescheinigungen"); ColumnLayout scl = new ColumnLayout(groupspendenbescheinigungen.getComposite(), 2); SimpleContainer sleft = new SimpleContainer(scl.getComposite()); diff --git a/src/de/jost_net/JVerein/gui/view/DokumentationUtil.java b/src/de/jost_net/JVerein/gui/view/DokumentationUtil.java index a4f2af538..c80c07836 100644 --- a/src/de/jost_net/JVerein/gui/view/DokumentationUtil.java +++ b/src/de/jost_net/JVerein/gui/view/DokumentationUtil.java @@ -24,7 +24,7 @@ public class DokumentationUtil //private static final String ALLGEMEIN = "allgemein/"; - private static final String FUNKTIONEN = "allgemeine-funktionen/"; + private static final String FUNKTIONEN = "v2.9.0/"; private static final String ADMIN = "administration/"; @@ -44,6 +44,8 @@ public class DokumentationUtil private static final String ADMERWEITERT = "erweitert/"; + private static final String ADMEINSTELLUNG = "einstellungen/"; + // Mitglieder public static final String ARBEITSEINSATZ = PRE + FUNKTIONEN + MITGLIEDER + "arbeitseinsatz"; @@ -72,6 +74,8 @@ public class DokumentationUtil public static final String SPENDENBESCHEINIGUNG = PRE + FUNKTIONEN + MITGLIEDER + "spendenbescheinigung"; + public static final String RECHNUNG = PRE + FUNKTIONEN + MITGLIEDER + "rechnung"; + public static final String SUCHPROFIL = PRE + FUNKTIONEN + MITGLIEDER + "content/suchprofil"; public static final String WIEDERVORLAGE = PRE + FUNKTIONEN + MITGLIEDER + "wiedervorlage"; @@ -109,6 +113,8 @@ public class DokumentationUtil public static final String SPLITBUCHUNG = PRE + FUNKTIONEN + BUCHF + "splittbuchungen"; public static final String ANLAGENLISTE = PRE + FUNKTIONEN + BUCHF + "anlagenverzeichnis"; + + public static final String MITTELVERWENDUNG = PRE + FUNKTIONEN + BUCHF + "mittelverwendung"; // Abrechnung @@ -139,7 +145,7 @@ public class DokumentationUtil // Druck und Mail - public static final String RECHNUNG = PRE + FUNKTIONEN + DRUCKMAIL + "rechnungen"; + public static final String RECHNUNG_MAIL = PRE + FUNKTIONEN + DRUCKMAIL + "rechnungen"; public static final String MAHNUNG = PRE + FUNKTIONEN + DRUCKMAIL+ "mahnungen"; @@ -158,7 +164,27 @@ public class DokumentationUtil // Einstellungen - public static final String EINSTELLUNGEN = PRE + FUNKTIONEN + ADMIN + "einstellungen"; + public static final String EINSTELLUNGEN_ABRECHNUNG = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "abrechnung"; + + public static final String EINSTELLUNGEN_ALLGEMEIN = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "allgemein"; + + public static final String EINSTELLUNGEN_ANSICHT = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "ansicht"; + + public static final String EINSTELLUNGEN_ANZEIGE = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "anzeige"; + + public static final String EINSTELLUNGEN_BUCHFUEHRUNG = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "buchfuehrung"; + + public static final String EINSTELLUNGEN_DATEINAMEN = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "dateinamen"; + + public static final String EINSTELLUNGEN_MAIL = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "mail"; + + public static final String EINSTELLUNGEN_RECHNUNGEN = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "rechnungen"; + + public static final String EINSTELLUNGEN_SPALTEN = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "spalten"; + + public static final String EINSTELLUNGEN_SPENDENBESCHEINIGUNGEN = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "spendenbescheinigungen"; + + public static final String EINSTELLUNGEN_STATISTIK = PRE + FUNKTIONEN + ADMIN + ADMEINSTELLUNG + "statistik"; // Einstellungen Mitglieder diff --git a/src/de/jost_net/JVerein/gui/view/EigenschaftGruppeListeView.java b/src/de/jost_net/JVerein/gui/view/EigenschaftGruppeListeView.java index 00221e91a..5a57daf88 100644 --- a/src/de/jost_net/JVerein/gui/view/EigenschaftGruppeListeView.java +++ b/src/de/jost_net/JVerein/gui/view/EigenschaftGruppeListeView.java @@ -29,7 +29,7 @@ public class EigenschaftGruppeListeView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Eigenschaften Gruppen"); + GUI.getView().setTitle("Eigenschaftengruppen"); EigenschaftGruppeControl control = new EigenschaftGruppeControl(this); diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenAbrechnungView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenAbrechnungView.java index cacdc3a95..223de2f1c 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenAbrechnungView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenAbrechnungView.java @@ -58,7 +58,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_ABRECHNUNG, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenAllgemeinView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenAllgemeinView.java index dd8c4a554..ca33a809c 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenAllgemeinView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenAllgemeinView.java @@ -42,15 +42,17 @@ public void bind() throws Exception cont.addLabelPair("Straße", control.getStrasse()); cont.addLabelPair("PLZ", control.getPlz()); cont.addLabelPair("Ort", control.getOrt()); - TextInput bic = control.getBic(); // vor IBAN initialisieren, das IBAN eine + cont.addLabelPair("Staat", control.getStaat()); + TextInput bic = control.getBic(); // vor IBAN initialisieren, da IBAN eine // Referenz auf bic benötigt! cont.addLabelPair("IBAN", control.getIban()); cont.addLabelPair("BIC", bic); cont.addLabelPair("Gläubiger-ID", control.getGlaeubigerID()); + cont.addLabelPair("USt-ID", control.getUstID()); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_ALLGEMEIN, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenAnzeigeView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenAnzeigeView.java index 63a9d6ff4..0e606b312 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenAnzeigeView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenAnzeigeView.java @@ -67,6 +67,8 @@ public void bind() throws Exception left.addLabelPair("Juristische Personen erlaubt", control.getJuristischePersonen()); left.addLabelPair("Mitgliedsfoto *", control.getMitgliedfoto()); + left.addLabelPair("Mittelverwendung anzeigen" + "*", + control.getMittelverwendung()); SimpleContainer right = new SimpleContainer(cols1.getComposite()); right.addLabelPair("Lesefelder anzeigen *", control.getUseLesefelder()); @@ -92,7 +94,7 @@ public void bind() throws Exception cont.addSeparator(); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_ANZEIGE, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenBuchfuehrungView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenBuchfuehrungView.java index 673cd5d46..23581db3a 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenBuchfuehrungView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenBuchfuehrungView.java @@ -52,7 +52,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_BUCHFUEHRUNG, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenDateinamenView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenDateinamenView.java index e38b23b8e..9d77eebb2 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenDateinamenView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenDateinamenView.java @@ -44,7 +44,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_DATEINAMEN, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenMailView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenMailView.java index 75f10018d..464f442ac 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenMailView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenMailView.java @@ -67,7 +67,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_MAIL, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliedAnsichtView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliedAnsichtView.java index c75845dad..dbfb797cf 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliedAnsichtView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliedAnsichtView.java @@ -33,7 +33,7 @@ public class EinstellungenMitgliedAnsichtView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Einstellungen Mitglied Ansicht"); + GUI.getView().setTitle("Einstellungen Mitglieder Ansicht"); final EinstellungControl control = new EinstellungControl(this); @@ -114,7 +114,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_ANSICHT, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliederSpaltenView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliederSpaltenView.java index b4d8a6e7a..47d52db6c 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliederSpaltenView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenMitgliederSpaltenView.java @@ -29,7 +29,7 @@ public class EinstellungenMitgliederSpaltenView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Einstellungen Trefferliste Mitglieder"); + GUI.getView().setTitle("Einstellungen Mitglieder Spalten"); final EinstellungControl control = new EinstellungControl(this); @@ -38,7 +38,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_SPALTEN, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java index 161c320d3..38d673d34 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenRechnungenView.java @@ -30,7 +30,7 @@ public class EinstellungenRechnungenView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Einstellungen"); + GUI.getView().setTitle("Einstellungen Rechnungen"); final EinstellungControl control = new EinstellungControl(this); @@ -59,7 +59,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_RECHNUNGEN, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenSpendenbescheinigungenView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenSpendenbescheinigungenView.java index fc6596c73..1f0281e33 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenSpendenbescheinigungenView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenSpendenbescheinigungenView.java @@ -58,7 +58,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_SPENDENBESCHEINIGUNGEN, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/EinstellungenStatistikView.java b/src/de/jost_net/JVerein/gui/view/EinstellungenStatistikView.java index 358d56b8d..2f1bf6de2 100644 --- a/src/de/jost_net/JVerein/gui/view/EinstellungenStatistikView.java +++ b/src/de/jost_net/JVerein/gui/view/EinstellungenStatistikView.java @@ -44,7 +44,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.EINSTELLUNGEN, false, "question-circle.png"); + DokumentationUtil.EINSTELLUNGEN_STATISTIK, false, "question-circle.png"); buttons.addButton("Speichern", new Action() { diff --git a/src/de/jost_net/JVerein/gui/view/FormularListeView.java b/src/de/jost_net/JVerein/gui/view/FormularListeView.java index d21ec63be..2e9350a44 100644 --- a/src/de/jost_net/JVerein/gui/view/FormularListeView.java +++ b/src/de/jost_net/JVerein/gui/view/FormularListeView.java @@ -18,6 +18,7 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.FormularAction; +import de.jost_net.JVerein.gui.action.FormularImportAction; import de.jost_net.JVerein.gui.control.FormularControl; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; @@ -38,6 +39,8 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.FORMULARE, false, "question-circle.png"); + buttons.addButton("Importieren", new FormularImportAction(), null, false, + "file-import.png"); buttons.addButton("Neu", new FormularAction(), null, false, "document-new.png"); buttons.paint(this.getParent()); diff --git a/src/de/jost_net/JVerein/gui/view/JubilaeenView.java b/src/de/jost_net/JVerein/gui/view/JubilaeenView.java index e90f2ee28..7663255d2 100644 --- a/src/de/jost_net/JVerein/gui/view/JubilaeenView.java +++ b/src/de/jost_net/JVerein/gui/view/JubilaeenView.java @@ -40,7 +40,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.JUBILAEEN, false, "question-circle.png"); - buttons.addButton("Start", new JubilaeumsExportAction(), control, true, + buttons.addButton("Starten", new JubilaeumsExportAction(), control, true, "walking.png"); buttons.paint(getParent()); } diff --git a/src/de/jost_net/JVerein/gui/view/KontensaldoView.java b/src/de/jost_net/JVerein/gui/view/KontensaldoView.java index 2ca190aef..dd816a1e4 100644 --- a/src/de/jost_net/JVerein/gui/view/KontensaldoView.java +++ b/src/de/jost_net/JVerein/gui/view/KontensaldoView.java @@ -31,7 +31,7 @@ public class KontensaldoView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Konten-Saldo"); + GUI.getView().setTitle("Kontensaldo"); final KontensaldoControl control = new KontensaldoControl(this); diff --git a/src/de/jost_net/JVerein/gui/view/KontoView.java b/src/de/jost_net/JVerein/gui/view/KontoView.java index 4dbcd41f1..8b761abe2 100644 --- a/src/de/jost_net/JVerein/gui/view/KontoView.java +++ b/src/de/jost_net/JVerein/gui/view/KontoView.java @@ -40,7 +40,7 @@ public void bind() throws Exception ColumnLayout cl = new ColumnLayout(group.getComposite(), 2); SimpleContainer left = new SimpleContainer(cl.getComposite()); - left.addLabelPair("Anlagenkonto", control.getAnlagenkonto()); + left.addLabelPair("Kontoart", control.getKontoArt()); left.addLabelPair("Nummer", control.getNummer()); left.addLabelPair("Bezeichnung", control.getBezeichnung()); left.addLabelPair("Eröffnungsdatum", control.getEroeffnung()); diff --git a/src/de/jost_net/JVerein/gui/view/KontoauszugView.java b/src/de/jost_net/JVerein/gui/view/KontoauszugView.java index 4b1c47b2c..a67a39c78 100644 --- a/src/de/jost_net/JVerein/gui/view/KontoauszugView.java +++ b/src/de/jost_net/JVerein/gui/view/KontoauszugView.java @@ -34,7 +34,7 @@ public class KontoauszugView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Kontoauszug"); + GUI.getView().setTitle("Kontoauszüge"); final MitgliedskontoControl control = new MitgliedskontoControl(this); control.init("kontoauszug.", null, null); diff --git a/src/de/jost_net/JVerein/gui/view/KursteilnehmerSucheView.java b/src/de/jost_net/JVerein/gui/view/KursteilnehmerSucheView.java index 80b137579..fb4b11d95 100644 --- a/src/de/jost_net/JVerein/gui/view/KursteilnehmerSucheView.java +++ b/src/de/jost_net/JVerein/gui/view/KursteilnehmerSucheView.java @@ -23,6 +23,7 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.KursteilnehmerDetailAction; import de.jost_net.JVerein.gui.control.KursteilnehmerControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.datasource.rmi.DBService; import de.willuhn.datasource.rmi.ResultSetExtractor; import de.willuhn.jameica.gui.AbstractView; @@ -38,7 +39,7 @@ public class KursteilnehmerSucheView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Suche Kursteilnehmer"); + GUI.getView().setTitle("Kursteilnehmer"); final KursteilnehmerControl control = new KursteilnehmerControl(this); @@ -70,11 +71,27 @@ public Object extract(ResultSet rs) throws SQLException SimpleContainer right = new SimpleContainer(cl.getComposite()); right.addInput(control.getAbbuchungsdatumvon()); right.addInput(control.getAbbuchungsdatumbis()); - + ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck1 = control.getZurueckButton( + control.getEingabedatumvon(), control.getEingabedatumbis()); + fbuttons.addButton(zurueck1); + ToolTipButton vor1 = control.getVorButton(control.getEingabedatumvon(), + control.getEingabedatumbis()); + fbuttons.addButton(vor1); + ToolTipButton zurueck2 = control.getZurueckButton( + control.getAbbuchungsdatumvon(), control.getAbbuchungsdatumbis()); + fbuttons.addButton(zurueck2); + ToolTipButton vor2 = control.getVorButton(control.getAbbuchungsdatumvon(), + control.getAbbuchungsdatumbis()); + fbuttons.addButton(vor2); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck1.setToolTipText("Eingabe Datumsbereich zurück"); + vor1.setToolTipText("Eingabe Datumsbereich vowärts"); + zurueck2.setToolTipText("Abbuchung Datumsbereich zurück"); + vor2.setToolTipText("Abbuchung Datumsbereich vowärts"); if (anzahl.longValue() > 0) { diff --git a/src/de/jost_net/JVerein/gui/view/LastschriftListeView.java b/src/de/jost_net/JVerein/gui/view/LastschriftListeView.java index 34348c8ec..ad0b7981b 100644 --- a/src/de/jost_net/JVerein/gui/view/LastschriftListeView.java +++ b/src/de/jost_net/JVerein/gui/view/LastschriftListeView.java @@ -18,6 +18,7 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.control.LastschriftControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; @@ -47,11 +48,19 @@ public void bind() throws Exception right.addLabelPair("Fälligkeit von", control.getDatumvon()); right.addLabelPair("Fälligkeit bis", control.getDatumbis()); right.addLabelPair("Abrechnungslauf ab", control.getIntegerAusw()); - + ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); control.getLastschriftList().paint(this.getParent()); diff --git a/src/de/jost_net/JVerein/gui/view/LehrgaengeListeView.java b/src/de/jost_net/JVerein/gui/view/LehrgaengeListeView.java index 1e1e6eba1..e4e8eacb6 100644 --- a/src/de/jost_net/JVerein/gui/view/LehrgaengeListeView.java +++ b/src/de/jost_net/JVerein/gui/view/LehrgaengeListeView.java @@ -19,6 +19,7 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.LehrgangAction; import de.jost_net.JVerein.gui.control.LehrgangControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; @@ -48,9 +49,17 @@ public void bind() throws Exception right.addInput(control.getDatumbis()); ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); control.getLehrgaengeList().paint(this.getParent()); ButtonArea buttons = new ButtonArea(); diff --git a/src/de/jost_net/JVerein/gui/view/LesefeldDetailView.java b/src/de/jost_net/JVerein/gui/view/LesefeldDetailView.java index bfe0b76d1..b972c3e6d 100644 --- a/src/de/jost_net/JVerein/gui/view/LesefeldDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/LesefeldDetailView.java @@ -10,25 +10,17 @@ * * 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 java.rmi.RemoteException; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Event; -import org.eclipse.swt.widgets.Listener; - import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.Variable.MitgliedMap; -import de.jost_net.JVerein.gui.dialogs.ShowVariablesDialog; +import de.jost_net.JVerein.gui.action.OpenInsertVariableDialogAction; import de.jost_net.JVerein.gui.input.MitgliedInput; -import de.jost_net.JVerein.gui.menu.ShowVariablesMenu; import de.jost_net.JVerein.rmi.Lesefeld; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.util.LesefeldAuswerter; @@ -42,17 +34,21 @@ import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.ButtonArea; import de.willuhn.jameica.gui.util.SimpleContainer; -import de.willuhn.jameica.system.OperationCanceledException; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Event; +import org.eclipse.swt.widgets.Listener; + +import java.rmi.RemoteException; /** - * Ein View zum Bearbeiten von Skripten für ein Lesefeld. + * Ein View zum Bearbeiten von Skripten für ein Lesefeld. */ -public class LesefeldDetailView extends AbstractView implements Listener +public class LesefeldDetailView extends AbstractView { - private LesefeldAuswerter lesefeldAuswerter; + private final LesefeldAuswerter lesefeldAuswerter; private Lesefeld lesefeld; @@ -61,22 +57,19 @@ public class LesefeldDetailView extends AbstractView implements Listener private TextAreaInput textAreaInputScriptResult; private TextInput textInputScriptName; - + private AbstractInput mitglied; - + private Mitglied selectedMitglied; - public LesefeldDetailView(LesefeldAuswerter lesefeldAuswerter, Lesefeld lesefeld, Mitglied mitglied) { this.lesefeldAuswerter = lesefeldAuswerter; this.lesefeld = lesefeld; this.selectedMitglied = mitglied; - // KeyListener für HotKeys. - GUI.getDisplay().addFilter(SWT.KeyDown, this); } - + @Override public void bind() throws Exception { @@ -84,8 +77,8 @@ public void bind() throws Exception SimpleContainer container = new SimpleContainer(parent, true); container.addLabelPair("Mitglied", getMitglied()); - - // Auf diese Input-Felder sollte nur über die Funktionen + + // Auf diese Input-Felder sollte nur über die Funktionen // updateLesefeldFromGUI() und updateScriptResult() zugegriffen werden. textInputScriptName = new TextInput( lesefeld != null ? lesefeld.getBezeichnung() : ""); @@ -102,21 +95,15 @@ public void bind() throws Exception updateScriptResult(); ButtonArea buttonArea = new ButtonArea(); - Button button = new Button("Aktualisieren (F5)", new Action() - { - - @Override - public void handleAction(Object context) - { - updateScriptResult(); - } - }, null, false, "view-refresh.png"); + Button button = new Button("Aktualisieren", context -> updateScriptResult(), + null, false, "view-refresh.png"); buttonArea.addButton(button); - button = new Button("Variablen anzeigen (F6)", - new OpenInsertVariableDialogAction(), null, false, "bookmark.png"); + button = new Button("Variablen anzeigen", + new OpenInsertVariableDialogAction(), lesefeldAuswerter, false, + "bookmark.png"); buttonArea.addButton(button); - button = new Button("Speichern", new SaveLesefeldAction(), null, - false, "document-save.png"); + button = new Button("Speichern", new SaveLesefeldAction(), null, false, + "document-save.png"); buttonArea.addButton(button); buttonArea.paint(this.getParent()); } @@ -125,7 +112,6 @@ public void handleAction(Object context) * Aktualisiert lokales Feld lesefeld mit den vom Nutzer eingegebenen Daten * aus der GUI. Dabei wird ggf. lesefeld initialisiert und die Eindeutigkeit * des Namens des Skriptes sichergestellt. - * */ private boolean updateLesefeldFromGUI() { @@ -142,8 +128,8 @@ private boolean updateLesefeldFromGUI() if (lesefeld.getBezeichnung().equals(textInputScriptName.getValue())) { String currentid = lesefeld.getID(); - if (this.lesefeld == null || (this.lesefeld != null - && !this.lesefeld.getID().equalsIgnoreCase((currentid)))) + if (this.lesefeld == null || !this.lesefeld.getID() + .equalsIgnoreCase(currentid)) { GUI.getStatusBar() .setErrorText("Bitte eindeutigen Skript-Namen eingeben!"); @@ -152,15 +138,15 @@ private boolean updateLesefeldFromGUI() } } - // erstelle neues lesefeld, wenn nötig. + // erstelle neues lesefeld, wenn nötig. if (lesefeld == null) - lesefeld = (Lesefeld) Einstellungen.getDBService() + lesefeld = Einstellungen.getDBService() .createObject(Lesefeld.class, null); lesefeld.setBezeichnung((String) textInputScriptName.getValue()); lesefeld.setScript((String) textAreaInputScriptCode.getValue()); - lesefeld - .setEvaluatedContent((String) textAreaInputScriptResult.getValue()); + lesefeld.setEvaluatedContent( + (String) textAreaInputScriptResult.getValue()); } catch (RemoteException e) { @@ -172,18 +158,12 @@ private boolean updateLesefeldFromGUI() return true; } - @Override - public void unbind() - { - GUI.getDisplay().removeFilter(SWT.KeyDown, this); - } - /** * Holt akutelles Skript von GUI, evaluiert dieses und schreibt Ergebnis - * zurück in die GUI. - * + * zurück in die GUI. + * * @return true bei Erfolg, sonst false (Fehlermeldung wird in - * Skript-Ausgabe-Feld geschrieben). + * Skript-Ausgabe-Feld geschrieben). */ private boolean updateScriptResult() { @@ -196,7 +176,7 @@ private boolean updateScriptResult() result = (String) lesefeldAuswerter.eval(lesefeld.getScript()); if (result == null) { - result = "Skript-Fehler: Skript muss Rückgabewert liefern."; + result = "Skript-Fehler: Skript muss Rückgabewert liefern."; success = false; } } @@ -214,20 +194,6 @@ private boolean updateScriptResult() return success; } - @Override - public void handleEvent(Event event) - { - // aktualisiere Script-Ausgabe, wenn F5 gedrückt wird. - if (event.keyCode == org.eclipse.swt.SWT.F5) - { - updateScriptResult(); - } - else if (event.keyCode == org.eclipse.swt.SWT.F6) - { - new OpenInsertVariableDialogAction().handleAction(null); - } - } - private final class SaveLesefeldAction implements Action { @@ -254,41 +220,10 @@ public void handleAction(Object context) throws ApplicationException } else GUI.getStatusBar().setErrorText( - "Skript enthält Fehler. Kann nicht gespeichert werden."); + "Skript enthält Fehler. Kann nicht gespeichert werden."); } } - private final class OpenInsertVariableDialogAction implements Action - { - - @Override - public void handleAction(Object context) - { - try - { - ShowVariablesDialog d = new ShowVariablesDialog( - lesefeldAuswerter.getMap(), false); - ShowVariablesMenu menu = new ShowVariablesMenu(); - menu.setPrependCopyText(""); - menu.setAppendCopyText(""); - d.setContextMenu(menu); - d.setDoubleClickAction(menu.getCopyToClipboardAction()); - d.open(); - } - catch (OperationCanceledException e) - { - - } - catch (Exception e) - { - Logger.error("Fehler beim Anzeigen der Variablen.", e); - GUI.getStatusBar().setErrorText("Fehler beim Anzeigen der Variablen."); - } - - } - - } - public Input getMitglied() throws RemoteException { if (mitglied != null) @@ -302,7 +237,7 @@ public Input getMitglied() throws RemoteException mitglied.setMandatory(true); return mitglied; } - + public class MitgliedListener implements Listener { @@ -319,13 +254,13 @@ public void handleEvent(Event event) if (selected == null || selected == selectedMitglied) return; selectedMitglied = selected; - lesefeldAuswerter - .setMap(new MitgliedMap().getMap(selectedMitglied, null, true)); + lesefeldAuswerter.setMap( + new MitgliedMap().getMap(selectedMitglied, null, true)); updateScriptResult(); } catch (RemoteException e) { - String fehler = "Fehler beim Auswählen des Mitgliedes"; + String fehler = "Fehler beim Auswählen des Mitgliedes"; Logger.error(fehler, e); GUI.getStatusBar().setErrorText(fehler); } diff --git a/src/de/jost_net/JVerein/gui/view/LesefeldUebersichtView.java b/src/de/jost_net/JVerein/gui/view/LesefeldUebersichtView.java index bbd102aa1..59e8e0484 100644 --- a/src/de/jost_net/JVerein/gui/view/LesefeldUebersichtView.java +++ b/src/de/jost_net/JVerein/gui/view/LesefeldUebersichtView.java @@ -27,7 +27,7 @@ public class LesefeldUebersichtView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Lesefeld-Definitionen"); + GUI.getView().setTitle("Lesefelder"); LesefeldUebersichtPart lesefeldEinstellungPart = new LesefeldUebersichtPart( (Mitglied) getCurrentObject()); diff --git a/src/de/jost_net/JVerein/gui/view/MitgliedskontoMahnungView.java b/src/de/jost_net/JVerein/gui/view/MahnungMailView.java similarity index 84% rename from src/de/jost_net/JVerein/gui/view/MitgliedskontoMahnungView.java rename to src/de/jost_net/JVerein/gui/view/MahnungMailView.java index bf7913a56..51af8b143 100644 --- a/src/de/jost_net/JVerein/gui/view/MitgliedskontoMahnungView.java +++ b/src/de/jost_net/JVerein/gui/view/MahnungMailView.java @@ -17,10 +17,8 @@ package de.jost_net.JVerein.gui.view; import de.jost_net.JVerein.gui.action.DokumentationAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoExportAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoExportAction.EXPORT_TYP; import de.jost_net.JVerein.gui.action.MailVorlageZuweisenAction; -import de.jost_net.JVerein.gui.control.MitgliedskontoControl; +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; @@ -30,16 +28,16 @@ import de.willuhn.jameica.gui.util.LabelGroup; import de.willuhn.jameica.gui.util.SimpleContainer; -public class MitgliedskontoMahnungView extends AbstractView +public class MahnungMailView extends AbstractView { @Override public void bind() throws Exception { - GUI.getView().setTitle("Mahnung"); + GUI.getView().setTitle("Mahnungen"); - final MitgliedskontoControl control = new MitgliedskontoControl(this); - control.init(MitgliedskontoControl.TYP.MAHNUNG.name() + ".", null, null); + final RechnungControl control = new RechnungControl(this); + control.init(RechnungControl.TYP.MAHNUNG.name() + ".", null, null); if (this.getCurrentObject() == null) { @@ -73,7 +71,7 @@ public void bind() throws Exception cont.addLabelPair("Formular", control.getFormular(FormularArt.MAHNUNG)); cont.addInput(control.getAusgabeart()); - cont.addInput(control.getAusgabesortierung()); + //cont.addInput(control.getAusgabesortierung()); cont.addHeadline("Mail"); cont.addInput(control.getBetreff()); @@ -84,8 +82,8 @@ public void bind() throws Exception DokumentationUtil.MAHNUNG, false, "question-circle.png"); buttons.addButton(new Button("Mail-Vorlage", new MailVorlageZuweisenAction(), control, false, "view-refresh.png")); - buttons.addButton(new Button("Export", new MitgliedskontoExportAction( - EXPORT_TYP.MAHNUNGEN, getCurrentObject()), control, false, "document-save.png")); + /*buttons.addButton(new Button("Export", new MitgliedskontoExportAction( + EXPORT_TYP.MAHNUNGEN, getCurrentObject()), control, false, "document-save.png"));*/ buttons.addButton(control.getStartMahnungButton(this.getCurrentObject())); buttons.paint(this.getParent()); } diff --git a/src/de/jost_net/JVerein/gui/view/MailDetailView.java b/src/de/jost_net/JVerein/gui/view/MailDetailView.java index 0d6fac34d..8c00571ed 100644 --- a/src/de/jost_net/JVerein/gui/view/MailDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/MailDetailView.java @@ -10,7 +10,7 @@ * * 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 **********************************************************************/ @@ -26,12 +26,19 @@ import org.eclipse.swt.widgets.FileDialog; import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.Variable.AllgemeineMap; +import de.jost_net.JVerein.Variable.MitgliedMap; import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.MailVorlageZuweisenAction; +import de.jost_net.JVerein.gui.action.MailVorschauAction; +import de.jost_net.JVerein.gui.action.OpenInsertVariableDialogAction; import de.jost_net.JVerein.gui.control.MailControl; import de.jost_net.JVerein.gui.dialogs.MailEmpfaengerAuswahlDialog; import de.jost_net.JVerein.gui.util.JameicaUtil; import de.jost_net.JVerein.rmi.MailAnhang; +import de.jost_net.JVerein.rmi.MailEmpfaenger; +import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.server.MitgliedImpl; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; @@ -48,7 +55,7 @@ public class MailDetailView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("JVerein-Mail"); + GUI.getView().setTitle("Mail"); final MailControl control = new MailControl(this); @@ -164,8 +171,27 @@ public void handleAction(Object context) throws ApplicationException ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.MAIL, false, "question-circle.png"); - buttons.addButton(new Button("Mail-Vorlage", new MailVorlageZuweisenAction(), - control, false, "view-refresh.png")); + buttons.addButton( + new Button("Mail-Vorlage", new MailVorlageZuweisenAction(), control, + false, "view-refresh.png")); + Mitglied m; + if (control.getEmpfaenger().getItems().isEmpty()) + { + m = MitgliedImpl.getDummy(); + } + else + { + MailEmpfaenger empfaenger = (MailEmpfaenger) control.getEmpfaenger() + .getItems().get(0); + m = empfaenger.getMitglied(); + } + buttons.addButton( + new Button("Variablen anzeigen", new OpenInsertVariableDialogAction(), + new MitgliedMap().getMap(m, new AllgemeineMap().getMap(null)), + false, "bookmark.png")); + buttons.addButton( + new Button("Vorschau", new MailVorschauAction(control), m, false, + "edit-copy.png")); buttons.addButton(control.getMailSpeichernButton()); buttons.addButton(control.getMailReSendButton()); buttons.addButton(control.getMailSendButton()); diff --git a/src/de/jost_net/JVerein/gui/view/MailVorlageDetailView.java b/src/de/jost_net/JVerein/gui/view/MailVorlageDetailView.java index bf92b925c..0ff390b73 100644 --- a/src/de/jost_net/JVerein/gui/view/MailVorlageDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/MailVorlageDetailView.java @@ -10,21 +10,27 @@ * * 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.Variable.MitgliedMap; import de.jost_net.JVerein.gui.action.DokumentationAction; +import de.jost_net.JVerein.gui.action.MailVorschauAction; +import de.jost_net.JVerein.gui.action.OpenInsertVariableDialogAction; import de.jost_net.JVerein.gui.control.MailVorlageControl; +import de.jost_net.JVerein.server.MitgliedImpl; import de.willuhn.jameica.gui.AbstractView; -import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.ButtonArea; import de.willuhn.jameica.gui.util.LabelGroup; import de.willuhn.jameica.gui.util.SimpleContainer; +import java.util.Map; + public class MailVorlageDetailView extends AbstractView { @@ -40,18 +46,18 @@ public void bind() throws Exception SimpleContainer t = new SimpleContainer(getParent(), true); t.addPart(control.getTxt()); + Map map = new MitgliedMap().getMap(MitgliedImpl.getDummy(), + null); + ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.MAILVORLAGE, false, "question-circle.png"); - buttons.addButton("Speichern", new Action() - { - - @Override - public void handleAction(Object context) - { - control.handleStore(); - } - }, null, true, "document-save.png"); + buttons.addButton("Variablen anzeigen", + new OpenInsertVariableDialogAction(), map, false, "bookmark.png"); + buttons.addButton(new Button("Vorschau", new MailVorschauAction(control), + MitgliedImpl.getDummy(), false, "edit-copy.png")); + buttons.addButton("Speichern", context -> control.handleStore(), null, true, + "document-save.png"); buttons.paint(this.getParent()); } } diff --git a/src/de/jost_net/JVerein/gui/view/MigrationView.java b/src/de/jost_net/JVerein/gui/view/MigrationView.java index 037f4928f..b0a704067 100644 --- a/src/de/jost_net/JVerein/gui/view/MigrationView.java +++ b/src/de/jost_net/JVerein/gui/view/MigrationView.java @@ -187,7 +187,7 @@ private void autoColumnsAssignment(final Table table, public void bind() throws Exception { - GUI.getView().setTitle("Daten-Import"); + GUI.getView().setTitle("Migration"); final Composite parent = this.getParent(); parent.setLayout(new GridLayout(2, false)); diff --git a/src/de/jost_net/JVerein/gui/view/MitgliederSucheView.java b/src/de/jost_net/JVerein/gui/view/MitgliederSucheView.java index 68a545496..b7df883de 100644 --- a/src/de/jost_net/JVerein/gui/view/MitgliederSucheView.java +++ b/src/de/jost_net/JVerein/gui/view/MitgliederSucheView.java @@ -42,7 +42,7 @@ public MitgliederSucheView() throws RemoteException @Override public String getTitle() { - return "Mitglieder suchen"; + return "Mitglieder"; } @Override diff --git a/src/de/jost_net/JVerein/gui/view/MittelverwendungListeView.java b/src/de/jost_net/JVerein/gui/view/MittelverwendungListeView.java new file mode 100644 index 000000000..e1d345b01 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/view/MittelverwendungListeView.java @@ -0,0 +1,53 @@ +/********************************************************************** + * 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.MittelverwendungControl; +import de.jost_net.JVerein.gui.parts.QuickAccessPart; +import de.jost_net.JVerein.gui.parts.VonBisPart; +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.LabelGroup; + +public class MittelverwendungListeView extends AbstractView +{ + @Override + public void bind() throws Exception + { + GUI.getView().setTitle("Mittelverwendung"); + + final MittelverwendungControl control = new MittelverwendungControl(this); + + VonBisPart vpart = new VonBisPart(control, false); + vpart.paint(this.getParent()); + + QuickAccessPart qpart = new QuickAccessPart(control, false); + qpart.paint(this.getParent()); + + LabelGroup group = new LabelGroup(getParent(), "Liste", true); + group.addPart(control.getSaldoList()); + + ButtonArea buttons = new ButtonArea(); + buttons.addButton("Hilfe", new DokumentationAction(), + DokumentationUtil.MITTELVERWENDUNG, false, "question-circle.png"); + buttons.addButton(control.getCSVExportButton()); + buttons.addButton(control.getPDFExportButton()); + buttons.paint(this.getParent()); + } +} diff --git a/src/de/jost_net/JVerein/gui/view/NichtMitgliederSucheView.java b/src/de/jost_net/JVerein/gui/view/NichtMitgliederSucheView.java index 01cf95e36..061c7a013 100644 --- a/src/de/jost_net/JVerein/gui/view/NichtMitgliederSucheView.java +++ b/src/de/jost_net/JVerein/gui/view/NichtMitgliederSucheView.java @@ -41,7 +41,7 @@ public NichtMitgliederSucheView() throws RemoteException @Override public String getTitle() { - return "Nicht-Mitglieder suchen"; + return "Nicht-Mitglieder"; } @Override diff --git a/src/de/jost_net/JVerein/gui/view/PreNotificationView.java b/src/de/jost_net/JVerein/gui/view/PreNotificationView.java index 645f98040..c527ccbc7 100644 --- a/src/de/jost_net/JVerein/gui/view/PreNotificationView.java +++ b/src/de/jost_net/JVerein/gui/view/PreNotificationView.java @@ -45,7 +45,7 @@ public class PreNotificationView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("SEPA Pre-Notification"); + GUI.getView().setTitle("Pre-Notification"); final PreNotificationControl control = new PreNotificationControl(this); control.init("prenotification." , null, null); diff --git a/src/de/jost_net/JVerein/gui/view/ProjektListView.java b/src/de/jost_net/JVerein/gui/view/ProjektListView.java index 9d2f7a192..2c41c4b56 100644 --- a/src/de/jost_net/JVerein/gui/view/ProjektListView.java +++ b/src/de/jost_net/JVerein/gui/view/ProjektListView.java @@ -19,9 +19,13 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.ProjektAction; import de.jost_net.JVerein.gui.control.ProjektControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; 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 ProjektListView extends AbstractView { @@ -33,6 +37,41 @@ public void bind() throws Exception ProjektControl control = new ProjektControl(this); + LabelGroup group = new LabelGroup(getParent(), "Filter"); + ColumnLayout cl = new ColumnLayout(group.getComposite(), 3); + + SimpleContainer left = new SimpleContainer(cl.getComposite()); + left.addLabelPair("Bezeichnung", control.getSuchtext()); + + SimpleContainer middle = new SimpleContainer(cl.getComposite()); + middle.addLabelPair("Startdatum von", control.getDatumvon()); + middle.addLabelPair("Startdatum bis", control.getDatumbis()); + + SimpleContainer right = new SimpleContainer(cl.getComposite()); + right.addLabelPair("Endedatum von", control.getEingabedatumvon()); + right.addLabelPair("Endedatum bis", control.getEingabedatumbis()); + + ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck1 = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck1); + ToolTipButton vor1 = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor1); + ToolTipButton zurueck2 = control.getZurueckButton( + control.getEingabedatumvon(), control.getEingabedatumbis()); + fbuttons.addButton(zurueck2); + ToolTipButton vor2 = control.getVorButton(control.getEingabedatumvon(), + control.getEingabedatumbis()); + fbuttons.addButton(vor2); + fbuttons.addButton(control.getResetButton()); + fbuttons.addButton(control.getSuchenButton()); + group.addButtonArea(fbuttons); + zurueck1.setToolTipText("Start Datumsbereich zurück"); + vor1.setToolTipText("Start Datumsbereich vowärts"); + zurueck2.setToolTipText("Ende Datumsbereich zurück"); + vor2.setToolTipText("Ende Datumsbereich vowärts"); + control.getProjektList().paint(this.getParent()); ButtonArea buttons = new ButtonArea(); diff --git a/src/de/jost_net/JVerein/gui/view/ProjektSaldoView.java b/src/de/jost_net/JVerein/gui/view/ProjektSaldoView.java index a088f1f99..6e62e66a7 100644 --- a/src/de/jost_net/JVerein/gui/view/ProjektSaldoView.java +++ b/src/de/jost_net/JVerein/gui/view/ProjektSaldoView.java @@ -31,7 +31,7 @@ public class ProjektSaldoView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Projekt-Saldo"); + GUI.getView().setTitle("Projektsaldo"); final ProjektSaldoControl control = new ProjektSaldoControl(this); diff --git a/src/de/jost_net/JVerein/gui/view/ProjektView.java b/src/de/jost_net/JVerein/gui/view/ProjektView.java index 48d994d9d..bdb67cf53 100644 --- a/src/de/jost_net/JVerein/gui/view/ProjektView.java +++ b/src/de/jost_net/JVerein/gui/view/ProjektView.java @@ -35,9 +35,9 @@ public void bind() throws Exception final ProjektControl control = new ProjektControl(this); LabelGroup group = new LabelGroup(getParent(), "Projekt"); - group.addLabelPair("Bezeichnung", control.getBezeichnung()); - group.addLabelPair("Startdatum", control.getStartDatum()); - group.addLabelPair("Endedatum", control.getEndeDatum()); + group.addInput(control.getBezeichnung()); + group.addInput(control.getStartDatum()); + group.addInput(control.getEndeDatum()); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), diff --git a/src/de/jost_net/JVerein/gui/view/QIFBuchungsImportView.java b/src/de/jost_net/JVerein/gui/view/QIFBuchungsImportView.java index f9319c54e..6aba850cb 100644 --- a/src/de/jost_net/JVerein/gui/view/QIFBuchungsImportView.java +++ b/src/de/jost_net/JVerein/gui/view/QIFBuchungsImportView.java @@ -44,7 +44,7 @@ public class QIFBuchungsImportView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Importiere QIF Buchungen"); + GUI.getView().setTitle("QIF-Datei-Import"); QIFBuchungsImportControl control = new QIFBuchungsImportControl(this); LabelGroup group = new LabelGroup(getParent(), "Konto Kopfdaten"); @@ -77,7 +77,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.QIFIMPORT, false, "question-circle.png"); - buttons.addButton("Datei einlesen", new QIFDateiEinlesenAction(), null, + buttons.addButton("Import", new QIFDateiEinlesenAction(), null, false, "file-import.png"); buttons.addButton("Import löschen", control.getAktuellenImportLoeschenAction(), null, false, diff --git a/src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java b/src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java new file mode 100644 index 000000000..2badaccd1 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/view/RechnungAutoNeuView.java @@ -0,0 +1,69 @@ +/********************************************************************** + * 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 new file mode 100644 index 000000000..5e3995a07 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/view/RechnungListeView.java @@ -0,0 +1,78 @@ +/********************************************************************** + * 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.action.RechnungAutoNeuAction; +import de.jost_net.JVerein.gui.control.RechnungControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; +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 RechnungListeView extends AbstractView +{ + + @Override + public void bind() throws Exception + { + GUI.getView().setTitle("Rechnungen"); + + RechnungControl control = new RechnungControl(this); + control.init(RechnungControl.TYP.RECHNUNG.name() + ".", null, null); + + LabelGroup group = new LabelGroup(getParent(), "Filter"); + ColumnLayout cl = new ColumnLayout(group.getComposite(), 3); + + 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()); + right.addInput(control.getMailauswahl()); + + ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); + fbuttons.addButton(control.getResetButton()); + fbuttons.addButton(control.getSuchenButton()); + group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); + + control.getRechnungList().paint(this.getParent()); + + ButtonArea buttons = new ButtonArea(); + buttons.addButton("Hilfe", new DokumentationAction(), + DokumentationUtil.RECHNUNG, false, "question-circle.png"); + buttons.addButton("Neu (automatisch)", + new RechnungAutoNeuAction(), null, false, + "document-new.png"); + buttons.paint(this.getParent()); + } + +} diff --git a/src/de/jost_net/JVerein/gui/view/MitgliedskontoRechnungView.java b/src/de/jost_net/JVerein/gui/view/RechnungMailView.java similarity index 80% rename from src/de/jost_net/JVerein/gui/view/MitgliedskontoRechnungView.java rename to src/de/jost_net/JVerein/gui/view/RechnungMailView.java index 44946589d..ba016262e 100644 --- a/src/de/jost_net/JVerein/gui/view/MitgliedskontoRechnungView.java +++ b/src/de/jost_net/JVerein/gui/view/RechnungMailView.java @@ -18,10 +18,7 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.MailVorlageZuweisenAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoExportAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoExportAction.EXPORT_TYP; -import de.jost_net.JVerein.gui.control.MitgliedskontoControl; -import de.jost_net.JVerein.keys.FormularArt; +import de.jost_net.JVerein.gui.control.RechnungControl; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.Button; @@ -30,16 +27,16 @@ import de.willuhn.jameica.gui.util.LabelGroup; import de.willuhn.jameica.gui.util.SimpleContainer; -public class MitgliedskontoRechnungView extends AbstractView +public class RechnungMailView extends AbstractView { @Override public void bind() throws Exception { - GUI.getView().setTitle("Rechnung"); + GUI.getView().setTitle("Rechnungen"); - final MitgliedskontoControl control = new MitgliedskontoControl(this); - control.init(MitgliedskontoControl.TYP.RECHNUNG.name() + ".", null, null); + final RechnungControl control = new RechnungControl(this); + control.init(RechnungControl.TYP.RECHNUNG.name() + ".mail.", null, null); if (this.getCurrentObject() == null) { @@ -71,9 +68,8 @@ public void bind() throws Exception SimpleContainer cont = new SimpleContainer(getParent(), true); cont.addHeadline("Parameter"); - cont.addLabelPair("Formular", control.getFormular(FormularArt.RECHNUNG)); cont.addInput(control.getAusgabeart()); - cont.addInput(control.getAusgabesortierung()); + //cont.addInput(control.getAusgabesortierung()); cont.addHeadline("Mail"); cont.addInput(control.getBetreff()); @@ -81,13 +77,13 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.RECHNUNG, false, "question-circle.png"); + DokumentationUtil.RECHNUNG_MAIL, false, "question-circle.png"); buttons.addButton(new Button("Mail-Vorlage", new MailVorlageZuweisenAction(), control, false, "view-refresh.png")); - buttons.addButton(new Button("Export", + /*buttons.addButton(new Button("Export", new MitgliedskontoExportAction(EXPORT_TYP.RECHNUNGEN, getCurrentObject()), - control, false, "document-save.png")); + control, false, "document-save.png"));*/ buttons.addButton(control.getStartRechnungButton(this.getCurrentObject())); buttons.paint(this.getParent()); } diff --git a/src/de/jost_net/JVerein/gui/view/RechnungView.java b/src/de/jost_net/JVerein/gui/view/RechnungView.java new file mode 100644 index 000000000..b76abf469 --- /dev/null +++ b/src/de/jost_net/JVerein/gui/view/RechnungView.java @@ -0,0 +1,77 @@ +/********************************************************************** + * 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.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 RechnungView extends AbstractView +{ + + @Override + public void bind() throws Exception + { + GUI.getView().setTitle("Rechnungen"); + + final RechnungControl control = new RechnungControl(this); + + LabelGroup group = new LabelGroup(getParent(), "Rechnung"); + + ColumnLayout cl = new ColumnLayout(group.getComposite(), 3); + SimpleContainer left = new SimpleContainer(cl.getComposite()); + + left.addInput(control.getNummer()); + left.addInput(control.getRechnungsdatum()); + left.addInput(control.getMitglied()); + left.addInput(control.getBetrag()); + left.addInput(control.getRechnungFormular()); + left.addInput(control.getPersonenart()); + + SimpleContainer middle = new SimpleContainer(cl.getComposite()); + left.addInput(control.getGeschlecht()); + middle.addInput(control.getAnrede()); + middle.addInput(control.getTitel()); + middle.addInput(control.getName()); + middle.addInput(control.getVorname()); + middle.addInput(control.getStrasse()); + middle.addInput(control.getAdressierungszusatz()); + middle.addInput(control.getLeitwegID()); + + SimpleContainer rigth = new SimpleContainer(cl.getComposite()); + rigth.addInput(control.getPlz()); + rigth.addInput(control.getOrt()); + rigth.addInput(control.getStaat()); + rigth.addInput(control.getIban()); + rigth.addInput(control.getBic()); + rigth.addInput(control.getMandatdatum()); + rigth.addInput(control.getMandatid()); + + LabelGroup cont = new LabelGroup(getParent(), "Sollbuchungen", true); + cont.addPart(control.getBuchungenList()); + + ButtonArea buttons = new ButtonArea(); + buttons.addButton("Hilfe", new DokumentationAction(), + DokumentationUtil.RECHNUNG, false, "question-circle.png"); + buttons.paint(this.getParent()); + } +} diff --git a/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java index 0b34159d4..631062333 100644 --- a/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java +++ b/src/de/jost_net/JVerein/gui/view/SollbuchungDetailView.java @@ -23,6 +23,7 @@ import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; import de.willuhn.jameica.gui.GUI; +import de.willuhn.jameica.gui.parts.Button; import de.willuhn.jameica.gui.parts.ButtonArea; import de.willuhn.jameica.gui.util.LabelGroup; @@ -60,7 +61,9 @@ public void bind() throws Exception buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.MITGLIEDSKONTO_UEBERSICHT, false, "question-circle.png"); - buttons.addButton("Speichern", new Action() + + boolean hasRechnung = control.hasRechnung(); + Button save = new Button("Speichern", new Action() { @Override @@ -69,6 +72,10 @@ public void handleAction(Object context) control.handleStore(); } }, null, true, "document-save.png"); + save.setEnabled(!hasRechnung); + buttons.addButton(save); + + buttons.paint(this.getParent()); } } diff --git a/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java b/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java index 8572c8b4f..be22211f1 100644 --- a/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java +++ b/src/de/jost_net/JVerein/gui/view/SollbuchungListeView.java @@ -17,11 +17,12 @@ package de.jost_net.JVerein.gui.view; import de.jost_net.JVerein.gui.action.DokumentationAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoExportAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoSollbuchungEditAction; -import de.jost_net.JVerein.gui.action.MitgliedskontoExportAction.EXPORT_TYP; +import de.jost_net.JVerein.gui.action.SollbuchungExportAction; +import de.jost_net.JVerein.gui.action.SollbuchungEditAction; +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; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.Button; @@ -40,7 +41,7 @@ public void bind() throws Exception final MitgliedskontoControl control = new MitgliedskontoControl(this); control.init("sollbuchung.", null, null); - + LabelGroup group = new LabelGroup(getParent(), "Filter"); ColumnLayout cl = new ColumnLayout(group.getComposite(), 2); @@ -48,18 +49,26 @@ public void bind() throws Exception 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()); right.addInput(control.getMailauswahl()); - + ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); - control.getMitgliedskontoList(new MitgliedskontoSollbuchungEditAction(), + control.getMitgliedskontoList(new SollbuchungEditAction(), new SollbuchungMenu(), false).paint(this.getParent()); ButtonArea buttons = new ButtonArea(); @@ -67,10 +76,10 @@ public void bind() throws Exception DokumentationUtil.MITGLIEDSKONTO_UEBERSICHT, false, "question-circle.png"); buttons.addButton(new Button("Export", - new MitgliedskontoExportAction(EXPORT_TYP.MITGLIEDSKONTO, null), - control, false, "document-save.png")); - buttons.addButton("Neu", new MitgliedskontoSollbuchungEditAction(), - control, false, "document-new.png"); + new SollbuchungExportAction(EXPORT_TYP.MITGLIEDSKONTO), control, false, + "document-save.png")); + buttons.addButton("Neu", new SollbuchungEditAction(), control, false, + "document-new.png"); buttons.paint(this.getParent()); } } diff --git a/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungAutoNeuView.java b/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungAutoNeuView.java index 735907227..80bbf65f8 100644 --- a/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungAutoNeuView.java +++ b/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungAutoNeuView.java @@ -23,7 +23,9 @@ import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; import de.willuhn.jameica.gui.parts.InfoPanel; +import de.willuhn.jameica.gui.util.ColumnLayout; import de.willuhn.jameica.gui.util.LabelGroup; +import de.willuhn.jameica.gui.util.SimpleContainer; public class SpendenbescheinigungAutoNeuView extends AbstractView { @@ -57,18 +59,25 @@ public void bind() throws Exception info.setComment("Siehe Administration->Einstellungen->Spendenbescheinigungen->Mindestbetrag"); } info.paint(getParent()); - LabelGroup group = new LabelGroup(getParent(), "Jahr"); - group.addLabelPair("Jahr", control.getJahr()); - // TODO Unterscheidung Einzel/Sammel-Bestätigung: zwei Felder - group.addLabelPair("Formular-Einzelbest.", control.getFormular()); - group.addLabelPair("Formular-Sammelbest.", + LabelGroup group1 = new LabelGroup(getParent(), "Filter"); + group1.addLabelPair("Jahr", control.getJahr()); + + LabelGroup group2 = new LabelGroup(getParent(), "Formulare"); + ColumnLayout cl = new ColumnLayout(group2.getComposite(), 2); + + SimpleContainer left = new SimpleContainer(cl.getComposite()); + left.addLabelPair("Einzelbestätigung", + control.getFormular()); + + SimpleContainer right = new SimpleContainer(cl.getComposite()); + right.addLabelPair("Sammelbestätigung", control.getFormularSammelbestaetigung()); control.getSpendenbescheinigungTree().paint(this.getParent()); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), - DokumentationUtil.SPENDENBESCHEINIGUNG, false, "question-circle.png"); + DokumentationUtil.SPENDENBESCHEINIGUNG, false, "question-circle.png"); buttons.addButton(control.getSpendenbescheinigungErstellenButton()); buttons.paint(getParent()); } diff --git a/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungListeView.java b/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungListeView.java index 0bd27aa1f..4d30572f6 100644 --- a/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungListeView.java +++ b/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungListeView.java @@ -20,6 +20,7 @@ import de.jost_net.JVerein.gui.action.SpendenbescheinigungAction; import de.jost_net.JVerein.gui.action.SpendenbescheinigungAutoNeuAction; import de.jost_net.JVerein.gui.control.SpendenbescheinigungControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.jost_net.JVerein.keys.Spendenart; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; @@ -45,6 +46,7 @@ public void bind() throws Exception SimpleContainer left = new SimpleContainer(cl.getComposite()); left.addInput(control.getSuchname()); left.addInput(control.getMailauswahl()); + left.addInput(control.getSuchSpendenart()); SimpleContainer middle = new SimpleContainer(cl.getComposite()); middle.addLabelPair("Bescheinigungsdatum von", control.getDatumvon()); @@ -53,17 +55,35 @@ public void bind() throws Exception SimpleContainer right = new SimpleContainer(cl.getComposite()); right.addLabelPair("Spendedatum von", control.getEingabedatumvon()); right.addLabelPair("Spendedatum bis", control.getEingabedatumbis()); - + ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck1 = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck1); + ToolTipButton vor1 = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor1); + ToolTipButton zurueck2 = control.getZurueckButton( + control.getEingabedatumvon(), control.getEingabedatumbis()); + fbuttons.addButton(zurueck2); + ToolTipButton vor2 = control.getVorButton(control.getEingabedatumvon(), + control.getEingabedatumbis()); + fbuttons.addButton(vor2); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck1.setToolTipText("Bescheinigung Datumsbereich zurück"); + vor1.setToolTipText("Bescheinigung Datumsbereich vowärts"); + zurueck2.setToolTipText("Spende Datumsbereich zurück"); + vor2.setToolTipText("Spende Datumsbereich vowärts"); control.getSpendenbescheinigungList().paint(this.getParent()); ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.SPENDENBESCHEINIGUNG, false, "question-circle.png"); + buttons.addButton(control.getCSVExportButton()); + buttons.addButton(control.getPDFExportButton()); buttons.addButton("Neu (Sachspende)", new SpendenbescheinigungAction(Spendenart.SACHSPENDE), null, false, "document-new.png"); buttons.addButton("Neu (automatisch)", diff --git a/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungMailView.java b/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungMailView.java index 730137809..e11b2e605 100644 --- a/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungMailView.java +++ b/src/de/jost_net/JVerein/gui/view/SpendenbescheinigungMailView.java @@ -33,7 +33,7 @@ public class SpendenbescheinigungMailView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Spendenbescheinigung"); + GUI.getView().setTitle("Spendenbescheinigungen"); final SpendenbescheinigungControl control = new SpendenbescheinigungControl(this); control.init("spenden." , null, null); @@ -46,6 +46,7 @@ public void bind() throws Exception SimpleContainer left = new SimpleContainer(cl.getComposite()); left.addInput(control.getSuchname()); left.addInput(control.getMailauswahl()); + left.addInput(control.getSuchSpendenart()); SimpleContainer middle = new SimpleContainer(cl.getComposite()); middle.addLabelPair("Bescheinigungsdatum von", control.getDatumvon()); diff --git a/src/de/jost_net/JVerein/gui/view/SplitBuchungView.java b/src/de/jost_net/JVerein/gui/view/SplitBuchungView.java index 2aaa0c5ec..02bd76539 100644 --- a/src/de/jost_net/JVerein/gui/view/SplitBuchungView.java +++ b/src/de/jost_net/JVerein/gui/view/SplitBuchungView.java @@ -20,7 +20,7 @@ import de.jost_net.JVerein.gui.action.SplitbuchungAufloesenAction; import de.jost_net.JVerein.gui.action.SplitbuchungNeuAction; import de.jost_net.JVerein.gui.control.BuchungsControl; -import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenart; +import de.jost_net.JVerein.gui.control.BuchungsControl.Kontenfilter; import de.jost_net.JVerein.io.SplitbuchungsContainer; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.Action; @@ -37,7 +37,7 @@ public void bind() throws Exception { GUI.getView().setTitle("Splitbuchungen"); - final BuchungsControl control = new BuchungsControl(this, Kontenart.GELDKONTO); + final BuchungsControl control = new BuchungsControl(this, Kontenfilter.GELDKONTO); final boolean buchungabgeschlossen = control.isSplitBuchungAbgeschlossen(); diff --git a/src/de/jost_net/JVerein/gui/view/StatistikJahrgaengeView.java b/src/de/jost_net/JVerein/gui/view/StatistikJahrgaengeView.java index 132f09ea7..f0755c0e7 100644 --- a/src/de/jost_net/JVerein/gui/view/StatistikJahrgaengeView.java +++ b/src/de/jost_net/JVerein/gui/view/StatistikJahrgaengeView.java @@ -31,7 +31,7 @@ public class StatistikJahrgaengeView extends AbstractView @Override public void bind() throws Exception { - GUI.getView().setTitle("Statistik Jahrgänge"); + GUI.getView().setTitle("Jahrgangsstatistik"); final MitgliedControl control = new MitgliedControl(this); @@ -41,7 +41,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.STATISTIKJAHRGAENGE, false, "question-circle.png"); - Button btnStart = new Button("Start", new StatistikJahrgaengeExportAction(), + Button btnStart = new Button("Starten", new StatistikJahrgaengeExportAction(), control.getJubeljahr(), true, "walking.png"); buttons.addButton(btnStart); diff --git a/src/de/jost_net/JVerein/gui/view/WiedervorlagelisteView.java b/src/de/jost_net/JVerein/gui/view/WiedervorlagelisteView.java index 6ea44036b..602861de4 100644 --- a/src/de/jost_net/JVerein/gui/view/WiedervorlagelisteView.java +++ b/src/de/jost_net/JVerein/gui/view/WiedervorlagelisteView.java @@ -19,6 +19,7 @@ import de.jost_net.JVerein.gui.action.DokumentationAction; import de.jost_net.JVerein.gui.action.WiedervorlageAction; import de.jost_net.JVerein.gui.control.WiedervorlageControl; +import de.jost_net.JVerein.gui.parts.ToolTipButton; import de.willuhn.jameica.gui.AbstractView; import de.willuhn.jameica.gui.GUI; import de.willuhn.jameica.gui.parts.ButtonArea; @@ -48,9 +49,17 @@ public void bind() throws Exception right.addInput(control.getDatumbis()); ButtonArea fbuttons = new ButtonArea(); + ToolTipButton zurueck = control.getZurueckButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(zurueck); + ToolTipButton vor = control.getVorButton(control.getDatumvon(), + control.getDatumbis()); + fbuttons.addButton(vor); fbuttons.addButton(control.getResetButton()); fbuttons.addButton(control.getSuchenButton()); group.addButtonArea(fbuttons); + zurueck.setToolTipText("Datumsbereich zurück"); + vor.setToolTipText("Datumsbereich vowärts"); control.getWiedervorlageList().paint(this.getParent()); ButtonArea buttons = new ButtonArea(); diff --git a/src/de/jost_net/JVerein/gui/view/ZusatzbetraegelisteView.java b/src/de/jost_net/JVerein/gui/view/ZusatzbetraegelisteView.java index 16082ccce..8c4f99036 100644 --- a/src/de/jost_net/JVerein/gui/view/ZusatzbetraegelisteView.java +++ b/src/de/jost_net/JVerein/gui/view/ZusatzbetraegelisteView.java @@ -43,7 +43,7 @@ public void bind() throws Exception ButtonArea buttons = new ButtonArea(); buttons.addButton("Hilfe", new DokumentationAction(), DokumentationUtil.ZUSATZBETRAEGE, false, "question-circle.png"); - buttons.addButton("Importieren", + buttons.addButton("Import", new ZusatzbetraegeImportAction(),null,false, "file-import.png"); buttons.addButton(control.getPDFAusgabeButton()); buttons.addButton("Neu", new ZusatzbetraegeAction(null), diff --git a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java index b3ed81369..6bceef760 100644 --- a/src/de/jost_net/JVerein/io/AbrechnungSEPA.java +++ b/src/de/jost_net/JVerein/io/AbrechnungSEPA.java @@ -1,26 +1,26 @@ /********************************************************************** * 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 + * 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 + * 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, + * 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.io; -import java.math.RoundingMode; import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; +import java.math.RoundingMode; import java.nio.file.Files; import java.rmi.RemoteException; import java.text.DateFormat; @@ -33,6 +33,11 @@ import java.util.Map; import java.util.Properties; +import org.apache.commons.lang.StringUtils; +import org.kapott.hbci.GV.SepaUtil; +import org.kapott.hbci.GV.generators.ISEPAGenerator; +import org.kapott.hbci.GV.generators.SEPAGeneratorFactory; + import com.itextpdf.text.DocumentException; import de.jost_net.JVerein.Einstellungen; @@ -83,15 +88,9 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; import de.willuhn.util.ProgressMonitor; -import org.apache.commons.lang.StringUtils; -import org.kapott.hbci.GV.SepaUtil; -import org.kapott.hbci.GV.generators.ISEPAGenerator; -import org.kapott.hbci.GV.generators.SEPAGeneratorFactory; public class AbrechnungSEPA { - private final Calendar sepagueltigkeit; - private int counter = 0; public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) @@ -116,8 +115,6 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) Abrechnungslauf abrl = getAbrechnungslauf(param); - sepagueltigkeit = Calendar.getInstance(); - sepagueltigkeit.add(Calendar.MONTH, -36); Basislastschrift lastschrift = new Basislastschrift(); // Vorbereitung: Allgemeine Informationen einstellen lastschrift.setBIC(Einstellungen.getEinstellung().getBic()); @@ -146,7 +143,8 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) 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 + // 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); @@ -155,11 +153,14 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) ArrayList z = lastschrift.getZahler(); // Wenn keine Buchungen vorhanden sind, wird kein File erzeugt. - if ((param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) && !z.isEmpty()) + if ((param.abbuchungsausgabe == Abrechnungsausgabe.SEPA_DATEI) + && !z.isEmpty()) { writeSepaFile(param, lastschrift, z); - monitor.log(String.format("SEPA-Datei %s geschrieben.", param.sepafileRCUR.getAbsolutePath())); - param.setText(String.format(", SEPA-Datei %s geschrieben.", param.sepafileRCUR.getAbsolutePath())); + monitor.log(String.format("SEPA-Datei %s geschrieben.", + param.sepafileRCUR.getAbsolutePath())); + param.setText(String.format(", SEPA-Datei %s geschrieben.", + param.sepafileRCUR.getAbsolutePath())); } BigDecimal summemitgliedskonto = BigDecimal.valueOf(0); @@ -188,10 +189,12 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) ls.setAdressierungszusatz(k.getAdressierungszusatz()); ls.setPlz(k.getPlz()); ls.setOrt(k.getOrt()); - ls.setStaat(k.getStaat()); + ls.setStaat(k.getStaatCode()); ls.setEmail(k.getEmail()); if (k.getGeschlecht() != null) + { ls.setGeschlecht(k.getGeschlecht()); + } break; case MITGLIED: ls.setMitglied(Integer.parseInt(vza.getPersonId())); @@ -208,7 +211,7 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) ls.setAdressierungszusatz(m.getAdressierungszusatz()); ls.setPlz(m.getPlz()); ls.setOrt(m.getOrt()); - ls.setStaat(m.getStaat()); + ls.setStaat(m.getStaatCode()); ls.setEmail(m.getEmail()); ls.setGeschlecht(m.getGeschlecht()); } @@ -223,7 +226,7 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) ls.setAdressierungszusatz(m.getKtoiAdressierungszusatz()); ls.setPlz(m.getKtoiPlz()); ls.setOrt(m.getKtoiOrt()); - ls.setStaat(m.getKtoiStaat()); + ls.setStaat(m.getKtoiStaatCode()); ls.setEmail(m.getKtoiEmail()); ls.setGeschlecht(m.getKtoiGeschlecht()); } @@ -245,8 +248,9 @@ public AbrechnungSEPA(AbrechnungSEPAParam param, ProgressMonitor monitor) // Gegenbuchung für das Mitgliedskonto schreiben if (!summemitgliedskonto.equals(BigDecimal.valueOf(0))) { - writeMitgliedskonto(null, new Date(), "Gegenbuchung", - summemitgliedskonto.doubleValue() * -1, abrl, true, getKonto(), null, null); + writeMitgliedskonto(null, param.faelligkeit, "Gegenbuchung", + summemitgliedskonto.doubleValue() * -1, abrl, true, getKonto(), null, + null, null); } if (param.abbuchungsausgabe == Abrechnungsausgabe.HIBISCUS) { @@ -348,19 +352,19 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, int count = 0; while (list.hasNext()) { - Mitglied m = (Mitglied) list.next(); + Mitglied m = list.next(); - JVereinZahler z = abrechnungMitgliederSub(param, monitor, - abrl, konto, m, m.getBeitragsgruppe(), true); + JVereinZahler z = abrechnungMitgliederSub(param, monitor, abrl, konto, + m, m.getBeitragsgruppe(), true); DBIterator sekundaer = Einstellungen .getDBService().createList(SekundaereBeitragsgruppe.class); sekundaer.addFilter("mitglied=?", m.getID()); while (sekundaer.hasNext()) { - SekundaereBeitragsgruppe sb = (SekundaereBeitragsgruppe) sekundaer - .next(); - JVereinZahler z2 = abrechnungMitgliederSub(param, monitor, abrl, konto, m, sb.getBeitragsgruppe(), false); + SekundaereBeitragsgruppe sb = sekundaer.next(); + JVereinZahler z2 = abrechnungMitgliederSub(param, monitor, abrl, + konto, m, sb.getBeitragsgruppe(), false); if (z2 != null) { if (z != null) @@ -377,25 +381,32 @@ private void abrechnenMitglieder(AbrechnungSEPAParam param, { lastschrift.add(z); } - monitor.setPercentComplete((int) ((double) count++ / (double) list.size() * 100d)); - monitor.setStatusText(String.format("%s, %s abgerechnet" , m.getName(), m.getVorname())); + monitor.setPercentComplete( + (int) ((double) count++ / (double) list.size() * 100d)); + monitor.setStatusText( + String.format("%s, %s abgerechnet", m.getName(), m.getVorname())); } } } - private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, ProgressMonitor monitor, - Abrechnungslauf abrl, Konto konto, Mitglied m, Beitragsgruppe bg, - boolean primaer) throws RemoteException, ApplicationException + private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, + ProgressMonitor monitor, Abrechnungslauf abrl, Konto konto, Mitglied m, + Beitragsgruppe bg, boolean primaer) + throws RemoteException, ApplicationException { Double betr = 0d; JVereinZahler zahler = null; Mitglied mZahler = m; - if(m.getZahlungsweg() != null && m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) + if (m.getZahlungsweg() != null + && m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) { - if(m.getZahlerID() == null) - throw new ApplicationException( - "Kein Vollzahler vorhanden: " + m.getName() + ", " + m.getVorname()); - mZahler = Einstellungen.getDBService().createObject(Mitglied.class, m.getZahlerID().toString()); + if (m.getZahlerID() == null) + { + throw new ApplicationException("Kein Vollzahler vorhanden: " + + m.getName() + ", " + m.getVorname()); + } + mZahler = Einstellungen.getDBService().createObject(Mitglied.class, + m.getZahlerID().toString()); } if (Einstellungen.getEinstellung() .getBeitragsmodel() == Beitragsmodel.FLEXIBEL) @@ -411,8 +422,8 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, Progres { betr = BeitragsUtil.getBeitrag( Einstellungen.getEinstellung().getBeitragsmodel(), - mZahler.getZahlungstermin(), mZahler.getZahlungsrhythmus().getKey(), bg, - param.stichtag, m); + mZahler.getZahlungstermin(), mZahler.getZahlungsrhythmus().getKey(), + bg, param.stichtag, m); } catch (NullPointerException e) { @@ -427,11 +438,7 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, Progres betr = m.getIndividuellerBeitrag(); } } - if (betr == 0d) - { - return zahler; - } - if (!checkSEPA(mZahler, monitor)) + if ((betr == 0d) || !checkSEPA(mZahler, monitor)) { return zahler; } @@ -448,11 +455,11 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, Progres Logger.error("Fehler bei der Aufbereitung der Variablen", e); } - writeMitgliedskonto(m, - param.faelligkeit, + writeMitgliedskonto(m, param.faelligkeit, primaer ? vzweck : bg.getBezeichnung(), betr, abrl, mZahler.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT, konto, - bg.getBuchungsart(), bg.getBuchungsklasseId()); + bg.getBuchungsart(), bg.getBuchungsklasseId(), + mZahler.getZahlungsweg()); if (mZahler.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT) { try @@ -464,10 +471,15 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, Progres 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 - if(mZahler.getBic() == null || mZahler.getBic().length() == 0) + // Wenn BIC nicht vorhanden versuchen sie automatisch zu ermitteln + if (mZahler.getBic() == null || mZahler.getBic().length() == 0) + { zahler.setBic(i.getBIC()); - else zahler.setBic(mZahler.getBic()); + } + else + { + zahler.setBic(mZahler.getBic()); + } new BIC(zahler.getBic()); // Prüfung des BIC zahler.setMandatid(mZahler.getMandatID()); zahler.setMandatdatum(mZahler.getMandatDatum()); @@ -475,15 +487,22 @@ private JVereinZahler abrechnungMitgliederSub(AbrechnungSEPAParam param, Progres zahler.setFaelligkeit(param.faelligkeit); if (primaer && m.getZahlungsweg() != Zahlungsweg.VOLLZAHLER) { - zahler.setVerwendungszweck(getVerwendungszweck2(mZahler) + " " + vzweck); + String verwendungszweck = getVerwendungszweck2(mZahler) + " " + + vzweck; + if (verwendungszweck.length() >= 140) + { + verwendungszweck = verwendungszweck.substring(0, 136) + "..."; + } + zahler.setVerwendungszweck(verwendungszweck); } else { zahler.setVerwendungszweck(bg.getBezeichnung()); } - if(m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) + if (m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) { - zahler.setVerwendungszweck(zahler.getVerwendungszweck() + " " + m.getVorname()); + zahler.setVerwendungszweck( + zahler.getVerwendungszweck() + " " + m.getVorname()); } zahler.setName(mZahler.getKontoinhaber(1)); } @@ -506,7 +525,7 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, .createList(Zusatzbetrag.class); while (list.hasNext()) { - Zusatzbetrag z = (Zusatzbetrag) list.next(); + Zusatzbetrag z = list.next(); if (z.isAktiv(param.stichtag)) { Mitglied m = z.getMitglied(); @@ -520,11 +539,25 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, continue; } Mitglied mZahler = m; - if(m.getZahlungsweg() != null && m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) + if (m.getZahlungsweg() != null + && m.getZahlungsweg() == Zahlungsweg.VOLLZAHLER) { - mZahler = Einstellungen.getDBService().createObject(Mitglied.class, m.getZahlerID().toString()); + mZahler = Einstellungen.getDBService().createObject(Mitglied.class, + m.getZahlerID().toString()); } - if (!checkSEPA(mZahler, monitor)) + Integer zahlungsweg; + if (z.getZahlungsweg() != null + && z.getZahlungsweg().getKey() != Zahlungsweg.STANDARD) + { + zahlungsweg = z.getZahlungsweg().getKey(); + } + else + { + zahlungsweg = mZahler.getZahlungsweg(); + } + + if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT + && !checkSEPA(mZahler, monitor)) { continue; } @@ -541,7 +574,8 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, { Logger.error("Fehler bei der Aufbereitung der Variablen", e); } - if (mZahler.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT) + + if (zahlungsweg == Zahlungsweg.BASISLASTSCHRIFT) { try { @@ -600,21 +634,21 @@ private void abbuchenZusatzbetraege(AbrechnungSEPAParam param, monitor.log(z.getMitglied().getName() + " " + debString + " " + e); throw e; } - writeMitgliedskonto(m, - param.faelligkeit, - vzweck, z.getBetrag(), abrl, - mZahler.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT, konto, - z.getBuchungsart(), - z.getBuchungsklasseId()); - monitor.setStatusText(String.format("Zusatzbetrag von %s, %s abgerechnet" , m.getName(), m.getVorname())); + 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())); } - monitor.setPercentComplete((int) ((double) count++ / (double) list.size() * 100d)); + 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 + Basislastschrift lastschrift, Abrechnungslauf abrl, Konto konto, + ProgressMonitor monitor) throws ApplicationException, IOException { int count = 0; DBIterator list = Einstellungen.getDBService() @@ -623,7 +657,7 @@ private void abbuchenKursteilnehmer(AbrechnungSEPAParam param, while (list.hasNext()) { counter++; - Kursteilnehmer kt = (Kursteilnehmer) list.next(); + Kursteilnehmer kt = list.next(); try { JVereinZahler zahler = new JVereinZahler(); @@ -644,10 +678,13 @@ private void abbuchenKursteilnehmer(AbrechnungSEPAParam param, lastschrift.add(zahler); kt.setAbbudatum(param.faelligkeit); kt.store(); - writeMitgliedskonto(kt, param.faelligkeit, kt.getVZweck1(), - zahler.getBetrag().doubleValue(), abrl, true, konto, null, null); - monitor.setStatusText(String.format("Kursteilnehmer %s, %s abgerechnet" , kt.getName(), kt.getVorname())); - monitor.setPercentComplete((int) ((double) count++ / (double) list.size() * 100d)); + writeMitgliedskonto(kt, param.faelligkeit, kt.getVZweck1(), + zahler.getBetrag().doubleValue(), abrl, true, konto, null, null, + null); + monitor.setStatusText(String.format("Kursteilnehmer %s, %s abgerechnet", + kt.getName(), kt.getVorname())); + monitor.setPercentComplete( + (int) ((double) count++ / (double) list.size() * 100d)); } catch (Exception e) { @@ -656,8 +693,8 @@ private void abbuchenKursteilnehmer(AbrechnungSEPAParam param, } } - private void ausdruckenSEPA(final Basislastschrift lastschrift, final String pdf_fn) - throws IOException, DocumentException, SEPAException + private void ausdruckenSEPA(final Basislastschrift lastschrift, + final String pdf_fn) throws IOException, DocumentException, SEPAException { new Basislastschrift2Pdf(lastschrift, pdf_fn); GUI.getDisplay().asyncExec(new Runnable() @@ -679,7 +716,10 @@ public void run() }); } - private void writeSepaFile(AbrechnungSEPAParam param, Basislastschrift lastschrift, ArrayList alle_zahler) throws Exception + @SuppressWarnings({ "unchecked", "rawtypes" }) + private void writeSepaFile(AbrechnungSEPAParam param, + Basislastschrift lastschrift, ArrayList alle_zahler) + throws Exception { Properties ls_properties = new Properties(); ls_properties.setProperty("src.bic", lastschrift.getBIC()); @@ -691,29 +731,43 @@ private void writeSepaFile(AbrechnungSEPAParam param, Basislastschrift lastschri ls_properties.setProperty("sepaid", epochtime_string); ls_properties.setProperty("pmtinfid", epochtime_string); ls_properties.setProperty("sequencetype", "RCUR"); - ls_properties.setProperty("targetdate", param.faelligkeit != null ? ISO_DATE.format(param.faelligkeit) : SepaUtil.DATE_UNDEFINED); + ls_properties.setProperty("targetdate", + param.faelligkeit != null ? ISO_DATE.format(param.faelligkeit) + : SepaUtil.DATE_UNDEFINED); ls_properties.setProperty("type", "CORE"); ls_properties.setProperty("batchbook", ""); int counter = 0; String creditorid = lastschrift.getGlaeubigerID(); for (Zahler zahler : alle_zahler) { - ls_properties.setProperty(SepaUtil.insertIndex("dst.bic", counter), StringUtils.trimToEmpty(zahler.getBic())); - ls_properties.setProperty(SepaUtil.insertIndex("dst.iban", counter), StringUtils.trimToEmpty(zahler.getIban())); - ls_properties.setProperty(SepaUtil.insertIndex("dst.name", counter), StringUtils.trimToEmpty(zahler.getName())); - ls_properties.setProperty(SepaUtil.insertIndex("btg.value", counter), zahler.getBetrag().toString()); - ls_properties.setProperty(SepaUtil.insertIndex("btg.curr", counter), HBCIProperties.CURRENCY_DEFAULT_DE); - ls_properties.setProperty(SepaUtil.insertIndex("usage", counter), StringUtils.trimToEmpty(zahler.getVerwendungszweck())); - ls_properties.setProperty(SepaUtil.insertIndex("endtoendid", counter), "NOTPROVIDED"); - ls_properties.setProperty(SepaUtil.insertIndex("creditorid", counter), creditorid); - ls_properties.setProperty(SepaUtil.insertIndex("mandateid", counter), StringUtils.trimToEmpty(zahler.getMandatid())); - ls_properties.setProperty(SepaUtil.insertIndex("manddateofsig", counter), ISO_DATE.format(zahler.getMandatdatum())); - ls_properties.setProperty(SepaUtil.insertIndex("purposecode", counter), "OHTR"); + ls_properties.setProperty(SepaUtil.insertIndex("dst.bic", counter), + StringUtils.trimToEmpty(zahler.getBic())); + ls_properties.setProperty(SepaUtil.insertIndex("dst.iban", counter), + StringUtils.trimToEmpty(zahler.getIban())); + ls_properties.setProperty(SepaUtil.insertIndex("dst.name", counter), + StringUtils.trimToEmpty(zahler.getName())); + ls_properties.setProperty(SepaUtil.insertIndex("btg.value", counter), + zahler.getBetrag().toString()); + ls_properties.setProperty(SepaUtil.insertIndex("btg.curr", counter), + HBCIProperties.CURRENCY_DEFAULT_DE); + ls_properties.setProperty(SepaUtil.insertIndex("usage", counter), + StringUtils.trimToEmpty(zahler.getVerwendungszweck())); + ls_properties.setProperty(SepaUtil.insertIndex("endtoendid", counter), + "NOTPROVIDED"); + ls_properties.setProperty(SepaUtil.insertIndex("creditorid", counter), + creditorid); + ls_properties.setProperty(SepaUtil.insertIndex("mandateid", counter), + StringUtils.trimToEmpty(zahler.getMandatid())); + ls_properties.setProperty(SepaUtil.insertIndex("manddateofsig", counter), + ISO_DATE.format(zahler.getMandatdatum())); + ls_properties.setProperty(SepaUtil.insertIndex("purposecode", counter), + "OHTR"); counter += 1; } final OutputStream os = Files.newOutputStream(param.sepafileRCUR.toPath()); System.setProperty("sepa.pain.formatted", "true"); - ISEPAGenerator sepagenerator = SEPAGeneratorFactory.get("LastSEPA", param.sepaVersion); + ISEPAGenerator sepagenerator = SEPAGeneratorFactory.get("LastSEPA", + param.sepaVersion); sepagenerator.generate(ls_properties, os, true); os.close(); } @@ -809,19 +863,28 @@ private Abrechnungslauf getAbrechnungslauf(AbrechnungSEPAParam param) private void writeMitgliedskonto(Object mitglied, Date datum, String zweck1, double betrag, Abrechnungslauf abrl, boolean haben, Konto konto, - Buchungsart buchungsart, Long buchungsklasseId) throws ApplicationException, RemoteException + Buchungsart buchungsart, Long buchungsklasseId, Integer zahlungsweg) + throws ApplicationException, RemoteException { Mitgliedskonto mk = null; - if (mitglied != null && mitglied instanceof Mitglied) /* - * Mitglied darf dann null sein, wenn die Gegenbuchung - * geschrieben wird - */ + if (mitglied != null + && mitglied instanceof Mitglied) /* + * Mitglied darf dann null sein, wenn + * die Gegenbuchung geschrieben wird + */ { Mitglied mg = (Mitglied) mitglied; mk = (Mitgliedskonto) Einstellungen.getDBService() .createObject(Mitgliedskonto.class, null); mk.setAbrechnungslauf(abrl); - mk.setZahlungsweg(mg.getZahlungsweg()); + if (zahlungsweg != null) + { + mk.setZahlungsweg(zahlungsweg); + } + else + { + mk.setZahlungsweg(mg.getZahlungsweg()); + } mk.setBetrag(betrag); mk.setDatum(datum); mk.setMitglied(mg); @@ -836,10 +899,12 @@ private void writeMitgliedskonto(Object mitglied, Date datum, String zweck1, // Set tax rate mk.setSteuersatz(steuersatz); // Set bill amount without taxes - double nettobetrag = (steuersatz != 0d) ? (betrag / (1d + (steuersatz / 100d))) : betrag; + double nettobetrag = (steuersatz != 0d) + ? (betrag / (1d + (steuersatz / 100d))) + : betrag; mk.setNettobetrag(nettobetrag); // Set tax amount - mk.setSteuerbetrag(betrag - nettobetrag); + mk.setSteuerbetrag(betrag - nettobetrag); mk.store(); } if (haben) @@ -850,9 +915,9 @@ private void writeMitgliedskonto(Object mitglied, Date datum, String zweck1, buchung.setBetrag(betrag); buchung.setDatum(datum); buchung.setKonto(konto); - buchung.setName( - mitglied != null ? Adressaufbereitung.getNameVorname((IAdresse) mitglied) - : "JVerein"); + buchung.setName(mitglied != null + ? Adressaufbereitung.getNameVorname((IAdresse) mitglied) + : "JVerein"); buchung.setZweck(zweck1); if (mk != null) { @@ -860,7 +925,7 @@ private void writeMitgliedskonto(Object mitglied, Date datum, String zweck1, } if (buchungsart != null) { - buchung.setBuchungsart(Long.valueOf(buchungsart.getID())); + buchung.setBuchungsartId(Long.valueOf(buchungsart.getID())); } buchung.setBuchungsklasseId(buchungsklasseId); buchung.store(); @@ -869,7 +934,7 @@ private void writeMitgliedskonto(Object mitglied, Date datum, String zweck1, /** * Ist das Abbuchungskonto in der Buchführung eingerichtet? - * + * * @throws SEPAException */ private Konto getKonto() @@ -880,7 +945,7 @@ private Konto getKonto() it.addFilter("nummer = ?", Einstellungen.getEinstellung().getIban()); if (it.size() == 1) { - return (Konto) it.next(); + return it.next(); } // Variante 2: Kontonummer aus IBAN it = Einstellungen.getDBService().createList(Konto.class); @@ -888,7 +953,7 @@ private Konto getKonto() it.addFilter("nummer = ?", iban.getKonto()); if (it.size() == 1) { - return (Konto) it.next(); + return it.next(); } throw new ApplicationException(String.format( "Weder Konto %s noch Konto %s ist in der Buchführung eingerichtet. Menu: Buchführung | Konten", @@ -912,20 +977,28 @@ private boolean checkSEPA(Mitglied m, ProgressMonitor monitor) { return true; } - Date letzte_lastschrift = m.getLetzteLastschrift(); - if (letzte_lastschrift != null - && letzte_lastschrift.before(sepagueltigkeit.getTime())) - { - monitor.log(Adressaufbereitung.getNameVorname(m) - + ": Letzte Lastschrift ist älter als 36 Monate."); - return false; - } + // Ohne Mandat keine Lastschrift if (m.getMandatDatum() == Einstellungen.NODATE) { monitor.log(Adressaufbereitung.getNameVorname(m) + ": Kein Mandat-Datum vorhanden."); return false; } + // Bei Mandaten älter als 3 Jahre muss es eine Lastschrift + // innerhalb der letzten 3 Jahre geben + Calendar sepagueltigkeit = Calendar.getInstance(); + sepagueltigkeit.add(Calendar.MONTH, -36); + if (m.getMandatDatum().before(sepagueltigkeit.getTime())) + { + Date letzte_lastschrift = m.getLetzteLastschrift(); + 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; + } + } return true; } diff --git a/src/de/jost_net/JVerein/io/AbstractMitgliedskontoDokument.java b/src/de/jost_net/JVerein/io/AbstractMitgliedskontoDokument.java deleted file mode 100644 index bb69d59c6..000000000 --- a/src/de/jost_net/JVerein/io/AbstractMitgliedskontoDokument.java +++ /dev/null @@ -1,300 +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.io; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.rmi.RemoteException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Comparator; -import java.util.Map; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.FileDialog; - -import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.Variable.AllgemeineMap; -import de.jost_net.JVerein.Variable.MitgliedMap; -import de.jost_net.JVerein.Variable.MitgliedskontoMap; -import de.jost_net.JVerein.gui.control.MitgliedskontoControl; -import de.jost_net.JVerein.keys.Ausgabeart; -import de.jost_net.JVerein.keys.Ausgabesortierung; -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.util.Dateiname; -import de.jost_net.JVerein.util.JVDateFormatJJJJMMTT; -import de.jost_net.JVerein.util.StringTool; -import de.willuhn.jameica.gui.GUI; - -public abstract class AbstractMitgliedskontoDokument -{ - - MitgliedskontoControl control; - - ArrayList> mks = null; - - File file = null; - - FormularAufbereitung formularaufbereitung = null; - - ZipOutputStream zos = null; - - MitgliedskontoControl.TYP typ; - - public AbstractMitgliedskontoDokument(MitgliedskontoControl control, - MitgliedskontoControl.TYP typ) throws IOException - { - this.control = control; - this.typ = typ; - switch ((Ausgabeart) control.getAusgabeart().getValue()) - { - case DRUCK: - file = getDateiAuswahl("pdf"); - formularaufbereitung = new FormularAufbereitung(file); - break; - case MAIL: - file = getDateiAuswahl("zip"); - zos = new ZipOutputStream(new FileOutputStream(file)); - break; - } - } - - public void aufbereitung(Formular formular) throws IOException - { - for (ArrayList mk : mks) - { - switch ((Ausgabeart) control.getAusgabeart().getValue()) - { - case DRUCK: - aufbereitenFormular(mk, formularaufbereitung, formular); - break; - case MAIL: - File f = File.createTempFile(getDateiname(mk), ".pdf"); - formularaufbereitung = new FormularAufbereitung(f); - aufbereitenFormular(mk, formularaufbereitung, formular); - formularaufbereitung.closeFormular(); - zos.putNextEntry(new ZipEntry(getDateiname(mk) + ".pdf")); - FileInputStream in = new FileInputStream(f); - // buffer size - byte[] b = new byte[1024]; - int count; - while ((count = in.read(b)) > 0) - { - zos.write(b, 0, count); - } - in.close(); - break; - } - } - switch ((Ausgabeart) control.getAusgabeart().getValue()) - { - case DRUCK: - formularaufbereitung.showFormular(); - break; - case MAIL: - zos.close(); - new ZipMailer(file, (String) control.getBetreff().getValue(), - (String) control.getTxt().getValue(), typ.name() + ".pdf"); - break; - } - - } - - File getDateiAuswahl(String extension) throws RemoteException - { - FileDialog fd = new FileDialog(GUI.getShell(), SWT.SAVE); - fd.setText("Ausgabedatei wählen."); - String path = control.getSettings().getString("lastdir", - System.getProperty("user.home")); - if (path != null && path.length() > 0) - { - fd.setFilterPath(path); - } - fd.setFileName(new Dateiname(typ.name(), "", - Einstellungen.getEinstellung().getDateinamenmuster(), extension).get()); - fd.setFilterExtensions(new String[] { "*." + extension }); - - String s = fd.open(); - if (s == null || s.length() == 0) - { - return null; - } - if (!s.toLowerCase().endsWith("." + extension)) - { - s = s + "." + extension; - } - final File file = new File(s); - control.getSettings().setAttribute("lastdir", file.getParent()); - return file; - } - - /** - * Liefert ein Array pro Mitglied mit Arrays der einzelnen Rechnungspositionen - * - * @param currentObject - */ - ArrayList> getRechnungsempfaenger( - Object currentObject) - { - ArrayList> ret = new ArrayList<>(); - if (currentObject instanceof Mitgliedskonto) - { - Mitgliedskonto mk = (Mitgliedskonto) currentObject; - ArrayList r = new ArrayList<>(); - r.add(mk); - ret.add(r); - return ret; - } - if (currentObject instanceof Mitgliedskonto[]) - { - Mitgliedskonto[] mkn = (Mitgliedskonto[]) currentObject; - - Ausgabesortierung as = (Ausgabesortierung) control.getAusgabesortierung() - .getValue(); - switch (as) - { - case NAME: - // Sortiere nach Nachname und Vorname - Arrays.sort(mkn, new Comparator() - { - - @Override - public int compare(Mitgliedskonto mk1, Mitgliedskonto mk2) - { - try - { - int c = mk1.getMitglied().getName() - .compareTo(mk2.getMitglied().getName()); - if (c != 0) - { - return c; - } - c = mk1.getMitglied().getVorname() - .compareTo(mk2.getMitglied().getVorname()); - if (c != 0) - { - return c; - } - return mk1.getMitglied().getID() - .compareTo(mk2.getMitglied().getID()); - } - catch (RemoteException e) - { - throw new RuntimeException(e); - } - } - }); - break; - case PLZ: - // Sortiere nach PLZ und Straße - Arrays.sort(mkn, new Comparator() - { - - @Override - public int compare(Mitgliedskonto mk1, Mitgliedskonto mk2) - { - try - { - int c = mk1.getMitglied().getPlz() - .compareTo(mk2.getMitglied().getPlz()); - if (c != 0) - { - return c; - } - c = mk1.getMitglied().getStrasse() - .compareTo(mk2.getMitglied().getStrasse()); - if (c != 0) - { - return c; - } - return mk1.getMitglied().getID() - .compareTo(mk2.getMitglied().getID()); - } - catch (RemoteException e) - { - throw new RuntimeException(e); - } - } - }); - break; - } - - try - { - ArrayList r = new ArrayList<>(); - r = new ArrayList<>(); - for (Mitgliedskonto mk : mkn) - { - if (r.size() == 0 || r.get(0).getMitglied().getID() - .equals(mk.getMitglied().getID())) - { - r.add(mk); - } - else - { - ret.add(r); - r = new ArrayList<>(); - r.add(mk); - } - } - if (r.size() > 0) - { - ret.add(r); - } - } - catch (RemoteException e) - { - throw new RuntimeException(e); - } - } - return ret; - } - - void aufbereitenFormular(ArrayList mk, - FormularAufbereitung fa, Formular fo) throws RemoteException - { - Map map = new MitgliedskontoMap().getMap(mk, null); - Mitglied m = mk.get(0).getMitglied(); - map = new MitgliedMap().getMap(m, map); - map = new AllgemeineMap().getMap(map); - fa.writeForm(fo, map); - } - - String getDateiname(ArrayList mk) throws RemoteException - { - Mitglied m = mk.get(0).getMitglied(); - String filename = m.getID() + "#" - + new JVDateFormatJJJJMMTT().format(mk.get(0).getDatum()) + "#"; - String email = StringTool.toNotNullString(m.getEmail()); - if (email.length() > 0) - { - filename += email; - } - else - { - filename += m.getName() + m.getVorname(); - } - return filename; - } - -} diff --git a/src/de/jost_net/JVerein/io/Buchungsuebernahme.java b/src/de/jost_net/JVerein/io/Buchungsuebernahme.java index 8c26875a1..2c2dbfbaa 100644 --- a/src/de/jost_net/JVerein/io/Buchungsuebernahme.java +++ b/src/de/jost_net/JVerein/io/Buchungsuebernahme.java @@ -33,6 +33,7 @@ import de.willuhn.jameica.hbci.HBCI; import de.willuhn.jameica.hbci.rmi.Umsatz; import de.willuhn.jameica.system.Application; +import de.willuhn.jameica.system.OperationCanceledException; import de.willuhn.logging.Logger; public class Buchungsuebernahme @@ -77,6 +78,10 @@ private void uebernahme() buchungen, fehlerbuchung, exception); bup.open(); } + catch (OperationCanceledException oce) + { + // Keine Ausgabe einer Fehlermeldung + } catch (Exception e) { Logger.error("Fehler", e); diff --git a/src/de/jost_net/JVerein/io/CSVBuchungsImport.java b/src/de/jost_net/JVerein/io/CSVBuchungsImport.java index 6d673dc40..e69265c91 100644 --- a/src/de/jost_net/JVerein/io/CSVBuchungsImport.java +++ b/src/de/jost_net/JVerein/io/CSVBuchungsImport.java @@ -174,7 +174,7 @@ public void doImport(Object context, IOFormat format, File file, .format("Buchungsart %d existiert nicht in JVerein!", bart)); } Buchungsart b1 = (Buchungsart) bit.next(); - bu.setBuchungsart(Long.valueOf(b1.getID())); + bu.setBuchungsartId(Long.valueOf(b1.getID())); } catch (SQLException e) { diff --git a/src/de/jost_net/JVerein/io/Ct1Ueberweisung.java b/src/de/jost_net/JVerein/io/Ct1Ueberweisung.java index d9aa6c57d..bda24fcb3 100644 --- a/src/de/jost_net/JVerein/io/Ct1Ueberweisung.java +++ b/src/de/jost_net/JVerein/io/Ct1Ueberweisung.java @@ -46,6 +46,7 @@ import de.jost_net.JVerein.Variable.AllgemeineMap; import de.jost_net.JVerein.Variable.LastschriftMap; import de.jost_net.JVerein.Variable.VarTools; +import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.Ct1Ausgabe; import de.jost_net.JVerein.rmi.Lastschrift; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; @@ -56,11 +57,9 @@ import de.willuhn.jameica.hbci.HBCI; import de.willuhn.jameica.hbci.HBCIProperties; import de.willuhn.jameica.hbci.gui.action.SepaUeberweisungMerge; -import de.willuhn.jameica.hbci.gui.dialogs.PainVersionDialog; import de.willuhn.jameica.hbci.rmi.AuslandsUeberweisung; import de.willuhn.jameica.hbci.rmi.HibiscusAddress; import de.willuhn.jameica.system.Application; -import de.willuhn.jameica.system.OperationCanceledException; import de.willuhn.util.ApplicationException; public class Ct1Ueberweisung @@ -88,20 +87,7 @@ public int write(ArrayList lastschriften, File file, Date faell, private int dateiausgabe(ArrayList lastschriften, File file, Date faell, Ct1Ausgabe ct1ausgabe, String verwendungszweck) throws Exception { - SepaVersion sepaVersion; - if (Einstellungen.getEinstellung().getCt1SepaVersion() != null) - { - sepaVersion = Einstellungen.getEinstellung().getCt1SepaVersion(); - } - else - { - PainVersionDialog d = new PainVersionDialog(org.kapott.hbci.sepa.SepaVersion.Type.PAIN_001); - sepaVersion = (SepaVersion) d.open(); - if (sepaVersion == null) - { - throw new OperationCanceledException(); - } - } + SepaVersion sepaVersion = Einstellungen.getEinstellung().getCt1SepaVersion(); Properties ls_properties = new Properties(); ls_properties.setProperty("src.bic", Einstellungen.getEinstellung().getBic()); ls_properties.setProperty("src.iban", Einstellungen.getEinstellung().getIban()); @@ -118,8 +104,16 @@ private int dateiausgabe(ArrayList lastschriften, File file, Date f { ls_properties.setProperty(SepaUtil.insertIndex("dst.bic", counter), StringUtils.trimToEmpty(ls.getBIC())); ls_properties.setProperty(SepaUtil.insertIndex("dst.iban", counter), StringUtils.trimToEmpty(ls.getIBAN())); - ls_properties.setProperty(SepaUtil.insertIndex("dst.name", counter), StringUtils.trimToEmpty(ls.getMitglied() - .getKontoinhaber(1).toUpperCase())); + if (ls.getMitglied() != null) + { + ls_properties.setProperty(SepaUtil.insertIndex("dst.name", counter), StringUtils.trimToEmpty(ls.getMitglied() + .getKontoinhaber(1).toUpperCase())); + } + else if (ls.getKursteilnehmer() != null) + { + ls_properties.setProperty(SepaUtil.insertIndex("dst.name", counter), StringUtils.trimToEmpty( + Adressaufbereitung.getNameVorname(ls.getKursteilnehmer()).toUpperCase())); + } ls_properties.setProperty(SepaUtil.insertIndex("btg.value", counter), (BigDecimal.valueOf(0.01)).toString()); ls_properties.setProperty(SepaUtil.insertIndex("btg.curr", counter), HBCIProperties.CURRENCY_DEFAULT_DE); ls_properties.setProperty(SepaUtil.insertIndex("usage", counter), StringUtils.trimToEmpty(eval(ls, verwendungszweck))); diff --git a/src/de/jost_net/JVerein/io/DefaultZusatzbetraegeImport.java b/src/de/jost_net/JVerein/io/DefaultZusatzbetraegeImport.java index 81dd661d7..15446a774 100644 --- a/src/de/jost_net/JVerein/io/DefaultZusatzbetraegeImport.java +++ b/src/de/jost_net/JVerein/io/DefaultZusatzbetraegeImport.java @@ -32,6 +32,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Mitglied; @@ -276,6 +277,10 @@ else if (list.size() > 1) anz, mitgliedIdString)); fehlerInDaten = true; } + catch (SQLException e) + { + // + } try { String buchungsart = results.getString("Buchungsart"); @@ -315,6 +320,15 @@ else if (list.size() > 1) { // } + try + { + Integer zahlungsweg = results.getInt("Zahlungsweg"); + zus.setZahlungsweg(new Zahlungsweg(zahlungsweg)); + } + catch (Exception e) + { + zus.setZahlungsweg(new Zahlungsweg(Zahlungsweg.STANDARD)); + } zusatzbetraegeList.add(zus); } diff --git a/src/de/jost_net/JVerein/io/FormularAufbereitung.java b/src/de/jost_net/JVerein/io/FormularAufbereitung.java index ff61250f1..8583fbf6e 100644 --- a/src/de/jost_net/JVerein/io/FormularAufbereitung.java +++ b/src/de/jost_net/JVerein/io/FormularAufbereitung.java @@ -23,13 +23,25 @@ import java.io.IOException; import java.io.StringWriter; import java.io.UnsupportedEncodingException; +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; import org.apache.velocity.VelocityContext; import org.apache.velocity.app.Velocity; +import org.mustangproject.BankDetails; +import org.mustangproject.Contact; +import org.mustangproject.DirectDebit; +import org.mustangproject.Invoice; +import org.mustangproject.Item; +import org.mustangproject.Product; +import org.mustangproject.TradeParty; +import org.mustangproject.ZUGFeRD.IZUGFeRDExporter; +import org.mustangproject.ZUGFeRD.ZUGFeRDExporterFromPDFA; import com.google.zxing.BarcodeFormat; import com.google.zxing.EncodeHintType; @@ -42,6 +54,10 @@ import com.itextpdf.text.DocumentException; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.BaseFont; +import com.itextpdf.text.pdf.ICC_Profile; +import com.itextpdf.text.pdf.PdfAConformanceException; +import com.itextpdf.text.pdf.PdfAConformanceLevel; +import com.itextpdf.text.pdf.PdfAWriter; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; @@ -52,12 +68,14 @@ import de.jost_net.JVerein.Variable.AllgemeineVar; import de.jost_net.JVerein.Variable.MitgliedMap; import de.jost_net.JVerein.Variable.MitgliedVar; -import de.jost_net.JVerein.Variable.MitgliedskontoVar; +import de.jost_net.JVerein.Variable.RechnungVar; import de.jost_net.JVerein.Variable.VarTools; 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.Spendenbescheinigung; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; import de.jost_net.JVerein.util.StringTool; @@ -104,7 +122,7 @@ public class FormularAufbereitung * Die Datei, in die geschrieben werden soll * @throws RemoteException */ - public FormularAufbereitung(final File f) throws RemoteException + public FormularAufbereitung(final File f, boolean pdfa) throws RemoteException { this.f = f; try @@ -112,9 +130,30 @@ public FormularAufbereitung(final File f) throws RemoteException doc = new Document(); fos = new FileOutputStream(f); - writer = PdfWriter.getInstance(doc, fos); - doc.open(); + if (pdfa) + { + writer = PdfAWriter.getInstance(doc, fos, + PdfAConformanceLevel.PDF_A_3B); + + writer.createXmpMetadata(); + doc.open(); + + ICC_Profile icc = ICC_Profile + .getInstance(Class.forName("org.mustangproject.Invoice") + .getClassLoader().getResourceAsStream("sRGB.icc")); + writer.setOutputIntents("Custom", "", "http://www.color.org", + "sRGB IEC61966-2.1", icc); + writer.setCompressionLevel(9); + } + else + { + writer = PdfWriter.getInstance(doc, fos); + writer.setEncryption(null, null, + PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_SCREENREADERS, + PdfWriter.ENCRYPTION_AES_256); + doc.open(); + } } catch (IOException e) { @@ -124,6 +163,10 @@ public FormularAufbereitung(final File f) throws RemoteException { throw new RemoteException("Fehler", e); } + catch (ClassNotFoundException e) + { + throw new RemoteException("Fehler", e); + } } public void writeForm(Formular formular, Map map) @@ -162,7 +205,7 @@ public void writeForm(Formular formular, Map map) // Increase counter if form field is zaehler or qrcode (counter is // needed in QR code, so it needs to be incremented) if ((f.getName().equals(AllgemeineVar.ZAEHLER.getName()) - || f.getName().equals(MitgliedskontoVar.QRCODE_SUMME.getName())) + || f.getName().equals(RechnungVar.QRCODE_SUMME.getName())) && !increased) { zaehler++; @@ -174,9 +217,9 @@ public void writeForm(Formular formular, Map map) } // create QR code for invoice sum if form field is QRCODE_SUM - if (f.getName().equals(MitgliedskontoVar.QRCODE_SUMME.getName())) + if (f.getName().equals(RechnungVar.QRCODE_SUMME.getName())) { - map.put(MitgliedskontoVar.QRCODE_SUMME.getName(), getPaymentQRCode(map)); + map.put(RechnungVar.QRCODE_SUMME.getName(), getPaymentQRCode(map)); // Update QR code } @@ -217,7 +260,7 @@ private Image getPaymentQRCode(Map fieldsMap) throws RemoteException if (true == festerText) { String zahlungsgruende_raw = getString( - fieldsMap.get(MitgliedskontoVar.ZAHLUNGSGRUND.getName())); + fieldsMap.get(RechnungVar.ZAHLUNGSGRUND.getName())); String[] zahlungsgruende = zahlungsgruende_raw.split("\n"); if (zahlungsgruende.length == 1 && e.getQRCodeSnglLine()) { @@ -309,7 +352,7 @@ private Image getPaymentQRCode(Map fieldsMap) throws RemoteException sbEpc.append(e.getIban()).append("\n"); sbEpc.append(EPC_EUR); Object[] oPosten = (Object[]) fieldsMap - .get(MitgliedskontoVar.BETRAG.getName()); + .get(RechnungVar.BETRAG.getName()); // Der letzte Eintrag in dem Array ist die Rechnungssumme // Ersetze das Dezimalkomma durch einen Punkt, um der Spezifikation zu entsprechen String betrag = getString(oPosten[oPosten.length - 1]).replace(',', '.'); @@ -351,7 +394,7 @@ private Image getPaymentQRCode(Map fieldsMap) throws RemoteException * * @throws IOException */ - public void closeFormular() throws IOException + public void closeFormular() throws IOException, PdfAConformanceException { doc.close(); writer.close(); @@ -420,6 +463,13 @@ else if (val instanceof Image) float sz = mm2point(Einstellungen.getEinstellung().getQRCodeSizeInMm()); contentByte.addImage(i, sz, 0, 0, sz, x, y); } + else if (val instanceof com.itextpdf.text.Image) + { + com.itextpdf.text.Image i = (com.itextpdf.text.Image) val; + float sh = i.getScaledHeight(); + float sw = i.getScaledWidth(); + contentByte.addImage(i, sw, 0, 0, sh, x, y); + } else { buendig = links; @@ -580,5 +630,126 @@ public void printAnschreiben(Spendenbescheinigung spb, String text) throw new RemoteException("Fehler", e); } } - + + @SuppressWarnings("resource") + public void addZUGFeRD(Rechnung re, boolean mahnung) throws IOException + { + ArrayList mklist = re.getMitgliedskontoList(); + if (mklist.size() == 0) + return; + + String sourcePDF = f.getAbsolutePath(); + Einstellung e = Einstellungen.getEinstellung(); + IZUGFeRDExporter ze = new ZUGFeRDExporterFromPDFA().ignorePDFAErrors() + .load(sourcePDF).setProducer("JVerein") + .setCreator(System.getProperty("user.name")); + + Invoice invoice = new Invoice() + // Fälligkeitsdatum + .setDueDate(mklist.get(mklist.size() - 1).getDatum()) + // Lieferdatum + .setDeliveryDate(mklist.get(mklist.size() - 1).getDatum()) + // Rechnungsdatum + .setIssueDate(re.getDatum()) + // Rechnungsnummer + .setNumber(re.getID()); + + // Rechnungssteller + TradeParty sender = new TradeParty(e.getName(), + StringTool.toNotNullString(e.getStrasse()), + StringTool.toNotNullString(e.getPlz()), + StringTool.toNotNullString(e.getOrt()), e.getStaat()) + .addTaxID(e.getSteuernummer()); + 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)) + { + // Mandat + sender.addDebitDetails(new DirectDebit(re.getIBAN(), re.getMandatID())); + // Gläubiger identifikationsnummer + invoice.setCreditorReferenceID(e.getGlaeubigerID()); + } + else + { + sender.addBankDetails( + new BankDetails(StringTool.toNotNullString(e.getIban()), + StringTool.toNotNullString(e.getBic()))); + } + invoice.setSender(sender); + + if (mahnung) + { + double bezahlt = 0; + for (Mitgliedskonto mk : re.getMitgliedskontoList()) + { + bezahlt += mk.getIstSumme(); + } + // Bereits gezahlt + invoice.setTotalPrepaidAmount(new BigDecimal(bezahlt)); + } + + String id = re.getMitglied().getID(); + if (Einstellungen.getEinstellung().getExterneMitgliedsnummer()) + id = re.getMitglied().getExterneMitgliedsnummer(); + + // Rechnungsempfänger + invoice.setRecipient(new TradeParty( + StringTool.toNotNullString(re.getVorname()) + " " + + StringTool.toNotNullString(re.getName()), + StringTool.toNotNullString(re.getStrasse()), + StringTool.toNotNullString(re.getPlz()), + StringTool.toNotNullString(re.getOrt()), + re.getStaatCode() == null || re.getStaatCode().length() == 0 + ? e.getStaat() + : re.getStaatCode()) + .setID(id) + .setContact(new Contact( + StringTool.toNotNullString(re.getVorname()) + " " + + StringTool.toNotNullString(re.getName()), + re.getMitglied().getTelefonprivat(), + re.getMitglied().getEmail())) + .setAdditionalAddress( + StringTool.toNotNullString(re.getAdressierungszusatz()))); + + // LeitwegID + if (re.getLeitwegID() != null && re.getLeitwegID().length() > 0) + { + invoice.setReferenceNumber(re.getLeitwegID()); + } + + // Sollbuchungen + for (Mitgliedskonto mk : re.getMitgliedskontoList()) + { + Double betrag = mk.getNettobetrag(); + if (betrag == null || betrag == 0) + { + betrag = mk.getBetrag(); + } + if (mk.getBetrag() < 0) + { + invoice.addItem(new Item( + new Product(mk.getZweck1(), "", "LS", + new BigDecimal(mk.getSteuersatz()).setScale(2, + RoundingMode.HALF_DOWN)), + new BigDecimal(betrag * -1).setScale(2, RoundingMode.HALF_DOWN), + new BigDecimal(-1.0))); + } + else + { + invoice.addItem(new Item(new Product(mk.getZweck1(), "", "LS", // LS = + // pauschal + new BigDecimal(mk.getSteuersatz()).setScale(2, + RoundingMode.HALF_DOWN)), + new BigDecimal(betrag).setScale(2, RoundingMode.HALF_DOWN), + new BigDecimal(1.0))); + } + } + ze.setTransaction(invoice); + ze.export(f.getAbsolutePath()); + ze.close(); + } + } diff --git a/src/de/jost_net/JVerein/io/FormularExporterXML.java b/src/de/jost_net/JVerein/io/FormularExporterXML.java new file mode 100644 index 000000000..bbd668cba --- /dev/null +++ b/src/de/jost_net/JVerein/io/FormularExporterXML.java @@ -0,0 +1,112 @@ +/********************************************************************** + * 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.io; + + +import java.io.BufferedOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.rmi.RemoteException; + +import com.itextpdf.text.DocumentException; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.rmi.Formular; +import de.jost_net.JVerein.rmi.Formularfeld; +import de.willuhn.datasource.rmi.DBIterator; +import de.willuhn.datasource.rmi.DBObject; +import de.willuhn.datasource.serialize.XmlWriter; +import de.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +public class FormularExporterXML implements Exporter +{ + @Override + public String getName() + { + return "Formular XML-Export"; + } + + @Override + public IOFormat[] getIOFormats(Class objectType) + { + if (objectType != Formular.class) + { + return null; + } + IOFormat f = new IOFormat() + { + + @Override + public String getName() + { + return FormularExporterXML.this.getName(); + } + + /** + * @see de.willuhn.jameica.hbci.io.IOFormat#getFileExtensions() + */ + @Override + public String[] getFileExtensions() + { + return new String[] { "*.xml" }; + } + }; + return new IOFormat[] { f }; + } + + @Override + public String getDateiname() + { + return "formular"; + } + + @Override + public void doExport(Object[] objects, IOFormat format, File file, + ProgressMonitor monitor) throws RemoteException, ApplicationException, + FileNotFoundException, DocumentException, IOException + { + XmlWriter writer = new XmlWriter( + new BufferedOutputStream(new FileOutputStream(file))); + + int count = 1; + if (objects[0] instanceof DBObject[]) + { + objects = (Object[]) objects[0]; + } + for (Object o : objects) + { + DBObject dbObject = (DBObject) o; + writer.write(dbObject); + + DBIterator formularfeldIt = Einstellungen.getDBService() + .createList(Formularfeld.class); + formularfeldIt.addFilter("formular = ?", dbObject.getID()); + while (formularfeldIt.hasNext()) + { + writer.write(formularfeldIt.next()); + } + monitor.setPercentComplete(count * 100 / objects.length); + } + + writer.close(); + } + +} diff --git a/src/de/jost_net/JVerein/io/FormularImporterXML.java b/src/de/jost_net/JVerein/io/FormularImporterXML.java new file mode 100644 index 000000000..c1f8d7f18 --- /dev/null +++ b/src/de/jost_net/JVerein/io/FormularImporterXML.java @@ -0,0 +1,240 @@ +/********************************************************************** + * 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.io; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Iterator; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.JVereinPlugin; +import de.jost_net.JVerein.DBTools.DBTransaction; +import de.jost_net.JVerein.rmi.Formular; +import de.willuhn.datasource.BeanUtil; +import de.willuhn.datasource.db.AbstractDBObject; +import de.willuhn.datasource.serialize.Reader; +import de.willuhn.datasource.serialize.XmlReader; +import de.willuhn.jameica.system.Application; +import de.willuhn.jameica.system.OperationCanceledException; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +public class FormularImporterXML implements Importer +{ + + @SuppressWarnings("unchecked") + @Override + public void doImport(Object context, IOFormat format, File file, + String encoding, ProgressMonitor monitor) throws Exception + { + + if (file == null) + { + throw new ApplicationException("Keine zu importierende Datei ausgewählt"); + } + + if (format == null) + { + throw new ApplicationException("Kein Datei-Format ausgewählt"); + } + + HashMap> foreignMap = getForeignMap(); + HashMap> idMap = new HashMap<>(); + + final ClassLoader loader = Application.getPluginLoader() + .getManifest(JVereinPlugin.class).getClassLoader(); + Reader reader = null; + try + { + DBTransaction.starten(); + + reader = new XmlReader(new FileInputStream(file), (type, id, values) -> { + AbstractDBObject object = (AbstractDBObject) Einstellungen + .getDBService().createObject( + (Class) loader.loadClass(type), null); + object.setID(id); // ID setzen, sie muss vor dem Speichern wieder + // entfernt werden um nichts zu überschreiben + + Iterator i = values.keySet().iterator(); + while (i.hasNext()) + { + String name = (String) i.next(); + HashMap fieldMap = foreignMap.get(type); + if (fieldMap != null && fieldMap.get(name) != null) + { + if (idMap.get(fieldMap.get(name)) == null) + { + throw new ApplicationException( + "Kein Object der referenzierten Klasse " + fieldMap.get(name) + + " gefunden."); + } + String foreignId = idMap.get(fieldMap.get(name)) + .get(values.get(name).toString()); + if (foreignId == null) + { + throw new ApplicationException( + "Kein Object der referenzierten Klasse " + fieldMap.get(name) + + " mit id " + values.get(name).toString() + + " gefunden."); + } + object.setAttribute(name, foreignId); + } + else + { + object.setAttribute(name, values.get(name)); + } + } + return object; + }); + + if (monitor != null) + { + monitor.setStatusText("Lese Datei ein"); + } + + int created = 0; + + AbstractDBObject object = null; + while ((object = (AbstractDBObject) reader.read()) != null) + { + if (monitor != null) + { + Object name = BeanUtil.toString(object); + if (name != null && monitor != null) + { + monitor.log("Importiere " + name.toString()); + } + if (created > 0 && created % 10 == 0 && monitor != null) // nur + { + // geschaetzt + monitor.addPercentComplete(1); + } + } + + try + { + String idAlt = object.getID(); + object.setID(null); + object.store(); + HashMap map = idMap + .getOrDefault(object.getClass().getName(), new HashMap<>()); + map.put(idAlt, object.getID()); + idMap.put(object.getClass().getName(), map); + + created++; + } + catch (ApplicationException ae) + { + if (monitor != null) + { + monitor.log(" " + ae.getMessage()); + } + throw ae; + } + catch (Exception e) + { + Logger.error("unable to import line", e); + if (monitor != null) + { + monitor + .log("Fehler beim Import des Datensatzes: " + e.getMessage()); + } + throw e; + } + } + DBTransaction.commit(); + if (monitor != null) + { + monitor.setStatusText(created + " Datensätze erfolgreich importiert"); + monitor.setPercentComplete(100); + } + } + catch (OperationCanceledException oce) + { + DBTransaction.rollback(); + Logger.warn("operation cancelled"); + throw new ApplicationException("Import abgebrochen"); + } + catch (Exception e) + { + DBTransaction.rollback(); + Logger.error("error while reading file", e); + throw new ApplicationException("Fehler beim Import der XML-Datei"); + } + finally + { + if (reader != null) + { + try + { + reader.close(); + } + catch (IOException e) + { + Logger.error("error while closing inputstream", e); + } + } + } + } + + private HashMap> getForeignMap() + { + HashMap> foreignMap = new HashMap<>(); + + HashMap map = new HashMap<>(); + map.put("formular", "de.jost_net.JVerein.server.FormularImpl"); + + foreignMap.put("de.jost_net.JVerein.server.FormularfeldImpl", map); + + return foreignMap; + } + + @Override + public String getName() + { + return "Formular XML-Import"; + } + + @Override + public IOFormat[] getIOFormats(Class objectType) + { + if (objectType != Formular.class) + { + return null; + } + + IOFormat f = new IOFormat() + { + @Override + public String getName() + { + return FormularImporterXML.this.getName(); + } + + @Override + public String[] getFileExtensions() + { + return new String[] { "*.xml" }; + } + }; + return new IOFormat[] { f }; + } +} diff --git a/src/de/jost_net/JVerein/io/FreiesFormularAusgabe.java b/src/de/jost_net/JVerein/io/FreiesFormularAusgabe.java index fb4ff5721..bba4aeaa0 100644 --- a/src/de/jost_net/JVerein/io/FreiesFormularAusgabe.java +++ b/src/de/jost_net/JVerein/io/FreiesFormularAusgabe.java @@ -29,6 +29,7 @@ import de.jost_net.JVerein.util.JVDateFormatJJJJMMTT; import de.jost_net.JVerein.util.StringTool; import de.willuhn.jameica.gui.GUI; +import de.willuhn.util.ApplicationException; public class FreiesFormularAusgabe { @@ -40,7 +41,8 @@ public class FreiesFormularAusgabe ZipOutputStream zos = null; - public FreiesFormularAusgabe(FreieFormulareControl control) throws IOException + public FreiesFormularAusgabe(FreieFormulareControl control) + throws IOException, ApplicationException { this.control = control; Formular formular = (Formular) control @@ -55,7 +57,7 @@ public FreiesFormularAusgabe(FreieFormulareControl control) throws IOException { case DRUCK: file = getDateiAuswahl("pdf", formular.getBezeichnung()); - formularaufbereitung = new FormularAufbereitung(file); + formularaufbereitung = new FormularAufbereitung(file, false); break; case MAIL: file = getDateiAuswahl("zip", formular.getBezeichnung()); @@ -79,7 +81,7 @@ public FreiesFormularAusgabe(FreieFormulareControl control) throws IOException } public void aufbereitung(Formular formular, ArrayList mitglieder) - throws IOException + throws IOException, ApplicationException { for (Mitglied m : mitglieder) { @@ -94,7 +96,7 @@ public void aufbereitung(Formular formular, ArrayList mitglieder) continue; } File f = File.createTempFile(getDateiname(m), ".pdf"); - formularaufbereitung = new FormularAufbereitung(f); + formularaufbereitung = new FormularAufbereitung(f, false); aufbereitenFormular(m, formularaufbereitung, formular); formularaufbereitung.closeFormular(); zos.putNextEntry(new ZipEntry(getDateiname(m) + ".pdf")); @@ -154,11 +156,12 @@ File getDateiAuswahl(String extension, String name) throws RemoteException } void aufbereitenFormular(Mitglied m, FormularAufbereitung fa, Formular fo) - throws RemoteException + throws RemoteException, ApplicationException { Map map = new MitgliedMap().getMap(m, null); map = new AllgemeineMap().getMap(map); fa.writeForm(fo, map); + fo.store(); } String getDateiname(Mitglied m) throws RemoteException diff --git a/src/de/jost_net/JVerein/io/IAdresse.java b/src/de/jost_net/JVerein/io/IAdresse.java index 32af7d521..2864a032c 100644 --- a/src/de/jost_net/JVerein/io/IAdresse.java +++ b/src/de/jost_net/JVerein/io/IAdresse.java @@ -45,4 +45,6 @@ public interface IAdresse public String getStaat() throws RemoteException; public String getGeschlecht() throws RemoteException; + + public String getStaatCode() throws RemoteException; } diff --git a/src/de/jost_net/JVerein/io/KontenrahmenImportXML.java b/src/de/jost_net/JVerein/io/KontenrahmenImportXML.java index 96f0787a9..f9408864f 100644 --- a/src/de/jost_net/JVerein/io/KontenrahmenImportXML.java +++ b/src/de/jost_net/JVerein/io/KontenrahmenImportXML.java @@ -128,7 +128,7 @@ public void doImport(Object context, IOFormat format, File file, .createList(Buchungsart.class); stbuait.addFilter("nummer = ?", mapst.get(id)); Buchungsart stbua = stbuait.next(); - bua.setSteuerBuchungsart(Integer.parseInt(stbua.getID())); + bua.setSteuerBuchungsart(Long.parseLong(stbua.getID())); bua.store(); } } diff --git a/src/de/jost_net/JVerein/io/KontenrahmenImportXMLv2.java b/src/de/jost_net/JVerein/io/KontenrahmenImportXMLv2.java index 51d45b15d..bc3fc6afd 100644 --- a/src/de/jost_net/JVerein/io/KontenrahmenImportXMLv2.java +++ b/src/de/jost_net/JVerein/io/KontenrahmenImportXMLv2.java @@ -143,7 +143,7 @@ public void doImport(Object context, IOFormat format, File file, .createList(Buchungsart.class); stbuait.addFilter("nummer = ?", mapst.get(id)); Buchungsart stbua = stbuait.next(); - bua.setSteuerBuchungsart(Integer.parseInt(stbua.getID())); + bua.setSteuerBuchungsart(Long.parseLong(stbua.getID())); bua.store(); } } diff --git a/src/de/jost_net/JVerein/io/Mahnungsausgabe.java b/src/de/jost_net/JVerein/io/Mahnungsausgabe.java deleted file mode 100644 index 12ecc7102..000000000 --- a/src/de/jost_net/JVerein/io/Mahnungsausgabe.java +++ /dev/null @@ -1,86 +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.io; - -import java.io.IOException; -import java.rmi.RemoteException; - -import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.MitgliedskontoControl; -import de.jost_net.JVerein.keys.FormularArt; -import de.jost_net.JVerein.rmi.Formular; -import de.jost_net.JVerein.rmi.Mitgliedskonto; -import de.willuhn.datasource.GenericIterator; -import de.willuhn.jameica.gui.GUI; - -public class Mahnungsausgabe extends AbstractMitgliedskontoDokument -{ - - public Mahnungsausgabe(MitgliedskontoControl control) throws IOException - { - super(control, MitgliedskontoControl.TYP.MAHNUNG); - - Formular form = (Formular) control.getFormular(FormularArt.MAHNUNG) - .getValue(); - if (form == null) - { - throw new IOException("Kein Mahnungsformular ausgewählt"); - } - Formular formular = (Formular) Einstellungen.getDBService().createObject( - Formular.class, form.getID()); - - // Wurde ein Object übergeben? - if (control.getCurrentObject() != null) - { - // Ja: Einzeldruck aus dem Kontextmenu - mks = getRechnungsempfaenger(control.getCurrentObject()); - } - else - { - @SuppressWarnings("rawtypes") - GenericIterator it = control.getMitgliedskontoIterator(false); - Mitgliedskonto[] mk = new Mitgliedskonto[it.size()]; - int i = 0; - while (it.hasNext()) - { - mk[i] = (Mitgliedskonto) it.next(); - i++; - } - mks = getRechnungsempfaenger(mk); - } - if (mks.size() == 0) - { - GUI.getStatusBar().setErrorText( - "Keine passenden Sollbuchungen gefunden."); - file.delete(); - return; - } - aufbereitung(formular); - try - { - // Write updated form to DB - formular.store(); - // Update all linked forms - formular.setZaehlerToFormlink(formular.getZaehler()); - } - catch (RemoteException re) { throw re; } - catch (Exception e) - { - throw new RemoteException("Fehler", e); - } - } -} diff --git a/src/de/jost_net/JVerein/io/Migration.java b/src/de/jost_net/JVerein/io/Migration.java index 180da7890..711dceb9c 100755 --- a/src/de/jost_net/JVerein/io/Migration.java +++ b/src/de/jost_net/JVerein/io/Migration.java @@ -33,6 +33,7 @@ import de.jost_net.JVerein.gui.input.GeschlechtInput; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.Datentyp; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Arbeitseinsatz; import de.jost_net.JVerein.rmi.Beitragsgruppe; @@ -716,7 +717,7 @@ else if (zahlart.equalsIgnoreCase("u") } else { - if (m.getBic() == "" && m.getIban() != null) + if (m.getBic() == "" && m.getIban() != null && m.getIban().length() > 0) { IBAN i; try @@ -750,7 +751,11 @@ else if (zahlart.equalsIgnoreCase("u") getResultFrom(results, InternalColumns.KTOIADRESSIERUNGSZUSATZ)); m.setKtoiPlz(getResultFrom(results, InternalColumns.KTOIPLZ)); m.setKtoiOrt(getResultFrom(results, InternalColumns.KTOIORT)); - m.setKtoiStaat(getResultFrom(results, InternalColumns.KTOISTAAT)); + String staat = getResultFrom(results, InternalColumns.KTOISTAAT); + if (staat != null && staat.length() != 0) + { + m.setStaat(getStaat(staat)); + } m.setKtoiEmail(getResultFrom(results, InternalColumns.KTOIEMAIL)); Integer bg = beitragsGruppen .get(getResultFrom(results, InternalColumns.BEITRAGSART)); @@ -861,8 +866,11 @@ else if (personenArt.matches("^(n|N).*")) m.setHandy(getResultFrom(results, InternalColumns.TELEMOBIL)); m.setAdressierungszusatz(getResultFrom(results, InternalColumns.ADRZUSATZ)); - m.setStaat(getResultFrom(results, InternalColumns.STAAT)); // Default was - // null warum? + staat = getResultFrom(results, InternalColumns.STAAT); + if (staat != null && staat.length() != 0) + { + m.setStaat(getStaat(staat)); + } String zahlungsrhythmus = getResultFrom(results, InternalColumns.ZAHLRYTHM); if (zahlungsrhythmus.length() > 0) @@ -1175,4 +1183,19 @@ private void loescheBestand() } } + String getStaat(String staat) throws ApplicationException + { + if (Staat.getByKey(staat.toUpperCase()) != null) + { + return staat.toUpperCase(); + } + else if (Staat.getByText(staat.toUpperCase()) != null) + { + return Staat.getByText(staat.toUpperCase()).getKey(); + } + else + { + throw new ApplicationException("Staat nicht erkannt: " + staat); + } + } } diff --git a/src/de/jost_net/JVerein/io/MitgliederImport.java b/src/de/jost_net/JVerein/io/MitgliederImport.java index 9cb379a1f..5d9fff1b7 100644 --- a/src/de/jost_net/JVerein/io/MitgliederImport.java +++ b/src/de/jost_net/JVerein/io/MitgliederImport.java @@ -17,6 +17,7 @@ import de.jost_net.JVerein.keys.ArtBeitragsart; import de.jost_net.JVerein.keys.Beitragsmodel; import de.jost_net.JVerein.keys.Datentyp; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.keys.Zahlungsrhythmus; import de.jost_net.JVerein.keys.Zahlungstermin; import de.jost_net.JVerein.keys.Zahlungsweg; @@ -489,7 +490,7 @@ else if (m.getZahlungsweg() == Zahlungsweg.BASISLASTSCHRIFT } else { - if (m.getBic() == "" && m.getIban() != null) + if (m.getBic() == "" && m.getIban() != null && m.getIban().length() > 0) { IBAN i = new IBAN(m.getIban()); m.setBic(i.getBIC()); @@ -695,7 +696,18 @@ else if (Einstellungen.getEinstellung().getGeburtsdatumPflicht() String ktoistaat = results.getString("ktoistaat"); if (ktoistaat != null && ktoistaat.length() != 0) { - m.setKtoiStaat(ktoistaat); + if(Staat.getByText(ktoistaat.toUpperCase()) != null) + { + m.setKtoiStaat(Staat.getByText(ktoistaat.toUpperCase()).getKey()); + } + else if(Staat.getByKey(ktoistaat.toUpperCase()) != null) + { + m.setKtoiStaat(ktoistaat.toUpperCase()); + } + else + { + throw new ApplicationException("Zeile " + anz + ": Kontoinhaber Staat nicht erkannt: " + ktoistaat); + } } } catch (SQLException e) @@ -828,7 +840,18 @@ else if (Einstellungen.getEinstellung().getGeburtsdatumPflicht() String staat = results.getString("staat"); if (staat != null && staat.length() != 0) { - m.setStaat(staat); + if(Staat.getByKey(staat.toUpperCase()) != null) + { + m.setStaat(staat.toUpperCase()); + } + else if(Staat.getByText(staat.toUpperCase()) != null) + { + m.setStaat(Staat.getByText(staat.toUpperCase()).getKey()); + } + else + { + throw new ApplicationException("Zeile " + anz + ": Staat nicht erkannt: " + staat); + } } } catch (SQLException e) diff --git a/src/de/jost_net/JVerein/io/MittelverwendungExportCSV.java b/src/de/jost_net/JVerein/io/MittelverwendungExportCSV.java new file mode 100644 index 000000000..a11fcdbd9 --- /dev/null +++ b/src/de/jost_net/JVerein/io/MittelverwendungExportCSV.java @@ -0,0 +1,149 @@ +/********************************************************************** + * Copyright (c) by Thomas Laubrock + * + * 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.io; + +import java.io.File; +import java.io.FileWriter; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +import org.supercsv.cellprocessor.ConvertNullTo; +import org.supercsv.cellprocessor.FmtNumber; +import org.supercsv.cellprocessor.ift.CellProcessor; +import org.supercsv.io.CsvMapWriter; +import org.supercsv.io.ICsvMapWriter; +import org.supercsv.prefs.CsvPreference; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class MittelverwendungExportCSV +{ + + private static CellProcessor[] getProcessors() + { + + final CellProcessor[] processors = new CellProcessor[] { + new ConvertNullTo(""), // Nr + new ConvertNullTo(""), // Bezeichnung + new ConvertNullTo("", new FmtNumber(Einstellungen.DECIMALFORMAT)), // Betrag + new ConvertNullTo("", new FmtNumber(Einstellungen.DECIMALFORMAT)), // Summe + }; + + return processors; + } + + public MittelverwendungExportCSV(ArrayList zeile, + final File file, Date datumvon, Date datumbis) throws ApplicationException + { + ICsvMapWriter writer = null; + try + { + writer = new CsvMapWriter(new FileWriter(file), + CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE); + final CellProcessor[] processors = getProcessors(); + Map csvzeile = new HashMap<>(); + + String[] header = {"Nr", "Bezeichnung", "Betrag", "Summe"}; + writer.writeHeader(header); + + String title = "Mittelverwendung"; + csvzeile.put(header[1], title); + writer.write(csvzeile, header, processors); + csvzeile = new HashMap<>(); + String subtitle = "Geschäftsjahr " + new JVDateFormatTTMMJJJJ().format(datumvon) + " - " + + new JVDateFormatTTMMJJJJ().format(datumbis); + csvzeile.put(header[1], subtitle); + writer.write(csvzeile, header, processors); + + csvzeile = new HashMap<>(); + csvzeile.put(header[1], " "); + writer.write(csvzeile, header, processors); + + for (MittelverwendungZeile mvz : zeile) + { + csvzeile = new HashMap<>(); + switch (mvz.getStatus()) + { + case MittelverwendungZeile.EINNAHME: + case MittelverwendungZeile.AUSGABE: + { + String position = ""; + if ((Integer) mvz.getAttribute("position") != null); + { + position = ((Integer) mvz.getAttribute("position")).toString(); + } + csvzeile.put(header[0], position); + csvzeile.put(header[1], (String) mvz.getAttribute("bezeichnung")); + csvzeile.put(header[2],(Double) mvz.getAttribute("betrag")); + csvzeile.put(header[3], (Double) mvz.getAttribute("summe")); + break; + } + case MittelverwendungZeile.SUMME: + { + String position = ""; + if ((Integer) mvz.getAttribute("position") != null); + { + position = ((Integer) mvz.getAttribute("position")).toString(); + } + csvzeile.put(header[0], position); + csvzeile.put(header[1], (String) mvz.getAttribute("bezeichnung")); + csvzeile.put(header[2],(Double) mvz.getAttribute("betrag")); + csvzeile.put(header[3], (Double) mvz.getAttribute("summe")); + break; + } + case MittelverwendungZeile.UNDEFINED: + { + continue; + } + } + + writer.write(csvzeile, header, processors); + } + GUI.getStatusBar().setSuccessText("Export fertig."); + writer.close(); + FileViewer.show(file); + } + catch (Exception e) + { + Logger.error("Error while creating report", e); + throw new ApplicationException("Fehler", e); + } + finally + { + if (writer != null) + { + try + { + writer.close(); + } + catch (Exception e) + { + Logger.error("Error while creating report", e); + throw new ApplicationException("Fehler", e); + } + } + } + + } + +} diff --git a/src/de/jost_net/JVerein/io/MittelverwendungExportPDF.java b/src/de/jost_net/JVerein/io/MittelverwendungExportPDF.java new file mode 100644 index 000000000..9fb3b8f7f --- /dev/null +++ b/src/de/jost_net/JVerein/io/MittelverwendungExportPDF.java @@ -0,0 +1,123 @@ +/********************************************************************** + * 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.io; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; +import java.util.Date; + +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Chunk; +import com.itextpdf.text.DocumentException; +import com.itextpdf.text.Element; +import com.itextpdf.text.Font; +import com.itextpdf.text.Phrase; +import com.itextpdf.text.pdf.PdfPCell; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class MittelverwendungExportPDF +{ + + public MittelverwendungExportPDF(ArrayList zeile, + final File file, Date datumvon, Date datumbis) throws ApplicationException + { + try + { + FileOutputStream fos = new FileOutputStream(file); + String subtitle = "Geschäftsjahr: " + new JVDateFormatTTMMJJJJ().format(datumvon) + + " - " + new JVDateFormatTTMMJJJJ().format(datumbis); + Reporter reporter = new Reporter(fos, "Mittelverwendung", subtitle, + zeile.size()); + makeHeader(reporter); + + for (MittelverwendungZeile mvz : zeile) + { + switch (mvz.getStatus()) + { + case MittelverwendungZeile.EINNAHME: + case MittelverwendungZeile.AUSGABE: + { + reporter.addColumn(((Integer) mvz.getAttribute("position")).toString(), + Element.ALIGN_LEFT); + reporter.addColumn((String) mvz.getAttribute("bezeichnung"), + Element.ALIGN_LEFT); + reporter.addColumn((Double) mvz.getAttribute("betrag")); + reporter.addColumn(" ", Element.ALIGN_LEFT); + break; + } + case MittelverwendungZeile.SUMME: + { + reporter.addColumn( + ((Integer) mvz.getAttribute("position")).toString(), + Element.ALIGN_LEFT); + PdfPCell cell = null; + cell = new PdfPCell(new Phrase(new Chunk( + reporter.notNull((String) mvz.getAttribute("bezeichnung")), + Reporter.getFreeSansBold(9)))); + cell.setHorizontalAlignment(Element.ALIGN_RIGHT); + reporter.addColumn(cell); + reporter.addColumn(" ", Element.ALIGN_LEFT); + Font f = null; + Double value = (Double) mvz.getAttribute("summe"); + if (value >= 0) + { + f = Reporter.getFreeSansBold(9, BaseColor.BLACK); + } + else + { + f = Reporter.getFreeSansBold(9, BaseColor.RED); + } + cell = new PdfPCell( + new Phrase(Einstellungen.DECIMALFORMAT.format(value), f)); + cell.setHorizontalAlignment(Element.ALIGN_RIGHT); + reporter.addColumn(cell); + break; + } + } + } + GUI.getStatusBar().setSuccessText("Export fertig."); + reporter.closeTable(); + reporter.close(); + fos.close(); + FileViewer.show(file); + } + catch (Exception e) + { + Logger.error("error while creating report", e); + throw new ApplicationException("Fehler", e); + } + } + + private void makeHeader(Reporter reporter) throws DocumentException + { + reporter.addHeaderColumn("Nr", Element.ALIGN_CENTER, 5, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Mittel", Element.ALIGN_CENTER, 65, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Betrag", Element.ALIGN_CENTER, 15, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Summe", Element.ALIGN_CENTER, 15, + BaseColor.LIGHT_GRAY); + reporter.createHeader(); + } +} diff --git a/src/de/jost_net/JVerein/io/MittelverwendungZeile.java b/src/de/jost_net/JVerein/io/MittelverwendungZeile.java new file mode 100644 index 000000000..a39c599a5 --- /dev/null +++ b/src/de/jost_net/JVerein/io/MittelverwendungZeile.java @@ -0,0 +1,111 @@ +/********************************************************************** + * 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.io; + +import java.rmi.RemoteException; + +import de.willuhn.datasource.GenericObject; + +/** + * Hilfs-Objekt + */ +public class MittelverwendungZeile implements GenericObject +{ + private Integer position; + + private String bezeichnung = ""; + + private Double betrag = null; + + private Double summe = null; + + public static final int UNDEFINED = 0; + + public static final int EINNAHME = 1; + + public static final int AUSGABE = 2; + + public static final int SUMME = 3; + + private int status = UNDEFINED; + + public MittelverwendungZeile(int status, Integer position, + String bezeichnung, Double betrag, Double summe) + { + this.position = position; + this.status = status; + this.bezeichnung = bezeichnung; + this.betrag = betrag; + this.summe = summe; + } + + public int getStatus() + { + return status; + } + + @Override + public Object getAttribute(String arg0) throws RemoteException + { + if (arg0.equals("bezeichnung")) + { + return bezeichnung; + } + else if (arg0.equals("betrag")) + { + return betrag; + } + else if (arg0.equals("summe")) + { + return summe; + } + else if (arg0.equals("position")) + { + return position; + } + throw new RemoteException( + String.format("Ungültige Spaltenbezeichung: %s", arg0)); + } + + @Override + public String[] getAttributeNames() + { + return new String[] { "bezeichnung", "betrag" }; + } + + @Override + public String getID() throws RemoteException + { + return Integer.toString(position); + } + + @Override + public String getPrimaryAttribute() + { + return "bezeichnung"; + } + + @Override + public boolean equals(GenericObject arg0) throws RemoteException + { + if (arg0 == null || !(arg0 instanceof MittelverwendungZeile)) + { + return false; + } + return this.getID().equals(arg0.getID()); + } +} diff --git a/src/de/jost_net/JVerein/io/Rechnungsausgabe.java b/src/de/jost_net/JVerein/io/Rechnungsausgabe.java index 1fbbb3f49..889120712 100644 --- a/src/de/jost_net/JVerein/io/Rechnungsausgabe.java +++ b/src/de/jost_net/JVerein/io/Rechnungsausgabe.java @@ -16,74 +16,220 @@ **********************************************************************/ package de.jost_net.JVerein.io; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import java.io.IOException; import java.rmi.RemoteException; +import java.util.Map; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.FileDialog; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.gui.control.MitgliedskontoControl; +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.gui.control.RechnungControl; +import de.jost_net.JVerein.gui.control.RechnungControl.TYP; +import de.jost_net.JVerein.keys.Ausgabeart; import de.jost_net.JVerein.keys.FormularArt; import de.jost_net.JVerein.rmi.Formular; -import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.rmi.Rechnung; +import de.jost_net.JVerein.util.Dateiname; +import de.jost_net.JVerein.util.JVDateFormatJJJJMMTT; +import de.jost_net.JVerein.util.StringTool; import de.willuhn.datasource.GenericIterator; +import de.willuhn.datasource.pseudo.PseudoIterator; import de.willuhn.jameica.gui.GUI; -import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; -public class Rechnungsausgabe extends AbstractMitgliedskontoDokument +public class Rechnungsausgabe { - public Rechnungsausgabe(MitgliedskontoControl control) throws IOException + RechnungControl control; + + GenericIterator rechnungen = null; + + File file = null; + + FormularAufbereitung formularaufbereitung = null; + + ZipOutputStream zos = null; + + RechnungControl.TYP typ; + + @SuppressWarnings("unchecked") + public Rechnungsausgabe(RechnungControl control, RechnungControl.TYP typ) + throws IOException, ApplicationException { - super(control, MitgliedskontoControl.TYP.RECHNUNG); - Formular form = (Formular) control.getFormular(FormularArt.RECHNUNG) - .getValue(); - if (form == null) + this.control = control; + this.typ = typ; + switch ((Ausgabeart) control.getAusgabeart().getValue()) + { + case DRUCK: + file = getDateiAuswahl("pdf"); + formularaufbereitung = new FormularAufbereitung(file, true); + break; + case MAIL: + file = getDateiAuswahl("zip"); + zos = new ZipOutputStream(new FileOutputStream(file)); + break; + } + + Formular formular = null; + // Bei Mahnung ist Formular nötig, bei Rechnung ist es individuell in der + // Rechnung angegeben + if (typ == TYP.MAHNUNG) { - throw new IOException("Kein Rechnungsformular ausgewählt"); + Formular form = (Formular) control.getFormular(FormularArt.MAHNUNG) + .getValue(); + if (form == null) + { + throw new IOException("Kein Mahnungsformular ausgewählt"); + } + formular = (Formular) Einstellungen.getDBService() + .createObject(Formular.class, form.getID()); } - Formular formular = (Formular) Einstellungen.getDBService() - .createObject(Formular.class, form.getID()); - // Wurde ein Object übergeben? - if (control.getCurrentObject() != null) + Object context = control.getCurrentObject(); + if (context != null && context instanceof Rechnung[]) { - // Ja: Einzeldruck aus dem Kontextmenu - mks = getRechnungsempfaenger(control.getCurrentObject()); + rechnungen = PseudoIterator.fromArray((Rechnung[]) context); + } + else if (context != null && context instanceof Rechnung) + { + rechnungen = PseudoIterator + .fromArray(new Rechnung[] { (Rechnung) context }); } else { - // Nein: Sammeldruck aus der MitgliedskontoRechnungView - @SuppressWarnings("rawtypes") - GenericIterator it = control.getMitgliedskontoIterator(false); - Mitgliedskonto[] mk = new Mitgliedskonto[it.size()]; - int i = 0; - while (it.hasNext()) - { - mk[i] = (Mitgliedskonto) it.next(); - i++; - } - mks = getRechnungsempfaenger(mk); + rechnungen = control.getRechnungIterator(); } - if (mks.size() == 0) + + if (rechnungen.size() == 0) { - GUI.getStatusBar().setErrorText( - "Keine passenden Sollbuchungen gefunden."); + GUI.getStatusBar().setErrorText("Keine passende Rechnung gefunden."); file.delete(); return; } aufbereitung(formular); - try + } + + public void aufbereitung(Formular formular) + throws IOException, ApplicationException + { + while (rechnungen.hasNext()) { - // Write updated form to DB - formular.store(); - // Update all linked forms - formular.setZaehlerToFormlink(formular.getZaehler()); + Rechnung re = rechnungen.next(); + switch ((Ausgabeart) control.getAusgabeart().getValue()) + { + case DRUCK: + aufbereitenFormular(re, formularaufbereitung, formular); + break; + case MAIL: + File f = File.createTempFile(getDateiname(re), ".pdf"); + formularaufbereitung = new FormularAufbereitung(f, true); + aufbereitenFormular(re, formularaufbereitung, formular); + formularaufbereitung.closeFormular(); + formularaufbereitung.addZUGFeRD(re, typ == TYP.MAHNUNG); + zos.putNextEntry(new ZipEntry(getDateiname(re) + ".pdf")); + FileInputStream in = new FileInputStream(f); + // buffer size + byte[] b = new byte[1024]; + int count; + while ((count = in.read(b)) > 0) + { + zos.write(b, 0, count); + } + in.close(); + break; + } } - catch (Exception e) + switch ((Ausgabeart) control.getAusgabeart().getValue()) + { + case DRUCK: + formularaufbereitung.showFormular(); + if (rechnungen.size() == 1) + { + rechnungen.begin(); + formularaufbereitung.addZUGFeRD(rechnungen.next(), + typ == TYP.MAHNUNG); + } + break; + case MAIL: + zos.close(); + new ZipMailer(file, (String) control.getBetreff().getValue(), + (String) control.getTxt().getValue(), typ.name() + ".pdf"); + break; + } + } + + private File getDateiAuswahl(String extension) throws RemoteException + { + FileDialog fd = new FileDialog(GUI.getShell(), SWT.SAVE); + fd.setText("Ausgabedatei wählen."); + String path = control.getSettings().getString("lastdir", + System.getProperty("user.home")); + if (path != null && path.length() > 0) + { + fd.setFilterPath(path); + } + fd.setFileName(new Dateiname(typ.name(), "", + Einstellungen.getEinstellung().getDateinamenmuster(), extension).get()); + fd.setFilterExtensions(new String[] { "*." + extension }); + + String s = fd.open(); + if (s == null || s.length() == 0) + { + return null; + } + if (!s.toLowerCase().endsWith("." + extension)) + { + s = s + "." + extension; + } + final File file = new File(s); + control.getSettings().setAttribute("lastdir", file.getParent()); + return file; + } + + void aufbereitenFormular(Rechnung re, FormularAufbereitung fa, + Formular formular) throws RemoteException, ApplicationException + { + if (formular == null) + formular = re.getFormular(); + + if (re.getMitgliedskontoList().size() == 0) + return; + + Map map = new RechnungMap().getMap(re, null); + map = new MitgliedMap().getMap(re.getMitglied(), map); + map = new AllgemeineMap().getMap(map); + fa.writeForm(formular, map); + + formular.store(); + + formular.setZaehlerToFormlink(formular.getZaehler()); + } + + String getDateiname(Rechnung re) throws RemoteException + { + Mitglied m = re.getMitglied(); + String filename = m.getID() + "#" + + new JVDateFormatJJJJMMTT().format(re.getDatum()) + "#"; + String email = StringTool.toNotNullString(m.getEmail()); + if (email.length() > 0) + { + filename += email; + } + else { - String fehler = "Formularfeld kann nicht gespeichert werden. Siehe system log"; - Logger.error(fehler, e); - throw new RemoteException(fehler); + filename += m.getName() + m.getVorname(); } + return filename; } } diff --git a/src/de/jost_net/JVerein/io/Reporter.java b/src/de/jost_net/JVerein/io/Reporter.java index ceb2aaf46..4f5c6a0db 100644 --- a/src/de/jost_net/JVerein/io/Reporter.java +++ b/src/de/jost_net/JVerein/io/Reporter.java @@ -114,7 +114,8 @@ public Reporter(OutputStream out, float linkerRand, float rechterRand, rpt = new Document(); rpt.setMargins(linkerRand, rechterRand, obererRand, untererRand); hyph = new HyphenationAuto("de", "DE", 2, 2); - PdfWriter.getInstance(rpt, out); + PdfWriter.getInstance(rpt, out).setEncryption(null, null, + PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_SCREENREADERS, PdfWriter.ENCRYPTION_AES_256); AbstractPlugin plugin = Application.getPluginLoader() .getPlugin(JVereinPlugin.class); rpt.addAuthor(plugin.getManifest().getName() + " - Version " @@ -132,6 +133,8 @@ public Reporter(OutputStream out, String title, String subtitle, rpt = new Document(); hyph = new HyphenationAuto("de", "DE", 2, 2); PdfWriter writer = PdfWriter.getInstance(rpt, out); + writer.setEncryption(null, null, + PdfWriter.ALLOW_PRINTING | PdfWriter.ALLOW_SCREENREADERS, PdfWriter.ENCRYPTION_AES_256); rpt.setMargins(linkerRand, rechterRand, obererRand, untererRand); AbstractPlugin plugin = Application.getPluginLoader() .getPlugin(JVereinPlugin.class); diff --git a/src/de/jost_net/JVerein/io/MitgliedskontoExport.java b/src/de/jost_net/JVerein/io/SollbuchungExport.java similarity index 71% rename from src/de/jost_net/JVerein/io/MitgliedskontoExport.java rename to src/de/jost_net/JVerein/io/SollbuchungExport.java index 9b47ec456..f21288f61 100644 --- a/src/de/jost_net/JVerein/io/MitgliedskontoExport.java +++ b/src/de/jost_net/JVerein/io/SollbuchungExport.java @@ -21,21 +21,22 @@ import java.io.FileNotFoundException; import java.io.IOException; import java.rmi.RemoteException; -import java.util.Date; import com.itextpdf.text.DocumentException; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.Queries.MitgliedskontoQuery; -import de.jost_net.JVerein.gui.action.MitgliedskontoExportAction.EXPORT_TYP; -import de.jost_net.JVerein.gui.control.MitgliedskontoControl.DIFFERENZ; +import de.jost_net.JVerein.Queries.SollbuchungQuery; +import de.jost_net.JVerein.gui.action.SollbuchungExportAction.EXPORT_TYP; +import de.jost_net.JVerein.gui.control.MitgliedskontoControl; +import de.jost_net.JVerein.gui.input.MailAuswertungInput.MailAuswertungObject; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.willuhn.datasource.GenericIterator; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.util.ProgressMonitor; -public abstract class MitgliedskontoExport implements Exporter +public abstract class SollbuchungExport implements Exporter { @Override @@ -48,43 +49,36 @@ public abstract class MitgliedskontoExport implements Exporter protected File file; - protected Date vonDatum; - - protected Date bisDatum; - - protected DIFFERENZ differenz; - - protected Boolean ohneAbbucher; - - protected Mitglied selectedMitglied; + protected MitgliedskontoControl control = new MitgliedskontoControl(null); @Override - public void doExport(Object[] objects, IOFormat format, File file, + public void doExport(final Object[] objects, IOFormat format, File file, ProgressMonitor monitor) throws DocumentException, IOException { this.file = file; - vonDatum = (Date) objects[0]; - bisDatum = (Date) objects[1]; - differenz = (DIFFERENZ) objects[2]; - ohneAbbucher = (Boolean) objects[3]; - selectedMitglied = (Mitglied) objects[4]; + this.control.getSuchname().setValue(objects[0]); + this.control.getDifferenz().setValue(objects[1]); + this.control.getOhneAbbucher().setValue(objects[2]); + this.control.getDatumvon().setValue(objects[3]); + this.control.getDatumbis().setValue(objects[4]); + this.control.getMailauswahl() + .setValue(new MailAuswertungObject((int) objects[5])); + open(); DBIterator mitgl = Einstellungen.getDBService() .createList(Mitglied.class); - if (null != selectedMitglied) - mitgl.addFilter("id = ? ", selectedMitglied.getID()); mitgl.setOrder("ORDER BY name, vorname"); while (mitgl.hasNext()) { Mitglied m = (Mitglied) mitgl.next(); startMitglied(m); - MitgliedskontoQuery mkq = new MitgliedskontoQuery(m, vonDatum, bisDatum, - differenz, ohneAbbucher); - for (Mitgliedskonto mk : mkq.get()) + GenericIterator sollbuchnungen = new SollbuchungQuery( + control, false, m).get(); + while (sollbuchnungen.hasNext()) { - add(mk); + add(sollbuchnungen.next()); monitor.log("Vorbereitung: " + Adressaufbereitung.getNameVorname(m)); } endeMitglied(); diff --git a/src/de/jost_net/JVerein/io/MitgliedskontoExportCSV.java b/src/de/jost_net/JVerein/io/SollbuchungExportCSV.java similarity index 93% rename from src/de/jost_net/JVerein/io/MitgliedskontoExportCSV.java rename to src/de/jost_net/JVerein/io/SollbuchungExportCSV.java index dd7f47707..e7aba8047 100644 --- a/src/de/jost_net/JVerein/io/MitgliedskontoExportCSV.java +++ b/src/de/jost_net/JVerein/io/SollbuchungExportCSV.java @@ -28,14 +28,14 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.Variable.MitgliedMap; -import de.jost_net.JVerein.Variable.MitgliedskontoMap; +import de.jost_net.JVerein.Variable.RechnungMap; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; import de.willuhn.logging.Logger; import de.willuhn.util.ProgressMonitor; -public class MitgliedskontoExportCSV extends MitgliedskontoExport +public class SollbuchungExportCSV extends SollbuchungExport { private ArrayList mkonten = null; @@ -59,7 +59,7 @@ public IOFormat[] getIOFormats(Class objectType) @Override public String getName() { - return MitgliedskontoExportCSV.this.getName(); + return SollbuchungExportCSV.this.getName(); } /** @@ -122,7 +122,7 @@ protected void close(ProgressMonitor monitor) } Map map = new MitgliedMap().getMap(m, null); - map = new MitgliedskontoMap().getMap(mk, map); + map = new RechnungMap().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 MitgliedskontoMap().getMap(mkto, mp); + map = new RechnungMap().getMap(mkto, mp); writer.write(map, header, processors); monitor.log( "Export: " + Adressaufbereitung.getNameVorname(mkto.getMitglied())); diff --git a/src/de/jost_net/JVerein/io/SpendenbescheinigungExportCSV.java b/src/de/jost_net/JVerein/io/SpendenbescheinigungExportCSV.java new file mode 100644 index 000000000..f2dec589c --- /dev/null +++ b/src/de/jost_net/JVerein/io/SpendenbescheinigungExportCSV.java @@ -0,0 +1,110 @@ +/********************************************************************** + * 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.io; + +import java.io.File; +import java.io.FileWriter; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import org.supercsv.cellprocessor.ConvertNullTo; +import org.supercsv.cellprocessor.FmtNumber; +import org.supercsv.cellprocessor.ift.CellProcessor; +import org.supercsv.io.CsvMapWriter; +import org.supercsv.io.ICsvMapWriter; +import org.supercsv.prefs.CsvPreference; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.rmi.Spendenbescheinigung; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class SpendenbescheinigungExportCSV +{ + + private static CellProcessor[] getProcessors() + { + final CellProcessor[] processors = new CellProcessor[] { + new ConvertNullTo(""), new ConvertNullTo(""), + new ConvertNullTo("", new FmtNumber(Einstellungen.DECIMALFORMAT)), // Betrag + new ConvertNullTo(""), new ConvertNullTo(""), new ConvertNullTo(""), + new ConvertNullTo(""), new ConvertNullTo(""), new ConvertNullTo(""), + new ConvertNullTo(""), }; + + return processors; + } + + public SpendenbescheinigungExportCSV(final File file, + final ArrayList spbList) throws ApplicationException + { + ICsvMapWriter writer = null; + try + { + writer = new CsvMapWriter(new FileWriter(file), + CsvPreference.EXCEL_NORTH_EUROPE_PREFERENCE); + final CellProcessor[] processors = getProcessors(); + Map csvzeile = new HashMap<>(); + + // Header + String[] header = { "Bescheinigungsdatum", "Spendedatum", "Betrag", + "Zeile 1", "Zeile 2", "Zeile 3", "Zeile 4", "Zeile 5", "Zeile 6", + "Zeile 7" }; + writer.writeHeader(header); + + // Einträge + for (Spendenbescheinigung spb : spbList) + { + csvzeile.put(header[0], spb.getBescheinigungsdatum()); + csvzeile.put(header[1], spb.getSpendedatum()); + csvzeile.put(header[2], (Double) spb.getBetrag()); + csvzeile.put(header[3], spb.getZeile1()); + csvzeile.put(header[4], spb.getZeile2()); + csvzeile.put(header[5], spb.getZeile3()); + csvzeile.put(header[6], spb.getZeile4()); + csvzeile.put(header[7], spb.getZeile5()); + csvzeile.put(header[8], spb.getZeile6()); + csvzeile.put(header[9], spb.getZeile7()); + writer.write(csvzeile, header, processors); + } + + GUI.getStatusBar().setSuccessText("Ausgabe fertig"); + writer.close(); + } + catch (Exception e) + { + Logger.error("Error while creating report", e); + throw new ApplicationException("Fehler", e); + } + finally + { + if (writer != null) + { + try + { + writer.close(); + } + catch (Exception e) + { + Logger.error("Error while creating report", e); + throw new ApplicationException("Fehler", e); + } + } + } + } +} diff --git a/src/de/jost_net/JVerein/io/SpendenbescheinigungExportPDF.java b/src/de/jost_net/JVerein/io/SpendenbescheinigungExportPDF.java new file mode 100644 index 000000000..bf54cd360 --- /dev/null +++ b/src/de/jost_net/JVerein/io/SpendenbescheinigungExportPDF.java @@ -0,0 +1,88 @@ +/********************************************************************** + * 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.io; + +import java.io.File; +import java.io.FileOutputStream; +import java.util.ArrayList; + +import com.itextpdf.text.BaseColor; +import com.itextpdf.text.Element; + +import de.jost_net.JVerein.rmi.Spendenbescheinigung; +import de.willuhn.jameica.gui.GUI; +import de.willuhn.logging.Logger; +import de.willuhn.util.ApplicationException; + +public class SpendenbescheinigungExportPDF +{ + + public SpendenbescheinigungExportPDF(final File file, + final ArrayList spbList) + throws ApplicationException + { + try + { + FileOutputStream fos = new FileOutputStream(file); + Reporter reporter = new Reporter(fos, "Spendenbescheinigungen", "", + spbList.size()); + reporter.addHeaderColumn("Bescheinigungsdatum", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Spendedatum", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Betrag", Element.ALIGN_RIGHT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Zeile 1", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Zeile 2", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Zeile 3", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Zeile 4", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Zeile 5", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Zeile 5", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.addHeaderColumn("Zeile 7", Element.ALIGN_LEFT, 10, + BaseColor.LIGHT_GRAY); + reporter.createHeader(); + for (Spendenbescheinigung spb : spbList) + { + reporter.addColumn(spb.getBescheinigungsdatum(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getSpendedatum(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getBetrag()); + reporter.addColumn(spb.getZeile1(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getZeile2(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getZeile3(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getZeile4(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getZeile5(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getZeile6(), Element.ALIGN_LEFT); + reporter.addColumn(spb.getZeile7(), Element.ALIGN_LEFT); + } + reporter.closeTable(); + reporter.close(); + fos.close(); + GUI.getStatusBar().setSuccessText("Ausgabe fertig."); + } + catch (Exception e) + { + Logger.error("error while creating report", e); + throw new ApplicationException("Fehler", e); + } + } +} diff --git a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java index 6705dea8e..b80aac763 100644 --- a/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java +++ b/src/de/jost_net/JVerein/io/SplitbuchungsContainer.java @@ -158,6 +158,7 @@ public static void aufloesen() throws RemoteException, ApplicationException if (b.getSplitTyp() == SplitbuchungTyp.HAUPT) { b.setSplitId(null); + b.setSplitTyp(null); b.store(); } else @@ -289,7 +290,7 @@ private static Buchung getGegenbuchung(Buchung b) throws RemoteException buch.setAuszugsnummer(b.getAuszugsnummer()); buch.setBetrag(b.getBetrag() * -1); buch.setBlattnummer(b.getBlattnummer()); - buch.setBuchungsart(b.getBuchungsartId()); + buch.setBuchungsartId(b.getBuchungsartId()); buch.setBuchungsklasseId(b.getBuchungsklasseId()); buch.setDatum(b.getDatum()); buch.setKommentar(b.getKommentar()); @@ -311,7 +312,7 @@ private static Buchung getSplitbuchung(Buchung master, Buchung origin) throws Re buch.setAuszugsnummer(master.getAuszugsnummer()); buch.setBetrag(origin.getBetrag()); buch.setBlattnummer(master.getBlattnummer()); - buch.setBuchungsart(origin.getBuchungsartId()); + buch.setBuchungsartId(origin.getBuchungsartId()); buch.setBuchungsklasseId(origin.getBuchungsklasseId()); buch.setDatum(master.getDatum()); buch.setKommentar(origin.getKommentar()); diff --git a/src/de/jost_net/JVerein/io/VCardTool.java b/src/de/jost_net/JVerein/io/VCardTool.java index ecc94268f..fcdfbdcd6 100644 --- a/src/de/jost_net/JVerein/io/VCardTool.java +++ b/src/de/jost_net/JVerein/io/VCardTool.java @@ -21,6 +21,7 @@ import java.util.Date; import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.gui.input.GeschlechtInput; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.rmi.Mitglied; import ezvcard.VCard; @@ -56,25 +57,28 @@ public static VCard[] getVCards(ArrayList mitglieder) vcard.setBirthday(bd); } - if (m.getGeschlecht().equalsIgnoreCase("m")) + if(m.getGeschlecht() != null) { - vcard.setGender(Gender.male()); - } - if (m.getGeschlecht().equalsIgnoreCase("w")) - { - vcard.setGender(Gender.female()); - } - if (m.getGeschlecht().equalsIgnoreCase("o")) - { - vcard.setGender(Gender.other()); - } - if (m.getPersonenart().equalsIgnoreCase("n")) - { - StructuredName n = new StructuredName(); - n.setFamily(m.getName()); - n.setGiven(m.getVorname()); - // n.addPrefix("Mr"); - vcard.setStructuredName(n); + if (m.getGeschlecht().equalsIgnoreCase(GeschlechtInput.MAENNLICH)) + { + vcard.setGender(Gender.male()); + } + if (m.getGeschlecht().equalsIgnoreCase(GeschlechtInput.WEIBLICH)) + { + vcard.setGender(Gender.female()); + } + if (m.getGeschlecht().equalsIgnoreCase(GeschlechtInput.OHNEANGABE)) + { + vcard.setGender(Gender.other()); + } + if (m.getPersonenart().equalsIgnoreCase("n")) + { + StructuredName n = new StructuredName(); + n.setFamily(m.getName()); + n.setGiven(m.getVorname()); + // n.addPrefix("Mr"); + vcard.setStructuredName(n); + } } vcard.setFormattedName(Adressaufbereitung.getVornameName(m)); diff --git a/src/de/jost_net/JVerein/keys/Kontoart.java b/src/de/jost_net/JVerein/keys/Kontoart.java new file mode 100644 index 000000000..1e69928af --- /dev/null +++ b/src/de/jost_net/JVerein/keys/Kontoart.java @@ -0,0 +1,70 @@ +/********************************************************************** + * 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.keys; + +public enum Kontoart +{ + // LIMIT ist keine Kontoart sondern dient zur Abgrenzung. + // Ids unter dem Limit werden regulär im Buchungsklassensaldo und Kontensaldo + // berücksichtigt. + // Ids über dem Limit werden in beiden Salden ignoriert. + GELD(1, "Geldkonto"), + ANLAGE(2, "Anlagenkonto"), + VERBINDLICHKEITEN(3, "Verbindlichkeitskonto"), + LIMIT(100, "-- Limit --"), + RUECKLAGE(101, "Rücklagenkonto nach § 62 Abs. 1 AO"), + VERMOEGEN(102, "Vermögenskonto nach § 62 Abs. 3 und 4 AO"), + SONSTIGE_RUECKLAGEN(103, "Konto für sonstige Rücklagen"); + + private final String text; + + private final int key; + + Kontoart(int key, String text) + { + this.key = key; + this.text = text; + } + + public int getKey() + { + return key; + } + + public String getText() + { + return text; + } + + public static Kontoart getByKey(int key) + { + for (Kontoart art : Kontoart.values()) + { + if (art.getKey() == key) + { + return art; + } + } + return null; + } + + @Override + public String toString() + { + return getText(); + } +} diff --git a/src/de/jost_net/JVerein/keys/Staat.java b/src/de/jost_net/JVerein/keys/Staat.java new file mode 100644 index 000000000..881ed66df --- /dev/null +++ b/src/de/jost_net/JVerein/keys/Staat.java @@ -0,0 +1,160 @@ +/********************************************************************** + * 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.keys; + +import java.rmi.RemoteException; + +public enum Staat +{ + //Abchasien (Georgien) + AB ("ABCHASIEN"), + AL ("ALBANIEN"), + AD ("ANDORRA"), + AM ("ARMENIEN"), + AZ ("ASERBAIDSCHAN"), + BY ("BELARUS"), + BE ("BELGIEN"), + //Bergkarabach (Armenien/Aserbaidschan) + AR ("BERGKARABACH"), + BA ("BOSNIEN UND HERZEGOWINA"), + BG ("BULGARIEN"), + DK ("DÄNEMARK"), + DE ("DEUTSCHLAND"), + EE ("ESTLAND"), + FI ("FINNLAND"), + FR ("FRANKREICH"), + GE ("GEORGIEN"), + GR ("GRIECHENLAND"), + IE ("IRLAND"), + IS ("ISLAND"), + IT ("ITALIEN"), + CA ("KANADA"), + KZ ("KASACHSTAN"), + XK ("KOSOVO"), + HR ("KROATIEN"), + LV ("LETTLAND"), + LI ("LIECHTENSTEIN"), + LT ("LITAUEN"), + LU ("LUXEMBURG"), + MT ("MALTA"), + MD ("MOLDAU, REPUBLIK"), + MC ("MONACO"), + ME ("MONTENEGRO"), + NL ("NIEDERLANDE"), + MK ("NORDMAZEDONIEN"), + //Nordzypern (Türkei) + NC ("NORDZYPERN"), + NO ("NORWEGEN"), + AT ("ÖSTERREICH"), + PL ("POLEN"), + PT ("PORTUGAL"), + RO ("RUMÄNIEN"), + RU ("RUSSISCHE FÖDERATION"), + SM ("SAN MARINO"), + SE ("SCHWEDEN"), + CH ("SCHWEIZ"), + RS ("SERBIEN"), + SK ("SLOWAKEI"), + SI ("SLOWENIEN"), + ES ("SPANIEN"), + //Südossetien (Georgien) + SO ("SÜDOSSETIEN"), + //Transnistrien (Republik Moldau) + TN ("TRANSNISTRIEN"), + CZ ("TSCHECHIEN"), + TR ("TÜRKEI"), + UA ("UKRAINE"), + HU ("UNGARN"), + VA ("VATIKANSTADT"), + US ("VEREINIGTE STAATEN VON AMERIKA"), + GB ("VEREINIGTES KÖNIGREICH"), + CY ("ZYPERN"); + + private final String text; + + Staat(String text) + { + this.text = text; + } + + public String getText() + { + return text; + } + + public String getKey() + { + return this.name(); + } + + public static Staat getByKey(String key) + { + if(key == null) + { + return null; + } + for (Staat s : Staat.values()) + { + if (s.getKey().equals(key.toUpperCase())) + { + return s; + } + } + return null; + } + + public static Staat getByText(String text) + { + if(text == null) + { + return null; + } + for (Staat s : Staat.values()) + { + if (s.getText().equals(text.toUpperCase())) + { + return s; + } + } + return null; + } + + public static String getStaat(String code) throws RemoteException + { + if (Staat.getByKey(code) != null) + { + return Staat.getByKey(code).getText(); + } + // Wenn der Code nicht vorhanden ist, nehmen wir + // zur Kompatibilität den Text wie er in der DB Steht + return code; + } + + public static String getStaatCode(String code) throws RemoteException + { + // Wenn noch das ganze Land drin steht, bestimmen wir den Code + if (Staat.getByText(code) != null) + return Staat.getByText(code).getKey(); + return code; + } + + @Override + public String toString() + { + return getText(); + } +} diff --git a/src/de/jost_net/JVerein/keys/SuchSpendenart.java b/src/de/jost_net/JVerein/keys/SuchSpendenart.java new file mode 100644 index 000000000..3e9eca25b --- /dev/null +++ b/src/de/jost_net/JVerein/keys/SuchSpendenart.java @@ -0,0 +1,69 @@ +/********************************************************************** + * 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.keys; + +/** + * Suchspendenart + */ +public enum SuchSpendenart +{ + + ALLE(1, "Alle"), + GELDSPENDE(2, "Geldspende"), + SACHSPENDE(3, "Sachspende"), + ERSTATTUNGSVERZICHT(4, "Geldspende mit Erstattungsverzicht"), + GELDSPENDE_ECHT(5, "Geldspende ohne Erstattungsverzicht"), + SACHSPENDE_ERSTATTUNGSVERZICHT(6, "Sachspende oder Geldspende mit Erstattungsverzicht"); + + private final String text; + + private final int key; + + SuchSpendenart(int key, String text) + { + this.key = key; + this.text = text; + } + + public int getKey() + { + return key; + } + + public String getText() + { + return text; + } + + public static SuchSpendenart getByKey(int key) + { + for (SuchSpendenart sb : SuchSpendenart.values()) + { + if (sb.getKey() == key) + { + return sb; + } + } + return null; + } + + @Override + public String toString() + { + return getText(); + } +} diff --git a/src/de/jost_net/JVerein/keys/Zahlungsweg.java b/src/de/jost_net/JVerein/keys/Zahlungsweg.java index 9fa9e3fd6..c34ea987f 100644 --- a/src/de/jost_net/JVerein/keys/Zahlungsweg.java +++ b/src/de/jost_net/JVerein/keys/Zahlungsweg.java @@ -24,6 +24,8 @@ public class Zahlungsweg { + public static final int STANDARD = 0; + public static final int BASISLASTSCHRIFT = 1; public static final int ÜBERWEISUNG = 2; @@ -53,6 +55,8 @@ public static String get(int key) { switch (key) { + case STANDARD: + return "Standard"; case BASISLASTSCHRIFT: return "Basislastschrift"; case ÜBERWEISUNG: diff --git a/src/de/jost_net/JVerein/rmi/Buchung.java b/src/de/jost_net/JVerein/rmi/Buchung.java index 5324ded81..ad94f5d59 100644 --- a/src/de/jost_net/JVerein/rmi/Buchung.java +++ b/src/de/jost_net/JVerein/rmi/Buchung.java @@ -79,7 +79,7 @@ public interface Buchung extends DBObject public Long getBuchungsartId() throws RemoteException; - public void setBuchungsart(Long buchungsart) throws RemoteException; + public void setBuchungsartId(Long buchungsart) throws RemoteException; public Buchungsklasse getBuchungsklasse() throws RemoteException; diff --git a/src/de/jost_net/JVerein/rmi/Buchungsart.java b/src/de/jost_net/JVerein/rmi/Buchungsart.java index 09a3263fa..406d9efd4 100644 --- a/src/de/jost_net/JVerein/rmi/Buchungsart.java +++ b/src/de/jost_net/JVerein/rmi/Buchungsart.java @@ -50,7 +50,7 @@ public interface Buchungsart extends DBObject public Buchungsart getSteuerBuchungsart() throws RemoteException; - public void setSteuerBuchungsart(Integer steuer_buchungsart) throws RemoteException; + public void setSteuerBuchungsart(Long steuer_buchungsart) throws RemoteException; public int getStatus() throws RemoteException; diff --git a/src/de/jost_net/JVerein/rmi/Einstellung.java b/src/de/jost_net/JVerein/rmi/Einstellung.java index e014c44c2..619119342 100644 --- a/src/de/jost_net/JVerein/rmi/Einstellung.java +++ b/src/de/jost_net/JVerein/rmi/Einstellung.java @@ -616,4 +616,15 @@ public void setCt1SepaVersion(SepaVersion sepaversion) public void setBeitragAltersstufen(String altersstufen) throws RemoteException; + public void setUStID(String ustid) throws RemoteException; + + public String getUStID() throws RemoteException; + + public void setStaat(String land) throws RemoteException; + + public String getStaat() throws RemoteException; + + public Boolean getMittelverwendung() throws RemoteException; + + public void setMittelverwendung(Boolean mittelverwendung) throws RemoteException; } diff --git a/src/de/jost_net/JVerein/rmi/Konto.java b/src/de/jost_net/JVerein/rmi/Konto.java index f7f8db16c..0f4840504 100644 --- a/src/de/jost_net/JVerein/rmi/Konto.java +++ b/src/de/jost_net/JVerein/rmi/Konto.java @@ -19,6 +19,7 @@ import java.rmi.RemoteException; import java.util.Date; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.util.Geschaeftsjahr; import de.willuhn.datasource.rmi.DBIterator; import de.willuhn.datasource.rmi.DBObject; @@ -51,11 +52,10 @@ public interface Konto extends DBObject public void setBuchungsartId(Long buchungsartId) throws RemoteException; - public Boolean getAnlagenkonto() throws RemoteException; + public Kontoart getKontoArt() throws RemoteException; + + public void setKontoArt(Kontoart kontoart) throws RemoteException; - public void setAnlagenkonto(Boolean anlagenkonto) - throws RemoteException; - public Buchungsart getAnlagenart() throws RemoteException; public Long getAnlagenartId() throws RemoteException; diff --git a/src/de/jost_net/JVerein/rmi/Mitglied.java b/src/de/jost_net/JVerein/rmi/Mitglied.java index 25fe584a5..7b01d8ba7 100644 --- a/src/de/jost_net/JVerein/rmi/Mitglied.java +++ b/src/de/jost_net/JVerein/rmi/Mitglied.java @@ -225,4 +225,10 @@ public void setIndividuellerBeitrag(Double individuellerbeitrag) public Map getVariablen() throws RemoteException; + public String getKtoiStaatCode() throws RemoteException; + + public String getLeitwegID() throws RemoteException; + + public void setLeitwegID(String leitwegid) throws RemoteException; + } diff --git a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java index 485ddaf8f..86ba4bc37 100644 --- a/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java +++ b/src/de/jost_net/JVerein/rmi/Mitgliedskonto.java @@ -29,6 +29,8 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) throws RemoteException; public Mitglied getMitglied() throws RemoteException; + + public String getMitgliedId() throws RemoteException; public void setMitglied(Mitglied mitglied) throws RemoteException; @@ -65,10 +67,18 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) 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/rmi/Rechnung.java b/src/de/jost_net/JVerein/rmi/Rechnung.java new file mode 100644 index 000000000..49caf8946 --- /dev/null +++ b/src/de/jost_net/JVerein/rmi/Rechnung.java @@ -0,0 +1,118 @@ +/********************************************************************** + * 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.ArrayList; +import java.util.Date; + +import de.jost_net.JVerein.io.IAdresse; +import de.willuhn.datasource.rmi.DBObject; + +public interface Rechnung extends DBObject, IAdresse +{ + public Mitglied getMitglied() throws RemoteException; + + public void setMitglied(int mitglied) throws RemoteException; + + public void setFormular(Formular formular) throws RemoteException; + + double getBetrag() throws RemoteException; + + void setBetrag(double betrag) throws RemoteException; + + public void setDatum(Date date) throws RemoteException; + + public Date getDatum() throws RemoteException; + + public ArrayList getMitgliedskontoList() throws RemoteException; + + public Formular getFormular() throws RemoteException; + + public void setAnrede(String anrede) throws RemoteException; + + @Override + public String getTitel() throws RemoteException; + + public void setTitel(String titel) throws RemoteException; + + @Override + public String getName() throws RemoteException; + + public void setName(String name) throws RemoteException; + + @Override + public String getVorname() throws RemoteException; + + public void setVorname(String vorname) throws RemoteException; + + @Override + public String getStrasse() throws RemoteException; + + public void setStrasse(String strasse) throws RemoteException; + + @Override + public String getAdressierungszusatz() throws RemoteException; + + public void setAdressierungszusatz(String adressierungszusatz) + throws RemoteException; + + @Override + public String getPlz() throws RemoteException; + + public void setPlz(String plz) throws RemoteException; + + @Override + public String getOrt() throws RemoteException; + + @Override + public String getStaat() throws RemoteException; + + public void setOrt(String ort) throws RemoteException; + + public void setStaat(String staat) throws RemoteException; + + @Override + public String getGeschlecht() throws RemoteException; + + public void setGeschlecht(String geschlecht) throws RemoteException; + + @Override + public String getAnrede() throws RemoteException; + + void setPersonenart(String personenart) throws RemoteException; + + public String getMandatID() throws RemoteException; + + public void setMandatID(String id) throws RemoteException; + + public Date getMandatDatum() throws RemoteException; + + public void setMandatDatum(Date datum) throws RemoteException; + + public String getBIC() throws RemoteException; + + public void setBIC(String bic) throws RemoteException; + + public String getIBAN() throws RemoteException; + + public void setIBAN(String iban) throws RemoteException; + + public String getLeitwegID() throws RemoteException; + + public void setLeitwegID(String leitwegid) throws RemoteException; +} diff --git a/src/de/jost_net/JVerein/rmi/Spendenbescheinigung.java b/src/de/jost_net/JVerein/rmi/Spendenbescheinigung.java index 2e79e4598..4a1480556 100644 --- a/src/de/jost_net/JVerein/rmi/Spendenbescheinigung.java +++ b/src/de/jost_net/JVerein/rmi/Spendenbescheinigung.java @@ -19,7 +19,6 @@ import java.rmi.RemoteException; import java.util.Date; import java.util.List; -import java.util.Map; import de.willuhn.datasource.rmi.DBObject; @@ -87,30 +86,40 @@ public void setErsatzAufwendungen(Boolean ersatzaufwendungen) public void setMitgliedID(Integer mitglied) throws RemoteException; /** - * Liefert als Kennzeichen zurück, ob die Spendenbescheinigung eine + * Liefert als Kennzeichen zurück, ob die Spendenbescheinigung eine * Sammelbestaetigung ist. Dies ist der Fall, wenn die Liste der Buchungen - * mehr als eine Buchung enthält. Ist keine oder nur eine Buchung zugewiesen, - * liegt eine Einzelbestätigung vor. + * mehr als eine Buchung enthält. Ist keine oder nur eine Buchung zugewiesen, + * liegt eine Einzelbestätigung vor. * - * @return Flag, ob Sammelbestätigung + * @return Flag, ob Sammelbestätigung * @throws RemoteException */ public boolean isSammelbestaetigung() throws RemoteException; /** - * Fügt der Liste der Buchungen eine Buchung hinzu. Der Gesamtbetrag der - * Spendenbescheinigung wird anhand der Einzelbeträge der Buchungen berechnet. + * Liefert als Kennzeichen zurück, ob die Spendenbescheinigung eine echte + * Geldspende ist. Dies ist der Fall, wenn es sich um eine Gelspende handelt + * bei der bei keiner Buchung das Flag Erstattungsverzicht gesetzt ist. + * + * @return Flag, ob echte Geldspende + * @throws RemoteException + */ + public boolean isEchteGeldspende() throws RemoteException; + + /** + * Fügt der Liste der Buchungen eine Buchung hinzu. Der Gesamtbetrag der + * Spendenbescheinigung wird anhand der Einzelbeträge der Buchungen berechnet. * Die Spendenart wird auf "GELDSPENDE" gesetzt. * * @param buchung - * Die Buchung zum Hinzufügen + * Die Buchung zum Hinzufügen */ public void addBuchung(Buchung buchung) throws RemoteException; /** - * Hängt eine Buchung an die Spendenbescheinigung, wenn es eine - * Einzelbestätigung werden soll. Sollten vorher schon Buchungen eingetragen - * worden sein, wird die Liste der Buchungen vorher gelöscht. + * Hängt eine Buchung an die Spendenbescheinigung, wenn es eine + * Einzelbestätigung werden soll. Sollten vorher schon Buchungen eingetragen + * worden sein, wird die Liste der Buchungen vorher gelöscht. * * @param buchung * Die Buchung, die der Spendenbescheinigung zugeordnet wird @@ -118,10 +127,10 @@ public void setErsatzAufwendungen(Boolean ersatzaufwendungen) public void setBuchung(Buchung buchung) throws RemoteException; /** - * Liefert die Liste der Buchungen einer Spendenbescheinigung zurück. Falls + * Liefert die Liste der Buchungen einer Spendenbescheinigung zurück. Falls * die Liste noch nicht angelegt wurde, wird sie aus der Datenbank * nachgeladen. Sollten der Spendenbescheinigung noch keine Buchungen - * zugeordnet sein, wird eine leere Liste zurückgegeben.
+ * zugeordnet sein, wird eine leere Liste zurückgegeben.
* Beim Laden der Buchungen wird der Gesamtbetrag berechnet * * @return Liste der der Spendenbescheinigung zugeordneten Buchungen @@ -142,9 +151,6 @@ public void setBezeichnungSachzuwendung(String bezeichungsachzuwendung) public void setUnterlagenWertermittlung(Boolean unterlagenwertermittlung) throws RemoteException; - public Map getMap(Map inma) - throws RemoteException; - /** * Gibt an, ob die Spendenbescheinigung automaitsch oder manuell erstellt * wurde. @@ -165,4 +171,6 @@ public Map getMap(Map inma) */ public void setAutocreate(Boolean autocreate) throws RemoteException; + public Date getZeitraumBis() throws RemoteException; + } diff --git a/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java b/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java index 20bec0a8f..f8c328ec0 100644 --- a/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java +++ b/src/de/jost_net/JVerein/rmi/Zusatzbetrag.java @@ -19,6 +19,7 @@ import java.rmi.RemoteException; import java.util.Date; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.willuhn.datasource.rmi.DBObject; public interface Zusatzbetrag extends DBObject @@ -59,6 +60,8 @@ public interface Zusatzbetrag extends DBObject public boolean isAktiv(Date datum) throws RemoteException; + public boolean isOffen(Date datum) throws RemoteException; + public void naechsteFaelligkeit() throws RemoteException; public void vorherigeFaelligkeit() throws RemoteException; @@ -72,4 +75,8 @@ public interface Zusatzbetrag extends DBObject public Long getBuchungsklasseId() throws RemoteException; public void setBuchungsklasseId(Long buchungsklasseId) throws RemoteException; + + public Zahlungsweg getZahlungsweg() throws RemoteException; + + void setZahlungsweg(Zahlungsweg zahlungsweg) throws RemoteException; } diff --git a/src/de/jost_net/JVerein/rmi/ZusatzbetragVorlage.java b/src/de/jost_net/JVerein/rmi/ZusatzbetragVorlage.java index e58746ee8..e50254c5c 100644 --- a/src/de/jost_net/JVerein/rmi/ZusatzbetragVorlage.java +++ b/src/de/jost_net/JVerein/rmi/ZusatzbetragVorlage.java @@ -19,6 +19,7 @@ import java.rmi.RemoteException; import java.util.Date; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.willuhn.datasource.rmi.DBObject; public interface ZusatzbetragVorlage extends DBObject @@ -59,4 +60,8 @@ public interface ZusatzbetragVorlage extends DBObject public Long getBuchungsklasseId() throws RemoteException; public void setBuchungsklasseId(Long buchungsklasseId) throws RemoteException; + + public Zahlungsweg getZahlungsweg() throws RemoteException; + + public void setZahlungsweg(Zahlungsweg value) throws RemoteException; } diff --git a/src/de/jost_net/JVerein/server/BuchungImpl.java b/src/de/jost_net/JVerein/server/BuchungImpl.java index ee1ebbe72..4ed21657e 100644 --- a/src/de/jost_net/JVerein/server/BuchungImpl.java +++ b/src/de/jost_net/JVerein/server/BuchungImpl.java @@ -80,7 +80,7 @@ protected void deleteCheck() throws ApplicationException if (this.getSpendenbescheinigung() != null) { throw new ApplicationException( - "Buchung kann nicht gelöscht werden weil sie zu eine " + "Buchung kann nicht gelöscht werden weil sie zu einer " + "Spendenbescheinigung gehört"); } } @@ -97,7 +97,7 @@ protected void deleteCheck() throws ApplicationException "Buchung kann nicht gelöscht werden. Siehe system log"); } } - + @Override protected void insertCheck() throws ApplicationException { @@ -134,7 +134,7 @@ public void plausi() throws RemoteException, ApplicationException cal2.add(Calendar.YEAR, 10); if (cal1.after(cal2)) { - throw new ApplicationException("Buchungsdatum liegt mehr als 10 Jahre in der Zukunft"); + throw new ApplicationException("Buchungsdatum liegt mehr als 10 Jahre in der Zukunft"); } cal2.add(Calendar.YEAR, -20); if (cal1.before(cal2)) @@ -168,6 +168,22 @@ public void plausi() throws RemoteException, ApplicationException { throw new ApplicationException("Buchungsart fehlt bei Splitbuchung!"); } + + if (getSpendenbescheinigung() != null) + { + if (getBuchungsart() == null) + { + throw new ApplicationException( + "Buchungsart kann nicht gelöscht werden da " + + "eine Spendenbescheinigung zugeordnet ist!"); + } + if (getBuchungsart() != null && !getBuchungsart().getSpende()) + { + throw new ApplicationException( + "Buchungsart kann nicht in eine Buchungsart ohne der Eigenschaft Spende " + + "geändert werden da eine Spendenbescheinigung zugeordnet ist!"); + } + } } @Override @@ -313,7 +329,7 @@ public void setBetragNull() throws RemoteException { setAttribute("betrag", null); } - + @Override public String getZweck() throws RemoteException { @@ -383,15 +399,15 @@ public Buchungsart getBuchungsart() throws RemoteException @Override public Long getBuchungsartId() throws RemoteException { - return Long.parseLong(getBuchungsart().getID()); + return (Long) super.getAttribute("buchungsart"); } @Override - public void setBuchungsart(Long buchungsart) throws RemoteException + public void setBuchungsartId(Long buchungsartId) throws RemoteException { - setAttribute("buchungsart", buchungsart); + setAttribute("buchungsart", buchungsartId); } - + @Override public Buchungsklasse getBuchungsklasse() throws RemoteException { @@ -410,7 +426,7 @@ public Long getBuchungsklasseId() throws RemoteException { return (Long) super.getAttribute("buchungsklasse"); } - + @Override public void setBuchungsklasseId(Long buchungsklasseId) throws RemoteException { @@ -441,7 +457,7 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) { setAttribute("abrechnungslauf", Long.valueOf(abrechnungslauf.getID())); } - + @Override public Jahresabschluss getAbschluss() throws RemoteException { @@ -563,7 +579,7 @@ public void setSpendenbescheinigungId(Long spendenbescheinigung) { setAttribute("spendenbescheinigung", spendenbescheinigung); } - + @Override public int getDependencyId() throws RemoteException { @@ -601,7 +617,7 @@ public Map getMap(Map inma) } map.put(BuchungVar.ABRECHNUNGSLAUF.getName(), (this.getAbrechnungslauf() != null - ? this.getAbrechnungslauf().getDatum() + ? this.getAbrechnungslauf().getDatum() : "")); map.put(BuchungVar.ART.getName(), StringTool.toNotNullString(this.getArt())); @@ -658,8 +674,8 @@ public Map getMap(Map inma) this.getKonto() != null ? this.getKonto().getNummer() : ""); map.put(BuchungVar.MITGLIEDSKONTO.getName(), this.getMitgliedskonto() != null - ? Adressaufbereitung - .getNameVorname(this.getMitgliedskonto().getMitglied()) + ? Adressaufbereitung + .getNameVorname(this.getMitgliedskonto().getMitglied()) : ""); map.put(BuchungVar.NAME.getName(), this.getName()); map.put(BuchungVar.ZWECK1.getName(), @@ -685,16 +701,16 @@ public Object getAttribute(String fieldName) throws RemoteException if ("buchungsart".equals(fieldName)) return getBuchungsart(); - + if ("buchungsklasse".equals(fieldName)) return getBuchungsklasse(); if ("konto".equals(fieldName)) return getKonto(); - + if ("mitgliedskonto".equals(fieldName)) - return getMitgliedskonto(); - + return getMitgliedskonto(); + if ("document".equals(fieldName)) { DBIterator list = Einstellungen.getDBService() @@ -798,7 +814,7 @@ public boolean isToDelete() { return delete; } - + @Override public void delete() throws RemoteException, ApplicationException { @@ -814,13 +830,13 @@ public void delete() throws RemoteException, ApplicationException } super.delete(); } - + @Override public void store() throws RemoteException, ApplicationException { store(true); } - + @Override public void store(boolean check) throws RemoteException, ApplicationException { @@ -839,5 +855,5 @@ public void store(boolean check) throws RemoteException, ApplicationException // können. In diesem Fall wird mit check false gespeichert. super.store(); } - + } diff --git a/src/de/jost_net/JVerein/server/BuchungsartImpl.java b/src/de/jost_net/JVerein/server/BuchungsartImpl.java index e8f564376..74f16ede4 100644 --- a/src/de/jost_net/JVerein/server/BuchungsartImpl.java +++ b/src/de/jost_net/JVerein/server/BuchungsartImpl.java @@ -89,10 +89,6 @@ protected void updateCheck() throws ApplicationException @Override protected Class getForeignObject(String arg0) { - if ("buchungsklasse".equals(arg0)) - { - return Buchungsklasse.class; - } return null; } @@ -160,7 +156,14 @@ public void setStatus(int status) throws RemoteException @Override public Buchungsklasse getBuchungsklasse() throws RemoteException { - return (Buchungsklasse) getAttribute("buchungsklasse"); + 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 @@ -220,7 +223,7 @@ public Buchungsart getSteuerBuchungsart() throws RemoteException } @Override - public void setSteuerBuchungsart(Integer steuer_buchungsart) throws RemoteException + public void setSteuerBuchungsart(Long steuer_buchungsart) throws RemoteException { setAttribute("steuer_buchungsart", steuer_buchungsart); } @@ -280,6 +283,10 @@ else if (fieldName.equals("steuerbuchungsart")) { return getSteuerBuchungsart(); } + else if (fieldName.equals("buchungsklasse")) + { + return getBuchungsklasse(); + } else { return super.getAttribute(fieldName); diff --git a/src/de/jost_net/JVerein/server/DDLTool/AbstractDDLUpdate.java b/src/de/jost_net/JVerein/server/DDLTool/AbstractDDLUpdate.java index e8e7bf9c0..c70c181db 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/AbstractDDLUpdate.java +++ b/src/de/jost_net/JVerein/server/DDLTool/AbstractDDLUpdate.java @@ -203,7 +203,7 @@ public String alterColumnNotNull(String table, Column col) { case H2: return "ALTER TABLE " + table + " ALTER COLUMN " + col.getName() - + " SET NULL\n"; + + " SET NOT NULL;\n"; case MYSQL: return "ALTER TABLE " + table + " MODIFY COLUMN " + col.getName() + " " + getType(col) + ";\n"; diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0363.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0363.java index 23655b73d..328322a84 100644 --- a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0363.java +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0363.java @@ -33,8 +33,17 @@ public Update0363(String driver, ProgressMonitor monitor, Connection conn) @Override public void run() throws ApplicationException { - // Liquibase id=99 - execute(addColumn("einstellung", - new Column("mailsignatur", COLTYPE.VARCHAR, 1000, null, false, false))); + + if (getDriver().equals(DRIVER.MYSQL)) + { + execute("ALTER TABLE einstellung ADD mailsignatur VARCHAR(1000) " + + "CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;"); + } + else + { + // Liquibase id=99 + execute(addColumn("einstellung", new Column("mailsignatur", + COLTYPE.VARCHAR, 1000, null, false, false))); + } } } diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0449.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0449.java new file mode 100644 index 000000000..9d17e50b2 --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0449.java @@ -0,0 +1,35 @@ +/********************************************************************** + * 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.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +import java.sql.Connection; + +public class Update0449 extends AbstractDDLUpdate +{ + public Update0449(String driver, ProgressMonitor monitor, Connection conn) + { + super(driver, monitor, conn); + } + + @Override + public void run() throws ApplicationException + { + execute("update einstellung set sepaversion = 'pain.008.001.02.xsd' where sepaversion IS NULL"); + execute("update einstellung set ct1sepaversion = 'pain.001.001.03.xsd' where ct1sepaversion IS NULL"); + } +} diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0450.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0450.java new file mode 100644 index 000000000..31993d856 --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0450.java @@ -0,0 +1,154 @@ +/********************************************************************** + * 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 Update0450 extends AbstractDDLUpdate +{ + public Update0450(String driver, ProgressMonitor monitor, Connection conn) + { + super(driver, monitor, conn); + } + + @Override + public void run() throws ApplicationException + { + { + //Tebelle rechnung + Table t = new Table("rechnung"); + Column pk = new Column("id", COLTYPE.BIGINT, 10, null, true, true); + t.add(pk); + t.setPrimaryKey(pk); + + Column datum = new Column("datum", COLTYPE.DATE, 10, null, true, + false); + t.add(datum); + + Column mitglied = new Column("mitglied", COLTYPE.BIGINT, 10, + null, true, false); + t.add(mitglied); + + Column formular = new Column("formular", COLTYPE.BIGINT, 10, + null, true, false); + t.add(formular); + + Column betrag = new Column("betrag", COLTYPE.DOUBLE, 10, + null, true, false); + t.add(betrag); + + Column personenart = new Column("personenart", COLTYPE.VARCHAR, 1, + null, false, false); + t.add(personenart); + + Column anrede = new Column("anrede", COLTYPE.VARCHAR, 40, + null, false, false); + t.add(anrede); + + Column titel = new Column("titel", COLTYPE.VARCHAR, 40, + null, false, false); + t.add(titel); + + Column name = new Column("name", COLTYPE.VARCHAR, 40, + null, true, false); + t.add(name); + + Column vorname = new Column("vorname", COLTYPE.VARCHAR, 40, + null, false, false); + t.add(vorname); + + Column strasse = new Column("strasse", COLTYPE.VARCHAR, 40, + null, false, false); + t.add(strasse); + + Column adressierungszusatz = new Column("adressierungszusatz", COLTYPE.VARCHAR, 40, + null, false, false); + t.add(adressierungszusatz); + + Column plz = new Column("plz", COLTYPE.VARCHAR, 10, + null, false, false); + t.add(plz); + + Column ort = new Column("ort", COLTYPE.VARCHAR, 40, + null, false, false); + t.add(ort); + + Column staat = new Column("staat", COLTYPE.VARCHAR, 50, + null, false, false); + t.add(staat); + + Column geschlecht = new Column("geschlecht", COLTYPE.VARCHAR, 1, + null, false, false); + t.add(geschlecht); + + Column mandatid = new Column("mandatid", COLTYPE.VARCHAR, 10, + null, false, false); + t.add(mandatid); + + Column mandatdatum = new Column("mandatdatum", COLTYPE.DATE, 10, + null, false, false); + t.add(mandatdatum); + + Column bic = new Column("bic", COLTYPE.VARCHAR, 11, + null, false, false); + t.add(bic); + + Column iban = new Column("iban", COLTYPE.VARCHAR, 34, + null, false, false); + t.add(iban); + + execute(this.createTable(t)); + + //Indexes und ForeignKeys in rechnung + Index idx = new Index("ixRechnung1", false); + idx.add(mitglied); + execute(idx.getCreateIndex("rechnung")); + + execute(this.createForeignKey("fk_rechnung", + "rechnung", "mitglied", "mitglied", "id", + "CASCADE", "RESTRICT")); + + idx = new Index("ixRechnung2", false); + idx.add(formular); + execute(idx.getCreateIndex("rechnung")); + + execute(this.createForeignKey("fk_rechnung2", + "rechnung", "formular", "formular", "id", + "RESTRICT", "RESTRICT")); + + + //Spalte rechnung in mitgliedskonto + Column col = new Column("rechnung", COLTYPE.BIGINT, 0, null, false, + false); + execute(addColumn("mitgliedskonto", col)); + + //Index und ForeignKey in mitgliedskonto + idx = new Index("ixMitgliedskonto5", false); + idx.add(col); + execute(idx.getCreateIndex("mitgliedskonto")); + + execute(this.createForeignKey("fkMitgliedskonto5", + "mitgliedskonto", "rechnung", "rechnung", "id", + "SET NULL", "RESTRICT")); + + } + } +} diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0451.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0451.java new file mode 100644 index 000000000..5261e9156 --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0451.java @@ -0,0 +1,39 @@ +/********************************************************************** + * 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.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +import java.sql.Connection; + +public class Update0451 extends AbstractDDLUpdate +{ + public Update0451(String driver, ProgressMonitor monitor, Connection conn) + { + super(driver, monitor, conn); + } + + @Override + public void run() throws ApplicationException + { + execute(addColumn("zusatzabbuchung", new Column("zahlungsweg", + COLTYPE.INTEGER, 1, "0", true, false))); + + execute(addColumn("zusatzbetragvorlage", new Column("zahlungsweg", + COLTYPE.INTEGER, 1, "0", true, false))); + } +} 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..4823177bd --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0452.java @@ -0,0 +1,39 @@ +/********************************************************************** + * 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.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 + { + execute("update mitgliedskonto set betrag = 0 where betrag IS NULL"); + + Column betrag = new Column("betrag", COLTYPE.DOUBLE, 0, null, true, + false); + execute(alterColumnNotNull("mitgliedskonto", betrag)); + } +} diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0453.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0453.java new file mode 100644 index 000000000..062be341f --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0453.java @@ -0,0 +1,43 @@ +/********************************************************************** + * 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.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +import java.sql.Connection; + +public class Update0453 extends AbstractDDLUpdate +{ + public Update0453(String driver, ProgressMonitor monitor, Connection conn) + { + super(driver, monitor, conn); + } + + @Override + public void run() throws ApplicationException + { + execute(addColumn("konto", new Column("kontoart", + COLTYPE.INTEGER, 0, null, false, false))); + + execute("update konto set kontoart = 1 where anlagenkonto IS NULL"); + execute("update konto set kontoart = 1 where anlagenkonto IS FALSE"); + execute("update konto set kontoart = 2 where anlagenkonto IS TRUE"); + + // Das kann man später machen, so kann man auch wieder in der SW zurück gehen + // execute(dropColumn("konto", "anlagenkonto")); + } +} diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0454.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0454.java new file mode 100644 index 000000000..aca2db396 --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0454.java @@ -0,0 +1,36 @@ +/********************************************************************** + * 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.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +import java.sql.Connection; + +public class Update0454 extends AbstractDDLUpdate +{ + public Update0454(String driver, ProgressMonitor monitor, Connection conn) + { + super(driver, monitor, conn); + } + + @Override + public void run() throws ApplicationException + { + execute(addColumn("einstellung", new Column("mittelverwendung", + COLTYPE.BOOLEAN, 0, "FALSE", false, false))); + } +} diff --git a/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java new file mode 100644 index 000000000..f6c4543ec --- /dev/null +++ b/src/de/jost_net/JVerein/server/DDLTool/Updates/Update0455.java @@ -0,0 +1,47 @@ +/********************************************************************** + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, + * see . + * + **********************************************************************/ +package de.jost_net.JVerein.server.DDLTool.Updates; + +import java.sql.Connection; + +import de.jost_net.JVerein.server.DDLTool.AbstractDDLUpdate; +import de.jost_net.JVerein.server.DDLTool.Column; +import de.willuhn.util.ApplicationException; +import de.willuhn.util.ProgressMonitor; + +public class Update0455 extends AbstractDDLUpdate +{ + public Update0455(String driver, ProgressMonitor monitor, Connection conn) + { + super(driver, monitor, conn); + } + + @Override + public void run() throws ApplicationException + { + { + execute(addColumn("einstellung", + new Column("staat", COLTYPE.CHAR, 2, null, false, false))); + + execute(addColumn("einstellung", + new Column("ustid", COLTYPE.VARCHAR, 20, null, false, false))); + + execute(addColumn("mitglied", + new Column("leitwegid", COLTYPE.VARCHAR, 50, null, false, false))); + + execute(addColumn("rechnung", + new Column("leitwegid", COLTYPE.VARCHAR, 50, null, false, false))); + } + } +} diff --git a/src/de/jost_net/JVerein/server/EigenschaftenNode.java b/src/de/jost_net/JVerein/server/EigenschaftenNode.java index 12e80eab6..daab8b417 100644 --- a/src/de/jost_net/JVerein/server/EigenschaftenNode.java +++ b/src/de/jost_net/JVerein/server/EigenschaftenNode.java @@ -50,10 +50,7 @@ public class EigenschaftenNode implements GenericObjectNode private ArrayList childrens; - private String preset = UNCHECKED; // Gesetzter Status/Icon - - private String base = UNCHECKED; // Wert im Tree nach CHECKED bzw. MINUS - + // Node Typen public static final int NONE = 0; public static final int ROOT = 1; @@ -63,11 +60,8 @@ public class EigenschaftenNode implements GenericObjectNode public static final int EIGENSCHAFTEN = 3; private int nodetype = NONE; - - private Map config = new HashMap<>(); - - private boolean onlyChecked = false; // Nur CHECKED, kein PLUS, MINUS etc. + // Preset und Icon Definition public static final String UNCHECKED = "0"; public static final String PLUS = "1"; @@ -78,23 +72,35 @@ public class EigenschaftenNode implements GenericObjectNode public static final String CHECKED_PARTLY = "4"; + private String preset = UNCHECKED; // Gesetzter Status/Icon + + private String base = UNCHECKED; // Wert im Tree nach CHECKED bzw. MINUS + + private boolean onlyChecked = false; // Nur CHECKED, kein PLUS, MINUS etc. + + private Map config = new HashMap<>(); + + private List eigenschaften = null; + + public EigenschaftenNode(Mitglied mitglied) throws RemoteException { - this(mitglied, "", false, true, null); + this(mitglied, "", true, null); } - public EigenschaftenNode(String vorbelegung, boolean ohnePflicht, + public EigenschaftenNode(String vorbelegung, boolean onlyChecked, Mitglied[] mitglieder) throws RemoteException { - this(null, vorbelegung, ohnePflicht, onlyChecked, mitglieder); + this(null, vorbelegung, onlyChecked, mitglieder); } private EigenschaftenNode(Mitglied mitglied, String vorbelegung, - boolean ohnePflicht, boolean onlyChecked, Mitglied[] mitglieder) + boolean onlyChecked, Mitglied[] mitglieder) throws RemoteException { this.onlyChecked = onlyChecked; + nodetype = ROOT; if (!vorbelegung.isEmpty()) { // Aufruf aus (Nicht-)Mitglied Filter Dialog oder Auswertungen (Nicht-)Mitglied, @@ -164,16 +170,8 @@ else if (counters.get(key) != 0) } } childrens = new ArrayList<>(); - nodetype = ROOT; DBIterator it = Einstellungen.getDBService() .createList(EigenschaftGruppe.class); - if (ohnePflicht) - { - // Pflicht und Maximal Eins wird im Mitglied Kontext Menü -> Eigenschaften - // zur Zeit noch nicht unterstützt - it.addFilter( - "(PFLICHT <> true OR PFLICHT IS NULL) AND (MAX1 <> true OR MAX1 IS NULL)"); - } it.setOrder("order by bezeichnung"); while (it.hasNext()) { @@ -188,9 +186,9 @@ private EigenschaftenNode(EigenschaftenNode parent, boolean onlyChecked, { this.parent = parent; this.onlyChecked = onlyChecked; - childrens = new ArrayList<>(); this.eigenschaftgruppe = eg; nodetype = EIGENSCHAFTGRUPPE; + childrens = new ArrayList<>(); DBIterator it = Einstellungen.getDBService() .createList(Eigenschaft.class); it.addFilter("eigenschaftgruppe = ?", @@ -200,18 +198,19 @@ private EigenschaftenNode(EigenschaftenNode parent, boolean onlyChecked, { Eigenschaft eigenschaft = (Eigenschaft) it.next(); childrens.add(new EigenschaftenNode(this, onlyChecked, eigenschaft, - config)); + eigenschaftgruppe, config)); } } private EigenschaftenNode(EigenschaftenNode parent, boolean onlyChecked, - Eigenschaft eigenschaft, + Eigenschaft eigenschaft, EigenschaftGruppe eg, Map config) throws RemoteException { this.parent = parent; nodetype = EIGENSCHAFTEN; this.onlyChecked = onlyChecked; this.eigenschaft = eigenschaft; + this.eigenschaftgruppe = eg; String eigenschaftenKey = this.eigenschaft.getID(); if (config.containsKey(eigenschaftenKey)) { @@ -395,10 +394,14 @@ public void incPreset() @SuppressWarnings("unchecked") public List getEigenschaften() throws RemoteException { + if (eigenschaften != null) + { + return eigenschaften; + } // Eigenschaften lesen final DBService service = Einstellungen.getDBService(); String sql = "SELECT eigenschaften.* from eigenschaften "; - List mitgliedeigenschaften = (List) service.execute(sql, + eigenschaften = (List) service.execute(sql, new Object[] { }, new ResultSetExtractor() { @Override @@ -412,7 +415,7 @@ public Object extract(ResultSet rs) throws RemoteException, SQLException return list; } }); - return mitgliedeigenschaften; + return eigenschaften; } @SuppressWarnings("rawtypes") @@ -442,6 +445,93 @@ public ArrayList getCheckedNodes() return checkednodes; } + @SuppressWarnings("rawtypes") + public ArrayList getPflichtGruppen() + throws RemoteException + { + // Liefert alle EIGENSCHAFTGRUPPEn bei den Pflicht gesetzt ist + ArrayList plichtGruppen = new ArrayList<>(); + if (this.nodetype == EigenschaftenNode.ROOT) + { + GenericIterator rootit = this.getChildren(); + while (rootit.hasNext()) + { + EigenschaftenNode gruppenNode = (EigenschaftenNode) rootit.next(); + EigenschaftGruppe gruppe = gruppenNode.getEigenschaftGruppe(); + if (gruppe.getPflicht()) + plichtGruppen.add(gruppe); + } + } + return plichtGruppen; + } + + @SuppressWarnings("rawtypes") + public ArrayList getMax1Gruppen() + throws RemoteException + { + // Liefert alle EIGENSCHAFTGRUPPEn bei den Pflicht gesetzt ist + ArrayList max1Gruppen = new ArrayList<>(); + if (this.nodetype == EigenschaftenNode.ROOT) + { + GenericIterator rootit = this.getChildren(); + while (rootit.hasNext()) + { + EigenschaftenNode gruppenNode = (EigenschaftenNode) rootit.next(); + EigenschaftGruppe gruppe = gruppenNode.getEigenschaftGruppe(); + if (gruppe.getMax1()) + max1Gruppen.add(gruppe); + } + } + return max1Gruppen; + } + + @SuppressWarnings("rawtypes") + public EigenschaftenNode getEigenschaftenNode(String eigenschaftId) + throws RemoteException + { + // Liefert den EigenschaftenNode einer Eigenschaft + // Momentan nur für ROOT gebraucht + EigenschaftenNode eigenschaftenNode = null; + if (this.nodetype == EigenschaftenNode.ROOT) + { + GenericIterator rootit = this.getChildren(); + while (rootit.hasNext()) + { + GenericObjectNode gruppe = (GenericObjectNode) rootit.next(); + GenericIterator groupit = gruppe.getChildren(); + while (groupit.hasNext()) + { + eigenschaftenNode = (EigenschaftenNode) groupit.next(); + Eigenschaft eigenschaft = eigenschaftenNode.getEigenschaft(); + if (eigenschaft.getID().equals(eigenschaftId)) + return eigenschaftenNode; + } + } + } + return eigenschaftenNode; + } + + @SuppressWarnings("rawtypes") + public EigenschaftGruppe getEigenschaftGruppe(String gruppeId) + throws RemoteException + { + // Liefert die EigenschaftGruppe zur Id + // Momentan nur für ROOT gebraucht + EigenschaftGruppe eigenschaftGruppe = null; + if (this.nodetype == EigenschaftenNode.ROOT) + { + GenericIterator rootit = this.getChildren(); + while (rootit.hasNext()) + { + EigenschaftenNode gruppeNode = (EigenschaftenNode) rootit.next(); + eigenschaftGruppe = gruppeNode.getEigenschaftGruppe(); + if (eigenschaftGruppe.getID().equals(gruppeId)) + return eigenschaftGruppe; + } + } + return eigenschaftGruppe; + } + // Speichert den Startwert für eine Eigenschaft private class Config { diff --git a/src/de/jost_net/JVerein/server/EinstellungImpl.java b/src/de/jost_net/JVerein/server/EinstellungImpl.java index fbcec5c67..ad2d64482 100644 --- a/src/de/jost_net/JVerein/server/EinstellungImpl.java +++ b/src/de/jost_net/JVerein/server/EinstellungImpl.java @@ -2151,4 +2151,50 @@ public void setBeitragAltersstufen(String altersstufen) throws RemoteException { setAttribute("beitragaltersstufen", altersstufen); } + + @Override + public String getStaat() throws RemoteException + { + String staat = (String) getAttribute("staat"); + if (staat == null || staat.length() == 0) + { + return "DE"; + } + return staat; + } + + @Override + public void setStaat(String staat) throws RemoteException + { + setAttribute("staat", staat); + } + + @Override + public String getUStID() throws RemoteException + { + String ustid = (String) getAttribute("ustid"); + if (ustid == null) + { + return ""; + } + return ustid; + } + + @Override + public void setUStID(String ustid) throws RemoteException + { + setAttribute("ustid", ustid); + } + + public Boolean getMittelverwendung() throws RemoteException + { + return Util.getBoolean(getAttribute("mittelverwendung")); + } + + @Override + public void setMittelverwendung(Boolean mittelverwendung) + throws RemoteException + { + setAttribute("mittelverwendung", mittelverwendung); + } } diff --git a/src/de/jost_net/JVerein/server/JVereinUpdateProvider.java b/src/de/jost_net/JVerein/server/JVereinUpdateProvider.java index a9cff78af..e51f828dd 100644 --- a/src/de/jost_net/JVerein/server/JVereinUpdateProvider.java +++ b/src/de/jost_net/JVerein/server/JVereinUpdateProvider.java @@ -31,7 +31,7 @@ import java.util.Map; import de.jost_net.JVerein.Variable.MitgliedVar; -import de.jost_net.JVerein.Variable.MitgliedskontoVar; +import de.jost_net.JVerein.Variable.RechnungVar; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Einstellung; import de.jost_net.JVerein.rmi.JVereinDBService; @@ -1026,7 +1026,8 @@ private void update0028(Connection conn) throws ApplicationException sb.append(" rechnungfuerbarzahlung CHAR(5),"); sb.append(" UNIQUE (id),"); sb.append(" PRIMARY KEY (id)"); - sb.append(" ) ENGINE=InnoDB;\n"); + sb.append( + " ) ENGINE=InnoDB CHARACTER SET latin1 COLLATE latin1_german1_ci ROW_FORMAT=DYNAMIC;\n"); statements.put(DBSupportMySqlImpl.class.getName(), sb.toString()); execute(conn, statements, 28); @@ -3805,7 +3806,8 @@ private void update0172(Connection conn) throws ApplicationException // Update fuer MySQL sb = new StringBuilder(); - sb.append("ALTER TABLE einstellung ADD strasse char(30) after name;\n"); + sb.append( + "ALTER TABLE einstellung ADD strasse char(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci after name;\n"); statements.put(DBSupportMySqlImpl.class.getName(), sb.toString()); execute(conn, statements, 172); @@ -4360,16 +4362,16 @@ private void update0200(Connection conn) throws ApplicationException + sql1 + MitgliedVar.KUENDIGUNG.getName() + sql2 + KUENDIGUNG + sql3 // + sql1 + MitgliedVar.BEITRAGSGRUPPE_BEZEICHNUNG.getName() + sql2 + BEITRAGSGRUPPE + sql3 // - + sql1 + MitgliedskontoVar.ZAHLUNGSGRUND.getName() + sql2 + + sql1 + RechnungVar.ZAHLUNGSGRUND.getName() + sql2 + ZAHLUNGSGRUND + sql3// - + sql1 + MitgliedskontoVar.ZAHLUNGSGRUND1.getName() + sql2 + + sql1 + RechnungVar.ZAHLUNGSGRUND1.getName() + sql2 + ZAHLUNGSGRUND1 + sql3// - + sql1 + MitgliedskontoVar.ZAHLUNGSGRUND2.getName() + sql2 + + sql1 + RechnungVar.ZAHLUNGSGRUND2.getName() + sql2 + ZAHLUNGSGRUND2 + sql3// - + sql1 + MitgliedskontoVar.BUCHUNGSDATUM.getName() + sql2 + + sql1 + RechnungVar.BUCHUNGSDATUM.getName() + sql2 + BUCHUNGSDATUM + sql3// + sql1 + "tagesdatum" + sql2 + "Tagesdatum" + sql3// - + sql1 + MitgliedskontoVar.BETRAG.getName() + sql2 + BETRAG + sql3// + + sql1 + RechnungVar.BETRAG.getName() + sql2 + BETRAG + sql3// ; Map statements = new HashMap(); // Update fuer H2 @@ -4688,7 +4690,7 @@ private void update0218(Connection conn) throws ApplicationException statements.put(DBSupportH2Impl.class.getName(), "ALTER TABLE einstellung ALTER COLUMN strasse VARCHAR(50);\n"); statements.put(DBSupportMySqlImpl.class.getName(), - "ALTER TABLE einstellung MODIFY COLUMN strasse VARCHAR(50);\n"); + "ALTER TABLE einstellung MODIFY COLUMN strasse VARCHAR(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci;\n"); execute(conn, statements, 218); } @@ -5211,7 +5213,7 @@ private void update0249(Connection conn) throws ApplicationException // Update fuer MySQL sb = new StringBuilder(); sb.append( - "ALTER TABLE einstellung ADD smtp_from_anzeigename varchar(50) after smtp_from_address;\n"); + "ALTER TABLE einstellung ADD smtp_from_anzeigename varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci after smtp_from_address;\n"); statements.put(DBSupportMySqlImpl.class.getName(), sb.toString()); execute(conn, statements, 249); @@ -6890,7 +6892,8 @@ private void update0339(Connection conn) throws ApplicationException private void update0340(Connection conn) throws ApplicationException { Map statements = new HashMap(); - String sql = alterColumn("einstellung", "name", "VARCHAR(70)"); + String sql = alterColumn("einstellung", "name", + "VARCHAR(70) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci"); statements.put(driver, sql); execute(conn, statements, 340); } diff --git a/src/de/jost_net/JVerein/server/KontoImpl.java b/src/de/jost_net/JVerein/server/KontoImpl.java index 8cdbd5f2c..8a72bee84 100644 --- a/src/de/jost_net/JVerein/server/KontoImpl.java +++ b/src/de/jost_net/JVerein/server/KontoImpl.java @@ -21,6 +21,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.keys.AfaMode; +import de.jost_net.JVerein.keys.Kontoart; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Konto; @@ -103,7 +104,7 @@ private void plausi() throws ApplicationException { throw new ApplicationException("Bitte Nummer eingeben"); } - if (getAnlagenkonto()) + if (getKontoArt() == Kontoart.ANLAGE) { if (getBetrag() != null && getBetrag() < 0.0) { @@ -282,16 +283,24 @@ public void setBuchungsartId(Long buchungsartId) throws RemoteException } @Override - public Boolean getAnlagenkonto() throws RemoteException + public Kontoart getKontoArt() throws RemoteException { - return Util.getBoolean(getAttribute("anlagenkonto")); + Integer tmp = (Integer) super.getAttribute("kontoart"); + if (tmp == null) + { + return Kontoart.GELD; + } + else + { + return Kontoart.getByKey((int) super.getAttribute("kontoart")); + } } @Override - public void setAnlagenkonto(Boolean anlagenkonto) + public void setKontoArt(Kontoart kontoart) throws RemoteException { - setAttribute("anlagenkonto", Boolean.valueOf(anlagenkonto)); + setAttribute("kontoart", kontoart.getKey()); } @Override diff --git a/src/de/jost_net/JVerein/server/KursteilnehmerImpl.java b/src/de/jost_net/JVerein/server/KursteilnehmerImpl.java index 3f5a13a99..c4e2a769e 100644 --- a/src/de/jost_net/JVerein/server/KursteilnehmerImpl.java +++ b/src/de/jost_net/JVerein/server/KursteilnehmerImpl.java @@ -22,6 +22,7 @@ import java.util.Date; import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Kursteilnehmer; import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; @@ -275,7 +276,14 @@ public void setOrt(String ort) throws RemoteException @Override public String getStaat() throws RemoteException { - return (String) getAttribute("staat"); + return Staat.getStaat(getStaatCode()); + } + + @Override + public String getStaatCode() throws RemoteException + { + String code = (String) getAttribute("staat"); + return Staat.getStaatCode(code); } @Override diff --git a/src/de/jost_net/JVerein/server/LastschriftImpl.java b/src/de/jost_net/JVerein/server/LastschriftImpl.java index eba6e41d0..9a8ea8552 100644 --- a/src/de/jost_net/JVerein/server/LastschriftImpl.java +++ b/src/de/jost_net/JVerein/server/LastschriftImpl.java @@ -20,6 +20,7 @@ import java.util.Date; import de.jost_net.JVerein.io.IAdresse; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.rmi.Abrechnungslauf; import de.jost_net.JVerein.rmi.Kursteilnehmer; import de.jost_net.JVerein.rmi.Lastschrift; @@ -237,7 +238,14 @@ public void setOrt(String ort) throws RemoteException @Override public String getStaat() throws RemoteException { - return (String) getAttribute("staat"); + return Staat.getStaat(getStaatCode()); + } + + @Override + public String getStaatCode() throws RemoteException + { + String code = (String) getAttribute("staat"); + return Staat.getStaatCode(code); } @Override diff --git a/src/de/jost_net/JVerein/server/MitgliedImpl.java b/src/de/jost_net/JVerein/server/MitgliedImpl.java index 5a8223046..0ab6dc674 100644 --- a/src/de/jost_net/JVerein/server/MitgliedImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedImpl.java @@ -10,7 +10,7 @@ * * 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 **********************************************************************/ @@ -25,10 +25,12 @@ import java.util.Map; import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.gui.input.GeschlechtInput; import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; import de.jost_net.JVerein.keys.ArtBeitragsart; import de.jost_net.JVerein.keys.Datentyp; import de.jost_net.JVerein.keys.SepaMandatIdSource; +import de.jost_net.JVerein.keys.Staat; import de.jost_net.JVerein.keys.Zahlungsrhythmus; import de.jost_net.JVerein.keys.Zahlungstermin; import de.jost_net.JVerein.keys.Zahlungsweg; @@ -45,9 +47,12 @@ import de.jost_net.OBanToo.SEPA.BIC; import de.jost_net.OBanToo.SEPA.IBAN; import de.jost_net.OBanToo.SEPA.SEPAException; +import de.willuhn.datasource.GenericObject; import de.willuhn.datasource.db.AbstractDBObject; import de.willuhn.datasource.rmi.DBIterator; +import de.willuhn.datasource.rmi.DBObject; import de.willuhn.datasource.rmi.DBService; +import de.willuhn.datasource.rmi.Listener; import de.willuhn.datasource.rmi.ResultSetExtractor; import de.willuhn.jameica.messaging.QueryMessage; import de.willuhn.jameica.system.Application; @@ -61,6 +66,8 @@ public class MitgliedImpl extends AbstractDBObject implements Mitglied private static final long serialVersionUID = 1L; + private static MitgliedDummy DUMMY_INSTANCE; + public MitgliedImpl() throws RemoteException { super(); @@ -122,8 +129,8 @@ private void plausi() throws RemoteException, ApplicationException { checkExterneMitgliedsnummer(); - if (getPersonenart() == null - || (!getPersonenart().equalsIgnoreCase("n") && !getPersonenart().equalsIgnoreCase("j"))) + if (getPersonenart() == null || (!getPersonenart().equalsIgnoreCase( + "n") && !getPersonenart().equalsIgnoreCase("j"))) { throw new ApplicationException("Personenstatus ist nicht 'N' oder 'J'"); } @@ -131,19 +138,19 @@ private void plausi() throws RemoteException, ApplicationException { throw new ApplicationException("Bitte Namen eingeben"); } - if (getPersonenart().equalsIgnoreCase("n") - && (getVorname() == null || getVorname().length() == 0)) + if (getPersonenart().equalsIgnoreCase( + "n") && (getVorname() == null || getVorname().length() == 0)) { throw new ApplicationException("Bitte Vornamen eingeben"); } - if (getAdresstyp().getJVereinid() == 1 && getPersonenart().equalsIgnoreCase("n") - && getGeburtsdatum().getTime() == Einstellungen.NODATE.getTime() - && Einstellungen.getEinstellung().getGeburtsdatumPflicht()) + if (getAdresstyp().getJVereinid() == 1 && getPersonenart().equalsIgnoreCase( + "n") && getGeburtsdatum().getTime() == Einstellungen.NODATE.getTime() && Einstellungen.getEinstellung() + .getGeburtsdatumPflicht()) { throw new ApplicationException("Bitte Geburtsdatum eingeben"); } - if (getAdresstyp().getJVereinid() == 1 && getPersonenart().equalsIgnoreCase("n") - && Einstellungen.getEinstellung().getGeburtsdatumPflicht()) + if (getAdresstyp().getJVereinid() == 1 && getPersonenart().equalsIgnoreCase( + "n") && Einstellungen.getEinstellung().getGeburtsdatumPflicht()) { Calendar cal1 = Calendar.getInstance(); cal1.setTime(getGeburtsdatum()); @@ -175,9 +182,8 @@ && getGeburtsdatum().getTime() == Einstellungen.NODATE.getTime() } } - if (getAdresstyp().getJVereinid() == 1 - && getEintritt().getTime() == Einstellungen.NODATE.getTime() - && Einstellungen.getEinstellung().getEintrittsdatumPflicht()) + if (getAdresstyp().getJVereinid() == 1 && getEintritt().getTime() == Einstellungen.NODATE.getTime() && Einstellungen.getEinstellung() + .getEintrittsdatumPflicht()) { throw new ApplicationException("Bitte Eintrittsdatum eingeben"); } @@ -191,6 +197,10 @@ && getEintritt().getTime() == Einstellungen.NODATE.getTime() { throw new ApplicationException("Bitte Datum des Mandat eingeben"); } + else if (getMandatDatum().after(new Date())) + { + throw new ApplicationException("Datum des Mandat liegt in der Zukunft!"); + } } if (getIban() != null && getIban().length() != 0) { @@ -233,7 +243,7 @@ && getEintritt().getTime() == Einstellungen.NODATE.getTime() DBIterator famang = Einstellungen.getDBService() .createList(Mitglied.class); famang.addFilter("zahlerid = " + getID()); - famang.addFilter("(austritt is null or austritt > ?)",getAustritt()); + famang.addFilter("(austritt is null or austritt > ?)", getAustritt()); if (famang.hasNext()) { throw new ApplicationException( @@ -242,27 +252,29 @@ && getEintritt().getTime() == Einstellungen.NODATE.getTime() } } // Ist das Mitglied Teil eines Familienverbandes? - if (getBeitragsgruppe() != null && getBeitragsgruppe().getBeitragsArt() == ArtBeitragsart.FAMILIE_ANGEHOERIGER - && getZahlerID() != null) + if (getBeitragsgruppe() != null && getBeitragsgruppe().getBeitragsArt() == ArtBeitragsart.FAMILIE_ANGEHOERIGER && getZahlerID() != null) { // ja, suche Vollzahler. Er darf nicht, bzw nicht früher, ausgetreten sein! DBIterator zahler = Einstellungen.getDBService() .createList(Mitglied.class); zahler.addFilter("id = " + getZahlerID()); - if(getAustritt() != null) - zahler.addFilter("(austritt is not null and austritt < ?)",getAustritt()); + if (getAustritt() != null) + zahler.addFilter("(austritt is not null and austritt < ?)", + getAustritt()); Mitglied z = null; - if(zahler.hasNext()) + if (zahler.hasNext()) z = zahler.next(); if (z != null && ((Mitglied) z).getAustritt() != null) { throw new ApplicationException( "Der ausgewählte Vollzahler ist ausgetreten zu " + z.getAustritt() + ". Bitte anderen Vollzahler wählen!"); } - if(z != null && ((Mitglied)z).getEintritt().after(new Date()) && ((Mitglied)z).getEintritt().after(getEintritt())) + if (z != null && ((Mitglied) z).getEintritt() + .after(new Date()) && ((Mitglied) z).getEintritt() + .after(getEintritt())) { - throw new ApplicationException( - "Der ausgewählte Vollzahler tritt erst ein zu " + z.getEintritt() + ". Bitte anderen Vollzahler wählen!"); + throw new ApplicationException( + "Der ausgewählte Vollzahler tritt erst ein zu " + z.getEintritt() + ". Bitte anderen Vollzahler wählen!"); } } // Check ob das Mitglied vorher ein Vollzahler eines Familienverbandes war @@ -278,18 +290,16 @@ && getZahlerID() != null) "Dieses Mitglied ist Vollzahler in einem Familienverband.. Zunächst Beitragsart der Angehörigen ändern!"); } } - if (getBeitragsgruppe() != null - && getBeitragsgruppe() - .getBeitragsArt() == ArtBeitragsart.FAMILIE_ANGEHOERIGER - && getZahlerID() == null) + if (getBeitragsgruppe() != null && getBeitragsgruppe().getBeitragsArt() == ArtBeitragsart.FAMILIE_ANGEHOERIGER && getZahlerID() == null) { throw new ApplicationException("Bitte Vollzahler auswählen!"); } - + // Individueller Beitrag darf nicht kleiner als 0 sein if (getIndividuellerBeitrag() != null && getIndividuellerBeitrag() < 0) { - throw new ApplicationException("Individueller Beitrag darf nicht negativ sein!"); + throw new ApplicationException( + "Individueller Beitrag darf nicht negativ sein!"); } } @@ -297,7 +307,7 @@ && getZahlerID() == null) * Prüfe die externe Mitgliedsnummer. Ist es ein Mitgliedssatz und ist in den * Einstellungen die externe Mitgliedsnummer aktiviert, dann muss eine * vorhanden sein und diese muss eindeutig sein. - * + * * @throws RemoteException * @throws ApplicationException */ @@ -323,8 +333,8 @@ private void checkExterneMitgliedsnummer() { Mitglied mitglied = (Mitglied) mitglieder.next(); throw new ApplicationException( - "Die externe Mitgliedsnummer wird bereits verwendet für Mitglied : " - + mitglied.getAttribute("namevorname")); + "Die externe Mitgliedsnummer wird bereits verwendet für Mitglied : " + mitglied.getAttribute( + "namevorname")); } } @@ -528,26 +538,34 @@ public void setOrt(String ort) throws RemoteException @Override public String getStaat() throws RemoteException { - if (getAttribute("staat") != null) - { - return (String) getAttribute("staat"); - } - else - { - return ""; - } + return Staat.getStaat(getStaatCode()); + } + + @Override + public String getStaatCode() throws RemoteException + { + String code = (String) getAttribute("staat"); + return Staat.getStaatCode(code); } @Override public void setStaat(String staat) throws RemoteException { - if (staat != null) - { - staat = staat.toUpperCase(); - } setAttribute("staat", staat); } + @Override + public String getLeitwegID() throws RemoteException + { + return (String) getAttribute("leitwegid"); + } + + @Override + public void setLeitwegID(String leitwegid) throws RemoteException + { + setAttribute("leitwegid", leitwegid); + } + @Override public Integer getZahlungsweg() throws RemoteException { @@ -664,10 +682,9 @@ public Object extract(ResultSet rs) throws SQLException } }; - String sql = "select max(abrechnungslauf.FAELLIGKEIT) from lastschrift, abrechnungslauf " - + "where lastschrift.ABRECHNUNGSLAUF = abrechnungslauf.id and lastschrift.MITGLIED = ? and lastschrift.mandatid = ?"; - Date d = (Date) Einstellungen.getDBService().execute(sql, - new Object[] { getID(), getMandatID() }, rs); + String sql = "select max(abrechnungslauf.FAELLIGKEIT) from lastschrift, abrechnungslauf " + "where lastschrift.ABRECHNUNGSLAUF = abrechnungslauf.id and lastschrift.MITGLIED = ? and lastschrift.mandatid = ?"; + Date d = (Date) Einstellungen.getDBService() + .execute(sql, new Object[] { getID(), getMandatID() }, rs); return d; } @@ -823,7 +840,14 @@ public void setKtoiOrt(String ktoiort) throws RemoteException @Override public String getKtoiStaat() throws RemoteException { - return (String) getAttribute("ktoistaat"); + return Staat.getStaat(getKtoiStaatCode()); + } + + @Override + public String getKtoiStaatCode() throws RemoteException + { + String code = (String) getAttribute("ktoistaat"); + return Staat.getStaatCode(code); } @Override @@ -1031,8 +1055,8 @@ public Beitragsgruppe getBeitragsgruppe() throws RemoteException Object o = (Object) super.getAttribute("beitragsgruppe"); if (o == null) return null; - - Cache cache = Cache.get(Beitragsgruppe.class,true); + + Cache cache = Cache.get(Beitragsgruppe.class, true); return (Beitragsgruppe) cache.get(o); } @@ -1190,8 +1214,9 @@ public Date getLetzteAenderung() throws RemoteException @Override public boolean isAngemeldet(Date stichtag) throws RemoteException { - return getEintritt() != null && !stichtag.before(getEintritt()) - && (getAustritt() == null || getAustritt().after(stichtag)); + return getEintritt() != null && !stichtag.before( + getEintritt()) && (getAustritt() == null || getAustritt().after( + stichtag)); } @Override @@ -1218,10 +1243,10 @@ else if (fieldName.startsWith("zusatzfelder_")) Long l = (Long) super.getAttribute("beitragsgruppe"); if (l == null) return null; - - Cache cache = Cache.get(Beitragsgruppe.class,true); + + Cache cache = Cache.get(Beitragsgruppe.class, true); cache.get(l); - + DBIterator it = Einstellungen.getDBService() .createList(Felddefinition.class); it.addFilter("name = ?", new Object[] { fieldName.substring(13) }); @@ -1261,8 +1286,8 @@ else if ("alter".equals(fieldName)) { return getAlter(); } - else if("beitragsgruppe".equals(fieldName)) - return getBeitragsgruppe(); + else if ("beitragsgruppe".equals(fieldName)) + return getBeitragsgruppe(); return super.getAttribute(fieldName); } @@ -1297,16 +1322,704 @@ private Date toDate(String datum) public void delete() throws RemoteException, ApplicationException { DBService service = Einstellungen.getDBService(); - DBIterator docs = service.createList(MitgliedDokument.class); + DBIterator docs = service.createList( + MitgliedDokument.class); docs.addFilter("referenz = ?", new Object[] { this.getID() }); while (docs.hasNext()) { - QueryMessage qm = new QueryMessage( - ((MitgliedDokument) docs.next()).getUUID(), null); - Application.getMessagingFactory().getMessagingQueue( - "jameica.messaging.del").sendSyncMessage(qm); + QueryMessage qm = new QueryMessage(docs.next().getUUID(), null); + Application.getMessagingFactory() + .getMessagingQueue("jameica.messaging.del").sendSyncMessage(qm); } super.delete(); } - + + public static MitgliedDummy getDummy() + { + if (DUMMY_INSTANCE == null) + { + try + { + DUMMY_INSTANCE = new MitgliedDummy(); + } + catch (RemoteException e) + { + throw new RuntimeException(e); + } + } + + return DUMMY_INSTANCE; + } + + private static final class MitgliedDummy extends MitgliedImpl + { + private static final long serialVersionUID = 1L; + + private final static String PERSONENART = "n"; + + private final static String ANREDE = "Herrn"; + + private final static String TITEL = "Dr. Dr."; + + private final static String NAME = "Wichtig"; + + private final static String VORNAME = "Willi"; + + private final static String STRASSE = "Bahnhofstr. 22"; + + private final static String ADRESSZUSATZ = "Hinterhof bei Müller"; + + private final static String PLZ = "12345"; + + private final static String ORT = "Testenhausen"; + + private final static String STAAT = "Deutschland"; + + private final static String BIC = "XXXXXXXXXXX"; + + private final static String IBAN = "DE89370400440532013000"; + + private final static Integer ZAHLUNGSWEG = 1; + + private final static Date MANDATDATUM = new Date(); + + private final static String MANDATID = "12345"; + + private final static Date LETZTE_LASTSCHRIFT = new Date(); + + private final static String EXTERNE_MITGLIEDSNUMMER = "123456"; + + private final static String ID = "1"; + + private final static Zahlungsrhythmus ZAHLUNGSRHYTHMUS = new Zahlungsrhythmus( + 12); + + private final static Zahlungstermin ZAHLUNGSTERMIN = Zahlungstermin.HALBJAEHRLICH4; + + private final static Integer MANDATVERSION = 1; + + private final static String MAIL = "willi.wichtig@jverein.de"; + + private final static String GESCHLECHT = GeschlechtInput.MAENNLICH; + + private final static Date GEBURTSDATUM = toDate("02.03.1980"); + + private final static String TELEFON_PRIVAT = "011/123456"; + + private final static String TELEFON_DIENSTLICH = "011/123456789"; + + private final static String HANDY = "0170/123456789"; + + private final static Date EINTRITT = toDate("01.01.2010"); + + private final static Beitragsgruppe BEITRAGSGRUPPE = beitragsgruppe(); + + private final static double INDIVIDUELLER_BEITRAG = 123.45; + + private final static long ZAHLERID = 123456; + + private final static Date AUSTRITT = toDate("01.01.2025"); + + private final static Date KUENDIGUNG = toDate("01.11.2024"); + + private final static Date STERBETAG = toDate(("31.12.2024")); + + private final static String VERMERK1 = "Vermerk 1"; + + private final static String VERMERK2 = "Vermerk 2"; + + private final static Date EINGABEDATUM = toDate("01.02.2010"); + + private final static Date LETTZTE_AENDERUNG = new Date(); + + private final static boolean IS_ANGEMELDET = true; + + private final static Map VARIABLEN = new HashMap<>(); + + private final static Adresstyp ADRESSTYP = new Adresstyp() + { + @Override + public void transactionBegin() throws RemoteException + { + + } + + @Override + public void transactionCommit() throws RemoteException + { + + } + + @Override + public void transactionRollback() throws RemoteException + { + + } + + @Override + public String getBezeichnung() throws RemoteException + { + return "Mitglied"; + } + + @Override + public void setBezeichnung(String bezeichnung) throws RemoteException + { + + } + + @Override + public String getBezeichnungPlural() throws RemoteException + { + return "Mitglieder"; + } + + @Override + public void setBezeichnungPlural(String bezeichnungplural) + throws RemoteException + { + + } + + @Override + public int getJVereinid() throws RemoteException + { + return 1; + } + + @Override + public void setJVereinid(int jvereinid) throws RemoteException + { + + } + + @Override + public void load(String s) throws RemoteException + { + + } + + @Override + public Object getAttribute(String s) throws RemoteException + { + return null; + } + + @Override + public String getAttributeType(String s) throws RemoteException + { + return null; + } + + @Override + public String getPrimaryAttribute() throws RemoteException + { + return null; + } + + @SuppressWarnings("rawtypes") + @Override + public DBIterator getList() throws RemoteException + { + return null; + } + + @Override + public boolean equals(GenericObject genericObject) throws RemoteException + { + return false; + } + + @Override + public void addDeleteListener(Listener listener) throws RemoteException + { + + } + + @Override + public void addStoreListener(Listener listener) throws RemoteException + { + + } + + @Override + public void removeDeleteListener(Listener listener) throws RemoteException + { + + } + + @Override + public void removeStoreListener(Listener listener) throws RemoteException + { + + } + + @Override + public String[] getAttributeNames() throws RemoteException + { + return new String[0]; + } + + @Override + public String getID() throws RemoteException + { + return ID; + } + + @Override + public void store() throws RemoteException + { + + } + + @Override + public void delete() throws RemoteException + { + + } + + @Override + public void clear() throws RemoteException + { + + } + + @Override + public boolean isNewObject() throws RemoteException + { + return false; + } + + @Override + public void overwrite(DBObject dbObject) throws RemoteException + { + + } + }; + + private MitgliedDummy() throws RemoteException + { + } + + @Override + public String getPersonenart() throws RemoteException + { + return PERSONENART; + } + + @Override + public String getAnrede() throws RemoteException + { + return ANREDE; + } + + @Override + public String getTitel() throws RemoteException + { + return TITEL; + } + + @Override + public String getName() throws RemoteException + { + return NAME; + } + + @Override + public String getVorname() throws RemoteException + { + return VORNAME; + } + + @Override + public String getStrasse() throws RemoteException + { + return STRASSE; + } + + @Override + public String getAdressierungszusatz() throws RemoteException + { + return ADRESSZUSATZ; + } + + @Override + public String getPlz() throws RemoteException + { + return PLZ; + } + + @Override + public String getOrt() throws RemoteException + { + return ORT; + } + + @Override + public String getStaat() throws RemoteException + { + return STAAT; + } + + @Override + public String getBic() throws RemoteException + { + return BIC; + } + + @Override + public String getIban() throws RemoteException + { + return IBAN; + } + + @Override + public Integer getZahlungsweg() throws RemoteException + { + return ZAHLUNGSWEG; + } + + @Override + public Date getMandatDatum() throws RemoteException + { + return MANDATDATUM; + } + + @Override + public String getMandatID() throws RemoteException + { + return MANDATID; + } + + @Override + public Date getLetzteLastschrift() throws RemoteException + { + return LETZTE_LASTSCHRIFT; + } + + @Override + public String getExterneMitgliedsnummer() throws RemoteException + { + return EXTERNE_MITGLIEDSNUMMER; + } + + @Override + public Adresstyp getAdresstyp() throws RemoteException + { + return ADRESSTYP; + } + + @Override + public Zahlungsrhythmus getZahlungsrhythmus() throws RemoteException + { + return ZAHLUNGSRHYTHMUS; + } + + @Override + public Zahlungstermin getZahlungstermin() throws RemoteException + { + return ZAHLUNGSTERMIN; + } + + @Override + public void setMandatDatum(Date mandatdatum) throws RemoteException + { + + } + + @Override + public Integer getMandatVersion() throws RemoteException + { + return MANDATVERSION; + } + + @Override + public String getKtoiPersonenart() throws RemoteException + { + return PERSONENART; + } + + @Override + public void setKtoiPersonenart(String ktoipersonenart) + throws RemoteException + { + + } + + @Override + public String getKtoiAnrede() throws RemoteException + { + return ANREDE; + } + + @Override + public String getKtoiTitel() throws RemoteException + { + return TITEL; + } + + @Override + public String getKtoiName() throws RemoteException + { + return NAME; + } + + @Override + public String getKtoiVorname() throws RemoteException + { + return VORNAME; + } + + @Override + public String getKtoiStrasse() throws RemoteException + { + return STRASSE; + } + + @Override + public String getKtoiAdressierungszusatz() throws RemoteException + { + return ADRESSZUSATZ; + } + + @Override + public String getKtoiPlz() throws RemoteException + { + return PLZ; + } + + @Override + public String getKtoiOrt() throws RemoteException + { + return ORT; + } + + @Override + public String getKtoiStaat() throws RemoteException + { + return STAAT; + } + + @Override + public String getKtoiEmail() throws RemoteException + { + return MAIL; + } + + @Override + public String getKtoiGeschlecht() throws RemoteException + { + return GESCHLECHT; + } + + @Override + public String getKontoinhaber(int art) throws RemoteException + { + return null; + } + + @Override + public Date getGeburtsdatum() throws RemoteException + { + return GEBURTSDATUM; + } + + @Override + public Integer getAlter() throws RemoteException + { + return null; + } + + @Override + public String getGeschlecht() throws RemoteException + { + return GESCHLECHT; + } + + @Override + public String getTelefonprivat() throws RemoteException + { + return TELEFON_PRIVAT; + } + + @Override + public String getTelefondienstlich() throws RemoteException + { + return TELEFON_DIENSTLICH; + } + + @Override + public String getHandy() throws RemoteException + { + return HANDY; + } + + @Override + public String getEmail() throws RemoteException + { + return MAIL; + } + + @Override + public Date getEintritt() throws RemoteException + { + return EINTRITT; + } + + @Override + public Beitragsgruppe getBeitragsgruppe() throws RemoteException + { + return BEITRAGSGRUPPE; + } + + @Override + public int getBeitragsgruppeId() throws RemoteException + { + return 0; + } + + @Override + public Double getIndividuellerBeitrag() throws RemoteException + { + return INDIVIDUELLER_BEITRAG; + } + + @Override + public Long getZahlerID() throws RemoteException + { + return ZAHLERID; + } + + @Override + public Date getAustritt() throws RemoteException + { + return AUSTRITT; + } + + @Override + public Date getKuendigung() throws RemoteException + { + return KUENDIGUNG; + } + + @Override + public Date getSterbetag() throws RemoteException + { + return STERBETAG; + } + + @Override + public String getVermerk1() throws RemoteException + { + return VERMERK1; + } + + @Override + public String getVermerk2() throws RemoteException + { + return VERMERK2; + } + + @Override + public Date getEingabedatum() throws RemoteException + { + return EINGABEDATUM; + } + + @Override + public Date getLetzteAenderung() throws RemoteException + { + return LETTZTE_AENDERUNG; + } + + @Override + public Mitgliedfoto getFoto() throws RemoteException + { + return null; + } + + @Override + public boolean isAngemeldet(Date stichtag) throws RemoteException + { + return IS_ANGEMELDET; + } + + @Override + public void addVariable(String name, String wert) + { + VARIABLEN.put(name, wert); + } + + @Override + public Map getVariablen() + { + return VARIABLEN; + } + + @Override + public Object getAttribute(String s) throws RemoteException + { + return null; + } + + @Override + public String getPrimaryAttribute() + { + return null; + } + + @SuppressWarnings("rawtypes") + @Override + public DBIterator getList() throws RemoteException + { + return null; + } + + @Override + public boolean equals(GenericObject genericObject) throws RemoteException + { + return genericObject instanceof MitgliedDummy; + } + + @Override + public void store() throws RemoteException + { + + } + + @Override + public void delete() throws RemoteException + { + + } + + private static Date toDate(String datum) + { + Date d = null; + + try + { + d = new JVDateFormatTTMMJJJJ().parse(datum); + } + catch (Exception ignored) + { + } + return d; + } + + private static Beitragsgruppe beitragsgruppe() + { + try + { + DBIterator it = Einstellungen.getDBService() + .createList(Beitragsgruppe.class); + return it.next(); + } + catch (RemoteException rmi) + { + return null; + } + } + } + } diff --git a/src/de/jost_net/JVerein/server/MitgliedUtils.java b/src/de/jost_net/JVerein/server/MitgliedUtils.java index aac91014f..c614007d8 100644 --- a/src/de/jost_net/JVerein/server/MitgliedUtils.java +++ b/src/de/jost_net/JVerein/server/MitgliedUtils.java @@ -52,13 +52,13 @@ public static void setMitgliedOderSpender(DBIterator it) public static void setMitgliedNatuerlichePerson(DBIterator it) throws RemoteException { - it.addFilter("personenart = 'n' or personenart = 'N'"); + it.addFilter("(personenart = 'n' or personenart = 'N')"); } public static void setMitgliedJuristischePerson(DBIterator it) throws RemoteException { - it.addFilter("personenart = 'j' or personenart = 'J'"); + it.addFilter("(personenart = 'j' or personenart = 'J')"); } } diff --git a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java index b8e562d23..a3ba214a4 100644 --- a/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java +++ b/src/de/jost_net/JVerein/server/MitgliedskontoImpl.java @@ -27,8 +27,10 @@ import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.rmi.Rechnung; import de.willuhn.datasource.db.AbstractDBObject; import de.willuhn.datasource.rmi.DBService; +import de.willuhn.datasource.rmi.ObjectNotFoundException; import de.willuhn.datasource.rmi.ResultSetExtractor; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; @@ -59,9 +61,29 @@ public String getPrimaryAttribute() } @Override - protected void deleteCheck() + 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 @@ -102,10 +124,6 @@ protected void updateCheck() throws ApplicationException @Override protected Class getForeignObject(String arg0) { - if ("buchungsart".equals(arg0)) - { - return Buchungsart.class; - } return null; } @@ -129,11 +147,42 @@ public void setAbrechnungslauf(Abrechnungslauf abrechnungslauf) { setAttribute("abrechnungslauf", Integer.valueOf(abrechnungslauf.getID())); } + + @Override + public Rechnung getRechnung() throws RemoteException + { + Object o = (Object) super.getAttribute("rechnung"); + if (o == null) + return null; + + if(o instanceof Rechnung) + return (Rechnung)o; + + Cache cache = Cache.get(Rechnung.class,true); + return (Rechnung) cache.get(o); + } + @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 { - 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 @@ -145,6 +194,18 @@ public void setBuchungsart(Buchungsart buchungsart) throws RemoteException 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 { @@ -183,6 +244,11 @@ public Mitglied getMitglied() throws RemoteException 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 @@ -280,7 +346,7 @@ public void setSteuerbetrag(Double d) throws RemoteException @Override public Double getBetrag() throws RemoteException { - return (Double) getAttribute("betrag"); + return (Double) super.getAttribute("betrag"); } @Override @@ -320,6 +386,18 @@ public Object extract(ResultSet rs) throws SQLException @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(); @@ -336,6 +414,10 @@ public Object getAttribute(String fieldName) throws RemoteException { return getBuchungsklasse(); } + if (fieldName.equals("buchungsart")) + { + return getBuchungsart(); + } return super.getAttribute(fieldName); } } diff --git a/src/de/jost_net/JVerein/server/ProjektImpl.java b/src/de/jost_net/JVerein/server/ProjektImpl.java index ea1867885..84b804b6e 100644 --- a/src/de/jost_net/JVerein/server/ProjektImpl.java +++ b/src/de/jost_net/JVerein/server/ProjektImpl.java @@ -74,7 +74,7 @@ protected void insertCheck() throws ApplicationException private void plausi() throws RemoteException, ApplicationException { - if (getBezeichnung() == null) + if (getBezeichnung() == null || getBezeichnung().isEmpty()) { throw new ApplicationException("Bitte Bezeichnung eingeben"); } diff --git a/src/de/jost_net/JVerein/server/RechnungImpl.java b/src/de/jost_net/JVerein/server/RechnungImpl.java new file mode 100644 index 000000000..f1e5aaa7c --- /dev/null +++ b/src/de/jost_net/JVerein/server/RechnungImpl.java @@ -0,0 +1,356 @@ +/********************************************************************** + * 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.ArrayList; +import java.util.Date; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.io.IAdresse; +import de.jost_net.JVerein.keys.Staat; +import de.jost_net.JVerein.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.willuhn.datasource.db.AbstractDBObject; +import de.willuhn.datasource.rmi.DBIterator; +import de.willuhn.logging.Logger; + +public class RechnungImpl extends AbstractDBObject implements Rechnung, IAdresse +{ + + /** + * + */ + private static final long serialVersionUID = -286067581211521888L; + + public RechnungImpl() throws RemoteException + { + super(); + } + + @Override + public Mitglied getMitglied() throws RemoteException + { + return (Mitglied) getAttribute("mitglied"); + } + + @Override + public void setMitglied(int mitglied) throws RemoteException + { + setAttribute("mitglied", mitglied); + } + + @Override + public double getBetrag() throws RemoteException + { + return (double) getAttribute("betrag"); + } + + @Override + public void setBetrag(double betrag) throws RemoteException + { + setAttribute("betrag", betrag); + } + + @Override + protected String getTableName() + { + return "rechnung"; + } + + @Override + public String getPrimaryAttribute() throws RemoteException + { + return "id"; + } + + @Override + public void setFormular(Formular formular) throws RemoteException + { + setAttribute("formular", Long.valueOf(formular.getID())); + } + + @Override + public Formular getFormular() throws RemoteException + { + return (Formular) getAttribute("formular"); + } + + @Override + public void setDatum(Date date) throws RemoteException + { + setAttribute("datum", date); + } + + @Override + public Date getDatum() throws RemoteException + { + return (Date) getAttribute("datum"); + } + + @Override + public void setAnrede(String anrede) throws RemoteException + { + setAttribute("anrede", anrede); + } + + @Override + public String getAnrede() throws RemoteException + { + return (String) getAttribute("anrede"); + } + + @Override + public String getTitel() throws RemoteException + { + return (String) getAttribute("titel"); + } + + @Override + public void setTitel(String titel) throws RemoteException + { + setAttribute("titel", titel); + } + + @Override + public String getName() throws RemoteException + { + return (String) getAttribute("name"); + } + + @Override + public void setName(String name) throws RemoteException + { + setAttribute("name", name); + } + + @Override + public String getVorname() throws RemoteException + { + return (String) getAttribute("vorname"); + } + + @Override + public void setVorname(String vorname) throws RemoteException + { + setAttribute("vorname", vorname); + } + + @Override + public String getStrasse() throws RemoteException + { + return (String) getAttribute("strasse"); + } + + @Override + public void setStrasse(String strasse) throws RemoteException + { + setAttribute("strasse", strasse); + } + + @Override + public String getAdressierungszusatz() throws RemoteException + { + return (String) getAttribute("adressierungszusatz"); + } + + @Override + public void setAdressierungszusatz(String adressierungszusatz) throws RemoteException + { + setAttribute("adressierungszusatz", adressierungszusatz); + } + + @Override + public String getPlz() throws RemoteException + { + return (String) getAttribute("plz"); + } + + @Override + public void setPlz(String plz) throws RemoteException + { + setAttribute("plz", plz); + } + + @Override + public String getOrt() throws RemoteException + { + return (String) getAttribute("ort"); + } + + @Override + public void setOrt(String ort) throws RemoteException + { + setAttribute("ort", ort); + } + + @Override + public String getStaat() throws RemoteException + { + return Staat.getStaat(getStaatCode()); + } + + @Override + public String getStaatCode() throws RemoteException + { + String code = (String) getAttribute("staat"); + return Staat.getStaatCode(code); + } + + @Override + public void setStaat(String staat) throws RemoteException + { + setAttribute("staat", staat); + } + + @Override + public String getGeschlecht() throws RemoteException + { + return (String) getAttribute("geschlecht"); + } + + @Override + public void setGeschlecht(String geschlecht) throws RemoteException + { + setAttribute("geschlecht", geschlecht); + } + + @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(); + } + } + return super.getAttribute(fieldName); + } + + + @Override + public String getPersonenart() throws RemoteException + { + return (String) getAttribute("personenart"); + } + + + @Override + public void setPersonenart(String personenart) throws RemoteException + { + setAttribute("personenart", personenart); + } + + @Override + protected Class getForeignObject(String field) + { + if ("formular".equals(field)) + { + return Formular.class; + } + if ("mitglied".equals(field)) + { + return Mitglied.class; + } + 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 String getMandatID() throws RemoteException + { + return (String) getAttribute("mandatid"); + } + + @Override + public void setMandatID(String id) throws RemoteException + { + setAttribute("mandatid", id); + } + + @Override + public Date getMandatDatum() throws RemoteException + { + return (Date) getAttribute("mandatdatum"); + } + + @Override + public void setMandatDatum(Date datum) throws RemoteException + { + setAttribute("mandatdatum", datum); + } + + @Override + public String getBIC() throws RemoteException + { + return (String) getAttribute("bic"); + } + + @Override + public void setBIC(String bic) throws RemoteException + { + setAttribute("bic", bic); + } + + @Override + public String getIBAN() throws RemoteException + { + return (String) getAttribute("iban"); + } + + @Override + public void setIBAN(String iban) throws RemoteException + { + setAttribute("iban", iban); + } + + + @Override + public String getLeitwegID() throws RemoteException + { + return (String) getAttribute("leitwegid"); + } + + @Override + public void setLeitwegID(String leitwegid) throws RemoteException + { + setAttribute("leitwegid", leitwegid); + } +} diff --git a/src/de/jost_net/JVerein/server/RechnungNode.java b/src/de/jost_net/JVerein/server/RechnungNode.java new file mode 100644 index 000000000..667a0530b --- /dev/null +++ b/src/de/jost_net/JVerein/server/RechnungNode.java @@ -0,0 +1,357 @@ +/********************************************************************** + * Copyright (c) by Heiner Jostkleigrewe + * This program is free software: you can redistribute it and/or modify it under the terms of the + * GNU General Public License as published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without + * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See + * the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program. If not, + * see . + * + * heiner@jverein.de + * www.jverein.de + **********************************************************************/ +package de.jost_net.JVerein.server; + +import java.rmi.RemoteException; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +import de.jost_net.JVerein.Einstellungen; +import de.jost_net.JVerein.gui.control.FilterControl; +import de.jost_net.JVerein.gui.control.MitgliedskontoControl.DIFFERENZ; +import de.jost_net.JVerein.io.Adressbuch.Adressaufbereitung; +import de.jost_net.JVerein.keys.Zahlungsweg; +import de.jost_net.JVerein.rmi.Mitglied; +import de.jost_net.JVerein.rmi.Mitgliedskonto; +import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ; +import de.willuhn.datasource.GenericIterator; +import de.willuhn.datasource.GenericObject; +import de.willuhn.datasource.GenericObjectNode; +import de.willuhn.datasource.pseudo.PseudoIterator; +import de.willuhn.datasource.rmi.DBIterator; +import de.willuhn.datasource.rmi.ResultSetExtractor; + +public class RechnungNode implements GenericObjectNode +{ + private RechnungNode parent = null; + + private Mitglied mitglied = null; + + private Mitgliedskonto buchung = null; + + private ArrayList childrens; + + private boolean checked; + + public static final int NONE = 0; + + public static final int ROOT = 1; + + public static final int MITGLIED = 2; + + public static final int BUCHUNG = 3; + + private int nodetype = NONE; + + public RechnungNode(FilterControl control) throws RemoteException + { + childrens = new ArrayList<>(); + nodetype = ROOT; + + Map> mitgliedskontoMap = new HashMap<>(); + DBIterator mitgliedskontoIterator = Einstellungen + .getDBService().createList(Mitgliedskonto.class); + + mitgliedskontoIterator.addFilter("rechnung is null"); + if (control.getDatumvon().getValue() != null) + mitgliedskontoIterator.addFilter("datum >= ? ", + control.getDatumvon().getValue()); + if (control.getDatumbis().getValue() != null) + mitgliedskontoIterator.addFilter("datum <= ?", + control.getDatumbis().getValue()); + if ((Boolean) control.getOhneAbbucher().getValue()) + mitgliedskontoIterator.addFilter("zahlungsweg != ? ", + Zahlungsweg.BASISLASTSCHRIFT); + + if (control.isDifferenzAktiv() + && control.getDifferenz().getValue() != DIFFERENZ.EGAL) + { + String sql = "SELECT mitgliedskonto.id, mitgliedskonto.betrag, " + + "sum(buchung.betrag) FROM mitgliedskonto " + + "LEFT JOIN buchung on mitgliedskonto.id = buchung.mitgliedskonto " + + "group by mitgliedskonto.id "; + if (control.getDifferenz().getValue() == DIFFERENZ.FEHLBETRAG) + { + sql += "having sum(buchung.betrag) < mitgliedskonto.betrag or " + + "sum(buchung.betrag) is null and mitgliedskonto.betrag > 0 "; + } + else + { + sql += "having sum(buchung.betrag) > mitgliedskonto.betrag "; + } + + @SuppressWarnings("unchecked") + ArrayList diffIds = (ArrayList) Einstellungen + .getDBService().execute(sql, null, new ResultSetExtractor() + { + @Override + public Object extract(ResultSet rs) + throws RemoteException, SQLException + { + ArrayList list = new ArrayList<>(); + while (rs.next()) + { + list.add(rs.getString(1)); + } + return list; + } + }); + if (diffIds.size() == 0) + return; + mitgliedskontoIterator + .addFilter("id in (" + String.join(",", diffIds) + ")"); + } + + while (mitgliedskontoIterator.hasNext()) + { + Mitgliedskonto mitgliedskonto = mitgliedskontoIterator.next(); + ArrayList list = mitgliedskontoMap + .get(mitgliedskonto.getMitgliedId()); + if (list == null) + { + list = new ArrayList(); + list.add(mitgliedskonto); + mitgliedskontoMap.put(mitgliedskonto.getMitgliedId(), list); + } + else + { + list.add(mitgliedskonto); + mitgliedskontoMap.replace(mitgliedskonto.getMitgliedId(), list); + } + } + + DBIterator mitgliedterator = Einstellungen.getDBService() + .createList(Mitglied.class); + if (control.isSuchnameAktiv() + && !((String) control.getSuchname().getValue()).isEmpty()) + { + mitgliedterator.addFilter( + " (upper(name) like upper(?) or upper(vorname) like upper(?)) ", + new Object[] { control.getSuchname().getValue(), + control.getSuchname().getValue() }); + } + + while (mitgliedterator.hasNext()) + { + Mitglied m = mitgliedterator.next(); + if (mitgliedskontoMap.get(m.getID()) == null) + continue; + childrens.add(new RechnungNode(mitgliedskontoMap.get(m.getID()), m)); + } + } + + private RechnungNode(ArrayList mitgliedskontoList, + Mitglied mitglied) throws RemoteException + { + this.mitglied = mitglied; + + childrens = new ArrayList<>(); + nodetype = MITGLIED; + + if (mitgliedskontoList == null) + return; + + for (Mitgliedskonto mk : mitgliedskontoList) + { + childrens.add(new RechnungNode(mitglied, mk)); + } + } + + private RechnungNode(Mitglied mitglied, Mitgliedskonto buchung) + { + this.mitglied = mitglied; + this.buchung = buchung; + + childrens = new ArrayList<>(); + nodetype = BUCHUNG; + } + + @Override + public Object getAttribute(String name) throws RemoteException + { + switch (nodetype) + { + case ROOT: + { + return "Rechnungen"; + } + case MITGLIED: + { + @SuppressWarnings("rawtypes") + GenericIterator it1 = getChildren(); + double betrag = 0.0; + while (it1.hasNext()) + { + RechnungNode rn = (RechnungNode) it1.next(); + if (rn.getNodeType() == BUCHUNG) + { + betrag += rn.getBuchung().getBetrag(); + } + } + return Adressaufbereitung.getNameVorname(mitglied) + " (" + + Einstellungen.DECIMALFORMAT.format(betrag) + ")"; + } + case BUCHUNG: + { + return new JVDateFormatTTMMJJJJ().format(buchung.getDatum()) + ", " + + (buchung.getZweck1() != null && buchung.getZweck1().length() > 0 + ? buchung.getZweck1() + : "") + + ", " + Einstellungen.DECIMALFORMAT.format(buchung.getBetrag()); + } + } + return "bla"; + } + + public Object getObject() + { + switch (nodetype) + { + case MITGLIED: + { + return mitglied; + } + case BUCHUNG: + { + return buchung; + } + } + return null; + } + + public int getNodeType() + { + return nodetype; + } + + public Mitglied getMitglied() + { + return this.mitglied; + } + + public Mitgliedskonto getBuchung() + { + return this.buchung; + } + + public void setChecked(boolean checked) + { + this.checked = checked; + } + + public boolean isChecked() + { + return checked; + } + + @Override + public String toString() + { + String ret = ""; + try + { + if (this.nodetype == ROOT) + { + return "--> ROOT"; + } + if (this.nodetype == MITGLIED) + { + return "---> MITGLIED: " + Adressaufbereitung.getNameVorname(mitglied); + } + if (this.nodetype == BUCHUNG) + { + return "----> BUCHUNG: " + buchung.getDatum() + ";" + + buchung.getZweck1() + ";" + buchung.getBetrag(); + } + } + catch (RemoteException e) + { + ret = e.getMessage(); + } + return ret; + } + + @SuppressWarnings("rawtypes") + @Override + public GenericIterator getChildren() throws RemoteException + { + if (childrens == null) + { + return null; + } + return PseudoIterator + .fromArray(childrens.toArray(new GenericObject[childrens.size()])); + } + + public boolean removeChild(GenericObjectNode child) + { + return childrens.remove(child); + } + + @Override + public boolean hasChild(GenericObjectNode object) throws RemoteException + { + return childrens.size() > 0; + } + + @Override + public RechnungNode getParent() throws RemoteException + { + return parent; + } + + @SuppressWarnings("rawtypes") + @Override + public GenericIterator getPossibleParents() throws RemoteException + { + return null; + } + + @SuppressWarnings("rawtypes") + @Override + public GenericIterator getPath() throws RemoteException + { + return null; + } + + @Override + public String[] getAttributeNames() throws RemoteException + { + return null; + } + + @Override + public String getID() throws RemoteException + { + return null; + } + + @Override + public String getPrimaryAttribute() throws RemoteException + { + return null; + } + + @Override + public boolean equals(GenericObject other) throws RemoteException + { + return false; + } +} diff --git a/src/de/jost_net/JVerein/server/SpendenbescheinigungImpl.java b/src/de/jost_net/JVerein/server/SpendenbescheinigungImpl.java index c4171c110..8af08be0d 100644 --- a/src/de/jost_net/JVerein/server/SpendenbescheinigungImpl.java +++ b/src/de/jost_net/JVerein/server/SpendenbescheinigungImpl.java @@ -19,26 +19,19 @@ import java.rmi.RemoteException; import java.util.ArrayList; import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashMap; import java.util.List; -import java.util.Map; import de.jost_net.JVerein.Einstellungen; -import de.jost_net.JVerein.Variable.SpendenbescheinigungVar; import de.jost_net.JVerein.keys.HerkunftSpende; import de.jost_net.JVerein.keys.Spendenart; import de.jost_net.JVerein.rmi.Buchung; import de.jost_net.JVerein.rmi.Formular; import de.jost_net.JVerein.rmi.Mitglied; import de.jost_net.JVerein.rmi.Spendenbescheinigung; -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.DBIterator; import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -import jonelo.NumericalChameleon.SpokenNumbers.GermanNumber; public class SpendenbescheinigungImpl extends AbstractDBObject implements Spendenbescheinigung @@ -258,6 +251,7 @@ public Date getSpendedatum() throws RemoteException * * @throws RemoteException */ + @Override public Date getZeitraumBis() throws RemoteException { Date maxDate = getSpendedatum(); @@ -375,7 +369,7 @@ public void store() throws RemoteException, ApplicationException for (Buchung b : buchungen) { b.setSpendenbescheinigungId(id); - b.store(); + b.store(false); } } } @@ -427,6 +421,26 @@ public boolean isSammelbestaetigung() throws RemoteException return false; return getBuchungen().size() > 1; } + + /** + * Liefert als Kennzeichen zurück, ob die Spendenbescheinigung eine echte + * Geldspende ist. Dies ist der Fall, wenn es sich um eine Gelspende handelt + * bei der bei keiner Buchung das Flag Erstattungsverzicht gesetzt ist. + * + * @return Flag, ob echte Geldspende + * @throws RemoteException + */ + public boolean isEchteGeldspende() throws RemoteException + { + if (getBuchungen() == null) + return false; + for (Buchung buchung : getBuchungen()) + { + if (buchung.getVerzicht()) + return false; + } + return true; + } /** * Fügt der Liste der Buchungen eine Buchung hinzu. Der Gesamtbetrag der @@ -549,322 +563,4 @@ public void setAutocreate(Boolean autocreate) throws RemoteException setAttribute("autocreate", Boolean.valueOf(autocreate)); } - @Override - public Map getMap(Map inma) - throws RemoteException - { - Map map = null; - final String newLineStr = "\n"; - if (inma == null) - { - map = new HashMap<>(); - } - else - { - map = inma; - } - if (this.getID() == null) - { - this.setBescheinigungsdatum(new Date()); - this.setBetrag(1234.56); - this.setBezeichnungSachzuwendung("Buch"); - this.setErsatzAufwendungen(false); - this.setHerkunftSpende(1); - this.setSpendedatum(new Date()); - this.setSpendenart(Spendenart.GELDSPENDE); - this.setUnterlagenWertermittlung(true); - this.setZeile1("Herr"); - this.setZeile2("Dr. Willi Wichtig"); - this.setZeile3("Hinterm Bahnhof 1"); - this.setZeile4("12345 Testenhausen"); - this.setZeile5(null); - this.setZeile6(null); - this.setZeile7(null); - } - String empfaenger = getZeile1() + newLineStr + getZeile2() + newLineStr - + getZeile3() + newLineStr + getZeile4() + newLineStr + getZeile5() - + newLineStr + getZeile6() + newLineStr + getZeile7() + newLineStr; - map.put(SpendenbescheinigungVar.EMPFAENGER.getName(), empfaenger); - String anrede = (getZeile1().length() > 0) ? getZeile1() + " " + getZeile2() : getZeile2(); - map.put(SpendenbescheinigungVar.ANREDE.getName(), anrede); - map.put(SpendenbescheinigungVar.ZEILE1.getName(), getZeile1()); - map.put(SpendenbescheinigungVar.ZEILE2.getName(), getZeile2()); - map.put(SpendenbescheinigungVar.ZEILE3.getName(), getZeile3()); - map.put(SpendenbescheinigungVar.ZEILE4.getName(), getZeile4()); - map.put(SpendenbescheinigungVar.ZEILE5.getName(), getZeile5()); - map.put(SpendenbescheinigungVar.ZEILE6.getName(), getZeile6()); - map.put(SpendenbescheinigungVar.ZEILE7.getName(), getZeile7()); - Double dWert = getBetrag(); - // Hier keinen String, sondern ein Double-Objekt in die Map stellen, - // damit eine rechtsbündige Ausrichtung des Betrages in der Formular- - // aufbereitung.getString() erfolgt. - // Dies ist der Zustand vor Version 2.0 - // map.put(SpendenbescheinigungVar.BETRAG.getName(), - // Einstellungen.DECIMALFORMAT.format(getBetrag())); - map.put(SpendenbescheinigungVar.BETRAG.getName(), dWert); - try - { - String betraginworten = GermanNumber.toString(dWert.longValue()); - map.put(SpendenbescheinigungVar.BETRAGINWORTEN.getName(), - "-" + betraginworten + "-"); - } - catch (Exception e) - { - Logger.error("Fehler", e); - throw new RemoteException( - "Fehler bei der Aufbereitung des Betrages in Worten"); - } - // Calendar für Alt/Neu - GregorianCalendar gc = new GregorianCalendar(); - gc.setTime(getBescheinigungsdatum()); - - String bescheinigungsdatum = new JVDateFormatTTMMJJJJ() - .format(getBescheinigungsdatum()); - map.put(SpendenbescheinigungVar.BESCHEINIGUNGDATUM.getName(), - bescheinigungsdatum); - switch (getSpendenart()) - { - case Spendenart.GELDSPENDE: - String art = "Geldzuwendungen"; - if (Einstellungen.getEinstellung().getMitgliedsbetraege()) - { - art += "/Mitgliedsbeitrag"; - } - map.put(SpendenbescheinigungVar.SPENDEART.getName(), art); - break; - case Spendenart.SACHSPENDE: - map.put(SpendenbescheinigungVar.SPENDEART.getName(), "Sachzuwendungen"); - break; - } - String spendedatum = new JVDateFormatTTMMJJJJ().format(getSpendedatum()); - boolean printBuchungsart = Einstellungen.getEinstellung() - .getSpendenbescheinigungPrintBuchungsart(); - map.put(SpendenbescheinigungVar.BEZEICHNUNGSACHZUWENDUNG.getName(), - getBezeichnungSachzuwendung()); - map.put(SpendenbescheinigungVar.UNTERLAGENWERTERMITTUNG.getName(), - getUnterlagenWertermittlung() - ? "Geeignete Unterlagen, die zur Wertermittlung gedient haben, z. B. Rechnung, Gutachten, liegen vor." - : ""); - // Unterscheidung bis 2012 / ab 2013 - if (gc.get(GregorianCalendar.YEAR) <= 2012) - { - map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), - HerkunftSpende.get(getHerkunftSpende())); - map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN.getName(), - (getErsatzAufwendungen() ? "X" : "")); - } - else - { - // ab 2013 - switch (getHerkunftSpende()) - { - case HerkunftSpende.BETRIEBSVERMOEGEN: - map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), - "Die Sachzuwendung stammt nach den Angaben des Zuwendenden aus dem Betriebsvermögen und ist" - + newLineStr - + "mit dem Entnahmewert (ggf. mit dem niedrigeren gemeinen Wert) bewertet."); - break; - case HerkunftSpende.PRIVATVERMOEGEN: - map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), - "Die Sachzuwendung stammt nach den Angaben des Zuwendenden aus dem Privatvermögen."); - break; - case HerkunftSpende.KEINEANGABEN: - map.put(SpendenbescheinigungVar.HERKUNFTSACHZUWENDUNG.getName(), - "Der Zuwendende hat trotz Aufforderung keine Angaben zur Herkunft der Sachzuwendung gemacht."); - break; - } - map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN.getName(), - (getErsatzAufwendungen() ? "Ja" : "Nein")); - map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN_JA.getName(), - (getErsatzAufwendungen() ? "X" : " ")); - map.put(SpendenbescheinigungVar.ERSATZAUFWENDUNGEN_NEIN.getName(), - (getErsatzAufwendungen() ? " " : "X")); - } - - // bei Sammelbestätigungen ein Zeitraum und "siehe Anlage" - if (getBuchungen() != null && getBuchungen().size() > 1) - { - String zeitraumende = new JVDateFormatTTMMJJJJ().format(getZeitraumBis()); - map.put(SpendenbescheinigungVar.SPENDEDATUM.getName(), "s. Anlage"); - map.put(SpendenbescheinigungVar.SPENDENZEITRAUM.getName(), - String.format("%s bis %s", spendedatum, zeitraumende)); - StringBuilder bl = new StringBuilder(); - StringBuilder bl_daten = new StringBuilder(); - StringBuilder bl_art = new StringBuilder(); - StringBuilder bl_verzicht = new StringBuilder(); - StringBuilder bl_betrag = new StringBuilder(); - if (gc.get(GregorianCalendar.YEAR) <= 2012) - { - bl.append(StringTool.rpad("Datum", 10)); - bl.append(" "); - bl.append(StringTool.rpad(StringTool.lpad("Betrag", 8), 11)); - bl.append(" "); - bl.append("Verwendung"); - bl.append(newLineStr); - - bl.append("----------"); - bl.append(" "); - bl.append("-----------"); - bl.append(" "); - bl.append("-----------------------------------------"); - bl.append(newLineStr); - for (Buchung b : buchungen) - { - bl.append(new JVDateFormatTTMMJJJJ().format(b.getDatum())); - bl.append(" "); - String str = Einstellungen.DECIMALFORMAT.format(b.getBetrag()); - bl.append(StringTool.lpad(str, 11)); - bl.append(" "); - if (printBuchungsart) - { - bl.append(b.getBuchungsart().getBezeichnung()); - } - else - { - bl.append(b.getZweck()); - } - bl.append(" "); - bl.append((b.getVerzicht() ? "(b)" : "(a)")); - bl.append(newLineStr); - } - bl.append(newLineStr); - bl.append("----------"); - bl.append(" "); - bl.append("-----------"); - bl.append(" "); - bl.append("-----------------------------------------"); - bl.append(newLineStr); - bl.append(StringTool.rpad("Summe:", 10)); - bl.append(" "); - String str = Einstellungen.DECIMALFORMAT.format(getBetrag()); - bl.append(StringTool.lpad(str, 11)); - bl.append(newLineStr); - bl.append(newLineStr); - bl.append(newLineStr); - bl.append("Legende:"); - bl.append(newLineStr); - bl.append( - "(a): Es handelt sich nicht um den Verzicht auf Erstattung von Aufwendungen"); - bl.append(newLineStr); - bl.append( - "(b): Es handelt sich um den Verzicht auf Erstattung von Aufwendungen"); - bl.append(newLineStr); - } - else - { - final int colDatumLen = 10; - final int colArtLen = 27; - final int colVerzichtLen = 17; - final int colBetragLen = 11; - bl.append(StringTool.rpad(" ", colDatumLen)); - bl.append(" "); - bl.append(StringTool.rpad(" ", colArtLen)); - bl.append(" "); - bl.append(StringTool.rpad("Verzicht auf", colVerzichtLen)); - bl.append(" "); - bl.append(StringTool.rpad(" ", colBetragLen)); - bl.append(newLineStr); - - bl.append(StringTool.rpad("Datum der ", colDatumLen)); - bl.append(" "); - bl.append(StringTool.rpad("Art der", colArtLen)); - bl.append(" "); - bl.append(StringTool.rpad("die Erstattung", colVerzichtLen)); - bl.append(" "); - bl.append(StringTool.rpad(" ", colBetragLen)); - bl.append(newLineStr); - - bl.append(StringTool.rpad("Zuwendung", colDatumLen)); - bl.append(" "); - bl.append(StringTool.rpad("Zuwendung", colArtLen)); - bl.append(" "); - bl.append(StringTool.rpad("von Aufwendungen", colVerzichtLen)); - bl.append(" "); - bl.append(StringTool.rpad(StringTool.lpad("Betrag", 8), colBetragLen)); - bl.append(newLineStr); - - bl.append(StringTool.rpad("-", colDatumLen, "-")); - bl.append(" "); - bl.append(StringTool.rpad("-", colArtLen, "-")); - bl.append(" "); - bl.append(StringTool.rpad("-", colVerzichtLen, "-")); - bl.append(" "); - bl.append(StringTool.rpad("-", colBetragLen, "-")); - bl.append(newLineStr); - - for (Buchung b : buchungen) - { - bl.append(StringTool.rpad( - new JVDateFormatTTMMJJJJ().format(b.getDatum()), colDatumLen)); - bl_daten.append(new JVDateFormatTTMMJJJJ().format(b.getDatum())); - bl_daten.append(newLineStr); - bl.append(" "); - if (printBuchungsart) - { - bl.append(StringTool.rpad(b.getBuchungsart().getBezeichnung(), - colArtLen)); - bl_art.append(b.getBuchungsart().getBezeichnung()); - bl_art.append(newLineStr); - } - else - { - bl.append(StringTool.rpad(b.getZweck(), colArtLen)); - } - bl.append(" "); - if (b.getVerzicht().booleanValue()) - { - bl.append(StringTool.rpad( - StringTool.lpad("ja", colVerzichtLen / 2 - 2), colVerzichtLen)); - bl_verzicht.append("ja"); - } - else - { - bl.append( - StringTool.rpad(StringTool.lpad("nein", colVerzichtLen / 2 - 2), - colVerzichtLen)); - bl_verzicht.append("nein"); - } - bl_verzicht.append(newLineStr); - bl.append(" "); - String str = Einstellungen.DECIMALFORMAT.format(b.getBetrag()); - bl.append(StringTool.lpad(str, colBetragLen)); - bl_betrag.append(StringTool.lpad(str, colBetragLen)); - bl_betrag.append(newLineStr); - bl.append(newLineStr); - } - - bl.append(StringTool.rpad("-", colDatumLen, "-")); - bl.append(" "); - bl.append(StringTool.rpad("-", colArtLen, "-")); - bl.append(" "); - bl.append(StringTool.rpad("-", colVerzichtLen, "-")); - bl.append(" "); - bl.append(StringTool.rpad("-", colBetragLen, "-")); - bl.append(newLineStr); - // bl.append(StringTool.rpad("-", - // colDatumLen+2+colArtLen+2+colVerzichtLen, "-")); - // bl.append(" "); - // bl.append(StringTool.rpad("-", colBetragLen, "-")); - // bl.append(newLineStr); - - bl.append(StringTool.rpad("Gesamtsumme:", - colDatumLen + 2 + colArtLen + 2 + colVerzichtLen)); - bl.append(" "); - String str = Einstellungen.DECIMALFORMAT.format(getBetrag()); - bl.append(StringTool.lpad(str, colBetragLen)); - bl.append(newLineStr); - } - map.put(SpendenbescheinigungVar.BUCHUNGSLISTE.getName(), bl.toString()); - map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_DATEN.getName(), bl_daten.toString()); - map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_ART.getName(), bl_art.toString()); - map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_VERZICHT.getName(), bl_verzicht.toString()); - map.put(SpendenbescheinigungVar.BUCHUNGSLISTE_BETRAG.getName(), bl_betrag.toString()); - } - else - { - map.put(SpendenbescheinigungVar.SPENDEDATUM.getName(), spendedatum); - } - return map; - } - } diff --git a/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java b/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java index 606c636dc..03c6f2464 100644 --- a/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java +++ b/src/de/jost_net/JVerein/server/ZusatzbetragImpl.java @@ -1,16 +1,16 @@ /********************************************************************** * 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 + * 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 + * 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, + * 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 **********************************************************************/ @@ -21,6 +21,7 @@ import de.jost_net.JVerein.Einstellungen; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.Mitglied; @@ -81,8 +82,8 @@ protected void insertCheck() throws ApplicationException } if (getEndedatum() != null) { - if (!Datum - .isImInterval(getStartdatum(), getEndedatum(), getIntervall())) + if (!Datum.isImInterval(getStartdatum(), getEndedatum(), + getIntervall())) { throw new ApplicationException("Endedatum liegt nicht im Intervall"); } @@ -92,8 +93,8 @@ protected void insertCheck() throws ApplicationException throw new ApplicationException( "Das Fälligkeitsdatum darf nicht vor dem Startdatum liegen"); } - if (!Datum - .isImInterval(getStartdatum(), getFaelligkeit(), getIntervall())) + if (!Datum.isImInterval(getStartdatum(), getFaelligkeit(), + getIntervall())) { throw new ApplicationException( "Nächste Fälligkeit liegt nicht im Intervall"); @@ -102,6 +103,26 @@ protected void insertCheck() throws ApplicationException { throw new ApplicationException("Bitte Betrag eingeben"); } + if (getZahlungsweg().getKey() == Zahlungsweg.BASISLASTSCHRIFT) + { + if (getMitglied().getZahlungsweg() == Zahlungsweg.VOLLZAHLER) + { + Mitglied m = Einstellungen.getDBService().createObject( + MitgliedImpl.class, getMitglied().getZahlerID().toString()); + if (m.getIban().length() == 0 + || m.getMandatDatum().equals(Einstellungen.NODATE)) + { + throw new ApplicationException( + "Beim Vollzahler ist keine IBAN oder Mandatdatum hinterlegt."); + } + } + else if (getMitglied().getIban().length() == 0 + || getMitglied().getMandatDatum().equals(Einstellungen.NODATE)) + { + throw new ApplicationException( + "Beim Mitglied ist keine IBAN oder Mandatdatum hinterlegt."); + } + } } catch (RemoteException e) { @@ -126,14 +147,18 @@ protected Class getForeignObject(String arg0) @Override public Mitglied getMitglied() throws RemoteException { - Object o = (Object) super.getAttribute("mitglied"); + Object o = super.getAttribute("mitglied"); if (o == null) + { return null; - - if(o instanceof Mitglied) - return (Mitglied)o; - - Cache cache = Cache.get(Mitglied.class,true); + } + + if (o instanceof Mitglied) + { + return (Mitglied) o; + } + + Cache cache = Cache.get(Mitglied.class, true); return (Mitglied) cache.get(o); } @@ -242,14 +267,18 @@ public void setBuchungsart(Buchungsart buchungsart) throws RemoteException @Override public Buchungsart getBuchungsart() throws RemoteException { - Object o = (Object) super.getAttribute("buchungsart"); + Object o = super.getAttribute("buchungsart"); if (o == null) + { return null; - - if(o instanceof Buchungsart) - return (Buchungsart)o; - - Cache cache = Cache.get(Buchungsart.class,true); + } + + if (o instanceof Buchungsart) + { + return (Buchungsart) o; + } + + Cache cache = Cache.get(Buchungsart.class, true); return (Buchungsart) cache.get(o); } @@ -271,7 +300,7 @@ public Long getBuchungsklasseId() throws RemoteException { return (Long) super.getAttribute("buchungsklasse"); } - + @Override public void setBuchungsklasseId(Long buchungsklasseId) throws RemoteException { @@ -300,6 +329,36 @@ public Object getAttribute(String fieldName) throws RemoteException return super.getAttribute(fieldName); } + /* + * + */ + @Override + public boolean isOffen(Date datum) throws RemoteException + { + if (!getMitglied().isAngemeldet(datum)) + { + if (!Einstellungen.getEinstellung().getZusatzbetragAusgetretene()) + { + return false; + } + } + // Einmalige Ausführung + if (getIntervall().intValue() == IntervallZusatzzahlung.KEIN) + { + return (getAusfuehrung() == null); + } + + // Wenn das Endedatum gesetzt ist und das Fälligkeitsdatum liegt zum oder + // hinter + // dem Endedatum: nicht mehr ausführen + if (getEndedatum() != null + && getFaelligkeit().getTime() >= getEndedatum().getTime()) + { + return false; + } + return true; + } + @Override public boolean isAktiv(Date datum) throws RemoteException { @@ -316,7 +375,14 @@ public boolean isAktiv(Date datum) throws RemoteException // Ist das Ausführungsdatum gesetzt? if (getAusfuehrung() == null) { - return true; + if (getFaelligkeit().getTime() <= datum.getTime()) + { + return true; + } + else + { + return false; + } } else { @@ -325,9 +391,10 @@ public boolean isAktiv(Date datum) throws RemoteException } } - // Wenn das Endedatum gesetzt ist und das Fälligkeitsdatum liegt zum oder hinter + // Wenn das Endedatum gesetzt ist und das Ausführungsdatum liegt hinter // dem Endedatum: nicht mehr ausführen - if (getEndedatum() != null && getFaelligkeit().getTime() >= getEndedatum().getTime()) + if ((getEndedatum() != null && datum.getTime() >= getEndedatum().getTime()) + || getFaelligkeit().getTime() > datum.getTime()) { return false; } @@ -363,4 +430,28 @@ public void vorherigeFaelligkeit() throws RemoteException setFaelligkeit(vorh); } } + + @Override + public Zahlungsweg getZahlungsweg() throws RemoteException + { + Object o = getAttribute("zahlungsweg"); + if (o == null) + { + return new Zahlungsweg(0); + } + return new Zahlungsweg((Integer) o); + } + + @Override + public void setZahlungsweg(Zahlungsweg zahlungsweg) throws RemoteException + { + if (zahlungsweg == null) + { + setAttribute("zahlungsweg", 0); + } + else + { + setAttribute("zahlungsweg", zahlungsweg.getKey()); + } + } } diff --git a/src/de/jost_net/JVerein/server/ZusatzbetragVorlageImpl.java b/src/de/jost_net/JVerein/server/ZusatzbetragVorlageImpl.java index d597cd416..2fb8188e7 100644 --- a/src/de/jost_net/JVerein/server/ZusatzbetragVorlageImpl.java +++ b/src/de/jost_net/JVerein/server/ZusatzbetragVorlageImpl.java @@ -1,16 +1,16 @@ /********************************************************************** * 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 + * 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 + * 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, + * 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 **********************************************************************/ @@ -20,6 +20,7 @@ import java.util.Date; import de.jost_net.JVerein.keys.IntervallZusatzzahlung; +import de.jost_net.JVerein.keys.Zahlungsweg; import de.jost_net.JVerein.rmi.Buchungsart; import de.jost_net.JVerein.rmi.Buchungsklasse; import de.jost_net.JVerein.rmi.ZusatzbetragVorlage; @@ -27,8 +28,8 @@ import de.willuhn.logging.Logger; import de.willuhn.util.ApplicationException; -public class ZusatzbetragVorlageImpl extends AbstractDBObject implements - ZusatzbetragVorlage +public class ZusatzbetragVorlageImpl extends AbstractDBObject + implements ZusatzbetragVorlage { private static final long serialVersionUID = 1L; @@ -127,7 +128,9 @@ public double getBetrag() throws RemoteException { Double d = (Double) getAttribute("betrag"); if (d == null) + { return 0; + } return d.doubleValue(); } @@ -190,7 +193,7 @@ public Buchungsart getBuchungsart() throws RemoteException { return (Buchungsart) getAttribute("buchungsart"); } - + @Override public Buchungsklasse getBuchungsklasse() throws RemoteException { @@ -209,7 +212,7 @@ public Long getBuchungsklasseId() throws RemoteException { return (Long) super.getAttribute("buchungsklasse"); } - + @Override public void setBuchungsklasseId(Long buchungsklasseId) throws RemoteException { @@ -229,4 +232,28 @@ public Object getAttribute(String fieldName) throws RemoteException } return super.getAttribute(fieldName); } + + @Override + public Zahlungsweg getZahlungsweg() throws RemoteException + { + Object o = getAttribute("zahlungsweg"); + if (o == null) + { + return null; + } + return new Zahlungsweg((Integer) o); + } + + @Override + public void setZahlungsweg(Zahlungsweg zahlungsweg) throws RemoteException + { + if (zahlungsweg == null) + { + setAttribute("zahlungsweg", null); + } + else + { + setAttribute("zahlungsweg", zahlungsweg.getKey()); + } + } } diff --git a/src/liquibase/jverein.xml b/src/liquibase/jverein.xml index 044db27f6..b110b6eaa 100644 --- a/src/liquibase/jverein.xml +++ b/src/liquibase/jverein.xml @@ -38,7 +38,7 @@ - +