Files
fitme3070.pt/views/admin/dashboard.php
T
andreandClaude Sonnet 5 df1aad8769 refactor: move raw SQL out of views into config/functions_db.php
Auditoria 6.3 apontava dashboard.php (2×), user/index.php e
user/profile.php como as únicas vistas com SQL direto, quebrando a
convenção da frota (config/functions_*.php como camada de models). As
quatro passam a chamar db_users_count_clients(), db_users_count_team(),
db_users_list() e db_user_update_profile() — mesmo SQL, mesmos
parâmetros, só movido para onde o resto do código já vai buscar dados.

Nota: views/admin/gyms/{create,edit}.php e views/admin/reviews/index.php
também têm SQL direto, mas não estavam no âmbito dos "3 vistas" da
auditoria (entraram depois, no trabalho de multi-ginásio) — por tratar
numa próxima passagem.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-25 17:06:00 +01:00

134 lines
7.0 KiB
PHP

<?php
require __DIR__ . '/../../config/db.php';
require __DIR__ . '/../../config/functions.php';
$user = require_admin();
// Counts for the dashboard widgets.
$counts = [
'clientes' => db_users_count_clients($pdo),
'equipa' => db_users_count_team($pdo),
'leads_novos' => db_membership_leads_count_new($pdo),
];
$page_title = 'Painel';
include __DIR__ . '/../../includes/header.php';
?>
<div class="container">
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-4">
<h1 class="h3 mb-0">Olá, <?= htmlspecialchars($user['name']) ?></h1>
<span class="text-muted">Painel de administração</span>
</div>
<div class="row g-3 mb-4">
<div class="col-sm-6 col-lg-3">
<div class="card shadow-sm"><div class="card-body">
<div class="text-muted small text-uppercase">Clientes</div>
<div class="display-6"><?= $counts['clientes'] ?></div>
</div></div>
</div>
<div class="col-sm-6 col-lg-3">
<div class="card shadow-sm"><div class="card-body">
<div class="text-muted small text-uppercase">Equipa</div>
<div class="display-6"><?= $counts['equipa'] ?></div>
</div></div>
</div>
</div>
<div class="card shadow-sm mb-4"><div class="card-body">
<h2 class="h5">Gestão de Conteúdos</h2>
<div class="row g-3 mt-1">
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/gyms/index.php') ?>">
<div class="card-body">
<i class="bi bi-buildings-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Ginásios</strong>
<p class="text-muted small mb-0">A editar: <?= htmlspecialchars(admin_gym($pdo)['name']) ?> — criar e gerir ginásios</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/team/index.php') ?>">
<div class="card-body">
<i class="bi bi-people-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Equipa</strong>
<p class="text-muted small mb-0">Gerir treinadores e staff</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/modalidades/index.php') ?>">
<div class="card-body">
<i class="bi bi-grid-3x3-gap-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Modalidades</strong>
<p class="text-muted small mb-0">Gerir aulas e categorias</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/galerias/index.php') ?>">
<div class="card-body">
<i class="bi bi-images fs-3 text-primary mb-2 d-block"></i>
<strong>Galerias</strong>
<p class="text-muted small mb-0">Gerir galerias de fotos</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/work_hours/index.php') ?>">
<div class="card-body">
<i class="bi bi-clock-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Horário de Funcionamento</strong>
<p class="text-muted small mb-0">Horas de abertura</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/horario/index.php') ?>">
<div class="card-body">
<i class="bi bi-calendar-week-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Horário de Aulas</strong>
<p class="text-muted small mb-0">Aulas semanais</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/memberships/index.php') ?>">
<div class="card-body">
<i class="bi bi-credit-card-2-front-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Mensalidades</strong><?php if ($counts['leads_novos']): ?> <span class="badge bg-danger"><?= $counts['leads_novos'] ?> novo<?= $counts['leads_novos'] > 1 ? 's' : '' ?></span><?php endif; ?>
<p class="text-muted small mb-0">Cartões de preço e pedidos de inscrição</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/reviews/index.php') ?>">
<div class="card-body">
<i class="bi bi-star-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Reviews Google</strong>
<p class="text-muted small mb-0">Reviews do Google na página inicial</p>
</div>
</a>
</div>
<div class="col-sm-6 col-lg-4">
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/info/edit.php') ?>">
<div class="card-body">
<i class="bi bi-telephone-fill fs-3 text-primary mb-2 d-block"></i>
<strong>Contactos</strong>
<p class="text-muted small mb-0">Telefone, e-mail, morada e redes sociais</p>
</div>
</a>
</div>
</div>
</div></div>
<div class="card shadow-sm"><div class="card-body">
<h2 class="h5">Acessos rápidos</h2>
<div class="d-flex flex-wrap gap-2 mt-3">
<a class="btn btn-outline-primary" href="<?= base_url('views/user/index.php') ?>"><i class="bi bi-people me-1"></i>Utilizadores</a>
<a class="btn btn-outline-secondary" href="<?= base_url('views/sysadmin/system_settings.php') ?>"><i class="bi bi-sliders me-1"></i>Definições</a>
<a class="btn btn-outline-secondary" href="<?= base_url('/') ?>" target="_blank" rel="noopener"><i class="bi bi-box-arrow-up-right me-1"></i>Site público</a>
</div>
</div></div>
</div>
<?php include __DIR__ . '/../../includes/footer.php'; ?>