Initial commit: Ressourcenplanung-App

Vue 3 + Vite Frontend und Node/Express + SQLite Backend für
Projekt-, Aufgaben-, Mitarbeiter- und Teamverwaltung inkl.
Gantt-Zeitplan und Auslastungs-Heatmap.
This commit is contained in:
2026-07-03 22:45:07 +02:00
commit fc25eff643
24 changed files with 3938 additions and 0 deletions
+56
View File
@@ -0,0 +1,56 @@
async function request(method, url, body) {
const res = await fetch(url, {
method,
headers: body ? { 'Content-Type': 'application/json' } : undefined,
body: body ? JSON.stringify(body) : undefined,
});
if (!res.ok) {
const text = await res.text().catch(() => '');
throw new Error(`${method} ${url} fehlgeschlagen: ${res.status} ${text}`);
}
if (res.status === 204) return null;
return res.json();
}
export const api = {
// employees
getEmployees: () => request('GET', '/api/employees'),
createEmployee: (data) => request('POST', '/api/employees', data),
updateEmployee: (id, data) => request('PUT', `/api/employees/${id}`, data),
deleteEmployee: (id) => request('DELETE', `/api/employees/${id}`),
// teams
getTeams: () => request('GET', '/api/teams'),
createTeam: (data) => request('POST', '/api/teams', data),
updateTeam: (id, data) => request('PUT', `/api/teams/${id}`, data),
deleteTeam: (id) => request('DELETE', `/api/teams/${id}`),
addTeamMember: (teamId, employeeId) =>
request('POST', `/api/teams/${teamId}/members`, { employee_id: employeeId }),
removeTeamMember: (teamId, employeeId) =>
request('DELETE', `/api/teams/${teamId}/members/${employeeId}`),
// projects & tasks
getProjects: () => request('GET', '/api/projects'),
createProject: (data) => request('POST', '/api/projects', data),
updateProject: (id, data) => request('PUT', `/api/projects/${id}`, data),
deleteProject: (id) => request('DELETE', `/api/projects/${id}`),
createTask: (data) => request('POST', '/api/tasks', data),
updateTask: (id, data) => request('PUT', `/api/tasks/${id}`, data),
deleteTask: (id) => request('DELETE', `/api/tasks/${id}`),
addDependency: (taskId, dependsOnId) =>
request('POST', `/api/tasks/${taskId}/dependencies`, { depends_on_task_id: dependsOnId }),
removeDependency: (taskId, dependsOnId) =>
request('DELETE', `/api/tasks/${taskId}/dependencies/${dependsOnId}`),
// assignments
createAssignment: (data) => request('POST', '/api/assignments', data),
updateAssignment: (id, data) => request('PUT', `/api/assignments/${id}`, data),
deleteAssignment: (id) => request('DELETE', `/api/assignments/${id}`),
// utilization
getUtilization: (params = {}) => {
const qs = new URLSearchParams(params).toString();
return request('GET', `/api/utilization${qs ? `?${qs}` : ''}`);
},
};