diff --git a/backend/scripts/import-mitarbeiterliste.ts b/backend/scripts/import-mitarbeiterliste.ts index 028b064..6cf5e4a 100644 --- a/backend/scripts/import-mitarbeiterliste.ts +++ b/backend/scripts/import-mitarbeiterliste.ts @@ -6,7 +6,9 @@ import { and, eq } from "drizzle-orm" import { authProfileBranches, authProfiles, + authProfileTeams, branches, + teams, tenants, } from "../db/schema" @@ -270,6 +272,20 @@ function formatValue(value: unknown) { return String(value) } +function mapEmploymentCategory(value: string) { + const normalized = normalizeKey(value) + if (normalized === "aushilfe") return "Aushilfen" + if (normalized === "teilzeit" || normalized === "vollzeit") return "Festangestellte" + return null +} + +function buildTeamName(bereich: string, anstellung: string) { + const employmentCategory = mapEmploymentCategory(anstellung) + const normalizedBereich = String(bereich || "").trim() + if (!normalizedBereich || !employmentCategory) return null + return `${normalizedBereich} ${employmentCategory}` +} + function collectFieldChanges(existing: any, nextPayload: Record) { if (!existing) return [] @@ -320,6 +336,24 @@ async function validateTenantAndBranches( } } +async function loadTenantTeams(db: any, tenantId: number) { + const teamRows = await db + .select({ + id: teams.id, + name: teams.name, + branch: teams.branch, + archived: teams.archived, + }) + .from(teams) + .where(eq(teams.tenant, tenantId)) + + return new Map( + teamRows + .filter((team: any) => !team.archived) + .map((team: any) => [`${team.branch}::${normalizeKey(team.name)}`, team]) + ) +} + async function main() { const options = parseArgs(process.argv.slice(2)) if (!options) { @@ -347,6 +381,7 @@ async function main() { try { const { tenant } = await validateTenantAndBranches(db, options.tenantId, mappedBranchIds) + const teamByBranchAndName = await loadTenantTeams(db, options.tenantId) const existingProfiles = await db .select() @@ -375,6 +410,7 @@ async function main() { } const missingBranchMappings = new Set() + const missingTeams = new Set() const preparedRows = rows.map((row) => { const branchKey = normalizeKey(row.betrieb) const branchId = options.branchMap[branchKey] ?? options.defaultBranchId ?? null @@ -382,9 +418,20 @@ async function main() { missingBranchMappings.add(row.betrieb || `(Zeile ${row.rowNumber})`) } + const teamName = buildTeamName(row.bereich, row.anstellung) + const team = branchId && teamName + ? (teamByBranchAndName.get(`${branchId}::${normalizeKey(teamName)}`) as any) || null + : null + + if (branchId && teamName && !team) { + missingTeams.add(`${row.betrieb} | ${teamName}`) + } + return { ...row, branchId, + teamId: team?.id ?? null, + teamName, weeklyHours: toWeeklyHours(row.stundenMonat), } }) @@ -395,6 +442,12 @@ async function main() { ) } + if (missingTeams.size) { + throw new Error( + `Für folgende Niederlassung-/Bereich-Kombinationen fehlen Teams: ${[...missingTeams].join(", ")}` + ) + } + let createdProfiles = 0 let updatedProfiles = 0 const actionLogs: string[] = [] @@ -434,14 +487,15 @@ async function main() { const fieldChanges = existing ? collectFieldChanges(existing, payload) : [] const actionPrefix = action === "create" ? "ERSTELLEN" : "AKTUALISIEREN" const branchLabel = `${row.betrieb} -> ${row.branchId}` + const teamLabel = row.teamName ? `${row.teamName} -> ${row.teamId}` : "-" if (action === "create") { actionLogs.push( - `[${actionPrefix}] ${row.mitarbeiter} | Branch ${branchLabel} | Vertrag ${row.anstellung || "-"} | Position ${row.position || "-"}` + `[${actionPrefix}] ${row.mitarbeiter} | Branch ${branchLabel} | Team ${teamLabel} | Vertrag ${row.anstellung || "-"} | Position ${row.position || "-"}` ) } else { actionLogs.push( - `[${actionPrefix}] ${row.mitarbeiter} | Branch ${branchLabel} | Änderungen: ${fieldChanges.length ? fieldChanges.join("; ") : "keine"}` + `[${actionPrefix}] ${row.mitarbeiter} | Branch ${branchLabel} | Team ${teamLabel} | Änderungen: ${fieldChanges.length ? fieldChanges.join("; ") : "keine"}` ) } @@ -461,6 +515,13 @@ async function main() { branch_id: row.branchId, }) + if (row.teamId) { + await db.insert(authProfileTeams).values({ + profile_id: created.id, + team_id: row.teamId, + }) + } + existingByName.set(nameKey, created) } @@ -487,6 +548,17 @@ async function main() { profile_id: existing.id, branch_id: row.branchId, }) + + await db + .delete(authProfileTeams) + .where(eq(authProfileTeams.profile_id, existing.id)) + + if (row.teamId) { + await db.insert(authProfileTeams).values({ + profile_id: existing.id, + team_id: row.teamId, + }) + } } updatedProfiles += 1