Files
kapteins-daagbok/client/src/utils/logEntryTankLevels.ts
T
elpatron affe745250 feat: Tankstände vom Vortag bei neuem Reisetag mit Bestätigung übernehmen.
Abendstände werden als Morgenstände vorgeschlagen; der Nutzer kann übernehmen oder mit 0 starten.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-29 16:10:01 +02:00

65 lines
2.1 KiB
TypeScript

export interface TankLevels {
morning: number
refilled: number
evening: number
consumption: number
}
export interface TravelDaySortable {
date?: string
dayOfTravel?: string | number
}
/** Chronological order: date ascending, then day of travel ascending. */
export function compareTravelDaysChronological(a: TravelDaySortable, b: TravelDaySortable): number {
const dateCompare = new Date(a.date || 0).getTime() - new Date(b.date || 0).getTime()
if (dateCompare !== 0) return dateCompare
return Number(a.dayOfTravel || 0) - Number(b.dayOfTravel || 0)
}
export function getNextTravelDayNumber(entries: TravelDaySortable[]): string {
const maxDay = entries.reduce((max, entry) => Math.max(max, Number(entry.dayOfTravel) || 0), 0)
return String(maxDay + 1)
}
/** Closing level at end of travel day: evening stand, else calculated balance, else morning. */
export function getClosingTankLevel(tank?: Partial<TankLevels> | null): number {
if (!tank) return 0
const evening = Number(tank.evening) || 0
if (evening > 0) return evening
const morning = Number(tank.morning) || 0
const refilled = Number(tank.refilled) || 0
const consumption = Number(tank.consumption) || 0
const fromBalance = morning + refilled - consumption
if (fromBalance > 0) return fromBalance
return morning
}
export interface LogEntryTankSource {
freshwater?: Partial<TankLevels>
fuel?: Partial<TankLevels>
}
export function emptyTankLevels(morning = 0): TankLevels {
return { morning, refilled: 0, evening: 0, consumption: 0 }
}
export function formatTankLiters(liters: number): string {
if (!Number.isFinite(liters) || liters <= 0) return '0'
return Number.isInteger(liters) ? String(liters) : liters.toFixed(1)
}
export function carryOverTankLevelsFromPreviousDay(previousEntry?: LogEntryTankSource | null): { freshwater: TankLevels; fuel: TankLevels } {
if (!previousEntry) {
return { freshwater: emptyTankLevels(), fuel: emptyTankLevels() }
}
return {
freshwater: emptyTankLevels(getClosingTankLevel(previousEntry.freshwater)),
fuel: emptyTankLevels(getClosingTankLevel(previousEntry.fuel))
}
}