getRouteParam('id'); if (!$id) { throw new BadRequest('ID fehlt.'); } $puls = $this->entityManager->getEntityById('CPuls', $id); if (!$puls) { throw new NotFound('Puls nicht gefunden.'); } // Prüfe, ob bereits finalisiert if ($puls->get('status') === 'Finalisiert') { throw new Forbidden('Puls wurde bereits finalisiert.'); } // Prüfe syncStatus if ($puls->get('syncStatus') === 'unclean') { throw new BadRequest('Neue Dokumente vorhanden. Bitte warten Sie auf die KI-Analyse.'); } // Hole aktuelle Team-ID des Benutzers $user = $this->entityManager->getEntityById('User', $request->getServerParam('ESPO_USER_ID')); if (!$user) { throw new Forbidden('Benutzer nicht gefunden.'); } $teamIds = $user->getLinkMultipleIdList('teams'); if (empty($teamIds)) { throw new Forbidden('Sie sind keinem Team zugeordnet.'); } // Finde Zuordnung für erstes Team des Benutzers $zuordnung = $this->entityManager->getRDBRepositoryByClass('CPulsTeamZuordnung') ->where([ 'pulsId' => $id, 'teamId' => $teamIds, 'aktiv' => true ]) ->findOne(); if (!$zuordnung) { throw new Forbidden('Sie sind diesem Puls nicht zugeordnet oder nicht aktiv.'); } // Markiere Zuordnung als abgeschlossen $zuordnung->set([ 'abgeschlossen' => true, 'abgeschlossenAm' => date('Y-m-d H:i:s'), 'abgeschlossenVon' => $user->getId() ]); $this->entityManager->saveEntity($zuordnung); // FIRST-READ-CLOSES: Finalisiere den Puls sofort $puls->set([ 'status' => 'Finalisiert', 'finalisiertAm' => date('Y-m-d H:i:s'), 'finalisiertVon' => $user->getId() ]); $this->entityManager->saveEntity($puls); $GLOBALS['log']->info("Puls {$id} durch Team {$zuordnung->get('teamId')} finalisiert (First-Read-Closes)."); return ResponseComposer::json([ 'success' => true, 'finalized' => true, 'message' => 'Puls wurde finalisiert (First-Read-Closes).' ]); } }