import logging from datetime import datetime from django.core.management.base import BaseCommand from django.db import transaction from stiftung.models import Land, LandAbrechnung, Paechter, Verpachtung logger = logging.getLogger(__name__) class Command(BaseCommand): help = "Vereinheitlicht Verpachtungen, Land und Abrechnungen zu einem konsistenten System" def add_arguments(self, parser): parser.add_argument( "--dry-run", action="store_true", help="Zeigt nur an, was gemacht würde, ohne Änderungen zu speichern", ) parser.add_argument( "--create-abrechnungen", action="store_true", help="Erstellt automatisch Abrechnungen aus Verpachtungsdaten", ) def handle(self, *args, **options): dry_run = options["dry_run"] create_abrechnungen = options["create_abrechnungen"] if dry_run: self.stdout.write( self.style.WARNING("DRY RUN - Keine Änderungen werden gespeichert!") ) # Schritt 1: Alle Verpachtungen analysieren alle_verpachtungen = Verpachtung.objects.all().order_by("land", "-pachtbeginn") self.stdout.write( f"Gefunden: {alle_verpachtungen.count()} Verpachtungen insgesamt" ) land_updates = 0 abrechnungen_created = 0 with transaction.atomic(): current_land = None for verpachtung in alle_verpachtungen: land = verpachtung.land # Für jedes Land nur die neueste aktive Verpachtung als "aktuell" setzen if current_land != land: current_land = land # Prüfen ob dies die neueste aktive Verpachtung ist if verpachtung.status == "aktiv" and not land.aktueller_paechter: self.stdout.write( f"Setze aktuelle Verpachtung: {land} -> {verpachtung.paechter}" ) if not dry_run: # Land-Felder aktualisieren land.aktueller_paechter = verpachtung.paechter land.paechter_name = verpachtung.paechter.get_full_name() land.paechter_anschrift = self._get_paechter_anschrift( verpachtung.paechter ) land.pachtbeginn = verpachtung.pachtbeginn land.pachtende = verpachtung.pachtende land.verlaengerung_klausel = bool(verpachtung.verlaengerung) land.pachtzins_pauschal = verpachtung.pachtzins_jaehrlich # Verpachtete Fläche synchronisieren land.verp_flaeche_aktuell = verpachtung.verpachtete_flaeche land.save() land_updates += 1 # Schritt 2: Abrechnungen aus Verpachtungen erstellen (optional) if create_abrechnungen and verpachtung.status == "aktiv": # Erstelle Abrechnungen für die letzten 3 Jahre current_year = datetime.now().year for jahr in range(current_year - 2, current_year + 1): # Prüfen ob Abrechnung bereits existiert existing = LandAbrechnung.objects.filter( land=land, abrechnungsjahr=jahr ).first() if not existing: self.stdout.write(f"Erstelle Abrechnung: {land} - {jahr}") if not dry_run: abrechnung = LandAbrechnung.objects.create( land=land, abrechnungsjahr=jahr, pacht_vereinnahmt=verpachtung.pachtzins_jaehrlich, bemerkungen=f"Automatisch erstellt aus Verpachtung {verpachtung.vertragsnummer}", ) abrechnungen_created += 1 # Zusammenfassung self.stdout.write(self.style.SUCCESS("\n=== MIGRATION ABGESCHLOSSEN ===")) if dry_run: self.stdout.write(f"DRY RUN: {land_updates} Länder würden aktualisiert") if create_abrechnungen: self.stdout.write( f"DRY RUN: {abrechnungen_created} Abrechnungen würden erstellt" ) else: self.stdout.write(f"✓ {land_updates} Länder aktualisiert") if create_abrechnungen: self.stdout.write(f"✓ {abrechnungen_created} Abrechnungen erstellt") # Empfehlungen self.stdout.write(self.style.WARNING("\n=== NÄCHSTE SCHRITTE ===")) self.stdout.write("1. Prüfen Sie die migrierten Daten in der Weboberfläche") self.stdout.write( '2. Alte Verpachtungs-Views können als "Legacy" markiert werden' ) self.stdout.write( "3. Neue Verpachtungen sollten direkt im Land-Model erstellt werden" ) def _get_paechter_anschrift(self, paechter): """Erstellt eine Anschrift aus den Pächter-Daten""" parts = [] if paechter.strasse: parts.append(paechter.strasse) if paechter.plz and paechter.ort: parts.append(f"{paechter.plz} {paechter.ort}") elif paechter.ort: parts.append(paechter.ort) return "\n".join(parts) if parts else ""