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

81 lines
2.9 KiB
PHP

<?php
date_default_timezone_set('America/Lima');
require_once 'db/config.php';
// Asegurarse de que el usuario esté logueado
if (!isset($_SESSION['user_id'])) {
$_SESSION['error'] = "Debe iniciar sesión para realizar esta acción.";
header("Location: auth/login.php");
exit();
}
if ($_SERVER["REQUEST_METHOD"] == "POST") {
$producto_id = $_POST['producto_id'];
$ciudad_id = $_POST['ciudad_id'];
$cantidad = $_POST['cantidad'];
$observacion = $_POST['descripcion']; // El campo del formulario se llama 'descripcion'
$usuario_id = $_SESSION['user_id'];
$fecha = $_POST['fecha'];
if (empty($producto_id) || empty($ciudad_id) || empty($cantidad) || $cantidad <= 0) {
$_SESSION['error'] = "Por favor, complete todos los campos obligatorios.";
header("Location: registrar_salida.php");
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) {
$_SESSION['error'] = "No hay stock suficiente para realizar esta operación. Stock actual: " . ($stock_disponible ?: 0);
header("Location: registrar_salida.php");
$pdo->rollBack();
exit();
}
// 2. Actualizar el stock en la ciudad
$stmt = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual - :cantidad WHERE producto_id = :producto_id AND ciudad_id = :ciudad_id");
$stmt->execute([
'cantidad' => $cantidad,
'producto_id' => $producto_id,
'ciudad_id' => $ciudad_id
]);
// 3. Registrar el movimiento de salida
$stmt = $pdo->prepare(
"INSERT INTO movimientos (tipo, producto_id, ciudad_origen_id, cantidad, usuario_id, observacion, fecha, fecha_registro)
VALUES ('Salida', :producto_id, :ciudad_origen_id, :cantidad, :usuario_id, :observacion, :fecha, NOW())"
);
$stmt->execute([
'producto_id' => $producto_id,
'ciudad_origen_id' => $ciudad_id,
'cantidad' => $cantidad,
'usuario_id' => $usuario_id,
'observacion' => $observacion,
'fecha' => $fecha
]);
$pdo->commit();
$_SESSION['success'] = "Salida de producto registrada correctamente.";
header("Location: productos.php");
exit();
} catch (Exception $e) {
$pdo->rollBack();
$_SESSION['error'] = "Error al registrar la salida: " . $e->getMessage();
header("Location: registrar_salida.php");
exit();
}
} else {
header("Location: registrar_salida.php");
exit();
}
?>