Initial commit: Proyecto Portal ePromos completo con documentación unificada y seguridad base
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once __DIR__ . '/../admin/db.php';
|
||||
|
||||
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
|
||||
|
||||
try {
|
||||
// JSON o form
|
||||
$raw = file_get_contents('php://input');
|
||||
$data = json_decode($raw, true);
|
||||
if (!is_array($data)) $data = $_POST;
|
||||
|
||||
$rasca_id = isset($data['rasca_id']) ? (int)$data['rasca_id'] : 0;
|
||||
$porcentaje = isset($data['percent']) ? (float)$data['percent'] : null; // opcional
|
||||
|
||||
if ($rasca_id <= 0) { echo json_encode(['ok'=>false,'error'=>'rasca_id inválido']); exit; }
|
||||
|
||||
// Premios activos con stock (NULL = ilimitado)
|
||||
$sql = "SELECT id, nombre, probabilidad, stock, activo, imagen_url
|
||||
FROM rasca_premios
|
||||
WHERE rasca_id=? AND activo=1
|
||||
AND (stock IS NULL OR stock > 0)
|
||||
AND probabilidad > 0";
|
||||
$st = $conn->prepare($sql);
|
||||
$st->bind_param('i', $rasca_id);
|
||||
$st->execute();
|
||||
$st->bind_result($id, $nombre, $prob, $stock, $activo, $img);
|
||||
|
||||
$premios = []; $total = 0.0;
|
||||
while ($st->fetch()) {
|
||||
$prob = (float)$prob;
|
||||
$premios[] = [
|
||||
'id' => (int)$id,
|
||||
'nombre' => $nombre,
|
||||
'prob' => $prob,
|
||||
'stock' => is_null($stock) ? null : (int)$stock,
|
||||
'imagen_url' => $img ?: null
|
||||
];
|
||||
$total += max(0.0, $prob);
|
||||
}
|
||||
$st->close();
|
||||
|
||||
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? null;
|
||||
$ua = $_SERVER['HTTP_USER_AGENT'] ?? null;
|
||||
|
||||
if (!$premios) {
|
||||
// Sin premios disponibles: registra jugada sin premio
|
||||
$conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
|
||||
VALUES (?,?,?,?,NULL)")
|
||||
->bind_param('issd', $rasca_id, $ip, $ua, $porcentaje)
|
||||
->execute();
|
||||
echo json_encode(['ok'=>true,'sin_premio'=>true,'mensaje'=>'No hay premios activos o con stock']);
|
||||
exit;
|
||||
}
|
||||
if ($total <= 0) { echo json_encode(['ok'=>false,'error'=>'Probabilidades inválidas']); exit; }
|
||||
|
||||
// Selección ponderada
|
||||
$rnd = mt_rand() / mt_getrandmax() * $total;
|
||||
$acc = 0.0; $pick = null;
|
||||
foreach ($premios as $p) { $acc += max(0.0, $p['prob']); if ($rnd <= $acc) { $pick = $p; break; } }
|
||||
if ($pick === null) $pick = $premios[0];
|
||||
|
||||
// Transacción: descontar stock (si aplica) y registrar jugada
|
||||
$conn->begin_transaction();
|
||||
|
||||
if ($pick['stock'] !== null) {
|
||||
$upd = $conn->prepare("UPDATE rasca_premios SET stock = stock - 1 WHERE id=? AND stock > 0");
|
||||
$upd->bind_param('i', $pick['id']);
|
||||
$upd->execute();
|
||||
if ($upd->affected_rows === 0) {
|
||||
$conn->rollback();
|
||||
// stock se agotó en carrera; registra jugada sin premio
|
||||
$conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
|
||||
VALUES (?,?,?,?,NULL)")
|
||||
->bind_param('issd', $rasca_id, $ip, $ua, $porcentaje)
|
||||
->execute();
|
||||
echo json_encode(['ok'=>true,'sin_premio'=>true,'mensaje'=>'Stock agotado']);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
$ins = $conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
|
||||
VALUES (?,?,?,?,?)");
|
||||
$ins->bind_param('issdi', $rasca_id, $ip, $ua, $porcentaje, $pick['id']);
|
||||
$ins->execute();
|
||||
|
||||
$conn->commit();
|
||||
|
||||
echo json_encode([
|
||||
'ok' => true,
|
||||
'premio' => $pick['nombre'],
|
||||
'premio_id' => $pick['id'],
|
||||
'imagen_url' => $pick['imagen_url']
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
} catch (Throwable $e) {
|
||||
@mysqli_rollback($conn);
|
||||
echo json_encode(['ok'=>false,'error'=>'No hay articulos en stock.']);
|
||||
//echo json_encode(['ok'=>false,'error'=>'Sorteo falló: '.$e->getMessage()]);
|
||||
}
|
||||
Reference in New Issue
Block a user