76 lines
3.0 KiB
PHP
76 lines
3.0 KiB
PHP
<?php
|
|
header('Content-Type: application/json');
|
|
require_once 'db/config.php';
|
|
|
|
$response = ['success' => false, 'message' => 'Petición inválida.'];
|
|
|
|
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
|
$sede_id = isset($_POST['sede_id']) ? trim($_POST['sede_id']) : '';
|
|
$product_id_raw = isset($_POST['product_id']) ? trim($_POST['product_id']) : '';
|
|
$quantity_to_remove = isset($_POST['quantity']) ? (int)$_POST['quantity'] : 0;
|
|
|
|
// Extraer el ID numérico del producto
|
|
$product_id_parts = explode('-', $product_id_raw);
|
|
$product_id = end($product_id_parts);
|
|
|
|
if (empty($sede_id) || !is_numeric($product_id) || $quantity_to_remove <= 0) {
|
|
$response['message'] = 'Por favor, complete todos los campos correctamente.';
|
|
echo json_encode($response);
|
|
exit;
|
|
}
|
|
|
|
$pdo = db();
|
|
$pdo->beginTransaction();
|
|
|
|
try {
|
|
// 1. Obtener el stock actual y bloquear la fila para evitar concurrencia
|
|
$stmt = $pdo->prepare("SELECT quantity FROM stock_sedes WHERE sede_id = :sede_id AND product_id = :product_id FOR UPDATE");
|
|
$stmt->execute(['sede_id' => $sede_id, 'product_id' => $product_id]);
|
|
$stock = $stmt->fetch(PDO::FETCH_ASSOC);
|
|
|
|
$current_quantity = $stock ? (int)$stock['quantity'] : 0;
|
|
|
|
if ($current_quantity < $quantity_to_remove) {
|
|
$response['message'] = "No se puede retirar más stock del disponible. Stock actual: {$current_quantity}.";
|
|
$pdo->rollBack();
|
|
echo json_encode($response);
|
|
exit;
|
|
}
|
|
|
|
// 2. Calcular la nueva cantidad
|
|
$new_quantity = $current_quantity - $quantity_to_remove;
|
|
|
|
// 3. Actualizar la tabla de stock
|
|
$update_stmt = $pdo->prepare(
|
|
"UPDATE stock_sedes SET quantity = :new_quantity WHERE sede_id = :sede_id AND product_id = :product_id"
|
|
);
|
|
$update_stmt->execute([
|
|
'new_quantity' => $new_quantity,
|
|
'sede_id' => $sede_id,
|
|
'product_id' => $product_id
|
|
]);
|
|
|
|
// 4. (Opcional pero recomendado) Registrar el movimiento
|
|
$movement_stmt = $pdo->prepare(
|
|
"INSERT INTO stock_movements (product_id, sede_id, quantity, type, movement_date) VALUES (:product_id, :sede_id, :quantity, 'salida', NOW())"
|
|
);
|
|
$movement_stmt->execute([
|
|
'product_id' => $product_id,
|
|
'sede_id' => $sede_id,
|
|
'quantity' => $quantity_to_remove
|
|
]);
|
|
|
|
$pdo->commit();
|
|
$response['success'] = true;
|
|
$response['message'] = "Salida manual registrada con éxito. Stock actualizado a {$new_quantity} unidades.";
|
|
|
|
} catch (PDOException $e) {
|
|
$pdo->rollBack();
|
|
// En un entorno de producción, no deberías exponer el mensaje de error detallado.
|
|
// Considera registrar el error en un archivo de logs.
|
|
$response['message'] = 'Error en la base de datos al procesar la solicitud.'; // Mensaje genérico para el usuario
|
|
}
|
|
}
|
|
|
|
echo json_encode($response);
|
|
?>
|