318 lines
15 KiB
PHP
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">
|
|
— <?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>
|