feat: Memory-Konzept für Agents implementieren (STI-21)

- REST API: 9 Read-Only-Endpunkte unter /api/v1/ für alle Kernmodelle
  (Destinatäre, Ländereien, Pächter, Förderungen, Konten,
  Verpachtungen, Verwaltungskosten, Kalender, Transaktionen)
- Token-Authentifizierung via DRF TokenAuthentication
- Management-Command `create_agent_token` für Agent-Tokens
- Wissensbasis: knowledge/ mit Satzung, Richtlinien, Verfahren,
  Kontakte, Historie
- Agent-Instructions: Datenzugriff-Sektion in AGENTS.md dokumentiert

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
SysAdmin Agent
2026-03-09 22:45:11 +00:00
parent 4b21f553c3
commit f8f9dc3319
17 changed files with 1224 additions and 1 deletions

View File

@@ -162,7 +162,32 @@ Nutze für die Prüfung möglichst dieses Raster:
- Protokollentwurf
- Wenn eine Frage unklar ist, nenne zuerst die Annahmen, auf denen deine Antwort beruht.
### 11. KLARE GRENZEN
### 11. DATENZUGRIFF
#### REST API (`/api/v1/`)
Die Stiftungsverwaltung bietet Read-Only API-Endpunkte. Authentifizierung über Token (`Authorization: Token <token>`).
| Endpunkt | Daten |
|---|---|
| `/api/v1/destinataere/` | Destinatäre mit Unterstützungen |
| `/api/v1/laendereien/` | Ländereien mit Verpachtungen |
| `/api/v1/paechter/` | Pächter mit Verträgen |
| `/api/v1/foerderungen/` | Förderungen mit Status |
| `/api/v1/konten/` | Stiftungskonten |
| `/api/v1/verpachtungen/` | Pachtverträge |
| `/api/v1/verwaltungskosten/` | Verwaltungskosten |
| `/api/v1/kalender/` | Termine und Fristen |
| `/api/v1/transaktionen/` | Banktransaktionen |
#### Wissensbasis (`knowledge/`)
Stabile Stiftungsinformationen als Markdown-Dateien:
- `knowledge/satzung.md` — Stiftungssatzung und Zwecke
- `knowledge/richtlinien.md` — Förderrichtlinien
- `knowledge/verfahren.md` — Verwaltungsverfahren und Abläufe
- `knowledge/kontakte.md` — Wichtige Kontakte
- `knowledge/historie.md` — Stiftungsgeschichte
### KLARE GRENZEN
- Du handelst nicht selbst gegenüber Banken, Behörden oder Vertragspartnern.
- Du gibst keine finalen rechtlichen Freigaben.
- Du bestätigst keine Gemeinnützigkeitskonformität mit Verbindlichkeit.

View File

@@ -53,6 +53,33 @@ Du bist Systemadministrator einer gemeinnützigen deutschen Familienstiftung. Du
- Erfinde keine Fakten. Benenne Unsicherheiten und offene Punkte klar.
- Eskaliere bei Unklarheiten oder potenziellen Risiken.
## Datenzugriff
### REST API (`/api/v1/`)
Die Stiftungsverwaltung bietet Read-Only API-Endpunkte für alle Kernmodelle. Authentifizierung über Token (`Authorization: Token <token>`).
| Endpunkt | Daten |
|---|---|
| `/api/v1/destinataere/` | Destinatäre mit Unterstützungen |
| `/api/v1/laendereien/` | Ländereien mit Verpachtungen |
| `/api/v1/paechter/` | Pächter mit Verträgen |
| `/api/v1/foerderungen/` | Förderungen mit Status |
| `/api/v1/konten/` | Stiftungskonten |
| `/api/v1/verpachtungen/` | Pachtverträge |
| `/api/v1/verwaltungskosten/` | Verwaltungskosten |
| `/api/v1/kalender/` | Termine und Fristen |
| `/api/v1/transaktionen/` | Banktransaktionen |
Token erstellen: `python manage.py create_agent_token <username>`
### Wissensbasis (`knowledge/`)
Stabile Stiftungsinformationen als Markdown-Dateien:
- `knowledge/satzung.md` — Stiftungssatzung und Zwecke
- `knowledge/richtlinien.md` — Förderrichtlinien
- `knowledge/verfahren.md` — Verwaltungsverfahren und Abläufe
- `knowledge/kontakte.md` — Wichtige Kontakte
- `knowledge/historie.md` — Stiftungsgeschichte
## Grenzen
- Du triffst keine eigenständigen Entscheidungen über Architektur oder Technologieauswahl ohne Rücksprache.

View File

@@ -34,6 +34,7 @@ INSTALLED_APPS = [
"django.contrib.staticfiles",
"django.contrib.humanize",
"rest_framework",
"rest_framework.authtoken",
"django_otp",
"django_otp.plugins.otp_totp",
"django_otp.plugins.otp_static",
@@ -99,6 +100,15 @@ STATICFILES_DIRS = [
]
DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField"
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": [
"rest_framework.authentication.TokenAuthentication",
],
"DEFAULT_PERMISSION_CLASSES": [
"rest_framework.permissions.IsAuthenticated",
],
}
MEDIA_URL = "/media/"
MEDIA_ROOT = BASE_DIR / "media"

View File

@@ -7,6 +7,7 @@ from django.urls import include, path
from stiftung.views import home
urlpatterns = [
path("api/v1/", include("stiftung.api_urls")),
path("", include("stiftung.urls")),
path("admin/", admin.site.urls),
# Authentication URLs

View File

@@ -0,0 +1,88 @@
from rest_framework import serializers
from .models import (
BankTransaction,
Destinataer,
DestinataerUnterstuetzung,
Foerderung,
Land,
LandVerpachtung,
Paechter,
StiftungsKalenderEintrag,
StiftungsKonto,
Verwaltungskosten,
)
class DestinataerUnterstuetzungSerializer(serializers.ModelSerializer):
class Meta:
model = DestinataerUnterstuetzung
fields = "__all__"
class DestinataerSerializer(serializers.ModelSerializer):
unterstuetzungen = DestinataerUnterstuetzungSerializer(many=True, read_only=True)
class Meta:
model = Destinataer
fields = "__all__"
class LandVerpachtungSerializer(serializers.ModelSerializer):
class Meta:
model = LandVerpachtung
fields = "__all__"
class LandSerializer(serializers.ModelSerializer):
aktive_verpachtungen = serializers.SerializerMethodField()
class Meta:
model = Land
fields = "__all__"
def get_aktive_verpachtungen(self, obj):
qs = obj.neue_verpachtungen.filter(status="aktiv")
return LandVerpachtungSerializer(qs, many=True).data
class PaechterSerializer(serializers.ModelSerializer):
aktive_verpachtungen = serializers.SerializerMethodField()
class Meta:
model = Paechter
fields = "__all__"
def get_aktive_verpachtungen(self, obj):
qs = obj.neue_verpachtungen.filter(status="aktiv")
return LandVerpachtungSerializer(qs, many=True).data
class FoerderungSerializer(serializers.ModelSerializer):
class Meta:
model = Foerderung
fields = "__all__"
class StiftungsKontoSerializer(serializers.ModelSerializer):
class Meta:
model = StiftungsKonto
fields = "__all__"
class VerwaltungskostenSerializer(serializers.ModelSerializer):
class Meta:
model = Verwaltungskosten
fields = "__all__"
class StiftungsKalenderEintragSerializer(serializers.ModelSerializer):
class Meta:
model = StiftungsKalenderEintrag
fields = "__all__"
class BankTransactionSerializer(serializers.ModelSerializer):
class Meta:
model = BankTransaction
fields = "__all__"

26
app/stiftung/api_urls.py Normal file
View File

@@ -0,0 +1,26 @@
from rest_framework.routers import DefaultRouter
from .api_views import (
BankTransactionViewSet,
DestinataerViewSet,
FoerderungViewSet,
LandVerpachtungViewSet,
LandViewSet,
PaechterViewSet,
StiftungsKalenderEintragViewSet,
StiftungsKontoViewSet,
VerwaltungskostenViewSet,
)
router = DefaultRouter()
router.register(r"destinataere", DestinataerViewSet)
router.register(r"laendereien", LandViewSet)
router.register(r"paechter", PaechterViewSet)
router.register(r"foerderungen", FoerderungViewSet)
router.register(r"konten", StiftungsKontoViewSet)
router.register(r"verpachtungen", LandVerpachtungViewSet)
router.register(r"verwaltungskosten", VerwaltungskostenViewSet)
router.register(r"kalender", StiftungsKalenderEintragViewSet)
router.register(r"transaktionen", BankTransactionViewSet)
urlpatterns = router.urls

69
app/stiftung/api_views.py Normal file
View File

@@ -0,0 +1,69 @@
from rest_framework.viewsets import ReadOnlyModelViewSet
from .api_serializers import (
BankTransactionSerializer,
DestinataerSerializer,
FoerderungSerializer,
LandSerializer,
LandVerpachtungSerializer,
PaechterSerializer,
StiftungsKalenderEintragSerializer,
StiftungsKontoSerializer,
VerwaltungskostenSerializer,
)
from .models import (
BankTransaction,
Destinataer,
Foerderung,
Land,
LandVerpachtung,
Paechter,
StiftungsKalenderEintrag,
StiftungsKonto,
Verwaltungskosten,
)
class DestinataerViewSet(ReadOnlyModelViewSet):
queryset = Destinataer.objects.all()
serializer_class = DestinataerSerializer
class LandViewSet(ReadOnlyModelViewSet):
queryset = Land.objects.all()
serializer_class = LandSerializer
class PaechterViewSet(ReadOnlyModelViewSet):
queryset = Paechter.objects.all()
serializer_class = PaechterSerializer
class FoerderungViewSet(ReadOnlyModelViewSet):
queryset = Foerderung.objects.all()
serializer_class = FoerderungSerializer
class StiftungsKontoViewSet(ReadOnlyModelViewSet):
queryset = StiftungsKonto.objects.all()
serializer_class = StiftungsKontoSerializer
class LandVerpachtungViewSet(ReadOnlyModelViewSet):
queryset = LandVerpachtung.objects.all()
serializer_class = LandVerpachtungSerializer
class VerwaltungskostenViewSet(ReadOnlyModelViewSet):
queryset = Verwaltungskosten.objects.all()
serializer_class = VerwaltungskostenSerializer
class StiftungsKalenderEintragViewSet(ReadOnlyModelViewSet):
queryset = StiftungsKalenderEintrag.objects.all()
serializer_class = StiftungsKalenderEintragSerializer
class BankTransactionViewSet(ReadOnlyModelViewSet):
queryset = BankTransaction.objects.all()
serializer_class = BankTransactionSerializer

View File

@@ -0,0 +1,28 @@
from django.contrib.auth import get_user_model
from django.core.management.base import BaseCommand, CommandError
from rest_framework.authtoken.models import Token
class Command(BaseCommand):
help = "Erstellt oder gibt ein API-Token für einen Django-User aus (für Agent-Zugriff)"
def add_arguments(self, parser):
parser.add_argument("username", type=str, help="Django-Username")
def handle(self, *args, **options):
User = get_user_model()
username = options["username"]
try:
user = User.objects.get(username=username)
except User.DoesNotExist:
raise CommandError(f'User "{username}" nicht gefunden.')
token, created = Token.objects.get_or_create(user=user)
if created:
self.stdout.write(self.style.SUCCESS(f"Neues Token erstellt für {username}:"))
else:
self.stdout.write(self.style.WARNING(f"Bestehendes Token für {username}:"))
self.stdout.write(token.key)

View File

@@ -66,6 +66,15 @@ services:
- DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
- DJANGO_DEBUG=${DJANGO_DEBUG}
- REDIS_URL=${REDIS_URL}
- IMAP_HOST=${IMAP_HOST}
- IMAP_PORT=${IMAP_PORT}
- IMAP_USER=${IMAP_USER}
- IMAP_PASSWORD=${IMAP_PASSWORD}
- IMAP_FOLDER=${IMAP_FOLDER}
- IMAP_USE_SSL=${IMAP_USE_SSL}
- PAPERLESS_API_URL=${PAPERLESS_API_URL}
- PAPERLESS_API_TOKEN=${PAPERLESS_API_TOKEN}
- PAPERLESS_DESTINATAERE_TAG_ID=${PAPERLESS_DESTINATAERE_TAG_ID}
depends_on:
- redis
- db
@@ -83,6 +92,15 @@ services:
- DJANGO_SECRET_KEY=${DJANGO_SECRET_KEY}
- DJANGO_DEBUG=${DJANGO_DEBUG}
- REDIS_URL=${REDIS_URL}
- IMAP_HOST=${IMAP_HOST}
- IMAP_PORT=${IMAP_PORT}
- IMAP_USER=${IMAP_USER}
- IMAP_PASSWORD=${IMAP_PASSWORD}
- IMAP_FOLDER=${IMAP_FOLDER}
- IMAP_USE_SSL=${IMAP_USE_SSL}
- PAPERLESS_API_URL=${PAPERLESS_API_URL}
- PAPERLESS_API_TOKEN=${PAPERLESS_API_TOKEN}
- PAPERLESS_DESTINATAERE_TAG_ID=${PAPERLESS_DESTINATAERE_TAG_ID}
depends_on:
- redis
- db

30
knowledge/README.md Normal file
View File

@@ -0,0 +1,30 @@
# Wissensbasis van Hees-Theyssen-Vogel'sche Stiftung
Dieses Verzeichnis enthält langfristig stabiles Stiftungswissen als Referenz für alle Agents und Mitarbeiter.
## Dateien
| Datei | Inhalt |
|---|---|
| [satzung.md](satzung.md) | Stiftungsname, Zweck, Förderberechtigte, Organe |
| [richtlinien.md](richtlinien.md) | Förderrichtlinien, Einkommensgrenzen, Nachweisfristen |
| [verfahren.md](verfahren.md) | Verwaltungsabläufe: Anträge, E-Mail, Pacht, Backup |
| [kontakte.md](kontakte.md) | Institutionelle Kontakte (Behörden, Berater) |
| [historie.md](historie.md) | Stiftungsgeschichte und Meilensteine |
## Wichtige Hinweise
- **Keine personenbezogenen Daten** von Destinatären in dieser Wissensbasis
- Angaben mit `[TODO]` müssen manuell aus Originalunterlagen ergänzt werden
- Operative Daten (Destinatäre, Zahlungen, Ländereien) befinden sich in der Datenbank
- Diese Dateien sind Strukturwissen, nicht Echtzeitdaten
## Pflege
Diese Dateien sollten aktualisiert werden bei:
- Satzungsänderungen
- Änderungen der Förderkriterien
- Wechsel externer Dienstleister/Behörden
- Wesentlichen Änderungen der Verwaltungsverfahren
*Erstellt: 2026-03 durch RentmeisterAI*

View File

@@ -0,0 +1,163 @@
# Bedienungsanleitung: E-Mail-Eingangsverarbeitung für Destinatäre
> VHTV-Stiftung | Stand: März 2026
---
## 1. Überblick
Das E-Mail-Eingangssystem verarbeitet automatisch eingehende E-Mails von Destinatären. Eingehende Nachrichten an **paperless@vhtv-stiftung.de** werden alle 15 Minuten abgerufen, dem richtigen Destinatär zugeordnet und Anhänge in Paperless-NGX archiviert.
**Typische Inhalte:** Studien- und Ausbildungsnachweise, Quartalsbelege, Anträge, allgemeine Korrespondenz.
---
## 2. So funktioniert der Workflow
```
E-Mail eingehend
Automatischer Abruf (alle 15 Min.)
Absender-Zuordnung ──► Bekannter Destinatär? ──► Ja: Status "zugewiesen"
│ Anhänge → Paperless
▼ Nein
Status "unbekannt" → Manuelle Zuordnung nötig
```
1. **E-Mail-Eingang:** Jan Siebels leitet Destinatär-Emails von jan.siebels@gmail.com an paperless@vhtv-stiftung.de weiter.
2. **Automatische Zuordnung:** Das System gleicht die Absender-E-Mail mit den hinterlegten E-Mail-Adressen der aktiven Destinatäre ab.
3. **Anhänge:** Werden automatisch in Paperless-NGX hochgeladen und mit dem Tag `Stiftung_Destinatäre` versehen.
4. **Unbekannte Absender:** Erhalten den Status `unbekannt` und müssen manuell zugeordnet werden.
---
## 3. E-Mail-Eingang aufrufen
Öffnen Sie im Hauptmenü der Stiftungsverwaltung:
**Pfad:** `/email-eingang/`
### 3.1 Listenansicht
Die Übersicht zeigt:
- **Statuskarten** oben: Gesamtzahl, Neue, Unbekannte, Fehler
- **Tabelle** mit allen eingegangenen E-Mails:
- Eingangsdatum
- Absender (Name und E-Mail)
- Zugeordneter Destinatär
- Betreff
- Anzahl Anhänge
- Status
**Filtern und Suchen:**
- **Suchfeld:** Durchsucht Absender, Betreff und Destinatär-Namen
- **Status-Filter:** Dropdown zur Einschränkung nach Status (Neu, Zugewiesen, Verarbeitet, Unbekannt, Fehler)
### 3.2 Detailansicht
Klicken Sie auf eine E-Mail, um die Details zu sehen (`/email-eingang/<id>/`):
- Vollständiger E-Mail-Text
- Anhänge mit Direktlinks zu Paperless-NGX
- Zuordnungsinformationen
- Fehlermeldungen (falls vorhanden)
---
## 4. Häufige Aufgaben
### 4.1 Unbekannten Absender zuordnen
1. Öffnen Sie die E-Mail mit Status `unbekannt`
2. Im Seitenbereich **"Destinatär zuordnen"**: Wählen Sie den richtigen Destinatär aus dem Dropdown
3. Klicken Sie **"Zuordnen"**
4. Der Status wechselt automatisch zu `zugewiesen`
### 4.2 E-Mail als verarbeitet markieren
1. Öffnen Sie die zugewiesene E-Mail
2. Im Seitenbereich **"Als verarbeitet markieren"**:
- Optional: Notizen zur Bearbeitung eintragen
3. Klicken Sie **"Verarbeitet"**
4. Der Status wechselt zu `verarbeitet`
### 4.3 Interne Notizen hinzufügen
1. Öffnen Sie eine E-Mail
2. Im Bereich **"Interne Notizen"**: Text eingeben
3. Klicken Sie **"Speichern"**
Notizen sind nur intern sichtbar und dienen der Dokumentation der Bearbeitung.
### 4.4 E-Mails manuell abrufen
Falls Sie nicht auf den nächsten automatischen Abruf warten möchten:
1. In der Listenansicht: Klicken Sie **"Jetzt abrufen"**
2. Der Abruf startet im Hintergrund
3. Neue E-Mails erscheinen nach dem Neuladen der Seite
---
## 5. Status-Übersicht
| Status | Bedeutung | Aktion erforderlich? |
|---|---|---|
| **Neu** | Gerade eingegangen, Destinatär zugeordnet | Inhalt prüfen, ggf. verarbeiten |
| **Zugewiesen** | Destinatär wurde zugeordnet | Inhalt prüfen, dann verarbeiten |
| **Verarbeitet** | Bearbeitung abgeschlossen | Keine |
| **Unbekannt** | Absender konnte nicht zugeordnet werden | Manuell zuordnen |
| **Fehler** | Technischer Fehler bei Verarbeitung | SysAdmin informieren |
---
## 6. Anhänge und Paperless-NGX
Alle E-Mail-Anhänge werden automatisch in Paperless-NGX gespeichert:
- **Tag:** `Stiftung_Destinatäre`
- **Korrespondent:** Name des zugeordneten Destinatärs
- **Zugriff:** Direktlinks in der Detailansicht der E-Mail
Um Anhänge in Paperless einzusehen, klicken Sie auf den jeweiligen Dokumentlink in der Detailansicht.
---
## 7. Empfohlener Bearbeitungsablauf
1. **Täglich** die Listenansicht öffnen (`/email-eingang/`)
2. **Statuskarten** prüfen: Gibt es neue oder unbekannte E-Mails?
3. **Unbekannte Absender** zuerst zuordnen
4. **Neue E-Mails** inhaltlich prüfen:
- Handelt es sich um einen Studiennachweis? → Zum Quartalsnachweis verknüpfen
- Allgemeine Korrespondenz? → Notizen ergänzen
5. **Als verarbeitet markieren** wenn erledigt
---
## 8. Fehlerbehebung
| Problem | Lösung |
|---|---|
| Keine neuen E-Mails trotz Weiterleitung | "Jetzt abrufen" klicken; ggf. SysAdmin kontaktieren |
| Anhänge fehlen in Paperless | Paperless-API-Verbindung prüfen (SysAdmin) |
| Status "Fehler" | Fehlerdetails in der Detailansicht lesen; SysAdmin informieren |
| Falscher Destinatär zugeordnet | In Detailansicht korrekten Destinatär neu zuordnen |
---
## 9. Technische Hinweise (für Administratoren)
- **E-Mail-Postfach:** paperless@vhtv-stiftung.de (IMAP, SSL, Port 993)
- **Polling-Intervall:** Alle 15 Minuten via Celery Beat
- **Duplikaterkennung:** Basierend auf Absender, Datum und Betreff
- **Konfiguration:** Umgebungsvariablen in der Docker-Compose-Datei
---
*VHTV-Stiftung | Bedienungsanleitung E-Mail-Eingang | Stand: März 2026*

View File

@@ -0,0 +1,124 @@
%PDF-1.4
%<25><><EFBFBD><EFBFBD> ReportLab Generated PDF document (opensource)
1 0 obj
<<
/F1 2 0 R /F2 3 0 R /F3 4 0 R /F4 6 0 R
>>
endobj
2 0 obj
<<
/BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font
>>
endobj
3 0 obj
<<
/BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding /Name /F2 /Subtype /Type1 /Type /Font
>>
endobj
4 0 obj
<<
/BaseFont /Helvetica-BoldOblique /Encoding /WinAnsiEncoding /Name /F3 /Subtype /Type1 /Type /Font
>>
endobj
5 0 obj
<<
/Contents 12 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
6 0 obj
<<
/BaseFont /Symbol /Name /F4 /Subtype /Type1 /Type /Font
>>
endobj
7 0 obj
<<
/Contents 13 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
8 0 obj
<<
/Contents 14 0 R /MediaBox [ 0 0 595.2756 841.8898 ] /Parent 11 0 R /Resources <<
/Font 1 0 R /ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ]
>> /Rotate 0 /Trans <<
>>
/Type /Page
>>
endobj
9 0 obj
<<
/PageMode /UseNone /Pages 11 0 R /Type /Catalog
>>
endobj
10 0 obj
<<
/Author (\(anonymous\)) /CreationDate (D:20260309224153+00'00') /Creator (\(unspecified\)) /Keywords () /ModDate (D:20260309224153+00'00') /Producer (ReportLab PDF Library - \(opensource\))
/Subject (\(unspecified\)) /Title (\(anonymous\)) /Trapped /False
>>
endobj
11 0 obj
<<
/Count 3 /Kids [ 5 0 R 7 0 R 8 0 R ] /Type /Pages
>>
endobj
12 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1781
>>
stream
Gau0DD/Yn7&H88.1$U.\A.pV(Ce(C%;^HifF?TNTdj`^ZD$I=(/Em5X27alZZcc"W0/62T6jZV=jdG;"H"Ifr6i(EWpG)qt3JZWr%%%Lq!17Q40`M.9o:rKZXLuuf/T5B")2q'qMbUl6h++Auk-S;4d0cs]e:W$?$eiBY]qB6.jk.YZ]]!g%kN>&$?D9)Lk&Q`-)55.8drUn+Jb^rQBO=@k5190X/G?#n`NhZ')T1]W'A]TVkEp39)I;fZE5=t"3#?VS$.KD6Xqh0n#d0]&X5FE89Lta\3NfEe6Mgbq@?W0VjQJ8L4Dr#W$[<(,#+a_UpZ]s#dpSJu^u5#!Af6s7$!\;qG@1quY7$q1!tU#gqK[9q9hMuTNdn]*P%KCb>]4@O-IW;"&]&;@nt%f9@;7J(XrPJfTNX`m\NV"&B/a=94i+Dr,FHSePN>11TIP#VGK*S6:d=oEAf*n+"IK59ZR"\$8=(JB?%sLp+3PU%\4PaNIRjjllg(PNHC'!s.^9C<Pe\T4s-r3]W89DH7MT@#^:4KURmC4-DNua-_sbDn.UOhA77afi(II7rdDZGm*h_kP:Ec*<M%sp$X7>!,.nl0\.Df?dE%45'Sm[24n9]k$E;B>`i+a-e)hBKF%dPj<Gl.-['&W"`Ds9"VG-+n:GUl-&AU(KqqCKgtGmk&$H+FQLYFS&o\[Ntbm)-l6X,KR5![Csthkr5.3\pZ%-sL+R,2UN65#D[9l\)'sG?r'):Oct*NSO%7.j`r%=TUlAf9o1*QB)YG_<44gK.+:t&1_h58\&,1<5tCFhQF5&D;S2jbQO)H.7?Vh[5)rF*nLSiKhEpJY'mS's0e4b9P%5I]"ac6Ht[BI6#*kToll+.DhiggD^,O;kIU<V>r64nRM@H^+r[D9JPmOa(TFhV@_pCsZ-[5X#_gKEUara$3r5$);kHsWDDSS>b(?*W2aDDC/kidMa"lW?@%t)umH?d$hU_2O/NX<'A[oU5lO1*2'NE")kOftFHY,J7WlFk\NXjomVJSNI2Vj&gHS5Qj_[O'0%/_Oj\E8s=X**6qi`m?7PX]8"qcTLW)-1)"?NjnPd'JUl46A<=."[2m(HnNdS8@aPrQT&!LSsqeV,l>L-uB%7!=stMG^I'P!BI>'gC"(>`iMGDn:p,X=c?8-D^qk]3^$*lP(^Ej[o2-$[;?AW5^qJhZ"kF$^R]s(#8euRq3!*0*s=T]j>,8?dc"WC]:0l=0L'A9hMSa4h_fQ=;Oh?n-OZ.dn/>4HB6QIsqJ_9OFmJoSl,,"[,?,\6[jLRA".sZ"1"#\'VEIE[@'UUU[>(W$U7;QdaMtPKmapRVDu4Do?=Kcc#l9OsX'\p'i@+*XSsf>Xo&RtJ^rYE\NH1KddTh!iqbToO`c]ueqNAm)Wm;aT)(_AD?@u=2r,RRVSuLf):MqHrU=,esFVQ\Fb-g))l.N='oBu7u<G3%K).c>$.^U5i8<\A'pJ.PROX]Q@X`c8GSlQ@:/Ne"&lXEc*?]0R+MrS`piHURZX61iN,%U$?ST\LM>c_3$BbKB'&k/eA4mCF%7o^",NrO:\QVH9`4h\+5dXH-^'X"c5aE:+CefJ!UJ/KGT^%*kEHDF5g$kfD7VaQga;W43%Ra"`s!bLDaqSIbC5OO4+NE:&*$@+lC5^U@U7@)aU7!;-!I?dM#20tIfNKHUfdoM6Z:X/Md)1@!GS+e/P#t3Bb@o)U`T\/4'dA)iOT''r!1VLDpV^fB&WF3*%7%:&g;Eo`YqJ7!K@F9)@.h$I*e-u8?YAZf48,i\.<`30~>endstream
endobj
13 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 1861
>>
stream
Gau0D>BALf'Roe[30T+-ai#sH&jgU[4Cf):cG`KbBfd2E3l7u:#&1?=<Sd63HWF>+&AecoN'X]%bBNC3&V2+>8G7<J!PG#?fd-Yc@HIZs$k$Yhi9fmlre0L'2Do<;\cg%Ha<7YQi]=`3$V@lFY)72+>+=n;<4`UG<uf#k1uNf'Dq@[uPV[RX*+n)9n29%?9>O$qlP[nq*Q+&Z0U85''6mooX+Z0>[V<!WRg/51Z_Uij?"P`(im7DRLY<q0e-2]rHrIjG]/5)#>Ra;eJRqZ&Hhu.M+a@Dss01.6(Q;!6+nFVMB<d22pj?g?HG5Z:?RS[A:CNV[eFn<aosVe_V#dI0ome_QO#.h6i&ZIh&m?h_?@KL99JJQ+&oF&Q3W+%Jq*oTPgh\7nU*P[*)1+Xkh:^)Y_"W32*u3YhraV#EU]&5dCEZi>VCI7+ENr7:\N.+p.A5Y4hkP_!kFg*.GCf,1ZV.@`Ci_YCopm*^K\&r9mtaq2mrr\3A,f.)/78iRq;'4ORd$B[L4K+>P`1Y]W25cHTY$,HKpW_nEU*9QjiDS*2!)-dZJl+\?kdo26$_R;_nEI8W*WX1h`E0oZ@Pj0WD4<Jn-8WYW&]r1034dj,P[NS.gL&DQ:;tLBMCAd&,:Tt@Q6:FNFDSXqpgPEG)3r>?,LYe#ChC\mG-P>f![N9hJVMfCVs"e6WAr2g!IiW3&5T$3LuY:KfL_`kMmaiVH([p>(hiOfY&I5,oWIj<-nnKG`<U90,e`*0Y&&HWf(^'[uH+[/*)=&Adqm[Q;^M)c'BoGW<i4DUp[1c[7\ER@NPt2Mp[)V(X5t&0b-HinpPCXg'LDJ\\_%PA9iD)*e&p3k\,h6_NT&iZJqsIAbBDR"4s#JMj9&Si%A&UdoT`WJT'&<O4_4$%<fJ%f-Y@eLKi)@@XL^D:VDkD>tC<R&:KXDq$+GGC*-EU0RQ%t9oh"MYiKsBDN[a4BsmNF.L06EBKkSef)%=6mtRM`:)8)Mb"k>-;D2VGPok,Uh:?l0*^ohj9=>11gkdAM1dfD6GbPNH**PVN("<2GaYMiW\A5&!G"LM<QH9D[_e]PQ5Gg)DKIO&0oI()iohD9e.^KSX3DuK5hefPB_fBj$NB5%O;iTJLQsG\S`L'YbPlT!+SG[&uIPTH+Zo7ck1DNfc9SFK#aNlCBVW0jC3Nrs[Lm<j@bY`o@%R,/^Ql9+jSDINLolsarm>eJI+/`d_4DpGPR2;C^enD-egfJLpG9]8U*p?)c8^Y6/`%apQ2AkpM[W1/K&U#TSWFZ*@-k4Np&("oYT6V\qbl0?krANFi4D&@HEj8@nr%jN/L.S1bRUftSI@Ddo()9'Ml)AG_RF@3+GT5K7)pF?E-*.iE`*7n$l9?mQ*SX)i=mTm-5-I'n:irLE,1Z6BLbH3T[VfpDK/4::D,(hh5`ThBJ)1;&kZHcM%6UP%CW2`2$[PAGcJaX6Ygl<1Y`usnGu\%4f:jii/p^naO2Z"FZ%&_a'ICC<_DXi3/GBnC/qi:fKN9&NNRF-D:(%udR$R<29$ui7;jjB'#iXUB*Z.[*?kS1pMmE>kT"MKJI@Q#$a,2ZfMf\ZE8R8b0'ED)E>4S=VCI/s4nB!Hs)3(7>o/MK%AIGqUMe:Gdp$aHk'$dFWj5p2(hk_e"Vg,NR=k(8,LZQ/Z.M3u/^?^mkWm8DdF<J^R$8UJZ/c;T<"&7)PZuj3+T3q$8NI9:?oCF,-kDojSjfMG&En;6R4_t4EB^WSETZ2n;AMZc;.sBDO9eW\peE#*O.J>V,/s`M=BnWP,eHj/XjBk+`c=P0^.0&-5UY[jZZ`9T3q.>0g<DWAsI]Nk.8'c7nn*K*3cCm_dGZmmuR_fTY,B<u!-iX;82Ve3~>endstream
endobj
14 0 obj
<<
/Filter [ /ASCII85Decode /FlateDecode ] /Length 802
>>
stream
Gau0A968fP%)2<`F<mF8G\uJ2:5(g!Zse\)2^^3s/Ah[=:"O/9c1K%X?Hf/km;PU5N#98+8Y9$;Yj#c^H^4aBA%9$[^`8//@%QIGquAZqk=::bT"\_1OV9GTqN8`@5GC+mgW$>WSL-^7&i`TF.<k:n5b(49Q=o;qJI8Qbe3\1=FZiO:CGj.!,nfkg`6T!EBSAPA2Sm)&:sDGKALV4!%Eh'e>\]M*PS,K=CQchmUif8$l$;]!+`'@"5'<qj]QBrp=\b#f6O"3%GlC04bFN[Wg2!3'0?;rEeZr&$2><S7Fa$Q.gVNIl]$:Rt?%j$iF9U$W<6u[tA;+G+_B-Ntl&#"[HHU$N[H*'S[[Wh:9ut;U"3`X0LGeJTaFY7A$Roh^iD.H1'ICW'RnhdiGSqd;+JVtB(CK9rm!tV@_"4<gG^kYUGVob=#1ea;>sm;*-$6%9#f+*h!&`?q9lEE%e/K4#:AJ^Gg"<d]?!-V3WXR)Aj*IEN4W:A#=)r1)FWL4O_>"usPD=2r(J7%/\L/+("RfO4\B$EKkIl5A;6>,0*LAM%1'H0`OcWRk5h:P)'kXCn_@X7A!OH^Z/*?/4Q&-e7^e9oT3dQa1a@h(@(CBR\Ku$\Z5>duh2:kh<($ULP'rL4%kWSZGd=3TU.cqHTXsi?co'cAoT;\W-c'@3_))YYi8EsJ^ba,2R=%0hQ9'fD(-r,<]f`,7b5'-be;WpX;E%1G8qLZ.l0*Q:#'GuN#^Okn6?2W?E1oCV.&VZ(WRfAPo%#*(eL[p13RN&/]jtaK#O]gkN7%3/FRKf>?fdimH~>endstream
endobj
xref
0 15
0000000000 65535 f
0000000061 00000 n
0000000122 00000 n
0000000229 00000 n
0000000341 00000 n
0000000460 00000 n
0000000665 00000 n
0000000742 00000 n
0000000947 00000 n
0000001152 00000 n
0000001221 00000 n
0000001502 00000 n
0000001574 00000 n
0000003447 00000 n
0000005400 00000 n
trailer
<<
/ID
[<bb45e303f875ee9fae4b75f06d3984e4><bb45e303f875ee9fae4b75f06d3984e4>]
% ReportLab generated PDF document -- digest (opensource)
/Info 10 0 R
/Root 9 0 R
/Size 15
>>
startxref
6293
%%EOF

90
knowledge/historie.md Normal file
View File

@@ -0,0 +1,90 @@
# Stiftungsgeschichte
> **Status:** Grundstruktur angelegt. Inhalte aus der Datenbank-Tabelle `GeschichteSeite` sind zu entnehmen.
> Die Verwaltungssoftware enthält ein Wiki-ähnliches Modul (`Geschichte`) unter `/geschichte/`,
> in dem die Stiftungsgeschichte gepflegt wird.
---
## Hinweis zur Datenpflege
Die Stiftungsgeschichte wird primär in der **Django-App** gepflegt:
- **URL:** `/geschichte/`
- **Modell:** `GeschichteSeite` (Markdown-Seiten) + `GeschichteBild` (Bilder)
- Seiten sind sortierbar und können mit Bildern versehen werden
- Bearbeitungsrecht erfordert Berechtigung `change_geschichteseite`
Diese Datei dient als **statischer Referenzpunkt** für Agents. Für aktuelle und detaillierte Inhalte ist die Datenbank maßgeblich.
---
## Stiftungsname und Familienhintergrund
Die **van Hees-Theyssen-Vogel'sche Stiftung** (VHTV) ist eine Familienstiftung, deren Name auf die Gründerfamilien(zweige) zurückgeht:
- van Hees
- Theyssen
- Vogel
[TODO: Herkunft und Bedeutung dieser Familiennamen aus Stiftungsunterlagen ergänzen]
---
## Gründungsgeschichte
[TODO: Folgende Angaben aus der Datenbank (GeschichteSeite) oder Stiftungsunterlagen entnehmen]
- **Gründungsjahr:** [TODO]
- **Gründer(in):** [TODO]
- **Gründungsanlass:** [TODO]
- **Ursprüngliches Stiftungsvermögen:** [TODO]
- **Ursprünglicher Stiftungszweck:** [TODO]
---
## Historische Entwicklung
[TODO: Wichtige Meilensteine in chronologischer Reihenfolge aus Stiftungsunterlagen eintragen]
| Jahr | Ereignis |
|---|---|
| [TODO] | Gründung der Stiftung |
| [TODO] | [Weitere Meilensteine] |
| [TODO] | Erste digitale Verwaltung |
| 2024/2025 | Einführung der modernen Django-Verwaltungssoftware |
| 2025 | Implementierung der automatischen E-Mail-Verarbeitung für Destinatäre |
| 2026 | Einführung KI-gestützter Stiftungsverwaltung (RentmeisterAI) |
---
## Ländereien und Vermögensgeschichte
[TODO: Geschichte des Landbesitzes beschreiben]
- Die Stiftung verwaltet landwirtschaftliche Ländereien in der Region Hamminkeln/Kreis Wesel (NRW)
- Nutzungsarten: Grünland, Acker, Wald
- Die Ländereien werden verpachtet; der Pachtzins bildet einen wesentlichen Teil der Erträge
---
## Digitalisierung der Verwaltung
Die Stiftungsverwaltung wurde sukzessive modernisiert:
- **Frühere Verwaltung:** [TODO: Wie wurde früher verwaltet?]
- **2024:** Entwicklung der Django-basierten Verwaltungssoftware
- **2025:** Integration von Paperless-NGX zur Dokumentenverwaltung
- **2025:** Automatische E-Mail-Verarbeitung für Destinatärs-Eingänge
- **2026:** KI-Unterstützung durch RentmeisterAI (Paperclip-Plattform)
---
## Zugriff auf ausführliche Geschichte
Die vollständige Stiftungsgeschichte mit Bildern und Artikeln ist in der Anwendung abrufbar:
1. In der Verwaltungsoberfläche → Menüpunkt **Geschichte**
2. URL: `https://vhtv-stiftung.de/geschichte/`
---
*Zuletzt aktualisiert: 2026-03 | Pflege der ausführlichen Geschichte: Verwaltungs-App unter /geschichte/*

105
knowledge/kontakte.md Normal file
View File

@@ -0,0 +1,105 @@
# Wichtige Kontakte der Stiftung
> **Datenschutzhinweis:** Diese Datei enthält ausschließlich institutionelle Kontakte (Behörden, externe Stellen).
> **Keine personenbezogenen Daten von Destinatären** werden hier gespeichert.
> Personenbezogene Daten von Rentmeistern und externen Dienstleistern nur in anonymisierter Form.
---
## 1. Stiftung (Eigene Kontaktdaten)
| Feld | Wert |
|---|---|
| Name | van Hees-Theyssen-Vogel'sche Stiftung |
| Adresse | Raesfelder Str. 3, 46499 Hamminkeln |
| E-Mail (Paperless/Eingang) | paperless@vhtv-stiftung.de |
| Website | https://vhtv-stiftung.de |
---
## 2. Rentmeister / Geschäftsführung
Die aktuell aktiven Rentmeister sind im System unter `/rentmeister/` (Geschäftsführung) einsehbar.
> **Hinweis:** Aus Datenschutzgründen werden hier keine Namen oder persönlichen Kontaktdaten gespeichert. Die aktuellen Rentmeister sind in der Datenbank (`Rentmeister`-Tabelle) hinterlegt.
---
## 3. Steuerberater
[TODO: Kanzleiname, Adresse, Telefon, E-Mail eintragen]
- **Kanzlei:** [TODO]
- **Ansprechpartner:** [TODO]
- **Adresse:** [TODO]
- **Telefon:** [TODO]
- **E-Mail:** [TODO]
- **Zuständig für:** Jahresabschluss, Gemeinnützigkeitsrecht, Steuererklärungen
---
## 4. Notar
[TODO: Notariat und Kontakt eintragen]
- **Notariat:** [TODO]
- **Ansprechpartner:** [TODO]
- **Adresse:** [TODO]
- **Telefon:** [TODO]
- **Zuständig für:** Satzungsänderungen, Grundstücksangelegenheiten
---
## 5. Bankverbindungen
Die Bankkonten der Stiftung sind im System unter `/konten/` (Geschäftsführung → Konten) einsehbar.
> **Sicherheitshinweis:** Kontodaten (IBAN, BIC) werden ausschließlich in der Datenbank gespeichert, nicht in dieser Datei.
[TODO: Hauptbank und Kontoart eintragen (ohne IBAN)]
- **Hauptbank:** [TODO z. B. Sparkasse, Volksbank, etc.]
- **Konto-Typ:** [TODO]
---
## 6. Stiftungsaufsicht
- **Behörde:** [TODO Bezirksregierung Düsseldorf? Hamminkeln liegt im Kreis Wesel, Regierungsbezirk Düsseldorf]
- **Referat:** [TODO]
- **Adresse:** [TODO]
- **Telefon:** [TODO]
- **Aktenzeichen:** [TODO]
---
## 7. Finanzamt
- **Finanzamt:** [TODO zuständiges Finanzamt für Hamminkeln/Kreis Wesel]
- **Steuernummer:** [TODO]
- **Freistellungsbescheid:** [TODO Datum des letzten Freistellungsbescheids]
---
## 8. Amtsgericht / Grundbuch
Für Grundstücksangelegenheiten zuständig:
- **Amtsgericht:** [TODO Amtsgericht Wesel? Hamminkeln liegt im Kreis Wesel]
- **Grundbuchamt:** [TODO]
- **Kontakt:** [TODO]
---
## 9. Sonstige externe Stellen
### Landwirtschaft / Ländereien
- **Landwirtschaftskammer NRW:** [TODO]
- **Katasteramt Kreis Wesel:** [TODO]
### IT / Hosting
- **Server-Hosting:** [TODO Hoster für vhtv-stiftung.de]
- **Paperless-NGX Installation:** https://vhtv-stiftung.de/paperless
---
*Zuletzt aktualisiert: 2026-03 | Hinweis: Alle mit [TODO] markierten Felder sind manuell zu ergänzen*

142
knowledge/richtlinien.md Normal file
View File

@@ -0,0 +1,142 @@
# Förderrichtlinien und Vergabekriterien
> **Status:** Abgeleitet aus der Systemlogik der Verwaltungssoftware (models.py).
> Angaben mit [TODO] sind aus der formalen Richtliniendokumentation zu ergänzen.
---
## 1. Förderberechtigung (Grundvoraussetzungen)
Für eine laufende Unterstützung durch die Stiftung müssen **alle drei** Voraussetzungen erfüllt sein:
### 1.1 Abstammungsnachweis
- Der Antragsteller muss **Abkömmling gemäß Satzung** sein (`ist_abkoemmling`)
- [TODO: Welche Abstammungsnachweise sind zu erbringen?]
### 1.2 Einkommensgrenzen
Die monatlichen Bezüge dürfen eine Einkommensgrenze nicht überschreiten:
| Haushaltsgröße | Max. monatliche Bezüge |
|---|---|
| 1 Person | 2.815,00 € |
| 2 Personen | 3.265,40 € |
| 3 Personen | 3.715,80 € |
| n Personen | 2.815,00 € + (n-1) × 450,40 € |
**Berechnungsgrundlage:** Regelsatz 563 € × 5 (Basis) + 0,8 × Regelsatz je weitere Haushaltsperson
### 1.3 Vermögensgrenze
- Eigenvermögen ≤ **15.500 €**
---
## 2. Förderkategorien
| Kategorie | Beschreibung |
|---|---|
| `bildung` | Bildung und Studium |
| `forschung` | Wissenschaftliche Forschung |
| `kultur` | Kulturelle Projekte |
| `soziales` | Soziale Unterstützung |
| `umwelt` | Umweltschutz |
| `anderes` | Sonstiges |
---
## 3. Laufende Unterstützungen (Destinatär-Unterstützungen)
### 3.1 Zahlungsmodalitäten
- Zahlungen erfolgen **quartalsweise im Voraus**
- Betrag: individuell festgelegter **vierteljährlicher Betrag** je Destinatär
- Zahlung auf das hinterlegte Bankkonto des Destinatärs (IBAN)
### 3.2 Zahlungsfristen (quartalsweise, im Voraus)
| Quartal | Zahlungsfälligkeit |
|---|---|
| Q1 (JanMär) | 15. Dezember (Vorjahr) |
| Q2 (AprJun) | 15. März |
| Q3 (JulSep) | 15. Juni |
| Q4 (OktDez) | 15. September |
### 3.3 Wiederkehrende Zahlungen
Folgende Zahlungsintervalle können eingerichtet werden:
- Monatlich
- Vierteljährlich (standard)
- Halbjährlich
- Jährlich
---
## 4. Nachweispflichten (Vierteljahresnachweise)
Destinatäre müssen quartalsweise folgende Nachweise einreichen:
### 4.1 Pflichtbestandteile
1. **Studiennachweis** (sofern erforderlich)
2. **Einkommenssituation** Bestätigung oder Beschreibung von Änderungen
3. **Vermögenssituation** Bestätigung oder Beschreibung von Änderungen
4. Ggf. weitere Dokumente
### 4.2 Fristen für Studiennachweise (semesterbasiert)
| Quartal | Studiennachweis-Frist |
|---|---|
| Q1 (JanMär) | 15. März |
| Q2 (AprJun) | 15. März |
| Q3 (JulSep) | 15. September |
| Q4 (OktDez) | 15. September |
**Hintergrund:** Die Studiennachweise sind semesterbasiert (Wintersemester / Sommersemester), nicht quartalsbasiert.
### 4.3 Nachweisstatus
| Status | Bedeutung |
|---|---|
| `offen` | Nachweis ausstehend |
| `teilweise` | Teilweise eingereicht |
| `eingereicht` | Vollständig eingereicht |
| `geprueft` | Geprüft & Freigegeben |
| `auto_geprueft` | Automatisch freigegeben (Semesterbasis) |
| `nachbesserung` | Nachbesserung erforderlich |
| `abgelehnt` | Abgelehnt |
---
## 5. Einzel-Förderungen (Projektförderungen)
### 5.1 Antragsprozess
[TODO: Formalen Antragsprozess beschreiben]
Bekannte Felder aus der Förderungsdatenbank:
- Antragsteller (Destinatär)
- Jahr
- Betrag
- Kategorie
- Antragsdatum / Entscheidungsdatum
- Verwendungsnachweis
### 5.2 Förderungsstatus
| Status | Bedeutung |
|---|---|
| `beantragt` | Antrag gestellt |
| `genehmigt` | Genehmigt, noch nicht ausgezahlt |
| `ausgezahlt` | Ausgezahlt |
| `abgelehnt` | Abgelehnt |
| `storniert` | Storniert |
---
## 6. Prüfkriterien bei Förderanfragen
Checkliste für die Prüfung von Förderanträgen:
- [ ] Antragsteller ist Abkömmling gem. Satzung
- [ ] Einkommensgrenzen eingehalten
- [ ] Vermögensgrenze eingehalten
- [ ] Kategorie entspricht Stiftungszweck
- [ ] Betrag ist angemessen und plausibel
- [ ] Verwendungsnachweis planbar
- [ ] Kein Interessenkonflikt
---
*Zuletzt aktualisiert: 2026-03 | Quelle: Systemanalyse models.py, Softwarelogik*

101
knowledge/satzung.md Normal file
View File

@@ -0,0 +1,101 @@
# Satzung und Stiftungszweck
> **Status:** Abgeleitet aus dem Systemcode und den Datenmodellen der Verwaltungsanwendung.
> Angaben ohne Quellennachweis aus der Originalsatzung sind als **[TODO: aus Satzungsurkunde prüfen]** markiert.
---
## 1. Stiftungsname und Sitz
- **Name:** van Hees-Theyssen-Vogel'sche Stiftung
- **Kurzbezeichnung:** VHTV-Stiftung
- **Sitz:** Raesfelder Str. 3, 46499 Hamminkeln (Nordrhein-Westfalen)
- **Website / E-Mail:** vhtv-stiftung.de / paperless@vhtv-stiftung.de
- **Rechtsform:** Gemeinnützige Stiftung des bürgerlichen Rechts
---
## 2. Stiftungszweck
[TODO: Stiftungszweck(e) aus der Satzungsurkunde entnehmen und eintragen]
Aus dem Systemcode ableitbar sind folgende Förderfelder, die die Stiftung in ihrer Verwaltungssoftware abbildet:
- **Bildung** Förderung von Ausbildung und Studium
- **Forschung** Unterstützung wissenschaftlicher Arbeiten
- **Kultur** Kulturelle Projekte und Aktivitäten
- **Soziales** Soziale Unterstützungsleistungen
- **Umwelt** Umweltschutz und Nachhaltigkeit
- **Anderes** Sonstige zweckentsprechende Maßnahmen
---
## 3. Förderberechtigter Personenkreis (Destinatäre)
Die Stiftung fördert **Destinatäre** natürliche Personen, die der Stifterfamilie angehören oder ihr nahestehen.
### Familienzweige
Die Software unterscheidet folgende Familienzweige:
- Hauptzweig
- Nebenzweig
- Verwandt
- Anderer
### Fördervoraussetzungen (gemäß Systemlogik)
Für eine Förderung/Unterstützung müssen kumulativ erfüllt sein:
1. **Abkömmling gemäß Satzung** (`ist_abkoemmling = True`)
2. **Einkommensgrenzen eingehalten:**
- Basierend auf Regelsatz (563 €/Monat)
- Einkommensgrenze = 5 × Regelsatz für erste Person + 0,8 × Regelsatz je weiterer Haushaltsperson
- Beispiel Einzelperson: max. 2.815 €/Monat
- Beispiel 2 Personen: max. 3.265,40 €/Monat
3. **Vermögen ≤ 15.500 €**
Diese Werte sind aus der Softwarelogik abgeleitet und sollten mit der Satzung abgeglichen werden.
---
## 4. Organe der Stiftung
[TODO: Organe und deren Zusammensetzung aus der Satzungsurkunde entnehmen]
Aus dem System ableitbar:
- **Rentmeister / Geschäftsführung:** Hauptverwaltungsorgan, verwaltet Ländereien, Finanzen und Destinatäre
- [TODO: Vorstand? Kuratorium? Beirat? aus Satzung prüfen]
---
## 5. Stiftungsvermögen
Das Stiftungsvermögen setzt sich zusammen aus:
- **Immobilien / Ländereien:** Landwirtschaftliche Nutzflächen (Grünland, Acker, Wald) in verschiedenen Gemeinden des Kreises Wesel/NRW, die verpachtet werden
- **Bankkonten:** Stiftungskonten bei [TODO: Bank(en) eintragen]
- **Sonstige Vermögenswerte:** [TODO: ergänzen]
Der Vermögenserhalt ist Grundprinzip der Stiftungsführung; Erträge werden für den Stiftungszweck eingesetzt.
---
## 6. Wichtige Regelungen
[TODO: Folgende Punkte aus der Satzungsurkunde entnehmen]
- Regelungen zur Mittelverwendung
- Rechnungslegung und Berichtspflichten
- Satzungsänderungen und Auflösung
- Stiftungsaufsicht (zuständige Behörde: [TODO])
- Steuerliche Anerkennung / Freistellungsbescheid [TODO: Finanzamt, AZ]
---
## 7. Stiftungsaufsicht
- **Zuständige Behörde:** [TODO: Bezirksregierung Düsseldorf? prüfen, Hamminkeln liegt im Regierungsbezirk Düsseldorf]
- **Aktenzeichen Stiftungsregister:** [TODO]
- **Steuer-Nr. / Finanzamt:** [TODO]
---
*Zuletzt aktualisiert: 2026-03 | Quelle: Systemanalyse der Verwaltungssoftware*

176
knowledge/verfahren.md Normal file
View File

@@ -0,0 +1,176 @@
# Verwaltungsverfahren und Abläufe
> **Status:** Aus Systemcode, Celery-Tasks und App-Struktur abgeleitet.
> Punkte mit [TODO] sind manuell zu ergänzen.
---
## 1. Antragsprozess für Förderungen
### 1.1 Erstaufnahme eines Destinatärs
1. Destinatär-Datensatz anlegen (Django Admin oder Weboberfläche `/destinataere/`)
2. Pflichtfelder ausfüllen:
- Name, Geburtsdatum, E-Mail, Telefon
- Familienzweig
- `ist_abkoemmling` setzen
- Haushaltsgröße, monatliche Bezüge, Vermögen
3. Prüfung Fördervoraussetzungen (automatisch via `erfuellt_voraussetzungen()`)
4. `unterstuetzung_bestaetigt` setzen wenn Voraussetzungen erfüllt
5. Vierteljährlichen Betrag festlegen
6. Standard-Auszahlungskonto zuordnen
### 1.2 Einzel-Förderungsantrag
1. Förderung anlegen unter `/foerderungen/`
2. Status beginnt mit `beantragt`
3. Prüfung durch Rentmeister
4. Entscheidung: `genehmigt` oder `abgelehnt`
5. Nach Auszahlung: Status auf `ausgezahlt` setzen
6. Verwendungsnachweis als Dokument in Paperless hochladen und verknüpfen
---
## 2. Vierteljährliches Nachweisverfahren
### 2.1 Ablauf
1. Zu Beginn jedes Quartals: VierteljahresNachweis-Datensätze für alle aktiven Destinatäre erstellen
2. Destinatäre werden benachrichtigt (per E-Mail, [TODO: Benachrichtigungsvorlage?])
3. Destinatäre reichen Unterlagen ein:
- Per E-Mail an paperless@vhtv-stiftung.de (automatisch erfasst)
- Oder direkt über das Self-Service-Portal (sofern eingerichtet)
4. Rentmeister prüft eingegangene Unterlagen
5. Status aktualisieren: `eingereicht``geprueft`
6. Zahlung freigeben wenn Nachweis genehmigt
### 2.2 Fristen (Überblick)
- **Studiennachweis:** 15. März (Q1/Q2) bzw. 15. September (Q3/Q4)
- **Zahlung:** 15. Dez. Vorjahr (Q1), 15. März (Q2), 15. Juni (Q3), 15. September (Q4)
### 2.3 Automatische Freigabe
Bei Destinatären mit Semesterbasis-Studiennachweis kann eine automatische Freigabe erfolgen (`auto_geprueft`).
---
## 3. E-Mail-Eingangsverarbeitung (Automatisiert)
### 3.1 Übersicht
Das System verarbeitet automatisch eingehende E-Mails an `paperless@vhtv-stiftung.de`.
**Technologie:** Celery Beat Task, läuft alle 15 Minuten
### 3.2 Konfiguration
| Env-Variable | Standard | Bedeutung |
|---|---|---|
| `IMAP_HOST` | | IMAP-Server (Pflicht) |
| `IMAP_PORT` | 993 | IMAP-Port (SSL) |
| `IMAP_USER` | paperless@vhtv-stiftung.de | Benutzername |
| `IMAP_PASSWORD` | | Passwort (Pflicht) |
| `IMAP_FOLDER` | INBOX | E-Mail-Ordner |
| `IMAP_USE_SSL` | true | SSL verwenden |
### 3.3 Workflow
1. System liest ungelesene E-Mails aus dem IMAP-Postfach
2. Absender-E-Mail wird mit Destinatär-Datenbank abgeglichen
3. `DestinataerEmailEingang`-Datensatz wird angelegt
4. Anhänge werden in **Paperless-NGX** hochgeladen mit Tag `Stiftung_Destinatäre`
5. Für jeden Anhang wird ein `DokumentLink` erstellt
6. Unbekannte Absender werden als `unbekannt` markiert (manuelle Nachbearbeitung nötig)
### 3.4 Paperless-Tags
| Tag | Verwendung |
|---|---|
| `Stiftung_Destinatäre` | Dokumente von/für Destinatäre |
| `Stiftung_Land_und_Pächter` | Dokumente zu Ländereien/Pächtern |
| `Stiftung_Administration` | Verwaltungsdokumente |
---
## 4. Pachtvertragsverwaltung
### 4.1 Datenstruktur
- **Land** (Flurstück): Grundeinheit, identifiziert durch `lfd_nr`
- **LandVerpachtung**: Pachtvertrag (neue Struktur)
- **LandAbrechnung**: Jährliche Abrechnung je Flurstück
### 4.2 Anlage eines Pachtvertrags
1. Land-Datensatz prüfen/anlegen (`/land/`)
2. Pächter anlegen (`/paechter/`) falls nicht vorhanden
3. LandVerpachtung anlegen (`/land/<id>/verpachtung/`)
- Vertragsnummer vergeben
- Pachtbeginn, Pachtende, Verlängerungsklausel
- Pachtzins (pro ha oder pauschal)
- Zahlungsweise
- USt-Option und Umlagen konfigurieren
4. System aktualisiert LandAbrechnung automatisch
### 4.3 Pachtzins-Zahlungsweisen
| Option | Beschreibung |
|---|---|
| `jaehrlich` | Einmal jährlich |
| `halbjaehrlich` | Zweimal jährlich |
| `vierteljaehrlich` | Quartalsweise |
| `monatlich` | Monatlich |
### 4.4 Umlagen (Durchreichungen an Pächter)
Folgende Kosten können als Umlage auf Pächter umgelegt werden:
- Grundsteuer
- Versicherungen
- Verbandsbeiträge
- Jagdpachtanteile (optional)
---
## 5. Abrechnungsverfahren für Ländereien (LandAbrechnung)
### 5.1 Jährliche Abrechnung
- Pro Flurstück wird automatisch eine `LandAbrechnung` für jedes Abrechnungsjahr erstellt
- Felder: Pacht vereinnahmt, Umlagen, sonstige Einnahmen
- Ausgaben: nach Kategorien (Grundsteuer, Versicherung, Verwaltung etc.)
- USt-Berechnung wenn USt-Option aktiv
### 5.2 Dokumentenablage
Relevante Dokumente (Pachtverträge, Grundsteuerbescheide, Versicherungsnachweise) werden in **Paperless-NGX** abgelegt und per `DokumentLink` verknüpft.
---
## 6. Backup-Verfahren
### 6.1 Backup-Typen
| Typ | Inhalt |
|---|---|
| `full` | Datenbank + Dateien |
| `database` | Nur PostgreSQL-Datenbank |
| `files` | Nur Mediendateien |
### 6.2 Ablauf
1. Backup-Job über Weboberfläche anlegen (`/backup/`)
2. System erstellt Backup asynchron im Hintergrund
3. Backup wird als `.tar.gz` unter `/app/backups/` gespeichert
4. Status: `pending``running``completed` / `failed`
### 6.3 Speicherort
- **Container:** `/app/backups/`
- **Dateiname:** `stiftung_backup_YYYYMMDD_HHMMSS.tar.gz`
---
## 7. Verwaltungskosten-Erfassung
Verwaltungskosten werden kategorisiert erfasst:
- Bezeichnung, Kategorie, Betrag, Datum
- Lieferant/Firma, Rechnungsnummer
- Zuordnung zu Rentmeister (für Fahrtkosten etc.)
- Kilometerpauschale: Standard 0,30 €/km
---
## 8. Audit Trail
Alle Änderungen in der Anwendung werden im `AuditLog` erfasst:
- Benutzer, Zeitstempel, Aktion
- Entitätstyp, ID, Name
- Änderungsdetails (JSON)
- IP-Adresse, Browser
---
*Zuletzt aktualisiert: 2026-03 | Quelle: Systemcode tasks.py, models.py, backup_utils.py*