Ergänze Team-Zuordnung im Mitarbeiterimport
This commit is contained in:
@@ -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<string, unknown>) {
|
||||
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<string>()
|
||||
const missingTeams = new Set<string>()
|
||||
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
|
||||
|
||||
Reference in New Issue
Block a user