beginTransaction(); $stmt = $pdo->prepare("SELECT * FROM stock_sedes WHERE product_id = :product_id AND sede_id = :sede_id FOR UPDATE"); $stmt->execute(['product_id' => $product_id, 'sede_id' => $sede_id]); $existing_stock = $stmt->fetch(); if ($existing_stock) { $new_quantity = $existing_stock['quantity'] - $quantity; if ($new_quantity < 0) { $error = "No hay stock para registrar la salida. Stock actual: " . $existing_stock['quantity']; $pdo->rollBack(); } else { $update_stmt = $pdo->prepare("UPDATE stock_sedes SET quantity = :quantity WHERE id = :id"); $update_stmt->execute(['quantity' => $new_quantity, 'id' => $existing_stock['id']]); $history_stmt = $pdo->prepare( "INSERT INTO stock_movements (product_id, sede_id, quantity, type, movement_date) VALUES (:product_id, :sede_id, :quantity, 'salida', :movement_date)" ); $history_stmt->execute([ 'product_id' => $product_id, 'sede_id' => $sede_id, 'quantity' => $quantity, 'movement_date' => $movement_date ]); $pdo->commit(); $stmt_prod_name = $pdo->prepare("SELECT nombre FROM products WHERE id = :id"); $stmt_prod_name->execute(['id' => $product_id]); $product_name = $stmt_prod_name->fetchColumn(); $message = "Salida de 1 unidad de '{$product_name}' registrada. Stock restante: {$new_quantity}."; } } else { $error = "No hay stock registrado para este producto en la sede seleccionada."; $pdo->rollBack(); } } catch (PDOException $e) { if (isset($pdo) && $pdo->inTransaction()) { $pdo->rollBack(); } // No exponer detalles del error de la DB al cliente $error = "Error al actualizar el inventario. Verifique la conexión o los datos."; // Loguear el error real para depuración error_log("PDOException en registrar_salida_api.php: " . $e->getMessage()); } } else { $error = "Faltan datos para registrar la salida (producto, sede o fecha)."; } } else { $error = "Método de solicitud no válido."; } if ($error) { $response['success'] = false; $response['message'] = $error; } else { $response['success'] = true; $response['message'] = $message; } echo json_encode($response); exit; ?>