Files
yogibook_aury_new/public/push-settings.php
2026-08-15 12:00:28 +03:00

318 lines
15 KiB
PHP

<?php
// headscript.php stampa gia' dell'HTML: bufferizziamo l'output cosi', se chi
// apre la pagina non e' amministratore, possiamo buttarlo via e fare un
// redirect HTTP vero invece di uno via JavaScript.
ob_start();
require_once('include/headscript.php');
?>
<?php
/**
* push-settings.php
* --------------------------------------------------------------------------
* Pannello admin per le notifiche push dell'app: orario di invio, giorni di
* anticipo e testi dei messaggi (tabella notificationsetting).
*
* I cron (push-lezioni-cron.php, push-ordini-cron.php, push-certificati-cron.php)
* girano ogni ora e leggono da qui a che ora devono partire: cambiando l'orario
* su questa pagina non serve toccare il cron del server.
* --------------------------------------------------------------------------
*/
// Solo amministratori: da qui si decidono i messaggi inviati a tutti gli iscritti.
if ((int) $roleuser !== 1) {
ob_end_clean();
redirectTo('/');
}
ob_end_flush();
$pdo = DBHandlerSelect::getInstance()->getConnection();
$impostazioni = $pdo->query("
SELECT idnotificationsetting, notificationtype, daysbefore, sendhour, active,
title, title_multi, body, body_multi
FROM notificationsetting
ORDER BY FIELD(notificationtype, 'lesson', 'order', 'certificate'), daysbefore DESC
")->fetchAll(PDO::FETCH_ASSOC);
// Etichette e spiegazioni per ogni tipo di notifica.
$etichette = [
'lesson' => 'Lezioni del giorno',
'order' => 'Scadenza abbonamento',
'certificate' => 'Scadenza certificato medico',
];
$spiegazioni = [
'lesson' => 'Inviata ogni mattina a chi ha lezioni prenotate per la giornata. '
. 'Se una persona ha piu\' lezioni riceve un solo messaggio: in quel caso vengono usati '
. 'il titolo e il testo "per piu\' lezioni".',
'order' => 'Inviata ai giorni di anticipo indicati rispetto alla data di scadenza '
. 'dell\'abbonamento.',
'certificate' => 'Inviata ai giorni di anticipo indicati rispetto alla scadenza del certificato '
. 'medico. Viene considerato solo il certificato piu\' recente di ogni utente.',
];
$segnaposti = [
'lesson' => '{first_name} {last_name} {servicename} {date} {time} {count} {lessons}',
'order' => '{first_name} {last_name} {expiredate} {servicename} {count} {orders}',
'certificate' => '{first_name} {last_name} {expiredate} {count} {documents}',
];
// Come si chiama il caso "piu' elementi insieme", tipo per tipo.
$etichetteMulti = [
'lesson' => 'piu\' lezioni nello stesso giorno',
'order' => 'piu\' abbonamenti in scadenza lo stesso giorno',
'certificate' => 'piu\' certificati con la stessa scadenza',
];
?>
<!doctype html>
<html lang="it">
<head>
<meta charset="utf-8" />
<title>YogiBook - Notifiche push</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta content="YogiBook - Impostazioni notifiche push" name="description" />
<meta content="Advanced Creative Solutions" name="author" />
<link rel="shortcut icon" href="assets/images/favicon.ico">
<!-- Bootstrap Css -->
<link href="assets/css/bootstrap.min.css" id="bootstrap-style" rel="stylesheet" type="text/css" />
<!-- Icons Css -->
<link href="assets/css/icons.min.css" rel="stylesheet" type="text/css" />
<!-- App Css-->
<link href="assets/css/app.min.css" id="app-style" rel="stylesheet" type="text/css" />
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0-beta3/css/all.min.css">
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@10"></script>
<style>
.custom-card {
margin: 20px auto;
background-color: white;
box-shadow: 0px 2px 4px rgba(0, 0, 0, 0.1);
border-radius: 8px;
padding: 20px;
}
.push-hint {
font-size: 12px;
color: #74788d;
}
.push-placeholders {
font-family: monospace;
font-size: 12px;
color: #556ee6;
}
</style>
<script>
$(document).ready(function() {
$('.btn-salva-push').on('click', function() {
var card = $(this).closest('.custom-card');
$.ajax({
url: 'updatepushsetting.php',
method: 'POST',
dataType: 'json',
data: {
idnotificationsetting: card.data('id'),
active: card.find('.push-active').is(':checked') ? 'Y' : 'N',
daysbefore: card.find('.push-daysbefore').val(),
sendhour: card.find('.push-sendhour').val(),
title: card.find('.push-title').val(),
body: card.find('.push-body').val(),
title_multi: card.find('.push-title-multi').val(),
body_multi: card.find('.push-body-multi').val()
},
success: function(response) {
if (response.success) {
Swal.fire({
title: 'Salvato!',
text: 'Impostazione aggiornata con successo.',
icon: 'success',
confirmButtonText: 'OK'
});
} else {
Swal.fire({
title: 'Errore!',
text: response.error,
icon: 'error',
confirmButtonText: 'OK'
});
}
},
error: function() {
Swal.fire({
title: 'Errore!',
text: 'Errore durante la richiesta AJAX.',
icon: 'error',
confirmButtonText: 'OK'
});
}
});
});
});
</script>
</head>
<body>
<div id="layout-wrapper">
<header id="page-topbar" class="isvertical-topbar">
<div class="navbar-header">
<div class="d-flex">
<?php include('include/logoarea.php'); ?>
<button type="button" class="btn btn-sm px-3 font-size-24 header-item waves-effect vertical-menu-btn">
<i class="bx bx-menu align-middle"></i>
</button>
<div class="page-title-box align-self-center d-none d-md-block">
<h4 class="page-title mb-0">Notifiche push</h4>
</div>
</div>
<div class="d-flex">
<?php include('include/languageselection.php'); ?>
<?php include('include/profiletopbar.php'); ?>
</div>
</div>
</header>
<?php include('include/sidebar.php'); ?>
<header class="ishorizontal-topbar">
<div class="navbar-header">
<div class="d-flex"></div>
</div>
<div class="topnav">
<div class="container-fluid">
<nav class="navbar navbar-light navbar-expand-lg topnav-menu"></nav>
</div>
</div>
</header>
<div class="main-content">
<div class="page-content">
<div class="container-fluid">
<div class="row">
<div class="col-xl-12">
<div class="custom-card">
<h4>Notifiche push dell'app</h4>
<p class="push-hint mb-0">
Le notifiche partono solo agli utenti che le hanno attivate nell'app.
I cron girano ogni ora e controllano l'orario impostato qui sotto,
quindi per cambiare l'ora di invio basta modificare questa pagina.
</p>
</div>
</div>
</div>
<?php foreach ($impostazioni as $riga) : ?>
<?php $tipo = $riga['notificationtype']; ?>
<div class="row">
<div class="col-xl-12">
<div class="custom-card" data-id="<?php echo (int) $riga['idnotificationsetting']; ?>">
<h5>
<?php echo htmlspecialchars($etichette[$tipo] ?? $tipo); ?>
<?php if ($tipo !== 'lesson') : ?>
<small class="text-muted">
&mdash; <?php echo (int) $riga['daysbefore'] === 0
? 'il giorno della scadenza'
: (int) $riga['daysbefore'] . ' giorni prima'; ?>
</small>
<?php endif; ?>
</h5>
<p class="push-hint"><?php echo $spiegazioni[$tipo] ?? ''; ?></p>
<div class="row mb-3">
<div class="col-md-3">
<div class="form-check mt-4">
<input class="form-check-input push-active" type="checkbox"
id="active-<?php echo (int) $riga['idnotificationsetting']; ?>"
<?php echo $riga['active'] === 'Y' ? 'checked' : ''; ?>>
<label class="form-check-label"
for="active-<?php echo (int) $riga['idnotificationsetting']; ?>">
Notifica attiva
</label>
</div>
</div>
<div class="col-md-3">
<label class="form-label">Ora di invio</label>
<input type="text" class="form-control push-sendhour"
value="<?php echo htmlspecialchars($riga['sendhour']); ?>"
placeholder="08:00">
<span class="push-hint">Formato HH:MM</span>
</div>
<div class="col-md-3">
<label class="form-label">Giorni di anticipo</label>
<input type="number" min="0" max="60" class="form-control push-daysbefore"
value="<?php echo (int) $riga['daysbefore']; ?>"
<?php echo $tipo === 'lesson' ? 'readonly' : ''; ?>>
<span class="push-hint">
<?php echo $tipo === 'lesson'
? 'Sempre il giorno stesso'
: '0 = il giorno della scadenza'; ?>
</span>
</div>
</div>
<div class="mb-3">
<label class="form-label">Titolo</label>
<input type="text" class="form-control push-title" maxlength="150"
value="<?php echo htmlspecialchars($riga['title']); ?>">
</div>
<div class="mb-3">
<label class="form-label">Testo</label>
<textarea class="form-control push-body" rows="2"><?php
echo htmlspecialchars($riga['body']);
?></textarea>
</div>
<div class="mb-3">
<label class="form-label">
Titolo quando ci sono <?php echo $etichetteMulti[$tipo] ?? 'piu\' elementi'; ?>
</label>
<input type="text" class="form-control push-title-multi" maxlength="150"
value="<?php echo htmlspecialchars((string) $riga['title_multi']); ?>">
</div>
<div class="mb-3">
<label class="form-label">
Testo quando ci sono <?php echo $etichetteMulti[$tipo] ?? 'piu\' elementi'; ?>
</label>
<textarea class="form-control push-body-multi" rows="2"><?php
echo htmlspecialchars((string) $riga['body_multi']);
?></textarea>
<span class="push-hint">
In quel caso parte comunque UNA sola notifica. Se questi campi restano
vuoti viene usato il testo qui sopra.
</span>
</div>
<p class="mb-2">
<span class="push-hint">Segnaposto disponibili: </span>
<span class="push-placeholders"><?php echo $segnaposti[$tipo] ?? ''; ?></span>
</p>
<button type="button" class="btn btn-primary btn-salva-push">Salva</button>
</div>
</div>
</div>
<?php endforeach; ?>
</div>
<?php include('include/footer.php'); ?>
</div>
</div>
</div>
<script src="assets/libs/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="assets/libs/metismenujs/metismenujs.min.js"></script>
<script src="assets/libs/simplebar/simplebar.min.js"></script>
<script src="assets/libs/eva-icons/eva.min.js"></script>
<script src="assets/js/app.js"></script>
</body>
</html>