40362-vm/checkout.php
2026-06-30 17:47:46 +00:00

101 lines
6.6 KiB
PHP
Raw Permalink 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);
session_start();
require_once __DIR__ . '/includes/store.php';
$items = cart_items();
$errors = [];
$orderId = null;
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
if (!$items) { $errors[] = 'Tu carrito está vacío.'; }
$name = trim((string)($_POST['customer_name'] ?? ''));
$email = trim((string)($_POST['customer_email'] ?? ''));
$phone = trim((string)($_POST['customer_phone'] ?? ''));
$notes = trim((string)($_POST['delivery_notes'] ?? ''));
$method = (string)($_POST['payment_method'] ?? 'qr');
if ($name === '' || mb_strlen($name) < 2) { $errors[] = 'Escribe tu nombre.'; }
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = 'Escribe un email válido.'; }
if ($phone === '' || mb_strlen($phone) < 6) { $errors[] = 'Escribe un teléfono válido.'; }
if (!in_array($method, ['qr', 'card', 'transfer'], true)) { $errors[] = 'Selecciona un método de pago.'; }
$proofPath = null;
if (isset($_FILES['proof']) && is_uploaded_file($_FILES['proof']['tmp_name'])) {
$max = 8 * 1024 * 1024;
$allowed = ['image/jpeg' => 'jpg', 'image/png' => 'png', 'application/pdf' => 'pdf'];
$mime = mime_content_type($_FILES['proof']['tmp_name']) ?: '';
if ($_FILES['proof']['size'] > $max) { $errors[] = 'El comprobante no puede superar 8 MB.'; }
if (!isset($allowed[$mime])) { $errors[] = 'El comprobante debe ser JPG, PNG o PDF.'; }
if (!$errors) {
$dir = __DIR__ . '/assets/uploads';
if (!is_dir($dir)) { mkdir($dir, 0775, true); }
$filename = 'proof-' . date('YmdHis') . '-' . bin2hex(random_bytes(4)) . '.' . $allowed[$mime];
if (move_uploaded_file($_FILES['proof']['tmp_name'], $dir . '/' . $filename)) {
$proofPath = 'assets/uploads/' . $filename;
} else { $errors[] = 'No se pudo guardar el comprobante.'; }
}
} else {
$errors[] = 'Sube el comprobante para revisión manual.';
}
if (!$errors) {
$orderId = create_order([
'customer_name' => $name,
'customer_email' => $email,
'customer_phone' => $phone,
'delivery_notes' => $notes,
'payment_method' => $method,
'proof_path' => $proofPath,
'items' => $items,
'total' => cart_total(),
]);
$_SESSION['cart'] = [];
header('Location: checkout.php?success=' . $orderId);
exit;
}
}
$successId = isset($_GET['success']) ? (int)$_GET['success'] : 0;
$order = $successId ? get_order($successId) : null;
$selectedMethod = (string)($_POST['payment_method'] ?? 'qr');
layout_header('Checkout', 'Checkout con QR, tarjeta, transferencia y comprobante manual para LA BORGUITA.');
?>
<section class="py-5">
<div class="container">
<?php if ($order): ?>
<div class="confirmation"><span class="eyebrow">Pedido recibido</span><h1>Pago pendiente de aprobación</h1><p>Tu pedido #<?= (int)$order['id'] ?> fue registrado por <?= h($order['customer_name']) ?>. El admin revisará el comprobante y cambiará el estado a aprobado.</p><a class="btn btn-dark" href="index.php#catalogo">Seguir comprando</a><a class="btn btn-outline-dark" href="admin.php">Ver panel admin</a></div>
<?php elseif (!$items): ?>
<div class="empty-state"><h1>No hay productos para pagar</h1><p>Agrega productos al carrito para continuar.</p><a class="btn btn-dark" href="index.php#catalogo">Ir al catálogo</a></div>
<?php else: ?>
<div class="section-heading"><span class="eyebrow">Pago manual</span><h1>Confirma tu pedido</h1><p>Elige QR, tarjeta Visa/Mastercard o transferencia. Por ahora la confirmación es manual con comprobante.</p></div>
<?php if ($errors): ?><div class="alert alert-danger"><strong>Revisa:</strong><ul class="mb-0"><?php foreach ($errors as $error): ?><li><?= h($error) ?></li><?php endforeach; ?></ul></div><?php endif; ?>
<div class="row g-4">
<div class="col-lg-7">
<form class="surface form-panel" method="post" enctype="multipart/form-data" novalidate>
<div class="row g-3">
<div class="col-md-6"><label class="form-label">Nombre</label><input class="form-control" name="customer_name" required value="<?= h((string)($_POST['customer_name'] ?? '')) ?>"></div>
<div class="col-md-6"><label class="form-label">Email</label><input class="form-control" type="email" name="customer_email" required value="<?= h((string)($_POST['customer_email'] ?? '')) ?>"></div>
<div class="col-md-6"><label class="form-label">WhatsApp / teléfono</label><input class="form-control" name="customer_phone" required value="<?= h((string)($_POST['customer_phone'] ?? '')) ?>"></div>
<div class="col-md-6">
<label class="form-label">Método</label>
<select class="form-select" name="payment_method">
<option value="qr" <?= $selectedMethod === 'qr' ? 'selected' : '' ?>>QR de pago</option>
<option value="card" <?= $selectedMethod === 'card' ? 'selected' : '' ?>>Visa/Mastercard MX/US</option>
<option value="transfer" <?= $selectedMethod === 'transfer' ? 'selected' : '' ?>>Transferencia</option>
</select>
<?= payment_icons_html('mt-2') ?>
</div>
<div class="col-12"><label class="form-label">Notas de entrega</label><textarea class="form-control" name="delivery_notes" rows="3"><?= h((string)($_POST['delivery_notes'] ?? '')) ?></textarea></div>
<div class="col-12"><label class="form-label">Comprobante de pago</label><input class="form-control" type="file" name="proof" accept="image/png,image/jpeg,application/pdf" required><div class="form-text">JPG, PNG o PDF hasta 8 MB. El admin aprobará manualmente.</div></div>
</div>
<button class="btn btn-dark btn-lg mt-4" type="submit">Enviar comprobante</button>
</form>
</div>
<div class="col-lg-5">
<aside class="surface summary"><div class="scan-box compact"><span>QR de pago</span><small>Coloca el QR real aquí más adelante.</small></div><div class="accepted-cards"><span>Aceptamos tarjetas</span><?= payment_icons_html('compact') ?></div><h2>Resumen</h2><?php foreach ($items as $item): ?><div class="summary-line"><span><?= h($item['name']) ?> × <?= (int)$item['qty'] ?></span><strong><?= h(money((float)$item['line_total'])) ?></strong></div><?php endforeach; ?><div class="summary-total"><span>Total</span><strong><?= h(money(cart_total())) ?></strong></div></aside>
</div>
</div>
<?php endif; ?>
</div>
</section>
<?php layout_footer(); ?>