84 lines
3.0 KiB
PHP
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;
|
|
}
|
|
?>
|