# 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 1) 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_verpachtungen` is scaffolded (dry-run by default; use `--commit` to persist) to create `LandVerpachtung` rows from `Verpachtung`. - After migration and verification: remove legacy model, views, and Land’s legacy pacht snapshot fields. 2) DRY date handling - A shared helper exists: `stiftung/utils/date_utils.py` with `ensure_date` and `get_year_from_date`. Models now import and use it. 3) 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. 4) 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. 5) Indexing - Add selective DB indexes on frequent filters (year, status, land, konto+datum). 6) Permissions - If using custom permissions, define them in a data migration or settings; remove the managed=False model class. 7) 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 `--commit` to apply changes; optionally `--limit N`.