0) { $where = 'h.job_id = ?'; $params[] = $job_filter; } $sql = " SELECT h.*, j.job AS job_label, j.description AS job_description, v.slug AS vendor_slug, v.name AS vendor_name FROM job_history h LEFT JOIN jobs j ON j.id = h.job_id LEFT JOIN vendors v ON v.id = j.vendor_id WHERE $where ORDER BY h.id DESC LIMIT $limit "; $stmt = db()->prepare($sql); $stmt->execute($params); $rows = $stmt->fetchAll(); function fmt_long_date(?string $ts): string { if (!$ts) return ''; try { $dt = new DateTimeImmutable($ts . ' UTC'); return $dt->setTimezone(new DateTimeZone(date_default_timezone_get())) ->format('Y-m-d g:i a'); } catch (Exception $e) { return h($ts); } } function fmt_event(array $h): string { $f = $h['field']; $old = $h['old_value']; $new = $h['new_value']; if ($f === 'created') { return 'Created (vendor: ' . h((string) $new) . ')'; } if ($f === 'partial_ship') { return 'Partial ship: split off ' . h((string) $new) . ' (was qty ' . h((string) $old) . ')'; } $labels = [ 'ack' => 'Acknowledgement', 'status' => 'Status', 'job' => 'Job #', 'material' => 'Material', 'description' => 'Description', 'qty' => 'Qty', 'due_date' => 'Due date', ]; $label = $labels[$f] ?? $f; $oldDisp = ($old === null || $old === '') ? '∅' : h((string) $old); $newDisp = ($new === null || $new === '') ? '∅' : h((string) $new); return $label . ': ' . $oldDisp . ' → ' . $newDisp; } ?> Activity Log

Activity Log

← Back to schedule
0): ?>

Showing events for job #. Show everything →

Latest events. Click a job number to filter.

When Who Job Description Event
No events recorded.
—' : h($desc) ?>