feat: feedback export to excel

addresses #869dv9k9z
This commit is contained in:
2026-09-01 10:20:31 +02:00
parent 2f747fc22f
commit 496a707a16
7 changed files with 835 additions and 79 deletions
@@ -0,0 +1,69 @@
<?php
namespace App\Controller\Administrative\Feedback;
use App\Repository\FeedbackRepository;
use App\Service\Common\FeedbackFilterHandler;
use App\Service\Export\FeedbackExporter;
use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\HeaderUtils;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Attribute\IsGranted;
class ExportController extends AbstractController
{
public function __construct(
private readonly FeedbackFilterHandler $filterHandler,
private readonly FeedbackRepository $feedbackRepository,
private readonly FeedbackExporter $feedbackExporter,
private readonly LoggerInterface $logger,
) {
}
#[Route('/administrative/feedback/export', name: 'app_administrative_feedback_export')]
#[IsGranted('ROLE_ADMINISTRATIVE')]
public function index(): Response
{
$filterDto = $this->filterHandler->getFilterSettings();
$feedback = $this
->feedbackRepository
->getExportQuery($filterDto)
->getResult()
;
if (0 === count($feedback)) {
$this->addFlash('error', 'Keine Daten für den Export vorhanden');
return $this->redirectToRoute('app_administrative_feedback_index');
}
$spreadsheet = $this->feedbackExporter->export($feedback);
$filename = sprintf('feedback-export_%s.xlsx', date('YmdHi'));
$response = new StreamedResponse(static function () use ($spreadsheet): void {
(new Xlsx($spreadsheet))->save('php://output');
});
$response->headers->set(
'Content-Type',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
);
$response->headers->set(
'Content-Disposition',
HeaderUtils::makeDisposition(HeaderUtils::DISPOSITION_ATTACHMENT, $filename, md5($filename))
);
$this->logger->info('Export feedback', [
'count' => count($feedback),
'filter_active' => $filterDto->isActive(),
]);
return $response;
}
}