rework vehicle handling
This commit is contained in:
@@ -560,7 +560,7 @@ class IncidentService {
|
||||
[targetYear]
|
||||
);
|
||||
|
||||
const totals = totalsResult.rows[0];
|
||||
const totals = totalsResult.rows[0] ?? { gesamt: 0, abgeschlossen: 0, aktiv: 0, avg_hilfsfrist_min: null };
|
||||
|
||||
// Monthly breakdown — target year
|
||||
const monthlyResult = await pool.query(
|
||||
@@ -636,21 +636,21 @@ class IncidentService {
|
||||
const haeufigste_art: EinsatzArt | null =
|
||||
byArtResult.rows.length > 0 ? (byArtResult.rows[0].einsatz_art as EinsatzArt) : null;
|
||||
|
||||
const monthly: MonthlyStatRow[] = monthlyResult.rows.map((r) => ({
|
||||
const monthly: MonthlyStatRow[] = (monthlyResult.rows ?? []).map((r) => ({
|
||||
monat: r.monat,
|
||||
anzahl: r.anzahl,
|
||||
avg_hilfsfrist_min: r.avg_hilfsfrist_min !== null ? Number(r.avg_hilfsfrist_min) : null,
|
||||
avg_dauer_min: r.avg_dauer_min !== null ? Number(r.avg_dauer_min) : null,
|
||||
}));
|
||||
|
||||
const prev_year_monthly: MonthlyStatRow[] = prevMonthlyResult.rows.map((r) => ({
|
||||
const prev_year_monthly: MonthlyStatRow[] = (prevMonthlyResult.rows ?? []).map((r) => ({
|
||||
monat: r.monat,
|
||||
anzahl: r.anzahl,
|
||||
avg_hilfsfrist_min: r.avg_hilfsfrist_min !== null ? Number(r.avg_hilfsfrist_min) : null,
|
||||
avg_dauer_min: r.avg_dauer_min !== null ? Number(r.avg_dauer_min) : null,
|
||||
}));
|
||||
|
||||
const by_art: EinsatzArtStatRow[] = byArtResult.rows.map((r) => ({
|
||||
const by_art: EinsatzArtStatRow[] = (byArtResult.rows ?? []).map((r) => ({
|
||||
einsatz_art: r.einsatz_art as EinsatzArt,
|
||||
anzahl: r.anzahl,
|
||||
avg_hilfsfrist_min: r.avg_hilfsfrist_min !== null ? Number(r.avg_hilfsfrist_min) : null,
|
||||
|
||||
@@ -236,6 +236,8 @@ class MemberService {
|
||||
// Attach rank history when the profile exists
|
||||
if (member.profile) {
|
||||
member.dienstgrad_verlauf = await this.getDienstgradVerlauf(userId);
|
||||
} else {
|
||||
member.dienstgrad_verlauf = [];
|
||||
}
|
||||
|
||||
return member;
|
||||
@@ -583,7 +585,15 @@ class MemberService {
|
||||
FROM mitglieder_profile
|
||||
`);
|
||||
|
||||
return result.rows[0] as MemberStats;
|
||||
return (result.rows[0] as MemberStats) ?? {
|
||||
total: 0,
|
||||
aktiv: 0,
|
||||
passiv: 0,
|
||||
ehrenmitglied: 0,
|
||||
jugendfeuerwehr: 0,
|
||||
'anwärter': 0,
|
||||
ausgetreten: 0,
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error('Error fetching member stats', { error });
|
||||
throw new Error('Failed to fetch member stats');
|
||||
|
||||
@@ -373,16 +373,16 @@ class VehicleService {
|
||||
WHERE deleted_at IS NULL
|
||||
`);
|
||||
|
||||
const totals = totalsResult.rows[0];
|
||||
const alerts = alertResult.rows[0];
|
||||
const totals = totalsResult.rows[0] ?? { total: '0', einsatzbereit: '0', ausser_dienst: '0', in_lehrgang: '0' };
|
||||
const alerts = alertResult.rows[0] ?? { inspections_due: '0', inspections_overdue: '0' };
|
||||
|
||||
return {
|
||||
total: parseInt(totals.total, 10),
|
||||
einsatzbereit: parseInt(totals.einsatzbereit, 10),
|
||||
ausserDienst: parseInt(totals.ausser_dienst, 10),
|
||||
inLehrgang: parseInt(totals.in_lehrgang, 10),
|
||||
inspectionsDue: parseInt(alerts.inspections_due, 10),
|
||||
inspectionsOverdue: parseInt(alerts.inspections_overdue, 10),
|
||||
total: parseInt(totals.total ?? '0', 10),
|
||||
einsatzbereit: parseInt(totals.einsatzbereit ?? '0', 10),
|
||||
ausserDienst: parseInt(totals.ausser_dienst ?? '0', 10),
|
||||
inLehrgang: parseInt(totals.in_lehrgang ?? '0', 10),
|
||||
inspectionsDue: parseInt(alerts.inspections_due ?? '0', 10),
|
||||
inspectionsOverdue: parseInt(alerts.inspections_overdue ?? '0', 10),
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error('VehicleService.getVehicleStats failed', { error });
|
||||
|
||||
Reference in New Issue
Block a user