Verbessere die Berechnung der Arbeitstage, indem die effektive Ereignisfolge für Action-Korrekturen verwendet wird und optimiere die Verarbeitung von Zeiteinträgen.
All checks were successful
Deploy production / deploy (push) Successful in 45s
All checks were successful
Deploy production / deploy (push) Successful in 45s
This commit is contained in:
@@ -1052,10 +1052,27 @@ class TimeEntryService {
|
|||||||
ORDER BY DATE(COALESCE(w1_fix.fix_date_time, w1.tstamp))
|
ORDER BY DATE(COALESCE(w1_fix.fix_date_time, w1.tstamp))
|
||||||
`;
|
`;
|
||||||
|
|
||||||
const workDays = await sequelize.query(query, {
|
// Die SQL-Abfrage oben kann nur originale `state`-/`relatedTo`-Paare
|
||||||
replacements: [userId, endDateStr],
|
// erkennen. Bei Action-Korrekturen fehlen dadurch ganze Arbeitstage in
|
||||||
type: sequelize.QueryTypes.SELECT
|
// der Gesamtstatistik. Verwende dieselbe effektive Ereignisfolge wie
|
||||||
});
|
// Timer und Wochenansicht.
|
||||||
|
const netMinutesByDate = new Map();
|
||||||
|
this._buildEffectiveWorkBlocks(await this._getEffectiveEntries(userId))
|
||||||
|
.filter(block => block.end)
|
||||||
|
.forEach(block => {
|
||||||
|
const start = new Date(block.start.effectiveTime);
|
||||||
|
const date = `${start.getFullYear()}-${String(start.getMonth() + 1).padStart(2, '0')}-${String(start.getDate()).padStart(2, '0')}`;
|
||||||
|
const day = start.getDay();
|
||||||
|
if (date > endDateStr || day === 0 || day === 6) return;
|
||||||
|
const pauses = block.pauses.reduce((sum, pause) => sum +
|
||||||
|
new Date(pause.end.effectiveTime).getTime() - new Date(pause.start.effectiveTime).getTime(), 0);
|
||||||
|
const minutes = Math.round((new Date(block.end.effectiveTime).getTime() - start.getTime() - pauses) / 60000);
|
||||||
|
netMinutesByDate.set(date, (netMinutesByDate.get(date) || 0) + minutes);
|
||||||
|
});
|
||||||
|
const workDays = [...netMinutesByDate.entries()].map(([work_date, minutes]) => ({
|
||||||
|
work_date,
|
||||||
|
net_hours: minutes / 60
|
||||||
|
}));
|
||||||
|
|
||||||
// Hole User-Bundesland
|
// Hole User-Bundesland
|
||||||
const { State: StateModel } = database.getModels();
|
const { State: StateModel } = database.getModels();
|
||||||
@@ -1285,7 +1302,17 @@ class TimeEntryService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const effectiveEntries = [...allEntries]
|
const effectiveEntries = [...allEntries]
|
||||||
.map(entry => ({ ...entry, effectiveAction: getAction(entry), effectiveTime: getEffectiveTime(entry) }))
|
// findByDateRange liefert Sequelize-Instanzen. Ein Spread würde deren
|
||||||
|
// Modellattribute (id, tstamp, state) nicht übernehmen und damit alle
|
||||||
|
// Blöcke aus der Wochenansicht verschwinden lassen.
|
||||||
|
.map(entry => ({
|
||||||
|
id: entry.id,
|
||||||
|
tstamp: entry.tstamp,
|
||||||
|
state: entry.state,
|
||||||
|
relatedTo_id: entry.relatedTo_id,
|
||||||
|
effectiveAction: getAction(entry),
|
||||||
|
effectiveTime: getEffectiveTime(entry)
|
||||||
|
}))
|
||||||
.sort((a, b) => new Date(a.effectiveTime) - new Date(b.effectiveTime) || a.id - b.id);
|
.sort((a, b) => new Date(a.effectiveTime) - new Date(b.effectiveTime) || a.id - b.id);
|
||||||
const pairs = this._buildEffectiveWorkBlocks(effectiveEntries).map(block => ({
|
const pairs = this._buildEffectiveWorkBlocks(effectiveEntries).map(block => ({
|
||||||
id: block.start.id,
|
id: block.start.id,
|
||||||
|
|||||||
Reference in New Issue
Block a user