feat(backoffice): exportação CSV nas listagens, com audit

Novo helper csv_export() (config/functions.php): CSV Excel-friendly (BOM UTF-8
+ ';') e cada exportação fica no audit_log (RGPD: exportar dados pessoais tem
de ser rastreável). Botão "Exportar CSV" em todas as listagens do backoffice:
equipa, eventos, galerias, ginásios, horário, mensalidades, modalidades,
horário de funcionamento e lixeira (pedidos de inscrição e aulas experimentais
já tinham). Fecha a metade "exportação com permissões e audit" do item 6.9
(a única parte que o relatório considera ganho real à escala atual).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
andreandClaude Fable 5 committed 2026-09-25 23:43:41 +01:00
1 parent 33158381bb
commit 116817e2de
10 files changed
+122 -4

No files matched your search

+13 -1
View File
@@ -17,6 +17,15 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
$gyms = db_gyms_list($pdo, true);
if (isset($_GET['csv'])) {
$rows = [];
foreach ($gyms as $g) {
$rows[] = [$g['name'], $g['locality'] ?? '', $g['slug'] ?? '', $g['deleted_at'] ? 'Apagado' : ($g['is_published'] ? 'Publicado' : 'Não publicado')];
}
csv_export('gym', 'ginasios', 'Exportação CSV de ginásios', ['Ginásio', 'Localidade', 'Slug', 'Estado'], $rows);
}
$editing = admin_gym_id();
$page_title = 'Ginásios';
include __DIR__ . '/../../../includes/header.php';
@@ -24,7 +33,10 @@ include __DIR__ . '/../../../includes/header.php';
<div class="container">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-3">
<h1 class="h3 mb-0">Ginásios</h1>
<a class="btn btn-primary" href="<?= base_url('views/admin/gyms/create.php') ?>"><i class="bi bi-plus-lg me-1"></i>Adicionar ginásio</a>
<div class="d-flex gap-2">
<a class="btn btn-outline-secondary" href="?csv=1"><i class="bi bi-filetype-csv me-1"></i>Exportar CSV</a>
<a class="btn btn-primary" href="<?= base_url('views/admin/gyms/create.php') ?>"><i class="bi bi-plus-lg me-1"></i>Adicionar ginásio</a>
</div>
</div>
<p class="text-muted small">Cada ginásio usa as mesmas secções do site com o seu próprio conteúdo (equipa, modalidades e horário, mensalidades, contactos…). O conteúdo que editas nas outras páginas é o do ginásio escolhido no topo («A editar»).</p>