> */ public static function alle(): array { return Database::fetchAll( 'SELECT * FROM berichtsgruppen WHERE benutzer_id = ? ORDER BY sortierung, name', [Mandant::id()] ); } public static function find(int $id): ?array { $zeile = Database::fetchOne( 'SELECT * FROM berichtsgruppen WHERE id = ? AND benutzer_id = ?', [$id, Mandant::id()] ); return $zeile === false ? null : $zeile; } public static function findeNachName(string $name): ?array { $zeile = Database::fetchOne( 'SELECT * FROM berichtsgruppen WHERE name = ? AND benutzer_id = ?', [trim($name), Mandant::id()] ); return $zeile === false ? null : $zeile; } public static function anlegen(string $name, int $sortierung = 0): int { $name = self::pruefeName($name); if (self::findeNachName($name) !== null) { throw new \RuntimeException('Die Berichtsgruppe „' . $name . '“ gibt es bereits.'); } Database::execute( 'INSERT INTO berichtsgruppen (benutzer_id, name, sortierung) VALUES (?, ?, ?)', [Mandant::id(), $name, $sortierung] ); return Database::lastInsertId(); } public static function findenOderAnlegen(string $name): int { $vorhanden = self::findeNachName($name); return $vorhanden === null ? self::anlegen($name) : (int)$vorhanden['id']; } public static function speichern(int $id, string $name, int $sortierung): void { $name = self::pruefeName($name); $andere = self::findeNachName($name); if ($andere !== null && (int)$andere['id'] !== $id) { throw new \RuntimeException('Die Berichtsgruppe „' . $name . '“ gibt es bereits.'); } Database::execute( 'UPDATE berichtsgruppen SET name = ?, sortierung = ? WHERE id = ? AND benutzer_id = ?', [$name, $sortierung, $id, Mandant::id()] ); } /** * Die Gruppe verschwindet, ihre Berichte bleiben: Der Fremdschlüssel setzt * gruppe_id auf NULL, sie rücken damit unter „Nicht gruppiert“. */ public static function loeschen(int $id): void { Database::execute( 'DELETE FROM berichtsgruppen WHERE id = ? AND benutzer_id = ?', [$id, Mandant::id()] ); } public static function anzahl(): int { return (int)Database::fetchValue( 'SELECT COUNT(*) FROM berichtsgruppen WHERE benutzer_id = ?', [Mandant::id()], 0 ); } private static function pruefeName(string $name): string { $name = trim($name); if ($name === '') { throw new \InvalidArgumentException('Die Berichtsgruppe braucht einen Namen.'); } return mb_substr($name, 0, 120); } }