+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/userarea/class_types.php b/public/userarea/class_types.php
new file mode 100644
index 0000000..45ba6ed
--- /dev/null
+++ b/public/userarea/class_types.php
@@ -0,0 +1,612 @@
+getConnection();
+
+// Verifica che iduserlogin sia definito
+if (!isset($iduserlogin)) {
+ die("Errore: ID utente non definito.");
+}
+
+// Recupera l'ID della scuola in base all'utente loggato
+$stmt = $pdo->prepare("SELECT id, name FROM schools WHERE owner_id = ?");
+$stmt->execute([$iduserlogin]);
+$school = $stmt->fetch();
+if (!$school) {
+ die("Errore: Nessuna scuola trovata per l'utente loggato.");
+}
+$school_id = $school['id'];
+$school_name = $school['name'];
+
+// Recupera tutte le categorie disponibili
+$stmt = $pdo->prepare("SELECT id, name FROM class_categories WHERE status = 'active' ORDER BY name");
+$stmt->execute();
+$categories = $stmt->fetchAll();
+
+// Funzione per ridimensionare l'immagine
+function resizeImage($source_path, $dest_path, $max_width = 800)
+{
+ list($width, $height, $type) = getimagesize($source_path);
+ if ($width <= $max_width) {
+ copy($source_path, $dest_path);
+ return;
+ }
+
+ $new_width = $max_width;
+ $new_height = (int)(($height * $new_width) / $width);
+
+ switch ($type) {
+ case IMAGETYPE_JPEG:
+ $source = imagecreatefromjpeg($source_path);
+ break;
+ case IMAGETYPE_PNG:
+ $source = imagecreatefrompng($source_path);
+ break;
+ case IMAGETYPE_GIF:
+ $source = imagecreatefromgif($source_path);
+ break;
+ default:
+ throw new Exception("Formato immagine non supportato.");
+ }
+
+ $dest = imagecreatetruecolor($new_width, $new_height);
+ if ($type == IMAGETYPE_PNG) {
+ imagealphablending($dest, false);
+ imagesavealpha($dest, true);
+ }
+ imagecopyresampled($dest, $source, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
+
+ switch ($type) {
+ case IMAGETYPE_JPEG:
+ imagejpeg($dest, $dest_path, 90);
+ break;
+ case IMAGETYPE_PNG:
+ imagepng($dest, $dest_path);
+ break;
+ case IMAGETYPE_GIF:
+ imagegif($dest, $dest_path);
+ break;
+ }
+
+ imagedestroy($source);
+ imagedestroy($dest);
+}
+
+// Gestione delle azioni (aggiunta, modifica, cancellazione)
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ if (isset($_POST['action'])) {
+ $action = $_POST['action'];
+
+ // Aggiunta di una nuova classe
+ if ($action === 'add') {
+ $class_category_id = $_POST['class_category_id'] ?? 0;
+ $name = $_POST['name'] ?? '';
+ $description = $_POST['description'] ?? null;
+ $requirements = $_POST['requirements'] ?? null;
+ $level = in_array($_POST['level'], ['beginner', 'intermediate', 'advanced']) ? $_POST['level'] : 'beginner';
+ $typical_duration = $_POST['typical_duration'] ? (int)$_POST['typical_duration'] : null;
+ $days_of_week = $_POST['days_of_week'] ?? '';
+ $start_time = $_POST['start_time'] ?? '';
+ $period_start = $_POST['period_start'] ?? '';
+ $period_end = $_POST['period_end'] ?? '';
+ $status = $_POST['status'] === 'active' ? 'active' : 'inactive';
+
+ if (empty($name) || $class_category_id <= 0 || empty($days_of_week) || empty($start_time) || empty($period_start) || empty($period_end)) {
+ $error = "I campi obbligatori non sono stati compilati.";
+ } else {
+ $photo = null;
+ if (isset($_FILES['photo']) && $_FILES['photo']['error'] === UPLOAD_ERR_OK) {
+ $file = $_FILES['photo'];
+ $timestamp = time();
+ $original_name = basename($file['name']);
+ $extension = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
+ $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
+
+ if (in_array($extension, $allowed_extensions)) {
+ $new_filename = "photoclass/{$school_id}-{$timestamp}-{$original_name}";
+ $temp_path = $file['tmp_name'];
+ try {
+ resizeImage($temp_path, $new_filename);
+ $photo = $new_filename;
+ } catch (Exception $e) {
+ $error = "Errore durante il ridimensionamento della foto: " . $e->getMessage();
+ }
+ } else {
+ $error = "Estensione del file non consentita. Usa JPG, JPEG, PNG o GIF.";
+ }
+ }
+
+ if (!isset($error)) {
+ $stmt = $pdo->prepare("
+ INSERT INTO class_types (school_id, class_category_id, name, description, photo, requirements, level, typical_duration, days_of_week, start_time, period_start, period_end, status)
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
+ ");
+ $success = $stmt->execute([
+ $school_id,
+ $class_category_id,
+ $name,
+ $description,
+ $photo,
+ $requirements,
+ $level,
+ $typical_duration,
+ $days_of_week,
+ $start_time,
+ $period_start,
+ $period_end,
+ $status
+ ]);
+
+ if ($success) {
+ $success_message = "Classe aggiunta con successo!";
+ } else {
+ $error = "Errore durante l'aggiunta della classe.";
+ }
+ }
+ }
+ }
+
+ // Modifica di una classe esistente
+ if ($action === 'edit') {
+ $id = $_POST['id'] ?? 0;
+ $class_category_id = $_POST['class_category_id'] ?? 0;
+ $name = $_POST['name'] ?? '';
+ $description = $_POST['description'] ?? null;
+ $requirements = $_POST['requirements'] ?? null;
+ $level = in_array($_POST['level'], ['beginner', 'intermediate', 'advanced']) ? $_POST['level'] : 'beginner';
+ $typical_duration = $_POST['typical_duration'] ? (int)$_POST['typical_duration'] : null;
+ $days_of_week = $_POST['days_of_week'] ?? '';
+ $start_time = $_POST['start_time'] ?? '';
+ $period_start = $_POST['period_start'] ?? '';
+ $period_end = $_POST['period_end'] ?? '';
+ $status = $_POST['status'] === 'active' ? 'active' : 'inactive';
+
+ if (empty($name) || $class_category_id <= 0 || empty($days_of_week) || empty($start_time) || empty($period_start) || empty($period_end)) {
+ $error = "I campi obbligatori non sono stati compilati.";
+ } else {
+ // Recupera la classe esistente per ottenere il percorso della foto attuale
+ $stmt = $pdo->prepare("SELECT photo FROM class_types WHERE id = ? AND school_id = ?");
+ $stmt->execute([$id, $school_id]);
+ $class = $stmt->fetch();
+ if (!$class) {
+ $error = "Classe non trovata.";
+ } else {
+ $photo = $class['photo'];
+ if (isset($_FILES['photo']) && $_FILES['photo']['error'] === UPLOAD_ERR_OK) {
+ $file = $_FILES['photo'];
+ $timestamp = time();
+ $original_name = basename($file['name']);
+ $extension = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
+ $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
+
+ if (in_array($extension, $allowed_extensions)) {
+ $new_filename = "photoclass/{$school_id}-{$timestamp}-{$original_name}";
+ $temp_path = $file['tmp_name'];
+ try {
+ resizeImage($temp_path, $new_filename);
+ $photo = $new_filename;
+ if ($class['photo'] && file_exists($class['photo'])) {
+ unlink($class['photo']);
+ }
+ } catch (Exception $e) {
+ $error = "Errore durante il ridimensionamento della foto: " . $e->getMessage();
+ }
+ } else {
+ $error = "Estensione del file non consentita. Usa JPG, JPEG, PNG o GIF.";
+ }
+ }
+
+ if (!isset($error)) {
+ $stmt = $pdo->prepare("
+ UPDATE class_types
+ SET class_category_id = ?, name = ?, description = ?, photo = ?, requirements = ?, level = ?,
+ typical_duration = ?, days_of_week = ?, start_time = ?, period_start = ?, period_end = ?, status = ?
+ WHERE id = ? AND school_id = ?
+ ");
+ $success = $stmt->execute([
+ $class_category_id,
+ $name,
+ $description,
+ $photo,
+ $requirements,
+ $level,
+ $typical_duration,
+ $days_of_week,
+ $start_time,
+ $period_start,
+ $period_end,
+ $status,
+ $id,
+ $school_id
+ ]);
+
+ if ($success) {
+ $success_message = "Classe aggiornata con successo!";
+ } else {
+ $error = "Errore durante l'aggiornamento della classe.";
+ }
+ }
+ }
+ }
+ }
+
+ // Cancellazione di una classe
+ if ($action === 'delete') {
+ $id = $_POST['id'] ?? 0;
+ $stmt = $pdo->prepare("SELECT photo FROM class_types WHERE id = ? AND school_id = ?");
+ $stmt->execute([$id, $school_id]);
+ $class = $stmt->fetch();
+ if ($class) {
+ if ($class['photo'] && file_exists($class['photo'])) {
+ unlink($class['photo']);
+ }
+ $stmt = $pdo->prepare("DELETE FROM class_types WHERE id = ? AND school_id = ?");
+ $success = $stmt->execute([$id, $school_id]);
+
+ if ($success) {
+ $success_message = "Classe eliminata con successo!";
+ } else {
+ $error = "Errore durante l'eliminazione della classe.";
+ }
+ } else {
+ $error = "Classe non trovata.";
+ }
+ }
+
+ // Reindirizza per evitare il doppio invio del form
+ header("Location: class_types.php");
+ exit;
+ }
+}
+
+// Recupera tutte le classi della scuola
+$stmt = $pdo->prepare("
+ SELECT ct.*, cc.name AS category_name
+ FROM class_types ct
+ LEFT JOIN class_categories cc ON ct.class_category_id = cc.id
+ WHERE ct.school_id = ?
+ ORDER BY ct.created_at DESC
+");
+$stmt->execute([$school_id]);
+$classes = $stmt->fetchAll();
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Classi della scuola:
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
ID
+
Categoria
+
Nome
+
Descrizione
+
Foto
+
Livello
+
Durata (min)
+
Giorni
+
Orario
+
Inizio
+
Fine
+
Stato
+
Data Creazione
+
Ultimo Aggiornamento
+
Azioni
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Nessuna foto
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Aggiungi Classe
+
+
+
+
+
+
+
+
+
+
+
+
+
Modifica Classe
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/userarea/cssinclude.php b/public/userarea/cssinclude.php
index 72f35cd..24e32f7 100644
--- a/public/userarea/cssinclude.php
+++ b/public/userarea/cssinclude.php
@@ -15,4 +15,6 @@
-
\ No newline at end of file
+
+
+
\ No newline at end of file
diff --git a/public/userarea/day_off.php b/public/userarea/day_off.php
new file mode 100644
index 0000000..648d2c2
--- /dev/null
+++ b/public/userarea/day_off.php
@@ -0,0 +1,318 @@
+getConnection();
+
+// Verifica che iduserlogin sia definito
+if (!isset($iduserlogin)) {
+ die("Errore: ID utente non definito.");
+}
+
+// Recupera i dati della scuola in base all'utente loggato
+$stmt = $pdo->prepare("SELECT id, name FROM schools WHERE owner_id = ?");
+$stmt->execute([$iduserlogin]);
+$school = $stmt->fetch();
+if (!$school) {
+ die("Errore: Nessuna scuola trovata per l'utente loggato.");
+}
+$school_id = $school['id'];
+$school_name = $school['name'];
+
+// Gestione delle azioni (aggiunta, modifica, cancellazione)
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ if (isset($_POST['action'])) {
+ $action = $_POST['action'];
+
+ // Aggiunta di un giorno di chiusura
+ if ($action === 'add') {
+ $start_date = $_POST['start_date'] ?? '';
+ $end_date = $_POST['end_date'] ?? '';
+ $description = $_POST['description'] ?? null;
+
+ // Validazione: assicurarsi che end_date >= start_date
+ if (empty($start_date) || empty($end_date)) {
+ $error = "Le date di inizio e fine sono obbligatorie.";
+ } elseif (strtotime($end_date) < strtotime($start_date)) {
+ $error = "La data di fine non può essere precedente alla data di inizio.";
+ } else {
+ $stmt = $pdo->prepare("
+ INSERT INTO day_off (school_id, start_date, end_date, description)
+ VALUES (?, ?, ?, ?)
+ ");
+ $success = $stmt->execute([
+ $school_id,
+ $start_date,
+ $end_date,
+ $description
+ ]);
+
+ if ($success) {
+ $success_message = "Giorno di chiusura aggiunto con successo!";
+ } else {
+ $error = "Errore durante l'aggiunta del giorno di chiusura.";
+ }
+ }
+ }
+
+ // Modifica di un giorno di chiusura
+ if ($action === 'edit') {
+ $id = $_POST['id'] ?? 0;
+ $start_date = $_POST['start_date'] ?? '';
+ $end_date = $_POST['end_date'] ?? '';
+ $description = $_POST['description'] ?? null;
+
+ // Validazione: assicurarsi che end_date >= start_date
+ if (empty($start_date) || empty($end_date)) {
+ $error = "Le date di inizio e fine sono obbligatorie.";
+ } elseif (strtotime($end_date) < strtotime($start_date)) {
+ $error = "La data di fine non può essere precedente alla data di inizio.";
+ } else {
+ $stmt = $pdo->prepare("
+ UPDATE day_off
+ SET start_date = ?, end_date = ?, description = ?
+ WHERE id = ? AND school_id = ?
+ ");
+ $success = $stmt->execute([
+ $start_date,
+ $end_date,
+ $description,
+ $id,
+ $school_id
+ ]);
+
+ if ($success) {
+ $success_message = "Giorno di chiusura aggiornato con successo!";
+ } else {
+ $error = "Errore durante l'aggiornamento del giorno di chiusura.";
+ }
+ }
+ }
+
+ // Cancellazione di un giorno di chiusura
+ if ($action === 'delete') {
+ $id = $_POST['id'] ?? 0;
+ $stmt = $pdo->prepare("DELETE FROM day_off WHERE id = ? AND school_id = ?");
+ $success = $stmt->execute([$id, $school_id]);
+
+ if ($success) {
+ $success_message = "Giorno di chiusura eliminato con successo!";
+ } else {
+ $error = "Errore durante l'eliminazione del giorno di chiusura.";
+ }
+ }
+
+ // Reindirizza per evitare il doppio invio del form
+ header("Location: day_off.php");
+ exit;
+ }
+}
+
+// Recupera tutti i giorni di chiusura della scuola
+$stmt = $pdo->prepare("
+ SELECT *
+ FROM day_off
+ WHERE school_id = ?
+ ORDER BY start_date
+");
+$stmt->execute([$school_id]);
+$days_off = $stmt->fetchAll();
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/userarea/siteinfo.php b/public/userarea/siteinfo.php
new file mode 100644
index 0000000..7b710c2
--- /dev/null
+++ b/public/userarea/siteinfo.php
@@ -0,0 +1,2 @@
+YogiBoook - School Management
+
\ No newline at end of file
diff --git a/public/userarea/teacher_profile.php b/public/userarea/teacher_profile.php
new file mode 100644
index 0000000..f376593
--- /dev/null
+++ b/public/userarea/teacher_profile.php
@@ -0,0 +1,327 @@
+getConnection();
+
+// ID dell'utente loggato (assumiamo sia definito)
+if (!isset($iduserlogin)) {
+ die("Errore: ID utente non definito.");
+}
+
+// Recupera i dati dell'insegnante
+$stmt = $pdo->prepare("
+ SELECT t.*, u.first_name, u.last_name, u.email
+ FROM auth_users u
+ LEFT JOIN teachers t ON t.user_id = u.id
+ WHERE u.id = ?
+");
+$stmt->execute([$iduserlogin]);
+$teacher = $stmt->fetch();
+
+if (!$teacher) {
+ die("Errore: Utente non trovato.");
+}
+
+// Determina se è un nuovo insegnante
+$is_new = !isset($teacher['id']);
+if ($is_new) {
+ $teacher = [
+ 'id' => null,
+ 'user_id' => $iduserlogin,
+ 'unique_code' => '',
+ 'phone' => '',
+ 'description' => '',
+ 'specializations' => '',
+ 'profile_picture' => '',
+ 'status' => 'active',
+ 'created_at' => '',
+ 'updated_at' => '',
+ 'first_name' => $teacher['first_name'],
+ 'last_name' => $teacher['last_name'],
+ 'email' => $teacher['email']
+ ];
+}
+
+// Funzione per generare un codice univoco
+function generateUniqueCode($pdo, $length = 16)
+{
+ do {
+ $code = bin2hex(random_bytes($length / 2));
+ $stmt = $pdo->prepare("SELECT COUNT(*) FROM teachers WHERE unique_code = ?");
+ $stmt->execute([$code]);
+ $count = $stmt->fetchColumn();
+ } while ($count > 0);
+ return $code;
+}
+
+// Generazione del QR Code
+$qr_code_path = null;
+if (!$is_new) {
+ try {
+ $unique_code = $teacher['unique_code'];
+ if (empty($unique_code)) {
+ throw new Exception("Errore: unique_code è vuoto.");
+ }
+
+ $base_dir = __DIR__ . '/../../public/userarea/phototeachers/qrcodes/';
+ $qr_code_filename = "{$base_dir}{$iduserlogin}-{$unique_code}.png";
+ $qr_code_path = "phototeachers/qrcodes/{$iduserlogin}-{$unique_code}.png";
+
+ if (!file_exists($qr_code_filename)) {
+ if (!is_dir($base_dir)) {
+ mkdir($base_dir, 0755, true) or die("Errore: Impossibile creare la directory.");
+ }
+ if (!is_writable($base_dir)) {
+ die("Errore: La directory non è scrivibile.");
+ }
+
+ $builder = new Builder();
+ $result = $builder->build(
+ writer: new PngWriter(),
+ data: $unique_code,
+ size: 150,
+ margin: 10
+ );
+ $result->saveToFile($qr_code_filename);
+ }
+ } catch (Exception $e) {
+ $error = "Errore generazione QR Code: " . $e->getMessage();
+ error_log($error);
+ }
+}
+
+// Gestione del form
+if ($_SERVER['REQUEST_METHOD'] === 'POST') {
+ $first_name = $_POST['first_name'];
+ $last_name = $_POST['last_name'];
+ $phone = $_POST['phone'] ?? null;
+ $description = $_POST['description'] ?? null;
+ $specializations = $_POST['specializations'] ?? null;
+ $status = $_POST['status'] === 'active' ? 'active' : 'inactive';
+
+ // Gestione del caricamento della foto
+ $profile_picture = $teacher['profile_picture'];
+ if (isset($_FILES['profile_picture']) && $_FILES['profile_picture']['error'] === UPLOAD_ERR_OK) {
+ $file = $_FILES['profile_picture'];
+ $timestamp = time();
+ $original_name = basename($file['name']);
+ $extension = strtolower(pathinfo($original_name, PATHINFO_EXTENSION));
+ $allowed_extensions = ['jpg', 'jpeg', 'png', 'gif'];
+
+ if (in_array($extension, $allowed_extensions)) {
+ $new_filename = "phototeachers/{$iduserlogin}-{$timestamp}-{$original_name}";
+ if (move_uploaded_file($file['tmp_name'], $new_filename)) {
+ $profile_picture = $new_filename;
+ if ($teacher['profile_picture'] && file_exists($teacher['profile_picture']) && !$is_new) {
+ unlink($teacher['profile_picture']);
+ }
+ } else {
+ $error = "Errore durante il caricamento della foto.";
+ }
+ } else {
+ $error = "Estensione del file non consentita. Usa JPG, JPEG, PNG o GIF.";
+ }
+ }
+
+ // Aggiorna auth_users
+ $stmt = $pdo->prepare("UPDATE auth_users SET first_name = ?, last_name = ? WHERE id = ?");
+ $stmt->execute([$first_name, $last_name, $iduserlogin]);
+
+ if ($is_new) {
+ $unique_code = generateUniqueCode($pdo);
+ $stmt = $pdo->prepare("
+ INSERT INTO teachers (user_id, unique_code, phone, description, specializations, profile_picture, status)
+ VALUES (?, ?, ?, ?, ?, ?, ?)
+ ");
+ $success = $stmt->execute([$iduserlogin, $unique_code, $phone, $description, $specializations, $profile_picture, $status]);
+
+ if ($success) {
+ $success_message = "Insegnante creato con successo!";
+ $stmt = $pdo->prepare("
+ SELECT t.*, u.first_name, u.last_name, u.email
+ FROM auth_users u
+ LEFT JOIN teachers t ON t.user_id = u.id
+ WHERE u.id = ?
+ ");
+ $stmt->execute([$iduserlogin]);
+ $teacher = $stmt->fetch();
+ $is_new = false;
+
+ // Genera QR Code per il nuovo insegnante
+ try {
+ $base_dir = __DIR__ . '/../../public/phototeachers/qrcodes/';
+ $qr_code_filename = "{$base_dir}{$iduserlogin}-{$unique_code}.png";
+ $qr_code_path = "phototeachers/qrcodes/{$iduserlogin}-{$unique_code}.png";
+
+ if (!file_exists($qr_code_filename)) {
+ if (!is_dir($base_dir)) {
+ mkdir($base_dir, 0755, true) or die("Errore: Impossibile creare la directory.");
+ }
+ $builder = new Builder();
+ $result = $builder->build(
+ writer: new PngWriter(),
+ data: $unique_code,
+ size: 150,
+ margin: 10
+ );
+ $result->saveToFile($qr_code_filename);
+ }
+ } catch (Exception $e) {
+ $error = "Errore generazione QR Code: " . $e->getMessage();
+ error_log($error);
+ }
+ } else {
+ $error = "Errore durante la creazione dell'insegnante.";
+ }
+ } else {
+ $stmt = $pdo->prepare("
+ UPDATE teachers
+ SET phone = ?, description = ?, specializations = ?, profile_picture = ?, status = ?
+ WHERE user_id = ?
+ ");
+ $success = $stmt->execute([$phone, $description, $specializations, $profile_picture, $status, $iduserlogin]);
+
+ if ($success) {
+ $success_message = "Dati aggiornati con successo!";
+ $stmt = $pdo->prepare("
+ SELECT t.*, u.first_name, u.last_name, u.email
+ FROM auth_users u
+ LEFT JOIN teachers t ON t.user_id = u.id
+ WHERE u.id = ?
+ ");
+ $stmt->execute([$iduserlogin]);
+ $teacher = $stmt->fetch();
+ } else {
+ $error = "Errore durante l'aggiornamento dei dati.";
+ }
+ }
+}
+?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/public/userarea/template.php b/public/userarea/template.php
index ba9ecb2..bd45ed2 100644
--- a/public/userarea/template.php
+++ b/public/userarea/template.php
@@ -1,3 +1,4 @@
+
@@ -8,7 +9,8 @@
- Rocker - Bootstrap 5 Admin Dashboard Template
+
+
@@ -23,68 +25,7 @@
-
-
-
-
-
-
-
Total Orders
-
4805
-
+2.5% from last week
-
-
-
-
-
-
-
-
-
-
-
-
-
Total Revenue
-
$84,245
-
+5.4% from last week
-
-
-
-
-
-
-
-
-
-
-
-
-
Bounce Rate
-
34.6%
-
-4.5% from last week
-
-
-
-
-
-
-
-
-
-
-
-
-
Total Customers
-
8.4K
-
+8.4% from last week
-
-
-
-
-
-
-
-
+
diff --git a/public/userarea/test-qr.png b/public/userarea/test-qr.png
new file mode 100644
index 0000000..e40647a
Binary files /dev/null and b/public/userarea/test-qr.png differ
diff --git a/storage/settings.json b/storage/settings.json
index 80782f3..d69476a 100644
--- a/storage/settings.json
+++ b/storage/settings.json
@@ -1 +1 @@
-{"remember_me":"1","notifications_signup_email":"0","forgot_password":"1","login_reset_token_lifetime":"30","throttle_enabled":"1","throttle_attempts":"3","throttle_lockout_time":"2","reg_enabled":"1","reg_email_confirmation":"1","2fa":{"enabled":true},"app_name":"YogiBoook","registration":{"captcha":{"enabled":false}},"tos":"1","captcha":{"enabled":false},"max_active_sessions":"0"}
\ No newline at end of file
+{"remember_me":"1","notifications_signup_email":"1","forgot_password":"1","login_reset_token_lifetime":"30","throttle_enabled":"1","throttle_attempts":"3","throttle_lockout_time":"2","reg_enabled":"1","reg_email_confirmation":"1","2fa":{"enabled":true},"app_name":"YogiBoook","registration":{"captcha":{"enabled":false}},"tos":"1","captcha":{"enabled":false},"max_active_sessions":"0"}
\ No newline at end of file