226 lines
6.0 KiB
TypeScript
226 lines
6.0 KiB
TypeScript
import { PrismaClient } from '@prisma/client'
|
|
import bcrypt from 'bcryptjs'
|
|
|
|
const prisma = new PrismaClient()
|
|
|
|
const DEMO_PASSWORD_HASH = bcrypt.hashSync('demo1234', 10)
|
|
|
|
async function main() {
|
|
console.log('Seeding database...')
|
|
|
|
// Create demo organization
|
|
const org = await prisma.organization.upsert({
|
|
where: { slug: 'innung-elektro-stuttgart' },
|
|
update: {},
|
|
create: {
|
|
name: 'Innung Elektrotechnik Stuttgart',
|
|
slug: 'innung-elektro-stuttgart',
|
|
plan: 'pilot',
|
|
primaryColor: '#E63946',
|
|
contactEmail: 'kontakt@innung-elektro-stuttgart.de',
|
|
},
|
|
})
|
|
|
|
console.log(`Created organization: ${org.name}`)
|
|
|
|
// Create demo admin user (better-auth manages sessions, we just pre-create the role)
|
|
// In production: use the invite flow via the admin dashboard
|
|
const adminUser = await prisma.user.upsert({
|
|
where: { email: 'admin@demo.de' },
|
|
update: {},
|
|
create: {
|
|
id: 'demo-admin-user-id',
|
|
name: 'Demo Admin',
|
|
email: 'admin@demo.de',
|
|
emailVerified: true,
|
|
},
|
|
})
|
|
|
|
// Create password account so email+password login works in dev
|
|
await prisma.account.upsert({
|
|
where: { id: 'demo-admin-account-id' },
|
|
update: { password: DEMO_PASSWORD_HASH },
|
|
create: {
|
|
id: 'demo-admin-account-id',
|
|
accountId: adminUser.id,
|
|
providerId: 'credential',
|
|
userId: adminUser.id,
|
|
password: DEMO_PASSWORD_HASH,
|
|
},
|
|
})
|
|
|
|
await prisma.userRole.upsert({
|
|
where: { orgId_userId: { orgId: org.id, userId: adminUser.id } },
|
|
update: {},
|
|
create: {
|
|
orgId: org.id,
|
|
userId: adminUser.id,
|
|
role: 'admin',
|
|
},
|
|
})
|
|
|
|
// Create demo admin member record
|
|
const adminMember = await prisma.member.upsert({
|
|
where: { userId: adminUser.id },
|
|
update: {},
|
|
create: {
|
|
orgId: org.id,
|
|
userId: adminUser.id,
|
|
name: 'Demo Admin',
|
|
betrieb: 'Innungsgeschäftsstelle',
|
|
sparte: 'Elektrotechnik',
|
|
ort: 'Stuttgart',
|
|
email: 'admin@demo.de',
|
|
status: 'aktiv',
|
|
},
|
|
})
|
|
|
|
// Create demo members
|
|
const demoMembers = [
|
|
{
|
|
name: 'Klaus Müller',
|
|
betrieb: 'Elektro Müller GmbH',
|
|
sparte: 'Elektrotechnik',
|
|
ort: 'Stuttgart',
|
|
telefon: '+49 711 123456',
|
|
email: 'mueller@elektro-mueller.de',
|
|
istAusbildungsbetrieb: true,
|
|
seit: 2015,
|
|
},
|
|
{
|
|
name: 'Maria Schmidt',
|
|
betrieb: 'Schmidt Elektrik',
|
|
sparte: 'Elektrotechnik',
|
|
ort: 'Ludwigsburg',
|
|
telefon: '+49 7141 987654',
|
|
email: 'schmidt@schmidt-elektrik.de',
|
|
istAusbildungsbetrieb: false,
|
|
seit: 2018,
|
|
},
|
|
{
|
|
name: 'Thomas Weber',
|
|
betrieb: 'Weber & Söhne Elektro',
|
|
sparte: 'Informationstechnik',
|
|
ort: 'Esslingen',
|
|
telefon: '+49 711 555123',
|
|
email: 'weber@weber-elektro.de',
|
|
istAusbildungsbetrieb: true,
|
|
seit: 2012,
|
|
},
|
|
]
|
|
|
|
const createdMembers = []
|
|
for (const m of demoMembers) {
|
|
const member = await prisma.member.create({
|
|
data: { orgId: org.id, status: 'aktiv', ...m },
|
|
})
|
|
createdMembers.push(member)
|
|
}
|
|
console.log(`Created ${createdMembers.length} demo members`)
|
|
|
|
// Create demo news
|
|
const news1 = await prisma.news.create({
|
|
data: {
|
|
orgId: org.id,
|
|
authorId: adminMember.id,
|
|
title: 'Wichtige Änderungen bei der Gesellenprüfung 2025',
|
|
body: `## Änderungen ab Herbst 2025
|
|
|
|
Die Prüfungsordnung wurde angepasst. Folgende Änderungen sind zu beachten:
|
|
|
|
- **Prüfungsteil A** (Gesellenstück) wird auf 2 Tage ausgeweitet
|
|
- Neue digitale Komponenten in Prüfungsteil B
|
|
- Anmeldeschluss ist der **15. September 2025**
|
|
|
|
Weitere Details entnehmen Sie dem beigefügten Rundschreiben.`,
|
|
kategorie: 'Pruefung',
|
|
publishedAt: new Date(),
|
|
},
|
|
})
|
|
|
|
await prisma.news.create({
|
|
data: {
|
|
orgId: org.id,
|
|
authorId: adminMember.id,
|
|
title: 'Förderung für Ausbildungsbetriebe: Jetzt beantragen!',
|
|
body: `## Neue Fördergelder verfügbar
|
|
|
|
Das Land Baden-Württemberg stellt für das Jahr 2025 zusätzliche Fördermittel für Ausbildungsbetriebe bereit.
|
|
|
|
**Förderhöhe:** Bis zu 3.000 € pro Auszubildenden
|
|
|
|
**Voraussetzungen:**
|
|
- Mitglied in einer anerkannten Innung
|
|
- Erstauszubildende oder benachteiligte Jugendliche
|
|
|
|
Anträge bis **31. März 2025** einreichen.`,
|
|
kategorie: 'Foerderung',
|
|
publishedAt: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
|
|
},
|
|
})
|
|
|
|
console.log('Created demo news articles')
|
|
|
|
// Create demo Termin
|
|
await prisma.termin.create({
|
|
data: {
|
|
orgId: org.id,
|
|
titel: 'Herbst-Gesellenprüfung 2025',
|
|
datum: new Date('2025-11-15'),
|
|
uhrzeit: '08:00',
|
|
endeDatum: new Date('2025-11-16'),
|
|
endeUhrzeit: '17:00',
|
|
ort: 'Berufsschule Stuttgart-Mitte',
|
|
adresse: 'Neckarstraße 22, 70190 Stuttgart',
|
|
typ: 'Pruefung',
|
|
beschreibung: 'Praktische und theoretische Gesellenprüfung für Elektrotechniker.',
|
|
maxTeilnehmer: 30,
|
|
},
|
|
})
|
|
|
|
await prisma.termin.create({
|
|
data: {
|
|
orgId: org.id,
|
|
titel: 'Innungsversammlung Winter 2025',
|
|
datum: new Date('2025-12-03'),
|
|
uhrzeit: '19:00',
|
|
endeUhrzeit: '21:00',
|
|
ort: 'Gasthof Zum Lamm',
|
|
adresse: 'Marktplatz 5, 70173 Stuttgart',
|
|
typ: 'Versammlung',
|
|
beschreibung: 'Jährliche Winterversammlung mit Jahresrückblick und Vorstandswahlen.',
|
|
},
|
|
})
|
|
|
|
console.log('Created demo Termine')
|
|
|
|
// Create demo Stelle
|
|
await prisma.stelle.create({
|
|
data: {
|
|
orgId: org.id,
|
|
memberId: createdMembers[0].id,
|
|
sparte: 'Elektrotechnik',
|
|
stellenAnz: 2,
|
|
verguetung: '620-750 € / Monat',
|
|
lehrjahr: 'beliebig',
|
|
beschreibung:
|
|
'Wir suchen motivierte Auszubildende für unser erfolgreiches Elektroinstallationsunternehmen. Moderner Fuhrpark, faire Vergütung, Übernahmechancen.',
|
|
kontaktEmail: 'mueller@elektro-mueller.de',
|
|
kontaktName: 'Klaus Müller',
|
|
aktiv: true,
|
|
},
|
|
})
|
|
|
|
console.log('Created demo Stelle')
|
|
console.log('Seeding complete!')
|
|
}
|
|
|
|
main()
|
|
.catch((e) => {
|
|
console.error(e)
|
|
process.exit(1)
|
|
})
|
|
.finally(async () => {
|
|
await prisma.$disconnect()
|
|
})
|