calendar and vehicle booking rework

This commit is contained in:
Matthias Hochmeister
2026-03-25 15:44:11 +01:00
parent e49639e2a6
commit 74d978171c
12 changed files with 1413 additions and 1835 deletions

View File

@@ -0,0 +1,105 @@
// =============================================================================
// BuchungsKategorie (Booking Category) Service
// =============================================================================
import pool from '../config/database';
import logger from '../utils/logger';
interface CreateKategorieData {
bezeichnung: string;
farbe?: string;
sort_order?: number;
}
interface UpdateKategorieData {
bezeichnung?: string;
farbe?: string;
aktiv?: boolean;
sort_order?: number;
}
async function getAll() {
try {
const result = await pool.query(
`SELECT * FROM buchungs_kategorien ORDER BY sort_order, bezeichnung`
);
return result.rows;
} catch (error) {
logger.error('BuchungsKategorieService.getAll failed', { error });
throw new Error('Buchungskategorien konnten nicht geladen werden');
}
}
async function getActive() {
try {
const result = await pool.query(
`SELECT * FROM buchungs_kategorien WHERE aktiv = TRUE ORDER BY sort_order, bezeichnung`
);
return result.rows;
} catch (error) {
logger.error('BuchungsKategorieService.getActive failed', { error });
throw new Error('Buchungskategorien konnten nicht geladen werden');
}
}
async function create(data: CreateKategorieData) {
try {
const result = await pool.query(
`INSERT INTO buchungs_kategorien (bezeichnung, farbe, sort_order)
VALUES ($1, $2, $3)
RETURNING *`,
[data.bezeichnung, data.farbe || '#607D8B', data.sort_order || 0]
);
return result.rows[0];
} catch (error) {
logger.error('BuchungsKategorieService.create failed', { error });
throw new Error('Buchungskategorie konnte nicht erstellt werden');
}
}
async function update(id: number, data: UpdateKategorieData) {
try {
const result = await pool.query(
`UPDATE buchungs_kategorien
SET bezeichnung = COALESCE($1, bezeichnung),
farbe = COALESCE($2, farbe),
aktiv = COALESCE($3, aktiv),
sort_order = COALESCE($4, sort_order)
WHERE id = $5
RETURNING *`,
[data.bezeichnung, data.farbe, data.aktiv, data.sort_order, id]
);
return result.rows[0] || null;
} catch (error) {
logger.error('BuchungsKategorieService.update failed', { error, id });
throw new Error('Buchungskategorie konnte nicht aktualisiert werden');
}
}
async function deactivate(id: number) {
try {
const result = await pool.query(
`UPDATE buchungs_kategorien SET aktiv = FALSE WHERE id = $1 RETURNING *`,
[id]
);
return result.rows[0] || null;
} catch (error) {
logger.error('BuchungsKategorieService.deactivate failed', { error, id });
throw new Error('Buchungskategorie konnte nicht deaktiviert werden');
}
}
async function remove(id: number) {
try {
const result = await pool.query(
`DELETE FROM buchungs_kategorien WHERE id = $1 RETURNING *`,
[id]
);
return result.rows[0] || null;
} catch (error) {
logger.error('BuchungsKategorieService.remove failed', { error, id });
throw new Error('Buchungskategorie konnte nicht gelöscht werden');
}
}
export default { getAll, getActive, create, update, deactivate, remove };