Files
espocrm/custom/Espo/Custom/Api/CPuls/AbschliessenFuerTeam.php

91 lines
2.8 KiB
PHP

<?php
namespace Espo\Custom\Api\CPuls;
use Espo\Core\Api\Action;
use Espo\Core\Api\Request;
use Espo\Core\Api\Response;
use Espo\Core\Api\ResponseComposer;
use Espo\Core\Exceptions\BadRequest;
use Espo\Core\Exceptions\Forbidden;
use Espo\Core\Exceptions\NotFound;
use Espo\ORM\EntityManager;
class AbschliessenFuerTeam implements Action
{
public function __construct(
private EntityManager $entityManager
) {}
public function process(Request $request): Response
{
$id = $request->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).'
]);
}
}