diff --git a/README.md b/README.md
index 35e9d7d..e37f645 100644
--- a/README.md
+++ b/README.md
@@ -1,30 +1,46 @@
-# kompass
+# jdav Kompass
[](https://jenkins.merten.dev/job/gitea/job/kompass/job/main/)
-This repository has the purpose to develop a webapplication that can be used by
-JDAV to send newsletters, manage user lists and keep material lists up to date.
-As this repository is also meant to be a base for exchange during development, feel free
-to contribute ideas in form of edits to this README, issues, landmarks, projects, wiki entries, ...
+Kompass is an administration platform designed for local sections of the Young German Alpine Club. It provides
+tools to contact and (automatically) manage members, groups, material, excursions and statements.
-# Docker
+For more details on the features, see the (German) [documentation](https://jdav-hd.de/static/docs/index.html).
-In the `docker` subfolder, there are `docker-compose.yaml`s for development and production use. For the development
-version, no further setup is needed.
+# Contributing
-# Production
+Any form of contribution is appreciated. If you found a bug or have a feature request, please file an
+[issue](https://git.jdav-hd.merten.dev/digitales/kompass/issues). If you want to help with the documentation or
+want to contribute code, please open a [pull request](https://git.jdav-hd.merten.dev/digitales/kompass/pulls).
-In production, the docker setup needs an external database. The exact access credentials are configured in the respective
-docker.env files.
+The following is a short description of where to find the documentation with more information.
-# Useful stuff
-## Reset database for certain app
+# Documentation
-The following can be useful in case that automatic migrations throw errors.
+Documentation is handled by [sphinx](https://www.sphinx-doc.org/) and located in `docs/`.
-1. delete everything in the migrations folder except for __init__.py.
-2. drop into my MySQL console and do: DELETE FROM django_migrations WHERE app='my_app'
-3. while at the MySQL console, drop all of the tables associated with my_app.
-4. re-run ./manage.py makemigrations my_app - this generates a 0001_initial.py file in my migrations folder.
-5. run ./manage migrate my_app - I expect this command to re-build all my tables, but instead it says: "No migrations to apply."
+The sphinx documentation contains information about:
+- Development Setup
+- Architecture
+- Testing
+- Production Deployment
+- End user documentation
+- and much more...
+
+> Please add all further documentation also in the sphinx documentation. And not in the readme
+
+## online
+Online (latest release version): https://jdav-hd.de/static/docs/
+
+## local
+To read the documentation build it locally and view it in your browser:
+```bash
+cd docs/
+make html
+
+# MacOS (with firefox)
+open -a firefox $(pwd)/docs/build/html/index.html
+# Linux (I guess?!?)
+firefox ${pwd}/docs/build/html/index.html
+```
diff --git a/docker/test/docker-compose.yaml b/docker/test/docker-compose.yaml
index 9bc9bae..edbb892 100644
--- a/docker/test/docker-compose.yaml
+++ b/docker/test/docker-compose.yaml
@@ -14,8 +14,8 @@ services:
entrypoint: /app/docker/test/entrypoint-master.sh
volumes:
- type: bind
- source: ./coverage.xml
- target: /app/jdav_web/coverage.xml
+ source: ./htmlcov/
+ target: /app/jdav_web/htmlcov/
cache:
restart: always
diff --git a/docker/test/entrypoint-master.sh b/docker/test/entrypoint-master.sh
index 8c70043..2c80809 100755
--- a/docker/test/entrypoint-master.sh
+++ b/docker/test/entrypoint-master.sh
@@ -38,5 +38,5 @@ fi
cd jdav_web
-coverage run manage.py test startpage finance members -v 2
-coverage xml
+coverage run manage.py test startpage finance members contrib logindata mailer material -v 2 --noinput
+coverage html
diff --git a/docs/source/_static/favicon.png b/docs/source/_static/favicon.png
new file mode 100644
index 0000000..c8498b9
Binary files /dev/null and b/docs/source/_static/favicon.png differ
diff --git a/docs/source/_static/favicon2.png b/docs/source/_static/favicon2.png
new file mode 100644
index 0000000..bac2794
Binary files /dev/null and b/docs/source/_static/favicon2.png differ
diff --git a/docs/source/_static/jdav_logo.png b/docs/source/_static/jdav_logo.png
new file mode 100644
index 0000000..87e1400
Binary files /dev/null and b/docs/source/_static/jdav_logo.png differ
diff --git a/docs/source/_static/jdav_logo_transparent.png b/docs/source/_static/jdav_logo_transparent.png
new file mode 100644
index 0000000..d3ef7b7
Binary files /dev/null and b/docs/source/_static/jdav_logo_transparent.png differ
diff --git a/docs/source/about.rst b/docs/source/about.rst
new file mode 100644
index 0000000..d057902
--- /dev/null
+++ b/docs/source/about.rst
@@ -0,0 +1,20 @@
+:orphan: true
+
+.. meta::
+ :description: Miscellaneous information about the Kompass project
+
+.. vale off
+
+About
+=====
+
+.. rst-class:: lead
+
+.. attention::
+ Die Seite befindet sich noch im Aufbau. -- The page is still under construction.
+
+ (Stand: 08.01.2025)
+
+
+- About the kompass project
+- About this documentation
diff --git a/docs/source/conf.py b/docs/source/conf.py
index e3ff583..c4c7f60 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -3,15 +3,19 @@
# For the full list of built-in configuration values, see the documentation:
# https://www.sphinx-doc.org/en/master/usage/configuration.html
-# -- Project information -----------------------------------------------------
+from dataclasses import asdict
+from sphinxawesome_theme import ThemeOptions
+
+
+# -- Project information -------------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#project-information
project = 'Kompass'
-copyright = '2024, Christian Merten'
-author = 'Christian Merten'
release = '2.0'
+author = 'The Kompass Team'
+copyright = f'2025, {author}'
-# -- General configuration ---------------------------------------------------
+# -- General configuration -----------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#general-configuration
extensions = []
@@ -21,8 +25,39 @@ exclude_patterns = []
language = 'de'
-# -- Options for HTML output -------------------------------------------------
+# -- Options for HTML output ---------------------------------------------------
# https://www.sphinx-doc.org/en/master/usage/configuration.html#options-for-html-output
-html_theme = 'alabaster'
+html_theme = 'sphinxawesome_theme'
html_static_path = ['_static']
+
+
+# -- Sphinxawsome-theme options ------------------------------------------------
+# https://sphinxawesome.xyz/how-to/configure/
+
+html_logo = "_static/favicon2.png"
+html_favicon = "_static/favicon2.png"
+
+html_sidebars = {
+ "about": ["sidebar_main_nav_links.html"],
+ # "changelog": ["sidebar_main_nav_links.html"],
+}
+
+# Code blocks color scheme
+pygments_style = "emacs"
+pygments_style_dark = "emacs"
+
+# Could be directly in html_theme_options, but this way it has type hints
+# from sphinxawesome_theme
+theme_options = ThemeOptions(
+ show_prev_next=True,
+ show_breadcrumbs=True,
+ main_nav_links={
+ "Docs": "index",
+ "About": "about",
+ # "Changelog": "changelog"
+ },
+ show_scrolltop=True,
+)
+
+html_theme_options = asdict(theme_options)
diff --git a/docs/source/development_manual/architecture.rst b/docs/source/development_manual/architecture.rst
new file mode 100644
index 0000000..d278f90
--- /dev/null
+++ b/docs/source/development_manual/architecture.rst
@@ -0,0 +1,7 @@
+.. _development_manual/architecture:
+
+=================
+Architecture
+=================
+
+tbd
\ No newline at end of file
diff --git a/docs/source/development_manual/contributing.rst b/docs/source/development_manual/contributing.rst
new file mode 100644
index 0000000..dce0c53
--- /dev/null
+++ b/docs/source/development_manual/contributing.rst
@@ -0,0 +1,85 @@
+.. _development_manual/contributing:
+
+============
+Contributing
+============
+
+Any form of contribution is appreciated. If you found a bug or have a feature request, please file an
+`issue `_. If you want to help with the documentation or
+want to contribute code, please open a `pull request `_.
+
+.. note::
+
+ Please read this page carefully before contributing.
+
+Miscellaneous
+-------------
+
+- version control with `git `_
+- own gitea instance at https://git.jdav-hd.merten.dev/
+- protected ``main`` branch
+
+Organization and branches
+-------------------------
+
+The stable development happens on the ``main``-branch for which only maintainers have write access. Any pull request
+should hence be targeted at ``main``. Regularly, the production instances are updated to the latest ``main`` version,
+in particular these are considered to be stable.
+
+If you have standard write access to the repository, feel free to create new branches. To make organization
+easier, please follow the branch naming convention: ``/``.
+
+The ``testing``-branch is deployed on the development instances. No development should happen there, this branch
+is regularly reset to the ``main``-branch.
+
+
+Workflow
+--------
+
+- request a gitea account from the project maintainers
+- decide on an `issue `_ to work on or create a new one
+- branch out to an own branch (naming convention: ``/``) from the ``main``-branch
+- work on the issue and commit your changes
+- create a pull request from your branch to the ``main``-branch
+
+
+.. _development_manual/contributing/documentation:
+
+Documentation
+-------------
+
+If you want to contribute to the documentation, please follow the steps below.
+
+Online (latest release version): https://jdav-hd.de/static/docs/
+
+- This documentation is build `sphinx `_ and `awsome sphinx theme `_ the source code is located in ``docs/``.
+- All documentation is written in `reStructuredText `_ and uses the `sphinx directives `_.
+ - The directives can vary due to the theme, see the `awesome sphinx theme documentation `_.
+- All technical documentation is written in english, user documentation is written in german.
+
+To read the documentation build it locally and view it in your browser:
+
+.. code-block:: bash
+
+ cd docs/
+ make html
+
+ # MacOS (with firefox)
+ open -a firefox $(pwd)/docs/build/html/index.html
+ # Linux (I guess?!?)
+ firefox ${pwd}/docs/build/html/index.html
+
+Code
+----
+
+If you want to contribute code, please follow the inital setup steps in the :ref:`development_manual/setup` section. And dont forget to :ref:`document ` your code properly and write tests.
+
+
+.. note::
+
+ Still open / to decide:
+
+ - linting
+ - (auto) formatting
+ - reliable tests via ci/cd pipeline
+
diff --git a/docs/source/development_manual/deployment.rst b/docs/source/development_manual/deployment.rst
new file mode 100644
index 0000000..afc9acc
--- /dev/null
+++ b/docs/source/development_manual/deployment.rst
@@ -0,0 +1,7 @@
+.. _development_manual/deployment:
+
+=====================
+Production Deployment
+=====================
+
+tbd
\ No newline at end of file
diff --git a/docs/source/development_manual/index.rst b/docs/source/development_manual/index.rst
new file mode 100644
index 0000000..f219dc9
--- /dev/null
+++ b/docs/source/development_manual/index.rst
@@ -0,0 +1,42 @@
+.. _development_manual/index:
+
+#########################
+Development Documentation
+#########################
+
+This part of the documentation describes the development and maintenance of the Kompass project.
+
+.. toctree::
+ :titlesonly:
+
+ contributing
+ setup
+ architecture
+ testing
+ deployment
+
+
+Contributing
+------------
+
+Any form of contribution is appreciated!
+
+.. seealso::
+
+ :ref:`Contributing `
+
+
+
+Documentation
+-------------
+
+Structure
+
+- :ref:`Nutzer Dokumentation ` auf deutsch
+- :ref:`Development Documentation ` auf englisch
+
+.. seealso::
+
+ :ref:`Contributing #Documentation `
+
+
diff --git a/docs/source/development_manual/setup.rst b/docs/source/development_manual/setup.rst
new file mode 100644
index 0000000..25a8de6
--- /dev/null
+++ b/docs/source/development_manual/setup.rst
@@ -0,0 +1,101 @@
+.. _development_manual/setup:
+
+=================
+Development Setup
+=================
+
+The project is run with ``docker`` and all related files are in the ``docker/`` subfolder. Besides the actual Kompass
+application, a database (postgresql) and a broker (redis) are setup and run in the docker container. No
+external services are needed for running the development container.
+
+Initial installation
+--------------------
+
+A working ``docker`` setup (with ``docker compose``) is required. For installation instructions see the
+`docker manual `_.
+
+1. Clone the repository and change into the directory of the repository.
+
+2. Fetch submodules
+
+.. code-block:: bash
+
+ git submodule update --init
+
+
+.. _step-3:
+
+3. Prepare development environment: to allow automatic rebuilding upon changes in the source,
+ the owner of the ``/app/jdav_web`` directory in the Docker container must match your
+ user. For this, make sure that the output of ``echo UID`` and ``echo UID`` is not empty. Then run
+
+.. code-block:: bash
+
+ export GID=${GID}
+ export UID=${UID}
+
+4. Start docker
+
+.. code-block:: bash
+
+ cd docker/development
+ docker compose up
+
+This runs the docker in your current shell, which is useful to see any log output. If you want to run
+the development server in the background instead, use ``docker compose up -d``.
+
+During the initial run, the container is built and all dependencies are installed which can take a few minutes.
+After successful installation, the Kompass initialization runs, which in particular sets up all tables in the
+database.
+
+If you need to rebuild the container (e.g. after changing the ``requirements.txt``), execute
+
+.. code-block:: bash
+
+ docker compose up --build
+
+5. Setup admin user: in a separate shell, while the docker container is running, execute
+
+.. code-block:: bash
+
+ cd docker/development
+ docker compose exec master bash -c "cd jdav_web && python3 manage.py createsuperuser"
+
+This creates an admin user for the administration interface.
+
+
+Development
+-----------
+
+If the initial installation was successful, you can start developing. Changes to files cause an automatic
+reload of the development server. If you need to generate and perform database migrations or generate locale files,
+use
+
+.. code-block:: bash
+
+ cd docker/development
+ docker compose exec master bash
+ cd jdav_web
+
+This starts a shell in the container, where you can execute any django maintenance commands via
+``python3 manage.py ``. For more information, see the https://docs.djangoproject.com/en/4.0/ref/django-admin.
+
+
+
+
+Known Issues
+------------
+
+- If the ``UID`` and ``GID`` variables are not setup properly, you will encounter the following error message
+ after running ``docker compose up``.
+
+.. code-block:: bash
+
+ => ERROR [master 6/7] RUN groupadd -g fritze && useradd -g -u -m -d /app fritze 0.2s
+ ------
+ > [master 6/7] RUN groupadd -g fritze && useradd -g -u -m -d /app fritze:
+ 0.141 groupadd: invalid group ID 'fritze'
+ ------
+ failed to solve: process "/bin/sh -c groupadd -g $GID $USER && useradd -g $GID -u $UID -m -d /app $USER" did not complete successfully: exit code: 3
+
+In this case repeat :ref:`step 3 ` above.
diff --git a/docs/source/development_manual/testing.rst b/docs/source/development_manual/testing.rst
new file mode 100644
index 0000000..218894f
--- /dev/null
+++ b/docs/source/development_manual/testing.rst
@@ -0,0 +1,7 @@
+.. _development_manual/testing:
+
+=================
+Testing
+=================
+
+To run the tests, you can use the docker setup under ``docker/test``.
\ No newline at end of file
diff --git a/docs/source/index.rst b/docs/source/index.rst
index 9970d37..5c4bddb 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -2,42 +2,41 @@
sphinx-quickstart on Sun Nov 24 18:37:20 2024.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
+.. _index:
-=======
-Kompass
-=======
+############
+jdav Kompass
+############
Der Kompass ist dein Kompass in der Jugendarbeit in deiner JDAV Sektion. Wenn du das
-erste mal hier bist, schau doch mal :ref:`first-steps` an.
+erste mal hier bist, schau doch mal :ref:`user_manual/getstarted` an.
+
+.. attention::
+ Die Dokumentation befindet sich noch im Aufbau. -- The documentation is still under construction.
+
+ (Stand: 08.01.2025)
+
-Was ist der Kompass?
+Nutzer Dokumentation
--------------------
-Der Kompass ist eine Verwaltungsplattform für die tägliche Jugendarbeit in der JDAV.
-Die wichtigsten Funktionen sind
+- auf deutsch
+- Hier findest Du als Nutzer alles was Du wissen musst um den Kompass bedienen zu können.
-- Verwaltung von Teilnehmer\*innen von Jugendgruppen
-- Organisation von Ausfahrten
-- Abwicklung von Abrechnungen
-- Senden von E-Mails
+.. toctree::
+ :titlesonly:
-Neben diesen Funktionen für die tägliche Arbeit, automatisiert der Kompass die
-Aufnahme von neuen Mitgliedern und die Pflege der Daten durch
+ user_manual/index
-- Wartelistenverwaltung
-- Registrierung neuer Mitglieder
-- Rückmeldeverfahren
-.. _index:
+Development Documentation
+-------------------------
-Inhaltsverzeichnis
-------------------
+- auf englisch
+- Hier findest Du als Entwickler alles was Du wissen musst um den Kompass entwickeln und zu pflegen.
.. toctree::
- :maxdepth: 2
+ :titlesonly:
+
+ development_manual/index
- getstarted
- members
- excursions
- waitinglist
- finance
diff --git a/docs/source/excursions.rst b/docs/source/user_manual/excursions.rst
similarity index 92%
rename from docs/source/excursions.rst
rename to docs/source/user_manual/excursions.rst
index eb50caf..6169a87 100644
--- a/docs/source/excursions.rst
+++ b/docs/source/user_manual/excursions.rst
@@ -1,9 +1,9 @@
-.. _excursions:
+.. _user_manual/excursions:
Ausfahrten
==========
-Neben der :ref:`Teilnehmer\*innenverwaltung ` ist das Abwickeln von Ausfahrten
+Neben der :ref:`Teilnehmer\*innenverwaltung ` ist das Abwickeln von Ausfahrten
die zweite wichtige Aufgabe des Kompass. Eine Ausfahrt für die eigene Jugendgruppe
anbieten ist neben der ganzen inhaltlichen Arbeit auch jede Menge bürokratischer Aufwand. Der Kompass
versucht dir von diesem Aufwand so viel wie möglich abzunehmen.
@@ -43,6 +43,8 @@ Seminarbericht direkt ein und lass dir den Papierkram vom Kompass erledigen.
SJR Antrag
----------
+tbd
+
Abrechnung
----------
diff --git a/docs/source/finance.rst b/docs/source/user_manual/finance.rst
similarity index 91%
rename from docs/source/finance.rst
rename to docs/source/user_manual/finance.rst
index e093ee1..238aacf 100644
--- a/docs/source/finance.rst
+++ b/docs/source/user_manual/finance.rst
@@ -1,3 +1,5 @@
+.. _user_manual/finance:
+
Finanzen
========
diff --git a/docs/source/getstarted.rst b/docs/source/user_manual/getstarted.rst
similarity index 97%
rename from docs/source/getstarted.rst
rename to docs/source/user_manual/getstarted.rst
index 5010292..72e9d0c 100644
--- a/docs/source/getstarted.rst
+++ b/docs/source/user_manual/getstarted.rst
@@ -1,4 +1,4 @@
-.. _first-steps:
+.. _user_manual/getstarted:
Erste Schritte
==============
@@ -29,7 +29,7 @@ er auf den entsprechenden Eintrag, ändert das Geburtsdatum und klickt auf *Spei
.. note::
Nicht alle Einträge in der `Teilnehmer\*innenanzeige`_ sind klickbar. Das liegt daran,
dass du manche Teilnehmer\*innen zwar sehen, aber nicht ihre Details einsehen kannst.
- Manche Einträge wiederum kannst du einsehen, aber nicht bearbeiten. Für mehr Details siehe :ref:`Teilnehmer\*innenverwaltung `
+ Manche Einträge wiederum kannst du einsehen, aber nicht bearbeiten. Für mehr Details siehe :ref:`Teilnehmer\*innenverwaltung `
Probier doch einmal aus deinen eigenen Eintrag zu ändern. Sicherlich gibt es einige
Felder, die nicht ausgefüllt oder nicht mehr aktuell sind. Lade z.B. ein Bild von dir hoch,
@@ -70,7 +70,7 @@ Wie geht es weiter?
-------------------
Nun hat Fritz den Bürokratiekram für heute erledigt. Du willst noch mehr wissen? Dann
-geh zurück zum :ref:`index`.
+geh zurück zur :ref:`user_manual/index`.
.. _Startseite: https://jdav-hd.de/kompass
.. _Teilnehmer\*innenanzeige: https://jdav-hd.de/kompassmembers/member/
diff --git a/docs/source/images/members_change_tabs.png b/docs/source/user_manual/images/members_change_tabs.png
similarity index 100%
rename from docs/source/images/members_change_tabs.png
rename to docs/source/user_manual/images/members_change_tabs.png
diff --git a/docs/source/images/members_changelist_action.png b/docs/source/user_manual/images/members_changelist_action.png
similarity index 100%
rename from docs/source/images/members_changelist_action.png
rename to docs/source/user_manual/images/members_changelist_action.png
diff --git a/docs/source/images/members_changelist_filters.png b/docs/source/user_manual/images/members_changelist_filters.png
similarity index 100%
rename from docs/source/images/members_changelist_filters.png
rename to docs/source/user_manual/images/members_changelist_filters.png
diff --git a/docs/source/images/members_changelist_group_filter.png b/docs/source/user_manual/images/members_changelist_group_filter.png
similarity index 100%
rename from docs/source/images/members_changelist_group_filter.png
rename to docs/source/user_manual/images/members_changelist_group_filter.png
diff --git a/docs/source/images/members_changelist_pages.png b/docs/source/user_manual/images/members_changelist_pages.png
similarity index 100%
rename from docs/source/images/members_changelist_pages.png
rename to docs/source/user_manual/images/members_changelist_pages.png
diff --git a/docs/source/images/members_changelist_sorting.png b/docs/source/user_manual/images/members_changelist_sorting.png
similarity index 100%
rename from docs/source/images/members_changelist_sorting.png
rename to docs/source/user_manual/images/members_changelist_sorting.png
diff --git a/docs/source/images/members_registration_form.png b/docs/source/user_manual/images/members_registration_form.png
similarity index 100%
rename from docs/source/images/members_registration_form.png
rename to docs/source/user_manual/images/members_registration_form.png
diff --git a/docs/source/images/members_unconfirmed_registration_demote.png b/docs/source/user_manual/images/members_unconfirmed_registration_demote.png
similarity index 100%
rename from docs/source/images/members_unconfirmed_registration_demote.png
rename to docs/source/user_manual/images/members_unconfirmed_registration_demote.png
diff --git a/docs/source/images/members_waitinglist_change_invite_to_group.png b/docs/source/user_manual/images/members_waitinglist_change_invite_to_group.png
similarity index 100%
rename from docs/source/images/members_waitinglist_change_invite_to_group.png
rename to docs/source/user_manual/images/members_waitinglist_change_invite_to_group.png
diff --git a/docs/source/images/members_waitinglist_change_invite_to_group_button.png b/docs/source/user_manual/images/members_waitinglist_change_invite_to_group_button.png
similarity index 100%
rename from docs/source/images/members_waitinglist_change_invite_to_group_button.png
rename to docs/source/user_manual/images/members_waitinglist_change_invite_to_group_button.png
diff --git a/docs/source/images/members_waitinglist_change_invite_to_group_selection.png b/docs/source/user_manual/images/members_waitinglist_change_invite_to_group_selection.png
similarity index 100%
rename from docs/source/images/members_waitinglist_change_invite_to_group_selection.png
rename to docs/source/user_manual/images/members_waitinglist_change_invite_to_group_selection.png
diff --git a/docs/source/user_manual/index.rst b/docs/source/user_manual/index.rst
new file mode 100644
index 0000000..6d802e8
--- /dev/null
+++ b/docs/source/user_manual/index.rst
@@ -0,0 +1,50 @@
+.. _user_manual/index:
+
+####################
+Nutzer Dokumentation
+####################
+
+
+Der Kompass ist dein Kompass in der Jugendarbeit in deiner JDAV Sektion. Wenn du das
+erste mal hier bist, schau doch mal :ref:`user_manual/getstarted` an.
+
+.. toctree::
+ :titlesonly:
+
+ getstarted
+ members
+ excursions
+ waitinglist
+ finance
+
+
+Was ist der Kompass?
+--------------------
+
+Der Kompass ist eine Verwaltungsplattform für die tägliche Jugendarbeit in der JDAV.
+Die wichtigsten Funktionen sind
+
+- Verwaltung von Teilnehmer\*innen von Jugendgruppen
+- Organisation von Ausfahrten
+- Abwicklung von Abrechnungen
+- Senden von E-Mails
+
+Neben diesen Funktionen für die tägliche Arbeit, automatisiert der Kompass die
+Aufnahme von neuen Mitgliedern und die Pflege der Daten durch
+
+- Wartelistenverwaltung
+- Registrierung neuer Mitglieder
+- Rückmeldeverfahren
+
+Feedback
+--------
+
+Wenn Du Feedback hast, schreibe uns gerne eine E-Mail an: `digitales@jdav-hd.de `_.
+Der Kompass lebt davon, dass er genau unsere Probleme löst und nicht nur ein weiteres Tool ist.
+
+Feedback könnte sein:
+
+- Fehler in der Software (bug)
+- Verbesserungsvorschläge
+- Wünsche für neue Funktionen
+- etc. pp.
diff --git a/docs/source/members.rst b/docs/source/user_manual/members.rst
similarity index 94%
rename from docs/source/members.rst
rename to docs/source/user_manual/members.rst
index 9eed0b5..5b72e86 100644
--- a/docs/source/members.rst
+++ b/docs/source/user_manual/members.rst
@@ -1,4 +1,4 @@
-.. _members:
+.. _user_manual/members:
Teilnehmer\*innenverwaltung
===========================
@@ -15,12 +15,12 @@ In der Teilnehmer\*innenverwaltung siehst du in der Regel zwei Menüpunkte:
- Teilnehmer\*innenverwaltung: Ausfahrten und *Alle Teilnehmer\*innen*.
In diesem Abschnitt geht es nur um die Teilnehmer\*innen selbst. Wenn du etwas zum Punkt Ausfahrten
-lernen möchtest, kannst du zu :ref:`excursions` springen.
+lernen möchtest, kannst du zu :ref:`user_manual/excursions` springen.
.. note::
Falls du ein Amt in deiner Sektion ausübst und zum Beispiel für Jugendgruppenkoordination
oder die Verwaltung der Warteliste zuständig ist, siehst du hier noch mehr Punkte. Mehr
- Informationen dazu findest du unter :ref:`waitinglist`.
+ Informationen dazu findest du unter :ref:`user_manual/waitinglist`.
Falls du direkt zu einer von dir geleiteten Jugendgruppe gehen möchtest, findest
du unter `Teilnehmer*innenverwaltung`_ oder auf der `Startseite`_
@@ -138,14 +138,14 @@ Der\*die ausgewählte Teilnehmer\*in erhält eine E-Mail mit einem Link. Dieser
Seite auf der die Person ihr Geburtsdatum eingeben muss.
.. note::
- Das Geburtsdatumsformat ist TT.MM.JJJJ, also wenn Peter am
- 1.4.1999 geboren ist, müsste er *01.04.1999* eingeben.
+ Das Geburtsdatumsformat ist ``TT.MM.JJJJ``, also wenn Peter am
+ 1.4.1999 geboren ist, muss er *01.04.1999* eingeben.
Nach erfolgreich eingegebenem Geburtsdatum, wird die Person auf ein Formular mit ihren Daten weitergeleitet.
-Dann einfach prüfen, gegebenenfalls aktualisieren und schließlich speichern. Der Link ist
+Dann prüfen, gegebenenfalls aktualisieren und schließlich speichern. Der Link ist
immer 30 Tage lang gültig und kann in dieser Zeit auch beliebig oft benutzt werden.
-Klingt alles noch abstrakt? Dann fordere doch mal dich selbst zur Rückmeldung auf und probiere es aus.
+Klingt alles noch abstrakt? Dann fordere dich doch mal selbst zur Rückmeldung auf und probiere es aus.
.. _emergency-contacts:
@@ -159,7 +159,7 @@ mindestens einen Notfallkontakt angeben.
.. note::
Bei vielen Teilnehmer\*innen sind keine Notfallkontakte eingetragen. Das liegt dann vermutlich daran,
- dass die aus einem anderen System migriert wurden und daher nicht verfügbar sind.
+ dass sie aus einem anderen System migriert wurden und daher nicht verfügbar sind.
Bei der regelmäßigen :ref:`echo` werden die Notfallkontakte ebenfalls abgefragt. Falls
du bei einem deiner Gruppenkinder feststellst, dass die Notfallkontakte fehlen
diff --git a/docs/source/waitinglist.rst b/docs/source/user_manual/waitinglist.rst
similarity index 98%
rename from docs/source/waitinglist.rst
rename to docs/source/user_manual/waitinglist.rst
index 09bfe7b..22f8a56 100644
--- a/docs/source/waitinglist.rst
+++ b/docs/source/user_manual/waitinglist.rst
@@ -1,4 +1,4 @@
-.. _waitinglist:
+.. _user_manual/waitinglist:
Warteliste und neue Mitglieder
==============================
@@ -65,7 +65,7 @@ Neues Mitglied in euerer Gruppe
Nach dem ihr ein neues Mitglied in eurer Gruppe habt seid ihr auch vorrangig für die Datenpflege
zuständig. Bitte ruft die Detailansicht des\*der Teilnehmer\*in auf. Öffnet das Anmeldeformular und
Übertragt die Infos in die zugehörigen Felder. Weiteres dazu findet ihr in der
-:ref:`Teilnehmer\*innenverwaltung `
+:ref:`Teilnehmer\*innenverwaltung `
.. _group-registration-password:
diff --git a/jdav_web/finance/locale/de/LC_MESSAGES/django.po b/jdav_web/finance/locale/de/LC_MESSAGES/django.po
index cc5404f..6c85b0f 100644
--- a/jdav_web/finance/locale/de/LC_MESSAGES/django.po
+++ b/jdav_web/finance/locale/de/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2024-12-01 16:23+0100\n"
+"POT-Creation-Date: 2025-01-01 21:48+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,12 +18,12 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: finance/admin.py:76
+#: finance/admin.py
#, python-format
msgid "%(name)s is already submitted."
msgstr "%(name)s ist bereits eingereicht."
-#: finance/admin.py:82
+#: finance/admin.py
#, python-format
msgid ""
"Successfully submited %(name)s. The finance department will notify the "
@@ -32,23 +32,23 @@ msgstr ""
"Rechnung %(name)s erfolgreich eingereicht. Das Finanzreferat wird auf dich "
"sobald wie möglich zukommen."
-#: finance/admin.py:85
+#: finance/admin.py
msgid "Submit statement"
msgstr "Rechnung einreichen"
-#: finance/admin.py:162
+#: finance/admin.py
#, python-format
msgid "%(name)s is not yet submitted."
msgstr "%(name)s ist noch nicht eingereicht."
-#: finance/admin.py:169
+#: finance/admin.py
#, python-format
msgid "An error occured while trying to confirm %(name)s. Please try again."
msgstr ""
"Beim Abwickeln von %(name)s ist ein Fehler aufgetreten. Bitte versuche es "
"erneut."
-#: finance/admin.py:173
+#: finance/admin.py
#, python-format
msgid ""
"Successfully confirmed %(name)s. I hope you executed the associated "
@@ -57,11 +57,11 @@ msgstr ""
"Erfolgreich %(name)s abgewickelt. Ich hoffe du hast die zugehörigen "
"Überweisungen ausgeführt, ich werde dich nicht nochmal erinnern."
-#: finance/admin.py:180
+#: finance/admin.py
msgid "Statement confirmed"
msgstr "Abrechnung abgewickelt"
-#: finance/admin.py:186
+#: finance/admin.py
msgid ""
"Transactions do not match the covered expenses. Please correct the mistakes "
"listed below."
@@ -69,19 +69,19 @@ msgstr ""
"Überweisungen stimmen nicht mit den übernommenen Kosten überein. Bitte "
"korrigiere die unten aufgeführten Fehler."
-#: finance/admin.py:191
+#: finance/admin.py
msgid "Some transactions have no ledger configured. Please fill in the gaps."
msgstr ""
"Manche Überweisungen haben kein Geldtopf eingestellt. Bitte trage das nach."
-#: finance/admin.py:200
+#: finance/admin.py
#, python-format
msgid "Successfully rejected %(name)s. The requestor can reapply, when needed."
msgstr ""
"Die Rechnung %(name)s wurde abgelehnt. Die Person kann die Rechnung erneut "
"einstellen, wenn es benötigt wird."
-#: finance/admin.py:207
+#: finance/admin.py
#, python-format
msgid ""
"%(name)s already has transactions. Please delete them first, if you want to "
@@ -90,12 +90,12 @@ msgstr ""
"%(name)s hat bereits Überweisungen. Bitte lösche diese zunächst, bevor du "
"neue generierst."
-#: finance/admin.py:212
+#: finance/admin.py
#, python-format
msgid "Successfully generated transactions for %(name)s"
msgstr "Automatisch Überweisungsträger für %(name)s generiert."
-#: finance/admin.py:215
+#: finance/admin.py
#, python-format
msgid ""
"Error while generating transactions for %(name)s. Do all bills have a payer?"
@@ -103,214 +103,208 @@ msgstr ""
"Fehler beim Erzeugen der Überweisungsträger für %(name)s. Sind für alle "
"Quittungen eine bezahlende Person eingestellt? "
-#: finance/admin.py:218
+#: finance/admin.py
msgid "View submitted statement"
msgstr "Eingereichte Abrechnung einsehen"
-#: finance/admin.py:230
+#: finance/admin.py
#, python-format
msgid "Successfully reduced transactions for %(name)s."
msgstr "Überweisungsträger für %(name)s minimiert."
-#: finance/admin.py:274
+#: finance/admin.py
#, python-format
msgid "%(name)s is not yet confirmed."
msgstr "%(name)s ist noch nicht bestätigt."
-#: finance/admin.py:283
+#: finance/admin.py
#, python-format
msgid "Successfully unconfirmed %(name)s. I hope you know what you are doing."
msgstr ""
"Erfolgreich die Bestätigung von %(name)s zurückgenommen. Ich hoffe du weißt "
"was du machst."
-#: finance/admin.py:288 finance/templates/admin/unconfirm_statement.html:26
+#: finance/admin.py finance/templates/admin/unconfirm_statement.html
msgid "Unconfirm statement"
msgstr "Bestätigung zurücknehmen"
-#: finance/apps.py:8
+#: finance/apps.py
msgid "Finance"
msgstr "Finanzen"
-#: finance/models.py:21
+#: finance/models.py
msgid "Name"
msgstr "Name"
-#: finance/models.py:27 finance/models.py:472 finance/models.py:496
-#: finance/templates/admin/confirmed_statement.html:38
-#: finance/templates/admin/overview_submitted_statement.html:100
+#: finance/models.py finance/templates/admin/confirmed_statement.html
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Ledger"
msgstr "Geldtopf"
-#: finance/models.py:28
+#: finance/models.py
msgid "Ledgers"
msgstr "Geldtöpfe"
-#: finance/models.py:48 finance/models.py:415 finance/models.py:495
+#: finance/models.py
msgid "Short description"
msgstr "Kurzbeschreibung"
-#: finance/models.py:51 finance/models.py:416
+#: finance/models.py
msgid "Explanation"
msgstr "Erklärung"
-#: finance/models.py:53
+#: finance/models.py
msgid "Associated excursion"
msgstr "Zugehörige Ausfahrt"
-#: finance/models.py:58
+#: finance/models.py
msgid "Price per night"
msgstr "Preis pro Nacht"
-#: finance/models.py:60
+#: finance/models.py
msgid "Submitted"
msgstr "Eingericht"
-#: finance/models.py:61
+#: finance/models.py
msgid "Submitted on"
msgstr "Eingereicht am"
-#: finance/models.py:62
+#: finance/models.py
msgid "Confirmed"
msgstr "Abgewickelt"
-#: finance/models.py:63 finance/models.py:479
+#: finance/models.py
msgid "Paid on"
msgstr "Bezahlt am"
-#: finance/models.py:65
+#: finance/models.py
msgid "Created by"
msgstr "Erstellt von"
-#: finance/models.py:70
+#: finance/models.py
msgid "Submitted by"
msgstr "Eingereicht von"
-#: finance/models.py:75 finance/models.py:480
+#: finance/models.py
msgid "Authorized by"
msgstr "Autorisiert von"
-#: finance/models.py:82 finance/models.py:414 finance/models.py:475
+#: finance/models.py
msgid "Statement"
msgstr "Abrechnung"
-#: finance/models.py:83
+#: finance/models.py
msgid "Statements"
msgstr "Abrechnungen"
-#: finance/models.py:98
+#: finance/models.py
#, python-format
msgid "Statement: %(excursion)s"
msgstr "Abrechnung: %(excursion)s"
-#: finance/models.py:150
+#: finance/models.py
msgid "Ready to confirm"
msgstr "Bereit zur Abwicklung"
-#: finance/models.py:194
+#: finance/models.py
#, python-format
msgid "Compensation for %(excu)s"
msgstr "Entschädigung für %(excu)s"
-#: finance/models.py:327
-#: finance/templates/admin/overview_submitted_statement.html:78
+#: finance/models.py finance/templates/admin/overview_submitted_statement.html
msgid "Total"
msgstr "Gesamtbetrag"
-#: finance/models.py:369
+#: finance/models.py
msgid "Statement in preparation"
msgstr "Abrechnung in Vorbereitung"
-#: finance/models.py:370
+#: finance/models.py
msgid "Statements in preparation"
msgstr "Abrechnungen in Vorbereitung"
-#: finance/models.py:389
+#: finance/models.py
msgid "Submitted statement"
msgstr "Eingereichte Abrechnung"
-#: finance/models.py:390
+#: finance/models.py
msgid "Submitted statements"
msgstr "Eingereichte Abrechnungen"
-#: finance/models.py:406
+#: finance/models.py
msgid "Paid statement"
msgstr "Bezahlte Abrechnung"
-#: finance/models.py:407
+#: finance/models.py
msgid "Paid statements"
msgstr "Bezahlte Abrechnungen"
-#: finance/models.py:418 finance/models.py:432 finance/models.py:469
-#: finance/templates/admin/confirmed_statement.html:36
-#: finance/templates/admin/overview_submitted_statement.html:31
-#: finance/templates/admin/overview_submitted_statement.html:98
+#: finance/models.py finance/templates/admin/confirmed_statement.html
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Amount"
msgstr "Betrag"
-#: finance/models.py:419
+#: finance/models.py
msgid "Paid by"
msgstr "Bezahlt von"
-#: finance/models.py:421
+#: finance/models.py
msgid "Covered"
msgstr "Übernommen"
-#: finance/models.py:422
+#: finance/models.py
msgid "Refunded"
msgstr "Ausgezahlt"
-#: finance/models.py:424
+#: finance/models.py
msgid "Proof"
msgstr "Beleg"
-#: finance/models.py:435 finance/models.py:442 finance/models.py:455
+#: finance/models.py
msgid "Bill"
msgstr "Ausgabe"
-#: finance/models.py:436 finance/models.py:443 finance/models.py:456
-#: finance/templates/admin/overview_submitted_statement.html:26
+#: finance/models.py finance/templates/admin/overview_submitted_statement.html
msgid "Bills"
msgstr "Ausgaben"
-#: finance/models.py:468 finance/templates/admin/confirmed_statement.html:37
-#: finance/templates/admin/overview_submitted_statement.html:99
+#: finance/models.py finance/templates/admin/confirmed_statement.html
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Reference"
msgstr "Verwendungszweck"
-#: finance/models.py:470
+#: finance/models.py
msgid "Recipient"
msgstr "Empfänger"
-#: finance/models.py:478
+#: finance/models.py
msgid "Paid"
msgstr "Bezahlt"
-#: finance/models.py:490
+#: finance/models.py
msgid "Transaction"
msgstr "Überweisung"
-#: finance/models.py:491
-#: finance/templates/admin/overview_submitted_statement.html:84
+#: finance/models.py finance/templates/admin/overview_submitted_statement.html
msgid "Transactions"
msgstr "Überweisungen"
-#: finance/templates/admin/confirmed_statement.html:17
-#: finance/templates/admin/overview_submitted_statement.html:17
-#: finance/templates/admin/submit_statement.html:17
-#: finance/templates/admin/unconfirm_statement.html:17
+#: finance/templates/admin/confirmed_statement.html
+#: finance/templates/admin/overview_submitted_statement.html
+#: finance/templates/admin/submit_statement.html
+#: finance/templates/admin/unconfirm_statement.html
msgid "Home"
msgstr "Start"
-#: finance/templates/admin/confirmed_statement.html:21
+#: finance/templates/admin/confirmed_statement.html
msgid "Paiment"
msgstr "Bezahlung"
-#: finance/templates/admin/confirmed_statement.html:26
+#: finance/templates/admin/confirmed_statement.html
msgid "Paying statement"
msgstr "Rechnung bezahlen"
-#: finance/templates/admin/confirmed_statement.html:29
+#: finance/templates/admin/confirmed_statement.html
msgid ""
"The statement is valid. Please execute the following transactions and then "
"proceed by finalizing the confirmation."
@@ -318,43 +312,59 @@ msgstr ""
"Die Abrechnung ist gültig. Bitte führe die folgenden Überweisungen aus und "
"fahre dann fort, indem du die Abwicklung bestätigst."
-#: finance/templates/admin/confirmed_statement.html:35
+#: finance/templates/admin/confirmed_statement.html
msgid "IBAN"
msgstr "IBAN"
-#: finance/templates/admin/confirmed_statement.html:66
+#: finance/templates/admin/confirmed_statement.html
+msgid "QR Code"
+msgstr "QR Code"
+
+#: finance/templates/admin/confirmed_statement.html
+msgid "Show"
+msgstr "Anzeigen"
+
+#: finance/templates/admin/confirmed_statement.html
+msgid "No QR code can be displayed."
+msgstr "Es kann kein QR-Code angezeigt werden."
+
+#: finance/templates/admin/confirmed_statement.html
+msgid "Showing"
+msgstr "Sichtbar"
+
+#: finance/templates/admin/confirmed_statement.html
msgid "I did execute the listed transactions."
msgstr "Ich habe die aufgeführten Überweisungen ausgeführt."
-#: finance/templates/admin/confirmed_statement.html:68
+#: finance/templates/admin/confirmed_statement.html
msgid "Confirm"
msgstr "Bestätigen"
-#: finance/templates/admin/overview_submitted_statement.html:21
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Overview"
msgstr "Übersicht"
-#: finance/templates/admin/overview_submitted_statement.html:32
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Covered by association"
msgstr "Vom Verein übernommen"
-#: finance/templates/admin/overview_submitted_statement.html:50
+#: finance/templates/admin/overview_submitted_statement.html
#, python-format
msgid "The total amount is %(total_bills)s €."
msgstr "Der Gesamtbetrag beträgt %(total_bills)s €."
-#: finance/templates/admin/overview_submitted_statement.html:54
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Excursion"
msgstr "Ausfahrt"
-#: finance/templates/admin/overview_submitted_statement.html:57
+#: finance/templates/admin/overview_submitted_statement.html
#, python-format
msgid "This excursion featured %(staff_count)s youth leader(s), each costing"
msgstr ""
"Diese Ausfahrt hatte %(staff_count)s Jugendleiter*innen. Auf jede*n "
"entfallen die folgenden Kosten:"
-#: finance/templates/admin/overview_submitted_statement.html:62
+#: finance/templates/admin/overview_submitted_statement.html
#, python-format
msgid ""
"%(nights)s nights for %(price_per_night)s€ per night making a total of "
@@ -363,7 +373,7 @@ msgstr ""
"%(nights)s Nächte zum Preis von %(price_per_night)s€ pro Nacht. Das ergibt "
"eine Gesamtsumme von %(nights_per_yl)s€."
-#: finance/templates/admin/overview_submitted_statement.html:65
+#: finance/templates/admin/overview_submitted_statement.html
#, python-format
msgid ""
"%(duration)s days for %(allowance_per_day)s€ per day making a total of "
@@ -372,7 +382,7 @@ msgstr ""
"%(duration)s Tage für %(allowance_per_day)s€ pro Tag. Das ergibt eine "
"Gesamtsumme von %(allowance_per_yl)s€."
-#: finance/templates/admin/overview_submitted_statement.html:68
+#: finance/templates/admin/overview_submitted_statement.html
#, python-format
msgid ""
"%(kilometers_traveled)s km by %(means_of_transport)s (%(euro_per_km)s € / "
@@ -381,7 +391,7 @@ msgstr ""
"%(kilometers_traveled)s km mit %(means_of_transport)s (%(euro_per_km)s€ / "
"km). Das ergibt eine Gesamtsumme von %(transportation_per_yl)s€."
-#: finance/templates/admin/overview_submitted_statement.html:73
+#: finance/templates/admin/overview_submitted_statement.html
#, python-format
msgid ""
"In total this is %(total_per_yl)s€ times %(staff_count)s, giving "
@@ -390,12 +400,12 @@ msgstr ""
"Insgesamt sind das Kosten von %(total_per_yl)s€ mal %(staff_count)s, "
"insgesamt also %(total_staff)s€."
-#: finance/templates/admin/overview_submitted_statement.html:81
+#: finance/templates/admin/overview_submitted_statement.html
#, python-format
msgid "This results in a total amount of %(total)s€"
msgstr "Das resultiert in einem Gesamtbetrag von %(total)s€"
-#: finance/templates/admin/overview_submitted_statement.html:87
+#: finance/templates/admin/overview_submitted_statement.html
msgid ""
"Currently, no transactions are planned. You can auto generate them from the "
"data, by clicking the following button."
@@ -403,19 +413,19 @@ msgstr ""
"Aktuell sind keine Überweisungen vorgesehen. Du kannst die erforderlichen "
"durch Klicken auf den folgenden Knopf generieren."
-#: finance/templates/admin/overview_submitted_statement.html:90
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Generate transactions"
msgstr "Erzeuge Überweisungsträger"
-#: finance/templates/admin/overview_submitted_statement.html:94
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Currently the following transactions are planned."
msgstr "Aktuell sind die folgenden Überweisungen vorgesehen."
-#: finance/templates/admin/overview_submitted_statement.html:137
+#: finance/templates/admin/overview_submitted_statement.html
msgid "These transactions match the calculated costs."
msgstr "Diese Überweisungen stimmen mit den berechneten Kosten überein."
-#: finance/templates/admin/overview_submitted_statement.html:140
+#: finance/templates/admin/overview_submitted_statement.html
msgid ""
"The current transactions do not reflect all costs in this statement. Please "
"fix the following issues:"
@@ -423,42 +433,41 @@ msgstr ""
"Die aktuell vorgesehenen Überweisungen stimmen nicht mit den berechneten "
"Kosten überein. Bitte korrigiere die folgenden Fehler:"
-#: finance/templates/admin/overview_submitted_statement.html:145
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Currently receiving"
msgstr "Erhält aktuell"
-#: finance/templates/admin/overview_submitted_statement.html:146
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Actual costs"
msgstr "Tatsächliche Kosten"
-#: finance/templates/admin/overview_submitted_statement.html:147
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Difference"
msgstr "Differenz"
-#: finance/templates/admin/overview_submitted_statement.html:174
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Accept"
msgstr "Annehmen"
-#: finance/templates/admin/overview_submitted_statement.html:175
+#: finance/templates/admin/overview_submitted_statement.html
msgid "Reject"
msgstr "Ablehnen"
-#: finance/templates/admin/overview_submitted_statement.html:178
-#: finance/templates/admin/submit_statement.html:35
-#: finance/templates/admin/unconfirm_statement.html:39
+#: finance/templates/admin/overview_submitted_statement.html
+#: finance/templates/admin/submit_statement.html
+#: finance/templates/admin/unconfirm_statement.html
msgid "Cancel"
msgstr "Abbruch"
-#: finance/templates/admin/submit_statement.html:21
-#: finance/templates/admin/submit_statement.html:34
+#: finance/templates/admin/submit_statement.html
msgid "Submit"
msgstr "Einreichen"
-#: finance/templates/admin/submit_statement.html:26
+#: finance/templates/admin/submit_statement.html
msgid "Submit to the finance department"
msgstr "Beim Finanzreferat einreichen"
-#: finance/templates/admin/submit_statement.html:28
+#: finance/templates/admin/submit_statement.html
msgid ""
"Do you want to submit the statement for further processing by the finance "
"department? If you proceed, no further changes to the statement are possible."
@@ -466,12 +475,11 @@ msgstr ""
"Möchtest du die Abrechnung beim Finanzreferat einreichen? Wenn du "
"fortschreitest, sind keine weiteren Änderungen an der Abrechnung möglich."
-#: finance/templates/admin/unconfirm_statement.html:21
-#: finance/templates/admin/unconfirm_statement.html:38
+#: finance/templates/admin/unconfirm_statement.html
msgid "Unconfirm"
msgstr "Bestätigung zurücknehmen"
-#: finance/templates/admin/unconfirm_statement.html:29
+#: finance/templates/admin/unconfirm_statement.html
msgid ""
"You are entering risk zone! Do you really want to manually set this "
"statement back to unconfirmed?"
@@ -479,7 +487,7 @@ msgstr ""
"Du bewegst dich in einer Risiko Zone! Möchtest du wirklich manuell die "
"Bestätigung dieser Abrechnung zurücknehmen?"
-#: finance/templates/admin/unconfirm_statement.html:36
+#: finance/templates/admin/unconfirm_statement.html
msgid ""
"I am aware that this is not a standard procedure and this might cause data "
"integrity issues."
diff --git a/jdav_web/finance/models.py b/jdav_web/finance/models.py
index 04286e1..d27b74f 100644
--- a/jdav_web/finance/models.py
+++ b/jdav_web/finance/models.py
@@ -15,6 +15,9 @@ from contrib.models import CommonModel
from contrib.rules import has_global_perm
from utils import cvt_to_decimal, RestrictedFileField
+from schwifty import IBAN
+import re
+
# Create your models here.
class Ledger(models.Model):
@@ -495,6 +498,45 @@ class Transaction(models.Model):
def __str__(self):
return "T#{}".format(self.pk)
+ @staticmethod
+ def escape_reference(reference):
+ umlaut_map = {
+ 'ä': 'ae', 'ö': 'oe', 'ü': 'ue',
+ 'Ä': 'Ae', 'Ö': 'Oe', 'Ü': 'Ue',
+ 'ß': 'ss'
+ }
+ pattern = re.compile('|'.join(umlaut_map.keys()))
+ int_reference = pattern.sub(lambda x: umlaut_map[x.group()], reference)
+ allowed_chars = r"[^a-z0-9 /?: .,'+-]"
+ clean_reference = re.sub(allowed_chars, '', int_reference, flags=re.IGNORECASE)
+ return clean_reference
+
+ def code(self):
+
+ if self.amount == 0:
+ return ""
+
+ iban = IBAN(self.member.iban, allow_invalid=True)
+ if not iban.is_valid:
+ return ""
+ bic = iban.bic
+
+ reference = self.escape_reference(self.reference)
+
+ # also escaping receiver as umlaute are also not allowed here
+ receiver = self.escape_reference(f"{self.member.prename} {self.member.lastname}")
+ return f"""BCD
+001
+1
+SCT
+{bic}
+{receiver}
+{iban}
+EUR{self.amount}
+
+
+{reference}"""
+
class Meta:
verbose_name = _('Transaction')
verbose_name_plural = _('Transactions')
diff --git a/jdav_web/finance/templates/admin/confirmed_statement.html b/jdav_web/finance/templates/admin/confirmed_statement.html
index aa2c079..3d35418 100644
--- a/jdav_web/finance/templates/admin/confirmed_statement.html
+++ b/jdav_web/finance/templates/admin/confirmed_statement.html
@@ -7,6 +7,8 @@
+
+
{% endblock %}
{% block bodyclass %}{{ block.super }} app-{{ opts.app_label }} model-{{ opts.model_name }} admin-view
@@ -36,6 +38,7 @@
| {% trans "Amount" %} |
{% trans "Reference" %} |
{% trans "Ledger" %} |
+ {% trans "QR Code" %} |
{% for transaction in statement.transaction_set.all %}
@@ -54,11 +57,53 @@
|
{{ transaction.ledger }}
|
+
+ {% trans "Show" %}
+ |
{% endfor %}
+
+