fetch("SELECT * FROM workers WHERE payer_token = :t AND active = 1", ['t' => $token]) : null; if (!$worker) { http_response_code(404); echo 'Link not found.'; exit; } $markPaidError = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST' && ($_POST['action'] ?? '') === 'mark_paid' && isValidDateStr($_POST['week_start'] ?? '')) { $weekStart = $_POST['week_start']; $weekDates = getWeekDates($weekStart); $ph = implode(',', array_fill(0, count($weekDates), '?')); $weekEntries = db()->query("SELECT work_date FROM day_entries WHERE worker_id = ? AND work_date IN ({$ph})", array_merge([$worker['id']], $weekDates))->fetchAll(); $filledDates = array_column($weekEntries, 'work_date'); $missing = array_diff($weekDates, $filledDates); if (!empty($missing)) { $markPaidError = 'Cannot mark paid - ' . count($missing) . ' day(s) still need an entry.'; } else { $existing = db()->fetch("SELECT * FROM week_settlements WHERE worker_id = :wid AND week_start = :w", ['wid' => $worker['id'], 'w' => $weekStart]); if ($existing) { db()->update('week_settlements', ['paid' => 1, 'paid_at' => date('Y-m-d H:i:s')], 'id = :id', ['id' => $existing['id']]); } else { db()->insert('week_settlements', ['worker_id' => $worker['id'], 'week_start' => $weekStart, 'paid' => 1, 'paid_at' => date('Y-m-d H:i:s')]); } header('Location: /p.php?t=' . urlencode($token) . '&week=' . urlencode(nextWeekStart($weekStart))); exit; } } $weekStart = $_GET['week'] ?? ''; $weekStart = isValidDateStr($weekStart) ? $weekStart : currentWeekStart(); $dates = getWeekDates($weekStart); $detail = !empty($_GET['detail']); $placeholders = implode(',', array_fill(0, count($dates), '?')); $entries = db()->query("SELECT * FROM day_entries WHERE worker_id = ? AND work_date IN ({$placeholders})", array_merge([$worker['id']], $dates))->fetchAll(); $entriesByDate = []; foreach ($entries as $en) { $entriesByDate[$en['work_date']] = $en; } $owed = calcOwed($entries); $settlement = db()->fetch("SELECT * FROM week_settlements WHERE worker_id = :wid AND week_start = :w", ['wid' => $worker['id'], 'w' => $weekStart]); $isPaid = $settlement ? (bool) $settlement['paid'] : false; $hasLongReason = false; foreach ($entriesByDate as $en) { if (!empty($en['absence_reason']) && strlen($en['absence_reason']) > 40) $hasLongReason = true; } $pageTitle = 'Week Summary (Payer) - ChuckCo Time Keeper'; require_once __DIR__ . '/includes/header.php'; ?>