Add "not working" day option with UI updates and logic adjustments for overtime calculations
This commit is contained in:
1 parent
17936615e2
commit
3cb3306a79
1 file changed
+60
-11
+60
-11
@@ -10,6 +10,7 @@ interface DayRecord {
|
|||||||
breakMins: number;
|
breakMins: number;
|
||||||
workedHrs: number;
|
workedHrs: number;
|
||||||
overtimeMinutes: number;
|
overtimeMinutes: number;
|
||||||
|
notWorking?: boolean;
|
||||||
}
|
}
|
||||||
|
|
||||||
type Records = Partial<Record<Workday, DayRecord>>;
|
type Records = Partial<Record<Workday, DayRecord>>;
|
||||||
@@ -17,7 +18,7 @@ type Records = Partial<Record<Workday, DayRecord>>;
|
|||||||
const STORAGE_KEY = 'workTrackerRecords';
|
const STORAGE_KEY = 'workTrackerRecords';
|
||||||
const CARRYOVER_KEY = 'workTrackerCarryover';
|
const CARRYOVER_KEY = 'workTrackerCarryover';
|
||||||
|
|
||||||
const DEFAULT_RECORD: DayRecord = { start: '', end: '', breakMins: 0, workedHrs: 0, overtimeMinutes: 0 };
|
const DEFAULT_RECORD: DayRecord = { start: '', end: '', breakMins: 0, workedHrs: 0, overtimeMinutes: 0, notWorking: false };
|
||||||
|
|
||||||
const WEEKDAYS: Workday[] = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag'];
|
const WEEKDAYS: Workday[] = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag'];
|
||||||
|
|
||||||
@@ -81,11 +82,16 @@ function App() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getWeeklyBalance = () => {
|
const getWeeklyBalance = () => {
|
||||||
const days: Workday[] = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag'];
|
const days: Workday[] = ['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag'];
|
||||||
return days.reduce((sum, day) => sum + (records[day]?.overtimeMinutes ?? 0), 0) + carryoverMinutes;
|
return days.reduce((sum, day) => {
|
||||||
|
const r = records[day];
|
||||||
|
if (!r || r.notWorking) return sum;
|
||||||
|
return sum + (r.overtimeMinutes ?? 0);
|
||||||
|
}, 0) + carryoverMinutes;
|
||||||
}
|
}
|
||||||
|
|
||||||
const getWorkEndTime = () => {
|
const getWorkEndTime = () => {
|
||||||
|
if (record.notWorking) return '-';
|
||||||
const start = toMinutes(record.start);
|
const start = toMinutes(record.start);
|
||||||
if (start === null) return '-';
|
if (start === null) return '-';
|
||||||
const balance = selectedDay === 'Freitag' ? getWeeklyBalance() : 0;
|
const balance = selectedDay === 'Freitag' ? getWeeklyBalance() : 0;
|
||||||
@@ -93,16 +99,25 @@ function App() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const handleSave = () => {
|
const handleSave = () => {
|
||||||
|
if (record.notWorking) {
|
||||||
|
updateRecord({ workedHrs: 0, overtimeMinutes: 0 });
|
||||||
|
return;
|
||||||
|
}
|
||||||
const hours = getHourDiff();
|
const hours = getHourDiff();
|
||||||
updateRecord({ workedHrs: hours, overtimeMinutes: Math.round((hours - 8) * 60) });
|
updateRecord({ workedHrs: hours, overtimeMinutes: Math.round((hours - 8) * 60) });
|
||||||
}
|
}
|
||||||
|
|
||||||
const handleResetWorkdays = () => {
|
const handleResetWorkdays = () => {
|
||||||
const totalOvertime = WEEKDAYS.reduce((sum, day) => sum + (records[day]?.overtimeMinutes ?? 0), 0) + carryoverMinutes;
|
const totalOvertime = WEEKDAYS.reduce((sum, day) => {
|
||||||
|
const r = records[day];
|
||||||
|
if (!r || r.notWorking) return sum;
|
||||||
|
return sum + (r.overtimeMinutes ?? 0);
|
||||||
|
}, 0) + carryoverMinutes;
|
||||||
setCarryoverMinutes(totalOvertime);
|
setCarryoverMinutes(totalOvertime);
|
||||||
setRecords({});
|
setRecords({});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const handleResetOvertime = () => {
|
const handleResetOvertime = () => {
|
||||||
setCarryoverMinutes(0);
|
setCarryoverMinutes(0);
|
||||||
}
|
}
|
||||||
@@ -111,16 +126,42 @@ function App() {
|
|||||||
<Center className={"my-auto"}>
|
<Center className={"my-auto"}>
|
||||||
<Stack>
|
<Stack>
|
||||||
<SegmentedControl
|
<SegmentedControl
|
||||||
data={['Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag']}
|
data={WEEKDAYS.map((day) => ({
|
||||||
|
value: day,
|
||||||
|
label: (
|
||||||
|
<span
|
||||||
|
style={records[day]?.notWorking ? { color: 'var(--mantine-color-grape-4)' } : undefined}
|
||||||
|
>
|
||||||
|
{day}
|
||||||
|
</span>
|
||||||
|
),
|
||||||
|
}))}
|
||||||
|
value={selectedDay}
|
||||||
onChange={(value) => setSelectedDay(value as Workday)}
|
onChange={(value) => setSelectedDay(value as Workday)}
|
||||||
className={"mt-2"}
|
className={"mt-2"}
|
||||||
/>
|
/>
|
||||||
|
<Button
|
||||||
|
variant={"outline"}
|
||||||
|
color={record.notWorking ? "grape" : "gray"}
|
||||||
|
onClick={() => {
|
||||||
|
const nowWorking = !record.notWorking;
|
||||||
|
if (nowWorking) {
|
||||||
|
updateRecord({ notWorking: true, start: '', end: '', breakMins: 0, workedHrs: 0, overtimeMinutes: 0 });
|
||||||
|
} else {
|
||||||
|
updateRecord({ notWorking: false });
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
fullWidth
|
||||||
|
>
|
||||||
|
{record.notWorking ? "✓ Als Arbeitstag markieren" : "Nicht gearbeitet"}
|
||||||
|
</Button>
|
||||||
<TimePicker
|
<TimePicker
|
||||||
value={record.start}
|
value={record.start}
|
||||||
label={"Arbeitsbeginn"}
|
label={"Arbeitsbeginn"}
|
||||||
onChange={(value) => updateRecord({ start: value })}
|
onChange={(value) => updateRecord({ start: value })}
|
||||||
format="24h"
|
format="24h"
|
||||||
clearable
|
clearable
|
||||||
|
disabled={record.notWorking}
|
||||||
/>
|
/>
|
||||||
<TimePicker
|
<TimePicker
|
||||||
value={record.end}
|
value={record.end}
|
||||||
@@ -128,6 +169,7 @@ function App() {
|
|||||||
onChange={(value) => updateRecord({ end: value })}
|
onChange={(value) => updateRecord({ end: value })}
|
||||||
format="24h"
|
format="24h"
|
||||||
clearable
|
clearable
|
||||||
|
disabled={record.notWorking}
|
||||||
/>
|
/>
|
||||||
<NumberInput
|
<NumberInput
|
||||||
label={"Pause in Minuten"}
|
label={"Pause in Minuten"}
|
||||||
@@ -136,27 +178,34 @@ function App() {
|
|||||||
onKeyDown={(event) => {
|
onKeyDown={(event) => {
|
||||||
if (event.key === 'Enter') handleSave();
|
if (event.key === 'Enter') handleSave();
|
||||||
}}
|
}}
|
||||||
|
disabled={record.notWorking}
|
||||||
/>
|
/>
|
||||||
|
|
||||||
<Button onClick={handleSave}>
|
<Button onClick={handleSave} disabled={record.notWorking}>
|
||||||
Berechnen + Speichern
|
Berechnen + Speichern
|
||||||
</Button>
|
</Button>
|
||||||
|
|
||||||
<Text>Gearbeitete Stunden heute: {record.workedHrs.toFixed(2)}</Text>
|
{record.notWorking ? (
|
||||||
|
<Text c={"grape"}>Heute nicht gearbeitet</Text>
|
||||||
|
) : (
|
||||||
|
<Text>Gearbeitete Stunden heute: {record.workedHrs.toFixed(2)}</Text>
|
||||||
|
)}
|
||||||
{carryoverMinutes !== 0 && (
|
{carryoverMinutes !== 0 && (
|
||||||
<Text c={"blue"}>Übernommene Überstunden aus Vorwoche: {carryoverMinutes} Minuten</Text>
|
<Text c={"blue"}>Übernommene Überstunden aus Vorwoche: {carryoverMinutes} Minuten</Text>
|
||||||
)}
|
)}
|
||||||
{selectedDay === 'Freitag' && (
|
{selectedDay === 'Freitag' && (
|
||||||
<Text c={"green"}>Übertragen aus Montag bis Donnerstag (inkl. Vorwoche): {getWeeklyBalance()} Minuten</Text>
|
<Text c={"green"}>Übertragen aus Montag bis Donnerstag (inkl. Vorwoche): {getWeeklyBalance()} Minuten</Text>
|
||||||
)}
|
)}
|
||||||
<Text>Wann du gehen kannst für 8 Stunden: {getWorkEndTime()}</Text>
|
{!record.notWorking && (
|
||||||
{record.start && record.end && record.overtimeMinutes === 0 && (
|
<Text>Wann du gehen kannst für 8 Stunden: {getWorkEndTime()}</Text>
|
||||||
|
)}
|
||||||
|
{!record.notWorking && record.start && record.end && record.overtimeMinutes === 0 && (
|
||||||
<Text>Du hast genau 8 Stunden gearbeitet.</Text>
|
<Text>Du hast genau 8 Stunden gearbeitet.</Text>
|
||||||
)}
|
)}
|
||||||
{record.start && record.end && record.overtimeMinutes > 0 && (
|
{!record.notWorking && record.start && record.end && record.overtimeMinutes > 0 && (
|
||||||
<Text c="yellow">Überstunden: {record.overtimeMinutes} Minuten</Text>
|
<Text c="yellow">Überstunden: {record.overtimeMinutes} Minuten</Text>
|
||||||
)}
|
)}
|
||||||
{record.start && record.end && record.overtimeMinutes < 0 && (
|
{!record.notWorking && record.start && record.end && record.overtimeMinutes < 0 && (
|
||||||
<Text c={"red"}>Fehlende Minuten für 8 Stunden: {-record.overtimeMinutes} Minuten</Text>
|
<Text c={"red"}>Fehlende Minuten für 8 Stunden: {-record.overtimeMinutes} Minuten</Text>
|
||||||
)}
|
)}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user