Refine today's timesheet handling — skip in-progress shifts
fetchTimesheetShifts: filter out today's shifts with no finish time (still clocked in), so only completed shifts contribute hours. runTimesheetSync: if today's row has no completed shifts at all, skip writing it — leaves rota schedule data in place rather than overwriting with an empty timesheet row while staff are still working. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
c19460ecb3
commit
e3c8f143ef
2 changed files with 14 additions and 1 deletions
|
|
@ -105,7 +105,14 @@ export async function runTimesheetSync(from, to) {
|
||||||
const day = new Date(fromDate)
|
const day = new Date(fromDate)
|
||||||
while (day <= toDate) {
|
while (day <= toDate) {
|
||||||
const d = fmtDate(day)
|
const d = fmtDate(day)
|
||||||
dailyRows.push({ date: d, staff: byDate[d] || [], source: 'timesheet' })
|
const staffForDate = byDate[d] || []
|
||||||
|
// For today: only write a timesheet row if at least one shift has clocked out.
|
||||||
|
// An empty row would overwrite rota data with nothing while staff are still working.
|
||||||
|
if (d === today && staffForDate.length === 0) {
|
||||||
|
day.setDate(day.getDate() + 1)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
dailyRows.push({ date: d, staff: staffForDate, source: 'timesheet' })
|
||||||
day.setDate(day.getDate() + 1)
|
day.setDate(day.getDate() + 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -85,11 +85,17 @@ export async function fetchTimesheetShifts(from, to, deptIds) {
|
||||||
|
|
||||||
const filtered = shifts.filter(s => deptIds.includes(String(s.department_id)))
|
const filtered = shifts.filter(s => deptIds.includes(String(s.department_id)))
|
||||||
|
|
||||||
|
const todayISO = new Date().toLocaleDateString('en-CA', { timeZone: 'Europe/London' })
|
||||||
|
|
||||||
const byUser = {}
|
const byUser = {}
|
||||||
for (const s of filtered) {
|
for (const s of filtered) {
|
||||||
const uid = String(s.user_id)
|
const uid = String(s.user_id)
|
||||||
if (!nameMap[uid]) continue
|
if (!nameMap[uid]) continue
|
||||||
const date = s.date // already 'YYYY-MM-DD'
|
const date = s.date // already 'YYYY-MM-DD'
|
||||||
|
|
||||||
|
// Skip today's shifts with no finish time — still clocked in, hours unknown
|
||||||
|
if (date === todayISO && !s.finish) continue
|
||||||
|
|
||||||
const hrs = (s.finish && s.start)
|
const hrs = (s.finish && s.start)
|
||||||
? Math.max(0, (s.finish - s.start) / 3600 - (s.break_length || 0) / 60)
|
? Math.max(0, (s.finish - s.start) / 3600 - (s.break_length || 0) / 60)
|
||||||
: 0
|
: 0
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue