39080-vm/includes/bootstrap.php
Flatlogic Bot a60c7b17bb booking
2026-03-10 08:55:05 +00:00

146 lines
4.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
declare(strict_types=1);
require_once __DIR__ . '/../db/config.php';
function h(string $value): string {
return htmlspecialchars($value, ENT_QUOTES, 'UTF-8');
}
function ensure_schema(): void {
$pdo = db();
$pdo->exec(
"CREATE TABLE IF NOT EXISTS movies (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(160) NOT NULL,
genre VARCHAR(80) NOT NULL,
duration_min INT NOT NULL,
rating VARCHAR(10) NOT NULL,
description TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
);
$pdo->exec(
"CREATE TABLE IF NOT EXISTS shows (
id INT AUTO_INCREMENT PRIMARY KEY,
movie_id INT NOT NULL,
screen VARCHAR(40) NOT NULL,
show_time DATETIME NOT NULL,
format_label VARCHAR(10) NOT NULL,
price DECIMAL(8,2) NOT NULL DEFAULT 12.00,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (movie_id) REFERENCES movies(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
);
$pdo->exec(
"CREATE TABLE IF NOT EXISTS bookings (
id INT AUTO_INCREMENT PRIMARY KEY,
show_id INT NOT NULL,
customer_name VARCHAR(120) NOT NULL,
customer_email VARCHAR(160) NOT NULL,
seats VARCHAR(120) NOT NULL,
total_price DECIMAL(8,2) NOT NULL,
booking_code VARCHAR(20) NOT NULL UNIQUE,
status VARCHAR(20) NOT NULL DEFAULT 'booked',
checked_in TINYINT(1) NOT NULL DEFAULT 0,
checked_in_at DATETIME NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (show_id) REFERENCES shows(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
);
}
function seed_data(): void {
$pdo = db();
$count = (int)$pdo->query("SELECT COUNT(*) FROM movies")->fetchColumn();
if ($count > 0) {
return;
}
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO movies (title, genre, duration_min, rating, description) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([
'Midnight Signal',
'Sci-Fi Thriller',
124,
'PG-13',
'A space relay operator uncovers a message that redefines humanitys future.'
]);
$stmt->execute([
'Velvet Avenue',
'Drama',
108,
'PG',
'A fashion editor returns home to rebuild her family studio and identity.'
]);
$movies = $pdo->query("SELECT id, title FROM movies")->fetchAll();
$now = new DateTimeImmutable('now');
$showStmt = $pdo->prepare("INSERT INTO shows (movie_id, screen, show_time, format_label, price) VALUES (?, ?, ?, ?, ?)");
foreach ($movies as $index => $movie) {
$base = $now->modify('+' . ($index * 2 + 1) . ' hours');
$showStmt->execute([$movie['id'], 'Screen A', $base->format('Y-m-d H:i:s'), '2D', 11.50]);
$showStmt->execute([$movie['id'], 'Screen B', $base->modify('+3 hours')->format('Y-m-d H:i:s'), 'IMAX', 15.00]);
}
$pdo->commit();
}
function fetch_movies_with_shows(): array {
$pdo = db();
$movies = $pdo->query("SELECT * FROM movies ORDER BY created_at DESC")->fetchAll();
$shows = $pdo->query(
"SELECT s.*, m.title AS movie_title
FROM shows s
JOIN movies m ON m.id = s.movie_id
ORDER BY s.show_time ASC"
)->fetchAll();
$grouped = [];
foreach ($shows as $show) {
$grouped[$show['movie_id']][] = $show;
}
return [$movies, $grouped];
}
function fetch_show(int $showId): ?array {
$pdo = db();
$stmt = $pdo->prepare(
"SELECT s.*, m.title, m.genre, m.duration_min, m.rating, m.description
FROM shows s
JOIN movies m ON m.id = s.movie_id
WHERE s.id = ?"
);
$stmt->execute([$showId]);
$row = $stmt->fetch();
return $row ?: null;
}
function fetch_booked_seats(int $showId): array {
$pdo = db();
$stmt = $pdo->prepare("SELECT seats FROM bookings WHERE show_id = ? AND status = 'booked'");
$stmt->execute([$showId]);
$booked = [];
foreach ($stmt->fetchAll() as $row) {
$parts = array_filter(array_map('trim', explode(',', $row['seats'])));
foreach ($parts as $seat) {
$booked[$seat] = true;
}
}
return array_keys($booked);
}
function generate_booking_code(PDO $pdo): string {
do {
$code = strtoupper(bin2hex(random_bytes(3)));
$stmt = $pdo->prepare("SELECT COUNT(*) FROM bookings WHERE booking_code = ?");
$stmt->execute([$code]);
} while ((int)$stmt->fetchColumn() > 0);
return $code;
}
ensure_schema();
seed_data();