mirror of
https://github.com/donpat1to/Schichtenplaner.git
synced 2025-11-30 22:45:46 +01:00
backend without errors
This commit is contained in:
@@ -14,17 +14,16 @@ export const getEmployees = async (req: AuthRequest, res: Response): Promise<voi
|
||||
SELECT
|
||||
id, email, name, role, is_active as isActive,
|
||||
employee_type as employeeType,
|
||||
is_sufficiently_independent as isSufficientlyIndependent,
|
||||
contract_type as contractType,
|
||||
can_work_alone as canWorkAlone,
|
||||
created_at as createdAt,
|
||||
last_login as lastLogin
|
||||
FROM users
|
||||
FROM employees
|
||||
WHERE is_active = 1
|
||||
ORDER BY name
|
||||
`);
|
||||
|
||||
console.log('✅ Employees found:', employees.length);
|
||||
console.log('📋 Employees data:', employees);
|
||||
|
||||
res.json(employees);
|
||||
} catch (error) {
|
||||
console.error('❌ Error fetching employees:', error);
|
||||
@@ -40,10 +39,11 @@ export const getEmployee = async (req: AuthRequest, res: Response): Promise<void
|
||||
SELECT
|
||||
id, email, name, role, is_active as isActive,
|
||||
employee_type as employeeType,
|
||||
is_sufficiently_independent as isSufficientlyIndependent,
|
||||
contract_type as contractType,
|
||||
can_work_alone as canWorkAlone,
|
||||
created_at as createdAt,
|
||||
last_login as lastLogin
|
||||
FROM users
|
||||
FROM employees
|
||||
WHERE id = ?
|
||||
`, [id]);
|
||||
|
||||
@@ -72,14 +72,15 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
name,
|
||||
role,
|
||||
employeeType,
|
||||
isSufficientlyIndependent,
|
||||
contractType,
|
||||
canWorkAlone // Statt isSufficientlyIndependent
|
||||
} = req.body as CreateEmployeeRequest;
|
||||
|
||||
// Validierung
|
||||
if (!email || !password || !name || !role || !employeeType) {
|
||||
if (!email || !password || !name || !role || !employeeType || !contractType) {
|
||||
console.log('❌ Validation failed: Missing required fields');
|
||||
res.status(400).json({
|
||||
error: 'Email, password, name, role und employeeType sind erforderlich'
|
||||
error: 'Email, password, name, role, employeeType und contractType sind erforderlich'
|
||||
});
|
||||
return;
|
||||
}
|
||||
@@ -91,7 +92,7 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
}
|
||||
|
||||
// Check if email already exists
|
||||
const existingActiveUser = await db.get<any>('SELECT id FROM users WHERE email = ? AND is_active = 1', [email]);
|
||||
const existingActiveUser = await db.get<any>('SELECT id FROM employees WHERE email = ? AND is_active = 1', [email]);
|
||||
|
||||
if (existingActiveUser) {
|
||||
console.log('❌ Email exists for active user:', existingActiveUser);
|
||||
@@ -104,10 +105,10 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
const employeeId = uuidv4();
|
||||
|
||||
await db.run(
|
||||
`INSERT INTO users (
|
||||
id, email, password, name, role, employee_type, is_sufficiently_independent,
|
||||
`INSERT INTO employees (
|
||||
id, email, password, name, role, employee_type, contract_type, can_work_alone,
|
||||
is_active
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`,
|
||||
[
|
||||
employeeId,
|
||||
email,
|
||||
@@ -115,7 +116,8 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
name,
|
||||
role,
|
||||
employeeType,
|
||||
isSufficientlyIndependent ? 1 : 0,
|
||||
contractType,
|
||||
canWorkAlone ? 1 : 0, // Statt isSufficientlyIndependent
|
||||
1
|
||||
]
|
||||
);
|
||||
@@ -125,10 +127,11 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
SELECT
|
||||
id, email, name, role, is_active as isActive,
|
||||
employee_type as employeeType,
|
||||
is_sufficiently_independent as isSufficientlyIndependent,
|
||||
contract_type as contractType,
|
||||
can_work_alone as canWorkAlone,
|
||||
created_at as createdAt,
|
||||
last_login as lastLogin
|
||||
FROM users
|
||||
FROM employees
|
||||
WHERE id = ?
|
||||
`, [employeeId]);
|
||||
|
||||
@@ -142,12 +145,12 @@ export const createEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
export const updateEmployee = async (req: AuthRequest, res: Response): Promise<void> => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const { name, role, isActive, employeeType, isSufficientlyIndependent } = req.body;
|
||||
const { name, role, isActive, employeeType, contractType, canWorkAlone } = req.body; // Statt isSufficientlyIndependent
|
||||
|
||||
console.log('📝 Update Employee Request:', { id, name, role, isActive, employeeType, isSufficientlyIndependent });
|
||||
console.log('📝 Update Employee Request:', { id, name, role, isActive, employeeType, contractType, canWorkAlone });
|
||||
|
||||
// Check if employee exists
|
||||
const existingEmployee = await db.get('SELECT * FROM users WHERE id = ?', [id]);
|
||||
const existingEmployee = await db.get('SELECT * FROM employees WHERE id = ?', [id]);
|
||||
if (!existingEmployee) {
|
||||
res.status(404).json({ error: 'Employee not found' });
|
||||
return;
|
||||
@@ -155,14 +158,15 @@ export const updateEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
|
||||
// Update employee
|
||||
await db.run(
|
||||
`UPDATE users
|
||||
`UPDATE employees
|
||||
SET name = COALESCE(?, name),
|
||||
role = COALESCE(?, role),
|
||||
is_active = COALESCE(?, is_active),
|
||||
employee_type = COALESCE(?, employee_type),
|
||||
is_sufficiently_independent = COALESCE(?, is_sufficiently_independent)
|
||||
contract_type = COALESCE(?, contract_type),
|
||||
can_work_alone = COALESCE(?, can_work_alone)
|
||||
WHERE id = ?`,
|
||||
[name, role, isActive, employeeType, isSufficientlyIndependent, id]
|
||||
[name, role, isActive, employeeType, contractType, canWorkAlone, id]
|
||||
);
|
||||
|
||||
console.log('✅ Employee updated successfully');
|
||||
@@ -172,10 +176,11 @@ export const updateEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
SELECT
|
||||
id, email, name, role, is_active as isActive,
|
||||
employee_type as employeeType,
|
||||
is_sufficiently_independent as isSufficientlyIndependent,
|
||||
contract_type as contractType,
|
||||
can_work_alone as canWorkAlone,
|
||||
created_at as createdAt,
|
||||
last_login as lastLogin
|
||||
FROM users
|
||||
FROM employees
|
||||
WHERE id = ?
|
||||
`, [id]);
|
||||
|
||||
@@ -194,7 +199,7 @@ export const deleteEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
// Check if employee exists
|
||||
const existingEmployee = await db.get<any>(`
|
||||
SELECT id, email, name, is_active, role
|
||||
FROM users
|
||||
FROM employees
|
||||
WHERE id = ?
|
||||
`, [id]);
|
||||
|
||||
@@ -211,7 +216,7 @@ export const deleteEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
|
||||
try {
|
||||
// 1. Remove availabilities
|
||||
await db.run('DELETE FROM employee_availabilities WHERE employee_id = ?', [id]);
|
||||
await db.run('DELETE FROM employee_availability WHERE employee_id = ?', [id]);
|
||||
|
||||
// 2. Remove from assigned_shifts (JSON field cleanup)
|
||||
interface AssignedShift {
|
||||
@@ -220,7 +225,7 @@ export const deleteEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
}
|
||||
|
||||
const assignedShifts = await db.all<AssignedShift>(
|
||||
'SELECT id, assigned_employees FROM assigned_shifts WHERE json_extract(assigned_employees, "$") LIKE ?',
|
||||
'SELECT id, assigned_employees FROM scheduled_shifts WHERE json_extract(assigned_employees, "$") LIKE ?',
|
||||
[`%${id}%`]
|
||||
);
|
||||
|
||||
@@ -229,14 +234,13 @@ export const deleteEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
const employeesArray: string[] = JSON.parse(shift.assigned_employees || '[]');
|
||||
const filteredEmployees = employeesArray.filter((empId: string) => empId !== id);
|
||||
await db.run(
|
||||
'UPDATE assigned_shifts SET assigned_employees = ? WHERE id = ?',
|
||||
'UPDATE scheduled_shifts SET assigned_employees = ? WHERE id = ?',
|
||||
[JSON.stringify(filteredEmployees), shift.id]
|
||||
);
|
||||
} catch (parseError) {
|
||||
console.warn(`Could not parse assigned_employees for shift ${shift.id}:`, shift.assigned_employees);
|
||||
// Falls JSON parsing fehlschlägt, setze leeres Array
|
||||
await db.run(
|
||||
'UPDATE assigned_shifts SET assigned_employees = ? WHERE id = ?',
|
||||
'UPDATE scheduled_shifts SET assigned_employees = ? WHERE id = ?',
|
||||
[JSON.stringify([]), shift.id]
|
||||
);
|
||||
}
|
||||
@@ -244,10 +248,9 @@ export const deleteEmployee = async (req: AuthRequest, res: Response): Promise<v
|
||||
|
||||
// 3. Nullify created_by references
|
||||
await db.run('UPDATE shift_plans SET created_by = NULL WHERE created_by = ?', [id]);
|
||||
await db.run('UPDATE shift_templates SET created_by = NULL WHERE created_by = ?', [id]);
|
||||
|
||||
// 4. Finally delete the user
|
||||
await db.run('DELETE FROM users WHERE id = ?', [id]);
|
||||
// 4. Finally delete the employee
|
||||
await db.run('DELETE FROM employees WHERE id = ?', [id]);
|
||||
|
||||
await db.run('COMMIT');
|
||||
console.log('✅ Successfully deleted employee:', existingEmployee.email);
|
||||
@@ -271,25 +274,26 @@ export const getAvailabilities = async (req: AuthRequest, res: Response): Promis
|
||||
const { employeeId } = req.params;
|
||||
|
||||
// Check if employee exists
|
||||
const existingEmployee = await db.get('SELECT id FROM users WHERE id = ?', [employeeId]);
|
||||
const existingEmployee = await db.get('SELECT id FROM employees WHERE id = ?', [employeeId]);
|
||||
if (!existingEmployee) {
|
||||
res.status(404).json({ error: 'Employee not found' });
|
||||
return;
|
||||
}
|
||||
|
||||
const availabilities = await db.all<any>(`
|
||||
SELECT * FROM employee_availabilities
|
||||
SELECT * FROM employee_availability
|
||||
WHERE employee_id = ?
|
||||
ORDER BY day_of_week, start_time
|
||||
ORDER BY day_of_week, time_slot_id
|
||||
`, [employeeId]);
|
||||
|
||||
res.json(availabilities.map(avail => ({
|
||||
id: avail.id,
|
||||
employeeId: avail.employee_id,
|
||||
planId: avail.plan_id,
|
||||
dayOfWeek: avail.day_of_week,
|
||||
startTime: avail.start_time,
|
||||
endTime: avail.end_time,
|
||||
isAvailable: avail.is_available === 1
|
||||
timeSlotId: avail.time_slot_id,
|
||||
preferenceLevel: avail.preference_level,
|
||||
notes: avail.notes
|
||||
})));
|
||||
} catch (error) {
|
||||
console.error('Error fetching availabilities:', error);
|
||||
@@ -300,17 +304,10 @@ export const getAvailabilities = async (req: AuthRequest, res: Response): Promis
|
||||
export const updateAvailabilities = async (req: AuthRequest, res: Response): Promise<void> => {
|
||||
try {
|
||||
const { employeeId } = req.params;
|
||||
const availabilities = req.body as Array<{
|
||||
id?: string;
|
||||
employeeId: string;
|
||||
dayOfWeek: number;
|
||||
startTime: string;
|
||||
endTime: string;
|
||||
isAvailable: boolean;
|
||||
}>;
|
||||
const { planId, availabilities } = req.body;
|
||||
|
||||
// Check if employee exists
|
||||
const existingEmployee = await db.get('SELECT id FROM users WHERE id = ?', [employeeId]);
|
||||
const existingEmployee = await db.get('SELECT id FROM employees WHERE id = ?', [employeeId]);
|
||||
if (!existingEmployee) {
|
||||
res.status(404).json({ error: 'Employee not found' });
|
||||
return;
|
||||
@@ -319,22 +316,23 @@ export const updateAvailabilities = async (req: AuthRequest, res: Response): Pro
|
||||
await db.run('BEGIN TRANSACTION');
|
||||
|
||||
try {
|
||||
// Delete existing availabilities
|
||||
await db.run('DELETE FROM employee_availabilities WHERE employee_id = ?', [employeeId]);
|
||||
// Delete existing availabilities for this plan
|
||||
await db.run('DELETE FROM employee_availability WHERE employee_id = ? AND plan_id = ?', [employeeId, planId]);
|
||||
|
||||
// Insert new availabilities
|
||||
for (const availability of availabilities) {
|
||||
const availabilityId = uuidv4();
|
||||
await db.run(
|
||||
`INSERT INTO employee_availabilities (id, employee_id, day_of_week, start_time, end_time, is_available)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
`INSERT INTO employee_availability (id, employee_id, plan_id, day_of_week, time_slot_id, preference_level, notes)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)`,
|
||||
[
|
||||
availabilityId,
|
||||
employeeId,
|
||||
planId,
|
||||
availability.dayOfWeek,
|
||||
availability.startTime,
|
||||
availability.endTime,
|
||||
availability.isAvailable ? 1 : 0
|
||||
availability.timeSlotId,
|
||||
availability.preferenceLevel,
|
||||
availability.notes || null
|
||||
]
|
||||
);
|
||||
}
|
||||
@@ -343,18 +341,19 @@ export const updateAvailabilities = async (req: AuthRequest, res: Response): Pro
|
||||
|
||||
// Return updated availabilities
|
||||
const updatedAvailabilities = await db.all<any>(`
|
||||
SELECT * FROM employee_availabilities
|
||||
WHERE employee_id = ?
|
||||
ORDER BY day_of_week, start_time
|
||||
`, [employeeId]);
|
||||
SELECT * FROM employee_availability
|
||||
WHERE employee_id = ? AND plan_id = ?
|
||||
ORDER BY day_of_week, time_slot_id
|
||||
`, [employeeId, planId]);
|
||||
|
||||
res.json(updatedAvailabilities.map(avail => ({
|
||||
id: avail.id,
|
||||
employeeId: avail.employee_id,
|
||||
planId: avail.plan_id,
|
||||
dayOfWeek: avail.day_of_week,
|
||||
startTime: avail.start_time,
|
||||
endTime: avail.end_time,
|
||||
isAvailable: avail.is_available === 1
|
||||
timeSlotId: avail.time_slot_id,
|
||||
preferenceLevel: avail.preference_level,
|
||||
notes: avail.notes
|
||||
})));
|
||||
|
||||
} catch (error) {
|
||||
|
||||
@@ -32,7 +32,7 @@ export const setupAdmin = async (req: Request, res: Response): Promise<void> =>
|
||||
try {
|
||||
// Check if admin already exists
|
||||
const adminExists = await db.get<{ 'COUNT(*)': number }>(
|
||||
'SELECT COUNT(*) FROM users WHERE role = ? AND is_active = 1',
|
||||
'SELECT COUNT(*) FROM employees WHERE role = ? AND is_active = 1',
|
||||
['admin']
|
||||
);
|
||||
|
||||
@@ -70,8 +70,8 @@ export const setupAdmin = async (req: Request, res: Response): Promise<void> =>
|
||||
try {
|
||||
// Create admin user
|
||||
await db.run(
|
||||
`INSERT INTO users (id, email, password, name, role, is_active)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
`INSERT INTO employees (id, email, password, name, role, is_active)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[adminId, email, hashedPassword, name, 'admin', 1]
|
||||
);
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ export interface TimeSlot {
|
||||
}
|
||||
|
||||
export interface Shift {
|
||||
timeSlot: any;
|
||||
id: string;
|
||||
planId: string;
|
||||
timeSlotId: string;
|
||||
|
||||
@@ -1,19 +1,24 @@
|
||||
// backend/src/scripts/checkTemplates.ts
|
||||
import { db } from '../services/databaseService.js';
|
||||
import { ShiftPlan } from '../models/ShiftPlan.js';
|
||||
|
||||
async function checkTemplates() {
|
||||
try {
|
||||
const templates = await db.all<ShiftPlan>(
|
||||
`SELECT sp.*, u.name as created_by_name
|
||||
// KORREKTUR: employees statt users verwenden
|
||||
const templates = await db.all<any>(
|
||||
`SELECT sp.*, e.name as created_by_name
|
||||
FROM shift_plans sp
|
||||
LEFT JOIN users u ON sp.created_by = u.id`
|
||||
LEFT JOIN employees e ON sp.created_by = e.id
|
||||
WHERE sp.is_template = 1`
|
||||
);
|
||||
|
||||
console.log('Templates:', templates);
|
||||
|
||||
for (const template of templates) {
|
||||
const shifts = await db.all<any>(
|
||||
`SELECT * FROM template_shifts WHERE template_id = ?`,
|
||||
`SELECT s.*, ts.name as time_slot_name
|
||||
FROM shifts s
|
||||
LEFT JOIN time_slots ts ON s.time_slot_id = ts.id
|
||||
WHERE s.plan_id = ?`,
|
||||
[template.id]
|
||||
);
|
||||
console.log(`Shifts for template ${template.id}:`, shifts);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// backend/src/scripts/setupDefaultTemplate.ts
|
||||
import { v4 as uuidv4 } from 'uuid';
|
||||
import { db } from '../services/databaseService.js';
|
||||
import { DEFAULT_ZEBRA_TIME_SLOTS, TemplateShift } from '../models/ShiftPlan.js';
|
||||
import { DEFAULT_ZEBRA_TIME_SLOTS } from '../models/defaults/shiftPlanDefaults.js';
|
||||
|
||||
interface AdminUser {
|
||||
id: string;
|
||||
@@ -13,9 +13,10 @@ interface AdminUser {
|
||||
*/
|
||||
export async function setupDefaultTemplate(): Promise<void> {
|
||||
try {
|
||||
// Prüfen ob bereits eine Standard-Vorlage existiert
|
||||
// Prüfen ob bereits eine Standard-Vorlage existiert - KORREKTUR: shift_plans verwenden
|
||||
const existingDefault = await db.get(
|
||||
'SELECT * FROM shift_templates WHERE is_default = 1'
|
||||
'SELECT * FROM shift_plans WHERE is_template = 1 AND name = ?',
|
||||
['Standardwoche']
|
||||
);
|
||||
|
||||
if (existingDefault) {
|
||||
@@ -23,9 +24,9 @@ export async function setupDefaultTemplate(): Promise<void> {
|
||||
return;
|
||||
}
|
||||
|
||||
// Admin-Benutzer für die Standard-Vorlage finden
|
||||
// Admin-Benutzer für die Standard-Vorlage finden - KORREKTUR: employees verwenden
|
||||
const adminUser = await db.get<AdminUser>(
|
||||
'SELECT id FROM users WHERE role = ?',
|
||||
'SELECT id FROM employees WHERE role = ?',
|
||||
['admin']
|
||||
);
|
||||
|
||||
@@ -40,70 +41,74 @@ export async function setupDefaultTemplate(): Promise<void> {
|
||||
// Transaktion starten
|
||||
await db.run('BEGIN TRANSACTION');
|
||||
|
||||
const timeSlots = DEFAULT_TIME_SLOTS;
|
||||
|
||||
|
||||
try {
|
||||
// Standard-Vorlage erstellen
|
||||
// Standard-Vorlage erstellen - KORREKTUR: shift_plans verwenden
|
||||
await db.run(
|
||||
`INSERT INTO shift_templates (id, name, description, is_default, created_by)
|
||||
VALUES (?, ?, ?, ?, ?)`,
|
||||
`INSERT INTO shift_plans (id, name, description, is_template, status, created_by)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[
|
||||
templateId,
|
||||
'Standard Wochenplan',
|
||||
'Standardwoche',
|
||||
'Mo-Do: Vormittags- und Nachmittagsschicht, Fr: nur Vormittagsschicht',
|
||||
1,
|
||||
1, // is_template = true
|
||||
'template', // status = 'template'
|
||||
adminUser.id
|
||||
]
|
||||
);
|
||||
|
||||
console.log('Standard-Vorlage erstellt:', templateId);
|
||||
|
||||
// Zeit-Slots erstellen - KORREKTUR: time_slots verwenden
|
||||
const timeSlots = DEFAULT_ZEBRA_TIME_SLOTS.map(slot => ({
|
||||
...slot,
|
||||
id: uuidv4()
|
||||
}));
|
||||
|
||||
for (const slot of timeSlots) {
|
||||
await db.run(
|
||||
`INSERT INTO template_time_slots (id, template_id, name, start_time, end_time)
|
||||
VALUES (?, ?, ?, ?, ?)`,
|
||||
[slot.id, templateId, slot.name, slot.startTime, slot.endTime]
|
||||
`INSERT INTO time_slots (id, plan_id, name, start_time, end_time, description)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[slot.id, templateId, slot.name, slot.startTime, slot.endTime, slot.description]
|
||||
);
|
||||
}
|
||||
|
||||
console.log('✅ Zeit-Slots erstellt');
|
||||
|
||||
// Schichten für Mo-Do
|
||||
// Schichten für Mo-Do - KORREKTUR: shifts verwenden
|
||||
for (let day = 1; day <= 4; day++) {
|
||||
// Vormittagsschicht
|
||||
await db.run(
|
||||
`INSERT INTO template_shifts (id, template_id, day_of_week, time_slot_id, required_employees, color)
|
||||
`INSERT INTO shifts (id, plan_id, day_of_week, time_slot_id, required_employees, color)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[uuidv4(), templateId, day, timeSlots[0].id, 1, '#3498db']
|
||||
[uuidv4(), templateId, day, timeSlots[0].id, 2, '#3498db']
|
||||
);
|
||||
|
||||
// Nachmittagsschicht
|
||||
await db.run(
|
||||
`INSERT INTO template_shifts (id, template_id, day_of_week, time_slot_id, required_employees, color)
|
||||
`INSERT INTO shifts (id, plan_id, day_of_week, time_slot_id, required_employees, color)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[uuidv4(), templateId, day, timeSlots[1].id, 1, '#e74c3c']
|
||||
[uuidv4(), templateId, day, timeSlots[1].id, 2, '#e74c3c']
|
||||
);
|
||||
}
|
||||
|
||||
// Freitag nur Vormittagsschicht
|
||||
await db.run(
|
||||
`INSERT INTO template_shifts (id, template_id, day_of_week, time_slot_id, required_employees, color)
|
||||
`INSERT INTO shifts (id, plan_id, day_of_week, time_slot_id, required_employees, color)
|
||||
VALUES (?, ?, ?, ?, ?, ?)`,
|
||||
[uuidv4(), templateId, 5, timeSlots[0].id, 1, '#3498db']
|
||||
[uuidv4(), templateId, 5, timeSlots[0].id, 2, '#3498db']
|
||||
);
|
||||
|
||||
console.log('✅ Schichten erstellt');
|
||||
|
||||
// In der problematischen Stelle:
|
||||
// In der problematischen Stelle: KORREKTUR: shift_plans verwenden
|
||||
const createdTemplate = await db.get(
|
||||
'SELECT * FROM shift_templates WHERE id = ?',
|
||||
'SELECT * FROM shift_plans WHERE id = ?',
|
||||
[templateId]
|
||||
) as { name: string } | undefined;
|
||||
console.log('📋 Erstellte Vorlage:', createdTemplate?.name);
|
||||
|
||||
const shiftCount = await db.get(
|
||||
'SELECT COUNT(*) as count FROM template_shifts WHERE template_id = ?',
|
||||
'SELECT COUNT(*) as count FROM shifts WHERE plan_id = ?',
|
||||
[templateId]
|
||||
) as { count: number } | undefined;
|
||||
console.log(`📊 Anzahl Schichten: ${shiftCount?.count}`);
|
||||
|
||||
Reference in New Issue
Block a user