Prototype implementation
This commit is contained in:
parent
315143a6fc
commit
14b0bc6d01
160 changed files with 5731 additions and 42 deletions
239
vergabe_teilnahme/apps/core/management/commands/seed_dev.py
Normal file
239
vergabe_teilnahme/apps/core/management/commands/seed_dev.py
Normal 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.'))
|
||||
Loading…
Add table
Add a link
Reference in a new issue