- Add dotenv loading to Django settings - Update CI workflow to use correct environment variables - Set POSTGRES_* variables instead of DATABASE_URL - Add environment variables to all Django management commands - Fixes CI test failures due to database connection issues
8.6 KiB
8.6 KiB
Stiftung Starter: Schema, Usage, and Cleanup Plan (2025-08-31)
This document consolidates the current domain model, relationships, active usage across the codebase, and targeted cleanup/migration proposals.
Summary
- Server and date-handling fixes completed earlier; stack is healthy.
- New vs. legacy lease models both in use; annual accounting (LandAbrechnung) is the hub.
- Orphans: a few likely candidates (LandAbrechnung.zahlungen, file fields; ApplicationPermission stub). Several legacy fields still referenced; plan deprecation after migration.
Entities and Relationships
-
CSVImport
- Tracks CSV imports; fields: import_type, filename, file_size, status, totals, error_log, created_by, started_at, completed_at
-
Paechter (Tenant)
- Fields: vorname, nachname, geburtsdatum, email, telefon, iban, strasse, plz, ort, personentyp, pachtnummer, pachtbeginn_erste, pachtende_letzte, pachtzins_aktuell, landwirtschaftliche_ausbildung, berufserfahrung_jahre, spezialisierung, notizen, aktiv
- Relations: Verpachtung (legacy) M:1; LandVerpachtung (new) M:1; reverse from Land.aktueller_paechter
- Helpers: get_full_name, get_aktive_verpachtungen, get_gesamt_pachtflaeche, get_gesamt_pachtzins
-
Destinataer (Beneficiary)
- Fields: familienzweig, vorname, nachname, geburtsdatum, email, telefon, iban, strasse, plz, ort, berufsgruppe, ausbildungsstand, institution, projekt_beschreibung, jaehrliches_einkommen, finanzielle_notlage, notizen, aktiv, ist_abkoemmling, haushaltsgroesse, monatliche_bezuege, vermoegen, unterstuetzung_bestaetigt, standard_konto(FK StiftungsKonto), vierteljaehrlicher_betrag, studiennachweis_erforderlich, letzter_studiennachweis
- Relations: Foerderung 1:M (via destinataer), DestinataerUnterstuetzung 1:M, DestinataerNotiz 1:M
- Helpers: get_full_name, totals, erfuellt_voraussetzungen, naechste_studiennachweis_termine
-
Person (Legacy)
- Legacy stand-in for beneficiaries; still referenced in views/templates; used by Foerderung.person
-
Land (Parcel)
- Identity: lfd_nr(unique), ew_nummer, grundbuchblatt, amtsgericht, gemeinde, gemarkung, flur, flurstueck, adresse
- Area: groesse_qm, gruenland_qm, acker_qm, wald_qm, sonstiges_qm
- Legacy pacht: verpachtete_gesamtflaeche, flaeche_alte_liste, verp_flaeche_aktuell
- Current pacht snapshot: aktueller_paechter(FK), paechter_name, paechter_anschrift, pachtbeginn, pachtende, verlaengerung_klausel, zahlungsweise, pachtzins_pro_ha, pachtzins_pauschal
- USt/Tax: ust_option, ust_satz, grundsteuer_umlage, versicherungen_umlage, verbandsbeitraege_umlage, jagdpacht_anteil_umlage, anteil_grundsteuer, anteil_lwk
- Status/meta: aktiv, notizen, erstellt_am, aktualisiert_am
- Relations: Verpachtung (legacy) 1:M; LandVerpachtung (new) 1:M; LandAbrechnung 1:M
- Helpers: area conversions; pachtfläche calculators
-
LandVerpachtung (New Lease)
- land(FK), paechter(FK), vertragsnummer(unique), pachtbeginn, pachtende?, verlaengerung_klausel
- verpachtete_flaeche, pachtzins_pauschal, pachtzins_pro_ha?, zahlungsweise
- USt/umlagen flags; status, bemerkungen; timestamps
- Behavior: save/delete sync LandAbrechnung; rent proration per year; umlage calc currently 0
-
LandAbrechnung (Annual Accounting)
- land(FK), abrechnungsjahr(unique per land)
- Einnahmen: pacht_vereinnahmt, umlagen_vereinnahmt, sonstige_einnahmen, zahlungen(JSON?)
- Ausgaben buckets; vorsteuer_aus_umlagen; offene_posten; bemerkungen
- File fields for uploads; timestamps; derived totals incl. ust_pacht_betrag
-
Verpachtung (Legacy Lease)
- land(FK), paechter(FK), vertragsnummer(unique), pachtbeginn, pachtende, verlaengerung?
- pachtzins_pro_qm, pachtzins_jaehrlich, verpachtete_flaeche; status; verwendungsnachweis; bemerkungen; timestamps
- Behavior: save/delete sync LandAbrechnung; rent proration with verlängerung
-
DokumentLink (Paperless linking)
- paperless_document_id, kontext, titel, beschreibung
- Flexible UUID links: verpachtung_id, land_verpachtung_id, land_id, paechter_id, destinataer_id, foerderung_id, rentmeister_id
-
Foerderung (Grant)
- person(FK legacy, nullable), destinataer(FK, nullable), jahr, betrag, kategorie, status, verwendungsnachweis(FK), bemerkungen, antragsdatum, entscheidungsdatum
-
DestinataerUnterstuetzung (Support)
- destinataer(FK), konto(FK StiftungsKonto), betrag, faellig_am, status, beschreibung, timestamps; indexes
-
DestinataerNotiz
- destinataer(FK), titel, text, datei, erstellt_von(FK auth.User), erstellt_am
-
Rentmeister
- person/address/bank fields; seit_datum, bis_datum?, aktiv, monatliche_verguetung, km_pauschale; used by Verwaltungskosten
-
StiftungsKonto
- kontoname, bank_name, iban, bic, konto_typ, saldo, saldo_datum, zinssatz, laufzeit_bis, aktiv, notizen, timestamps
-
BankTransaction
- konto(FK), datum, valuta?, betrag, waehrung, verwendungszweck, empfaenger_zahlungspflichtiger, iban_gegenpartei, bic_gegenpartei, referenz, transaction_type, status, kommentare, verwaltungskosten(FK?), import_datei, importiert_am, saldo_nach_buchung
- unique_together: (konto, datum, betrag, referenz)
-
Verwaltungskosten
- bezeichnung, kategorie, betrag, datum, lieferant_firma, rechnungsnummer, status, rentmeister(FK), zahlungskonto(FK), quellkonto(FK), konto(FK legacy), km_anzahl, km_satz, von_ort, nach_ort, zweck, beschreibung, notizen, timestamps
-
ApplicationPermission (managed=False)
- Declares custom permission codenames; no table created
-
AuditLog
- user(FK), username, timestamp, action, entity_type, entity_id, entity_name, description, changes(JSON), ip_address, user_agent, session_key; indexes
-
BackupJob
- backup_type, status, created_by(FK), created_at/started_at/completed_at, backup_filename, backup_size, error_message, database_size, files_count; helpers
Usage observations (workspace-wide scans)
- Legacy vs. new lease models are both heavily referenced across views/templates/forms.
- LandAbrechnung core fields are used in forms and detail pages; pacht_vereinnahmt updated by save/delete hooks and a sync command.
- DokumentLink UUID references are widely used for cross-entity navigation.
- Destinataer support fields power quarterly payout scheduling.
- Person (legacy) still appears in Foerderung flows and person pages.
Likely orphans / cleanup candidates
- LandAbrechnung.zahlungen (JSON): no UI/logic usage detected.
- LandAbrechnung file fields (pachtvertrag_datei, grundsteuer_bescheid_datei, versicherungsnachweis_datei): unused in UI; Paperless appears primary doc source.
- ApplicationPermission: only a managed=False stub with permissions; keep if used for seeding, otherwise move to data migration and remove the class.
- LandVerpachtung._calculate_umlage_for_year: returns 0; umlage flags are gathered but not used to compute revenue.
- Legacy Land fields: still used (imports, displays). Plan deprecation after migration to new lease model.
- Foerderung.person vs destinataer: both used; plan single-source migration and drop legacy.
Recommendations and plan
- Consolidate to LandVerpachtung
- Stop creating new legacy Verpachtung in UI; a feature flag now blocks legacy create (
DISABLE_LEGACY_VERPACHTUNG_CREATE, default True) and guides users to the new flow. - A conversion command
convert_legacy_verpachtungenis scaffolded (dry-run by default; use--committo persist) to createLandVerpachtungrows fromVerpachtung. - After migration and verification: remove legacy model, views, and Land’s legacy pacht snapshot fields.
- DRY date handling
- A shared helper exists:
stiftung/utils/date_utils.pywithensure_dateandget_year_from_date. Models now import and use it.
-
Implement Umlage allocation to Abrechnung
- For each LandAbrechnung year, distribute expense buckets (grundsteuer_betrag, versicherungen_betrag, verbandsbeitraege_betrag, ggf. jagdpacht) across active leases using area share; increase umlagen_vereinnahmt accordingly.
- Extend sync_abrechnungen to recompute Umlagen similar to Pacht.
-
Prune unused LandAbrechnung fields
- If Paperless is canonical: drop the three file fields.
- If no plan for zahlungen JSON: remove or replace with a Payment model.
-
Indexing
- Add selective DB indexes on frequent filters (year, status, land, konto+datum).
-
Permissions
- If using custom permissions, define them in a data migration or settings; remove the managed=False model class.
-
Template consolidation
- Extract shared partials for lease display to reduce duplication between legacy and new renders.
Notes
- Date: 2025-08-31
- Compose services OK; app checks pass (docker-compose exec web python manage.py check).
- To try conversion:
python manage.py convert_legacy_verpachtungen(dry-run), add--committo apply changes; optionally--limit N.