mirror of
https://github.com/donpat1to/Schichtenplaner.git
synced 2025-12-01 06:55:45 +01:00
added sorting to time table entries
This commit is contained in:
@@ -9,7 +9,7 @@ import {
|
||||
import { AuthRequest } from '../middleware/auth.js';
|
||||
import { TEMPLATE_PRESETS } from '../models/defaults/shiftPlanDefaults.js';
|
||||
import ExcelJS from 'exceljs';
|
||||
import { chromium } from 'playwright';
|
||||
import { chromium } from 'playwright-chromium';
|
||||
|
||||
async function getPlanWithDetails(planId: string) {
|
||||
const plan = await db.get<any>(`
|
||||
@@ -989,6 +989,20 @@ interface ExportTimetableData {
|
||||
allTimeSlots: ExportTimeSlot[];
|
||||
}
|
||||
|
||||
function sortTimeSlotsByStartTime(timeSlots: any[]): any[] {
|
||||
const timeToMinutes = (timeStr: string) => {
|
||||
if (!timeStr) return 0;
|
||||
const [hours, minutes] = timeStr.split(':').map(Number);
|
||||
return hours * 60 + minutes;
|
||||
};
|
||||
|
||||
return [...timeSlots].sort((a, b) => {
|
||||
const minutesA = timeToMinutes(a.startTime);
|
||||
const minutesB = timeToMinutes(b.startTime);
|
||||
return minutesA - minutesB; // Ascending order (earliest first)
|
||||
});
|
||||
}
|
||||
|
||||
function getTimetableDataForExport(plan: any): ExportTimetableData {
|
||||
const weekdays = [
|
||||
{ id: 1, name: 'Montag' },
|
||||
@@ -1032,9 +1046,16 @@ function getTimetableDataForExport(plan: any): ExportTimetableData {
|
||||
Object.keys(shiftsByDay).forEach(day => {
|
||||
const dayNum = parseInt(day);
|
||||
shiftsByDay[dayNum].sort((a: any, b: any) => {
|
||||
const timeA = a.startTime || '';
|
||||
const timeB = b.startTime || '';
|
||||
return timeA.localeCompare(timeB);
|
||||
// Use numeric comparison for proper time sorting
|
||||
const timeToMinutes = (timeStr: string) => {
|
||||
if (!timeStr) return 0;
|
||||
const [hours, minutes] = timeStr.split(':').map(Number);
|
||||
return hours * 60 + minutes;
|
||||
};
|
||||
|
||||
const minutesA = timeToMinutes(a.startTime);
|
||||
const minutesB = timeToMinutes(b.startTime);
|
||||
return minutesA - minutesB;
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1073,15 +1094,12 @@ function getTimetableDataForExport(plan: any): ExportTimetableData {
|
||||
});
|
||||
});
|
||||
|
||||
// Convert to array and sort by start time
|
||||
const allTimeSlots = Array.from(allTimeSlotsMap.values()).sort((a: ExportTimeSlot, b: ExportTimeSlot) => {
|
||||
return (a.startTime || '').localeCompare(b.startTime || '');
|
||||
});
|
||||
// Convert to array and sort by start time using numeric comparison
|
||||
const allTimeSlots = sortTimeSlotsByStartTime(Array.from(allTimeSlotsMap.values()));
|
||||
|
||||
return { days, allTimeSlots };
|
||||
}
|
||||
|
||||
// Export shift plan to Excel
|
||||
// Export shift plan to Excel
|
||||
export const exportShiftPlanToExcel = async (req: Request, res: Response): Promise<void> => {
|
||||
try {
|
||||
|
||||
@@ -86,7 +86,8 @@ export async function seedTestData(): Promise<void> {
|
||||
console.log('🌱 Starting test data seeding...');
|
||||
|
||||
// Read test.json file - adjust path to be relative to project root
|
||||
const testDataPath = path.resolve(process.cwd(), 'test.json');
|
||||
//const testDataPath = path.resolve(process.cwd(), './test.json');
|
||||
const testDataPath = path.resolve(__dirname, './test.json');
|
||||
|
||||
console.log('🔍 Looking for test.json at:', testDataPath);
|
||||
|
||||
@@ -95,9 +96,10 @@ export async function seedTestData(): Promise<void> {
|
||||
|
||||
// Try alternative paths
|
||||
const alternativePaths = [
|
||||
path.resolve(__dirname, '../../../test.json'),
|
||||
path.resolve(process.cwd(), '../test.json'),
|
||||
path.resolve(__dirname, '../../test.json')
|
||||
//path.resolve(__dirname, '../../../test.json'),
|
||||
//path.resolve(process.cwd(), '../test.json'),
|
||||
//path.resolve(__dirname, '../../test.json'),
|
||||
path.resolve(__dirname, './test.json')
|
||||
];
|
||||
|
||||
for (const altPath of alternativePaths) {
|
||||
@@ -136,7 +138,7 @@ export async function seedTestData(): Promise<void> {
|
||||
|
||||
const [firstname, lastname = ''] = name.split(' ');
|
||||
const email = generateEmail(firstname, lastname || 'Test');
|
||||
const passwordHash = await bcrypt.hash('test1234', 10);
|
||||
const passwordHash = await bcrypt.hash('ZebraAux123!', 10);
|
||||
|
||||
const contractType = mapContractType(testData.employee_info.contract_sizes[name]);
|
||||
const employeeType = testData.employee_info.employee_types[name];
|
||||
|
||||
Reference in New Issue
Block a user