pdo->prepare($sql); $st->execute($args); return array_map([self::class, 'mapRow'], $st->fetchAll()); } public function upsert(array $row): void { $site = $row['site'] ?? null; $sql = 'SELECT control_id FROM move_risk_controls WHERE event_type = ? AND site ' . ($site === null ? 'IS NULL' : '= ?'); $st = $this->pdo->prepare($sql); $st->execute($site === null ? [$row['event_type']] : [$row['event_type'], $site]); $id = $st->fetchColumn(); if ($id !== false) { $up = $this->pdo->prepare( 'UPDATE move_risk_controls SET hazard = ?, control = ?, severity_rating = ?, likelihood_rating = ?, reviewed_by = ?, reviewed_at = ?, updated_at = ? WHERE control_id = ?' ); $up->execute([ $row['hazard'], $row['control'], (int)$row['severity_rating'], (int)$row['likelihood_rating'], $row['reviewed_by'] ?? null, $row['reviewed_at'] ?? null, $row['updated_at'], (int)$id, ]); return; } $ins = $this->pdo->prepare( 'INSERT INTO move_risk_controls (site, event_type, hazard, control, severity_rating, likelihood_rating, reviewed_by, reviewed_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)' ); $ins->execute([ $site, $row['event_type'], $row['hazard'], $row['control'], (int)$row['severity_rating'], (int)$row['likelihood_rating'], $row['reviewed_by'] ?? null, $row['reviewed_at'] ?? null, $row['updated_at'], ]); } public function delete(int $id, ?string $site): bool { $sql = 'DELETE FROM move_risk_controls WHERE control_id = ?'; $args = [$id]; if ($site !== null) { $sql .= ' AND site = ?'; $args[] = $site; } $st = $this->pdo->prepare($sql); $st->execute($args); return $st->rowCount() > 0; } private static function mapRow(array $r): array { return [ 'control_id' => (int)$r['control_id'], 'site' => $r['site'] !== null ? (string)$r['site'] : null, 'event_type' => (string)$r['event_type'], 'hazard' => (string)$r['hazard'], 'control' => (string)$r['control'], 'severity_rating' => (int)$r['severity_rating'], 'likelihood_rating' => (int)$r['likelihood_rating'], 'risk_score' => (int)$r['severity_rating'] * (int)$r['likelihood_rating'], 'reviewed_by' => $r['reviewed_by'] !== null ? (string)$r['reviewed_by'] : null, 'reviewed_at' => $r['reviewed_at'] !== null ? (int)$r['reviewed_at'] : null, 'updated_at' => (int)$r['updated_at'], ]; } }