beginTransaction(); // 1. Verificar si ya existe stock para este producto en esta ciudad $stmt = $pdo->prepare("SELECT id 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_id = $stmt->fetchColumn(); // 2. Actualizar o insertar el stock if ($stock_id) { // Si existe, actualizar $stmt = $pdo->prepare("UPDATE stock_por_ciudad SET stock_actual = stock_actual + :cantidad WHERE id = :stock_id"); $stmt->execute(['cantidad' => $cantidad, 'stock_id' => $stock_id]); } else { // Si no existe, insertar $stmt = $pdo->prepare("INSERT INTO stock_por_ciudad (producto_id, ciudad_id, stock_actual) VALUES (:producto_id, :ciudad_id, :stock_actual)"); $stmt->execute(['producto_id' => $producto_id, 'ciudad_id' => $ciudad_id, 'stock_actual' => $cantidad]); } // 3. Registrar el movimiento de entrada $fecha = $_POST['fecha']; $stmt = $pdo->prepare( "INSERT INTO movimientos (tipo, producto_id, ciudad_destino_id, cantidad, usuario_id, observacion, fecha, fecha_registro) VALUES ('Entrada', :producto_id, :ciudad_destino_id, :cantidad, :usuario_id, :observacion, :fecha, NOW())" ); $stmt->execute([ 'producto_id' => $producto_id, 'ciudad_destino_id' => $ciudad_id, 'cantidad' => $cantidad, 'usuario_id' => $usuario_id, 'observacion' => $observacion, 'fecha' => $fecha ]); $pdo->commit(); $_SESSION['success'] = "Entrada de stock registrada correctamente."; header("Location: productos.php"); exit(); } catch (Exception $e) { $pdo->rollBack(); $_SESSION['error'] = "Error al registrar la entrada: " . $e->getMessage(); header("Location: registrar_entrada.php"); exit(); } } else { header("Location: registrar_entrada.php"); exit(); } ?>