<?php
// =========================================================================
// 1. CONFIGURACIÓN PRINCIPAL (EDITA ESTOS DATOS)
// =========================================================================
$db_host = 'localhost';
$db_name = 'tu_base_de_datos';$db_user = 'tu_usuario_mysql';
$db_pass = 'tu_contrasena_mysql';$clave_admin = '1234'; // Clave para que el cumpleañero vea los confirmados
// Datos del Evento
$evento = [
'nombre' => 'Camilo Andrés',
'fecha_texto' => 'Sábado, 28 de Noviembre • 7:00 PM',
'fecha_iso' => '2026-11-28T19:00:00', // Formato YYYY-MM-DDTHH:MM:SS
'ics_inicio' => '20261128T190000',
'ics_fin' => '20261129T010000',
'lugar' => 'Salón Terraza Mirador — Cra. 15 # 93-40, Bogotá',
'lat' => '4.6768',
'lng' => '-74.0483',
'limite_rsvp' => '22 de noviembre',
'cuentas' => [
['banco' => 'Nequi / Llave Bre-B', 'numero' => '3104567890'],
['banco' => 'Daviplata', 'numero' => '3104567890'],
['banco' => 'Bancolombia Ahorros','numero' => '12345678901']
]
];
// =========================================================================
// 2. CONEXIÓN Y AUTOINSTALACIÓN DE TABLAS MYSQL
// =========================================================================
try {
$pdo = new PDO("mysql:host=$db_host;dbname=$db_name;charset=utf8mb4", $db_user,$db_pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);
// Crear tablas automáticamente si no existen
$pdo->exec("CREATE TABLE IF NOT EXISTS rsvp_cumple (
id INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(120) NOT NULL,
asiste ENUM('si', 'no') NOT NULL,
cupos INT DEFAULT 1,
mensaje VARCHAR(255) DEFAULT '',
fecha_registro TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
$pdo->exec("CREATE TABLE IF NOT EXISTS regalos_cumple (
id INT AUTO_INCREMENT PRIMARY KEY,
titulo VARCHAR(150) NOT NULL,
detalle VARCHAR(150) DEFAULT '',
estado ENUM('disponible', 'apartado') DEFAULT 'disponible',
apartado_por VARCHAR(120) DEFAULT NULL,
fecha_apartado TIMESTAMP NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;");
// Insertar regalos iniciales solo si la tabla está vacía
$count =$pdo->query("SELECT COUNT(*) FROM regalos_cumple")->fetchColumn();
if ($count == 0) {$pdo->exec("INSERT INTO regalos_cumple (titulo, detalle) VALUES
('Perfume Invictus Victory', 'Frasco 100 ml'),
('Tenis casuales blancos', 'Talla 41'),
('Bono de regalo Zara / Falabella', 'Cualquier valor'),
('Audífonos inalámbricos', 'Color negro')");
}
} catch (PDOException $e) {
if (isset($_REQUEST['action'])) {
header('Content-Type: application/json; charset=utf-8');
echo json_encode(['ok' => false, 'error' => 'Error de conexión a la base de datos']);
exit;
}
die("
Error de conexión MySQL: Verifica tus credenciales en las líneas 5-8 de este archivo.
");
}
// =========================================================================
// 3. ENDPOINTS API EN TIEMPO REAL (AJAX)
// =========================================================================
if (isset($_REQUEST['action'])) {
header('Content-Type: application/json; charset=utf-8');
$action =$_REQUEST['action'];
// Obtener regalos
if ($action === 'get_regalos') {
$stmt =$pdo->query("SELECT id, titulo, detalle, estado FROM regalos_cumple ORDER BY id ASC");
echo json_encode(['ok' => true, 'regalos' => $stmt->fetchAll()]);
exit;
}
// Apartar regalo
if ($action === 'apartar_regalo' &&$_SERVER['REQUEST_METHOD'] === 'POST') {
$id = intval($_POST['id'] ?? 0);
$nombre = trim($_POST['nombre'] ?? 'Invitado');
if ($id <= 0) {
echo json_encode(['ok' => false, 'error' => 'Regalo inválido']);
exit;
}
$stmt =$pdo->prepare("UPDATE regalos_cumple SET estado = 'apartado', apartado_por = ?, fecha_apartado = NOW() WHERE id = ? AND estado = 'disponible'");
$stmt->execute([$nombre,$id]);
if ($stmt->rowCount() > 0) {
echo json_encode(['ok' => true]);
} else {
echo json_encode(['ok' => false, 'error' => 'Este regalo ya fue elegido por otro invitado.']);
}
exit;
}
// Guardar confirmación RSVP
if ($action === 'guardar_rsvp' && $_SERVER['REQUEST_METHOD'] === 'POST') {$nombre = trim($_POST['nombre'] ?? '');$asiste = ($_POST['asiste'] ?? 'si') === 'no' ? 'no' : 'si';$cupos = $asiste === 'si' ? max(1, min(10, intval($_POST['cupos'] ?? 1))) : 0;
$mensaje = trim($_POST['mensaje'] ?? '');
if ($nombre === '') {
echo json_encode(['ok' => false, 'error' => 'Por favor escribe tu nombre.']);
exit;
}
$stmt =$pdo->prepare("INSERT INTO rsvp_cumple (nombre, asiste, cupos, mensaje) VALUES (?, ?, ?, ?)");
$stmt->execute([$nombre,$asiste, $cupos,$mensaje]);
echo json_encode(['ok' => true]);
exit;
}
// Reporte privado del anfitrión
if ($action === 'admin_report' &&$_SERVER['REQUEST_METHOD'] === 'POST') {
$clave =$_POST['clave'] ?? '';
if ($clave !==$clave_admin) {
echo json_encode(['ok' => false, 'error' => 'Clave incorrecta']);
exit;
}
$invitados =$pdo->query("SELECT nombre, asiste, cupos, mensaje, fecha_registro FROM rsvp_cumple ORDER BY id DESC")->fetchAll();
$regalos =$pdo->query("SELECT titulo, detalle, estado, apartado_por FROM regalos_cumple ORDER BY id ASC")->fetchAll();
$total_cupos = 0;
foreach ($invitados as$inv) {
if ($inv['asiste'] === 'si') $total_cupos += intval($inv['cupos']);
}
echo json_encode([
'ok' => true,
'total_cupos' => $total_cupos,
'invitados' => $invitados,
'regalos' => $regalos
]);
exit;
}
echo json_encode(['ok' => false, 'error' => 'Acción no válida']);
exit;
}
?>
Cumpleaños de <?= htmlspecialchars($evento['nombre']) ?>