Prototype implementation

This commit is contained in:
2026-05-08 14:26:48 +02:00
parent 315143a6fc
commit 14b0bc6d01
160 changed files with 5731 additions and 42 deletions

View File

@@ -0,0 +1,239 @@
from datetime import date, timedelta
from django.core.management.base import BaseCommand
class Command(BaseCommand):
help = 'Erstellt Entwicklungs-Seed-Daten (idempotent)'
def handle(self, *args, **options):
from vergabe_teilnahme.apps.accounts.models import Mitarbeiter
from vergabe_teilnahme.apps.ausschreibungen.models import Ausschreibung
from vergabe_teilnahme.apps.aufgaben.models import Aufgabe
from vergabe_teilnahme.apps.bibliothek.models import Entscheidungsregel, Nachweis
from vergabe_teilnahme.apps.lose.models import Anforderung, Los
from vergabe_teilnahme.apps.marktbegleiter.models import Marktbegleiter
from vergabe_teilnahme.apps.partner.models import Dienstleistertyp, Subunternehmer
from vergabe_teilnahme.apps.preise.models import Preispunkt
self.stdout.write('Erstelle Seed-Daten...')
# 1. Mitarbeiter
bm, _ = Mitarbeiter.objects.get_or_create(
username='max.muster',
defaults={
'first_name': 'Max', 'last_name': 'Muster',
'rolle': 'bid_manager', 'organisationseinheit': 'Vertrieb',
'email': 'max.muster@example.com',
}
)
bm.set_password('testpass123')
bm.save(update_fields=['password'])
fach, _ = Mitarbeiter.objects.get_or_create(
username='anna.fach',
defaults={
'first_name': 'Anna', 'last_name': 'Fach',
'rolle': 'fachexperte', 'organisationseinheit': 'Technik',
'email': 'anna.fach@example.com',
}
)
fach.set_password('testpass123')
fach.save(update_fields=['password'])
gf, _ = Mitarbeiter.objects.get_or_create(
username='georg.chef',
defaults={
'first_name': 'Georg', 'last_name': 'Chef',
'rolle': 'geschaeftsfuehrung', 'organisationseinheit': 'GF',
'email': 'georg.chef@example.com', 'is_staff': True,
}
)
gf.set_password('testpass123')
gf.save(update_fields=['password'])
self.stdout.write(f' ✓ 3 Mitarbeiter')
# 2. Dienstleistertypen
dt_it, _ = Dienstleistertyp.objects.get_or_create(
name='IT-Dienstleister',
defaults={'beschreibung': 'Software- und IT-Infrastruktur-Dienstleister'}
)
dt_recht, _ = Dienstleistertyp.objects.get_or_create(
name='Rechtsberatung',
defaults={'beschreibung': 'Anwaltskanzleien und Rechtsberatungsunternehmen'}
)
self.stdout.write(f' ✓ 2 Dienstleistertypen')
# 3. Subunternehmer
sub, _ = Subunternehmer.objects.get_or_create(
name='TechPartner GmbH',
defaults={
'dienstleistertyp': dt_it,
'praeferenz': 'bevorzugt',
'ort': 'München',
'email': 'kontakt@techpartner.example.com',
'leistungsprofil': 'Cloud-Infrastruktur, DevOps, Security',
}
)
self.stdout.write(f' ✓ 1 Subunternehmer')
# 4. Nachweise
nachweis_iso, _ = Nachweis.objects.get_or_create(
titel='ISO 27001 Zertifikat',
defaults={
'kategorie': 'Zertifizierung',
'version': '2.0',
'gueltig_ab': date.today() - timedelta(days=365),
'gueltig_bis': date.today() + timedelta(days=365),
'eigentuemer': bm,
'freigabestatus': 'intern_freigegeben',
}
)
nachweis_dsgvo, _ = Nachweis.objects.get_or_create(
titel='DSGVO-Datenschutzerklärung',
defaults={
'kategorie': 'Rechtlich',
'version': '1.2',
'gueltig_bis': date.today() + timedelta(days=730),
'eigentuemer': bm,
'freigabestatus': 'intern_freigegeben',
}
)
self.stdout.write(f' ✓ 2 Nachweise')
# 5. Marktbegleiter
mb, _ = Marktbegleiter.objects.get_or_create(
name='Konkurrent AG',
defaults={
'kurzbeschreibung': 'Größter Wettbewerber im IT-Bereich',
'relevante_branchen': 'IT, Behörden, Finanzwesen',
'bekannte_staerken': 'Große Kundenbasis, günstige Preise',
'bekannte_schwaechen': 'Langsamer Support, wenig Flexibilität',
}
)
self.stdout.write(f' ✓ 1 Marktbegleiter')
# 6. Entscheidungsregeln
Entscheidungsregel.objects.get_or_create(
regelname='Muss-Anforderung nicht erfüllbar',
defaults={
'kategorie': 'ausschlusskriterium',
'empfehlung': 'nicht_teilnehmen',
'begruendung': 'Falls eine Muss-Anforderung nicht erfüllt werden kann.',
'aktiv': True,
}
)
Entscheidungsregel.objects.get_or_create(
regelname='Abgabefrist zu kurz',
defaults={
'kategorie': 'frist',
'empfehlung': 'pruefen',
'begruendung': 'Weniger als 2 Wochen bis zur Abgabe.',
'aktiv': True,
}
)
Entscheidungsregel.objects.get_or_create(
regelname='Fehlende Referenz',
defaults={
'kategorie': 'referenz',
'empfehlung': 'nicht_teilnehmen',
'begruendung': 'Keine passende Referenz für die geforderte Branche vorhanden.',
'aktiv': True,
}
)
self.stdout.write(f' ✓ 3 Entscheidungsregeln')
# 7. Ausschreibung mit Losen, Anforderungen, Aufgaben, Preispunkten
ausschreibung, _ = Ausschreibung.objects.get_or_create(
vergabenummer='DEV-2026-001',
defaults={
'titel': 'Digitalisierung Verwaltungsportal Phase 2',
'ausschreiber': 'Beispiel-Behörde GmbH',
'vergabeplattform': 'DTVP',
'status': 4,
'bieterfragen_bis': date.today() + timedelta(days=5),
'abgabe_bis': None,
'bid_manager': bm,
'branche': 'Öffentliche Verwaltung',
'leistungsbeschreibung': 'Entwicklung und Betrieb eines digitalen Verwaltungsportals.',
}
)
los1, _ = Los.objects.get_or_create(
ausschreibung=ausschreibung, losnummer='1',
defaults={'lostitel': 'Softwareentwicklung', 'zustaendiger': fach}
)
los2, _ = Los.objects.get_or_create(
ausschreibung=ausschreibung, losnummer='2',
defaults={'lostitel': 'Hosting & Betrieb', 'zustaendiger': bm}
)
anf1, _ = Anforderung.objects.get_or_create(
ausschreibung=ausschreibung,
titel='ISO 27001 Zertifizierung nachweisen',
defaults={
'verbindlichkeit': 'muss', 'ausschlusskriterium': True,
'kategorie': 'zertifizierung', 'los': los1,
}
)
anf2, _ = Anforderung.objects.get_or_create(
ausschreibung=ausschreibung,
titel='Mindestens 3 Referenzprojekte in der öffentlichen Verwaltung',
defaults={
'verbindlichkeit': 'muss', 'kategorie': 'referenz', 'los': los1,
}
)
anf3, _ = Anforderung.objects.get_or_create(
ausschreibung=ausschreibung,
titel='SLA 99,5% Verfügbarkeit',
defaults={
'verbindlichkeit': 'soll', 'kategorie': 'technisch', 'los': los2,
}
)
Aufgabe.objects.get_or_create(
ausschreibung=ausschreibung,
titel='ISO-Zertifikat aktualisieren und einreichen',
defaults={
'typ': 'dokument', 'prioritaet': 1,
'verantwortlicher': bm, 'anforderung': anf1,
}
)
Aufgabe.objects.get_or_create(
ausschreibung=ausschreibung,
titel='Referenzliste zusammenstellen',
defaults={
'typ': 'fachlich', 'prioritaet': 2,
'verantwortlicher': fach, 'anforderung': anf2,
}
)
from decimal import Decimal
Preispunkt.objects.get_or_create(
ausschreibung=ausschreibung,
konkrete_leistung='Entwicklung Frontend',
defaults={
'leistungstyp': 'Entwicklung',
'menge': Decimal('1'),
'mengeneinheit': 'Pauschal',
'einzelpreis': Decimal('85000.00'),
'los': los1,
}
)
Preispunkt.objects.get_or_create(
ausschreibung=ausschreibung,
konkrete_leistung='Hosting p.a.',
defaults={
'leistungstyp': 'Betrieb',
'menge': Decimal('1'),
'mengeneinheit': 'Jahr',
'einzelpreis': Decimal('24000.00'),
'wiederkehrend': True,
'los': los2,
'vergleichsgewicht': Decimal('0.8'),
}
)
self.stdout.write(f' ✓ 1 Ausschreibung mit 2 Losen, 3 Anforderungen, 2 Aufgaben, 2 Preispunkten')
self.stdout.write(self.style.SUCCESS('\nSeed-Daten erfolgreich erstellt.'))