Ergänze Team-Zuordnung im Mitarbeiterimport
This commit is contained in:
@@ -6,7 +6,9 @@ import { and, eq } from "drizzle-orm"
|
|||||||
import {
|
import {
|
||||||
authProfileBranches,
|
authProfileBranches,
|
||||||
authProfiles,
|
authProfiles,
|
||||||
|
authProfileTeams,
|
||||||
branches,
|
branches,
|
||||||
|
teams,
|
||||||
tenants,
|
tenants,
|
||||||
} from "../db/schema"
|
} from "../db/schema"
|
||||||
|
|
||||||
@@ -270,6 +272,20 @@ function formatValue(value: unknown) {
|
|||||||
return String(value)
|
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>) {
|
function collectFieldChanges(existing: any, nextPayload: Record<string, unknown>) {
|
||||||
if (!existing) return []
|
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() {
|
async function main() {
|
||||||
const options = parseArgs(process.argv.slice(2))
|
const options = parseArgs(process.argv.slice(2))
|
||||||
if (!options) {
|
if (!options) {
|
||||||
@@ -347,6 +381,7 @@ async function main() {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
const { tenant } = await validateTenantAndBranches(db, options.tenantId, mappedBranchIds)
|
const { tenant } = await validateTenantAndBranches(db, options.tenantId, mappedBranchIds)
|
||||||
|
const teamByBranchAndName = await loadTenantTeams(db, options.tenantId)
|
||||||
|
|
||||||
const existingProfiles = await db
|
const existingProfiles = await db
|
||||||
.select()
|
.select()
|
||||||
@@ -375,6 +410,7 @@ async function main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const missingBranchMappings = new Set<string>()
|
const missingBranchMappings = new Set<string>()
|
||||||
|
const missingTeams = new Set<string>()
|
||||||
const preparedRows = rows.map((row) => {
|
const preparedRows = rows.map((row) => {
|
||||||
const branchKey = normalizeKey(row.betrieb)
|
const branchKey = normalizeKey(row.betrieb)
|
||||||
const branchId = options.branchMap[branchKey] ?? options.defaultBranchId ?? null
|
const branchId = options.branchMap[branchKey] ?? options.defaultBranchId ?? null
|
||||||
@@ -382,9 +418,20 @@ async function main() {
|
|||||||
missingBranchMappings.add(row.betrieb || `(Zeile ${row.rowNumber})`)
|
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 {
|
return {
|
||||||
...row,
|
...row,
|
||||||
branchId,
|
branchId,
|
||||||
|
teamId: team?.id ?? null,
|
||||||
|
teamName,
|
||||||
weeklyHours: toWeeklyHours(row.stundenMonat),
|
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 createdProfiles = 0
|
||||||
let updatedProfiles = 0
|
let updatedProfiles = 0
|
||||||
const actionLogs: string[] = []
|
const actionLogs: string[] = []
|
||||||
@@ -434,14 +487,15 @@ async function main() {
|
|||||||
const fieldChanges = existing ? collectFieldChanges(existing, payload) : []
|
const fieldChanges = existing ? collectFieldChanges(existing, payload) : []
|
||||||
const actionPrefix = action === "create" ? "ERSTELLEN" : "AKTUALISIEREN"
|
const actionPrefix = action === "create" ? "ERSTELLEN" : "AKTUALISIEREN"
|
||||||
const branchLabel = `${row.betrieb} -> ${row.branchId}`
|
const branchLabel = `${row.betrieb} -> ${row.branchId}`
|
||||||
|
const teamLabel = row.teamName ? `${row.teamName} -> ${row.teamId}` : "-"
|
||||||
|
|
||||||
if (action === "create") {
|
if (action === "create") {
|
||||||
actionLogs.push(
|
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 {
|
} else {
|
||||||
actionLogs.push(
|
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,
|
branch_id: row.branchId,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if (row.teamId) {
|
||||||
|
await db.insert(authProfileTeams).values({
|
||||||
|
profile_id: created.id,
|
||||||
|
team_id: row.teamId,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
existingByName.set(nameKey, created)
|
existingByName.set(nameKey, created)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,6 +548,17 @@ async function main() {
|
|||||||
profile_id: existing.id,
|
profile_id: existing.id,
|
||||||
branch_id: row.branchId,
|
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
|
updatedProfiles += 1
|
||||||
|
|||||||
Reference in New Issue
Block a user