101 lines
6.6 KiB
PHP
101 lines
6.6 KiB
PHP
<?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(); ?>
|