34786-vm/handle_agregar_liquidacion.php
2025-12-12 16:33:10 +00:00

84 lines
3.0 KiB
PHP

<?php
session_start();
require_once 'db/config.php';
// Verificar que el usuario sea administrador
if (!isset($_SESSION['user_rol']) || ($_SESSION['user_rol'] !== 'admin' && $_SESSION['user_rol'] !== 'administrador')) {
// Si no es admin, redirigir o mostrar un error
header('Location: /liquidaciones.php?error=auth');
exit;
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$producto_id = $_POST['producto_id'] ?? null;
$ciudad_id = $_POST['ciudad_id'] ?? null;
$cantidad = $_POST['cantidad'] ?? null;
$cantidad_pedidos = $_POST['cantidad_pedidos'] ?? null;
$precio_liquidacion = $_POST['precio_liquidacion'] ?? null;
// Validación simple
if (empty($producto_id) || empty($ciudad_id) || empty($cantidad) || $cantidad <= 0 || empty($cantidad_pedidos) || empty($precio_liquidacion)) {
header('Location: /liquidaciones.php?error=missing_fields');
exit;
}
$pdo = db();
try {
$pdo->beginTransaction();
// 1. Verificar stock actual
$stmt = $pdo->prepare("SELECT stock_actual FROM stock_por_ciudad WHERE producto_id = :producto_id AND ciudad_id = :ciudad_id FOR UPDATE");
$stmt->execute(['producto_id' => $producto_id, 'ciudad_id' => $ciudad_id]);
$stock_disponible = $stmt->fetchColumn();
if ($stock_disponible === false || $stock_disponible < $cantidad) {
header('Location: /liquidaciones.php?error=no_stock');
$pdo->rollBack();
exit();
}
// 2. Actualizar el stock en la ciudad
$stmt_stock = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual - :cantidad WHERE producto_id = :producto_id AND ciudad_id = :ciudad_id");
$stmt_stock->execute([':cantidad' => $cantidad, ':producto_id' => $producto_id, ':ciudad_id' => $ciudad_id]);
// 3. Insertar el movimiento de salida
$stmt = $pdo->prepare("
INSERT INTO movimientos
(tipo, producto_id, cantidad, ciudad_origen_id, cantidad_pedidos, precio_liquidacion, fecha, usuario_id)
VALUES ('Salida', :producto_id, :cantidad, :ciudad_id, :cantidad_pedidos, :precio_liquidacion, NOW(), :usuario_id)
");
$user_id = get_current_user_id();
$stmt->execute([
':producto_id' => $producto_id,
':cantidad' => $cantidad,
':ciudad_id' => $ciudad_id,
':cantidad_pedidos' => $cantidad_pedidos,
':precio_liquidacion' => $precio_liquidacion,
':usuario_id' => $user_id
]);
// Confirmar transacción
$pdo->commit();
header('Location: /liquidaciones.php?success=added');
exit;
} catch (PDOException $e) {
// Revertir transacción en caso de error
if ($pdo->inTransaction()) {
$pdo->rollBack();
}
// Manejo de errores
error_log($e->getMessage());
header('Location: /liquidaciones.php?error=db_error');
exit;
}
} else {
// Si no es POST, redirigir
header('Location: /liquidaciones.php');
exit;
}
?>