- Contactos: nova página no backoffice (fitme3070_info) e 964 201 137 como telefone principal; o telefone secundário só aparece quando existe. - Equipa: título, aptidões/funções e formações; o cartão mostra foto, nome e título e abre um cartão horizontal de detalhe (hover no desktop, toque no telemóvel) sem mexer na grelha. - Mensalidades: cartões editáveis com um destaque, modal de inscrição que guarda o pedido (RGPD + estado + campos reservados para o CRM) e avisa o ginásio por e-mail; lista de pedidos com estados, notas e CSV. - Reviews Google via Places API (New), filtradas por classificação mínima e em cache configurável; página de configuração com pesquisa do Place ID. - Assets com ?v=<mtime>: site/assets é servido com cache imutável de 1 ano. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
125 lines
6.6 KiB
PHP
125 lines
6.6 KiB
PHP
<?php
|
|
require __DIR__ . '/../../config/db.php';
|
|
require __DIR__ . '/../../config/functions.php';
|
|
$user = require_admin();
|
|
|
|
// Counts for the dashboard widgets.
|
|
$counts = [
|
|
'clientes' => (int) $pdo->query("SELECT COUNT(*) FROM users WHERE role = 'client'")->fetchColumn(),
|
|
'equipa' => (int) $pdo->query("SELECT COUNT(*) FROM users WHERE role IN ('admin','staff')")->fetchColumn(),
|
|
'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/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'; ?>
|