info('Iniciando migración de stock a bodega principal...'); DB::beginTransaction(); try { // 1. Crear o encontrar la bodega principal $bodegaPrincipal = Bodega::firstOrCreate([ 'nombre' => 'Principal' ]); $this->info("Bodega principal creada/encontrada: {$bodegaPrincipal->nombre}"); // 2. Obtener todos los productos que necesitan migración $productos = Producto::with('variants')->get()->filter(function ($producto) { // Productos con stock directo O con variantes que tienen stock return $producto->stock > 0 || ($producto->variants()->exists() && $producto->variants()->sum('stock') > 0); }); $this->info("Encontrados {$productos->count()} productos con stock para migrar"); $productosActualizados = 0; foreach ($productos as $producto) { // Calcular stock total a migrar $stockAMigrar = 0; if ($producto->variants()->exists()) { // Para productos con variantes, usar la suma de variantes $stockAMigrar = $producto->variants()->sum('stock'); $this->line(" → Producto con variantes: {$producto->nombre}"); $this->line(" Stock total de variantes: {$stockAMigrar}"); } else { // Para productos sin variantes, usar stock directo $stockAMigrar = $producto->stock; } if ($stockAMigrar <= 0) { continue; // Saltar productos sin stock } // Verificar si ya existe una relación con esta bodega $existeRelacion = $producto->bodegas() ->where('bodega_id', $bodegaPrincipal->id) ->exists(); if (!$existeRelacion) { // Crear la relación con el stock calculado $producto->bodegas()->attach($bodegaPrincipal->id, [ 'stock' => $stockAMigrar ]); $this->line("✓ {$producto->nombre}: {$stockAMigrar} unidades → Bodega Principal"); $productosActualizados++; } else { // Actualizar el stock existente sumando el stock calculado $stockActual = $producto->bodegas() ->where('bodega_id', $bodegaPrincipal->id) ->first()->pivot->stock; $nuevoStock = $stockActual + $stockAMigrar; $producto->bodegas()->updateExistingPivot($bodegaPrincipal->id, [ 'stock' => $nuevoStock ]); $this->line("✓ {$producto->nombre}: {$stockActual} + {$stockAMigrar} = {$nuevoStock} unidades → Bodega Principal"); $productosActualizados++; } } DB::commit(); $this->info("\n🎉 Migración completada exitosamente!"); $this->info("📦 Productos procesados: {$productosActualizados}"); $this->info("🏢 Bodega principal: {$bodegaPrincipal->nombre}"); } catch (\Exception $e) { DB::rollBack(); $this->error("❌ Error durante la migración: " . $e->getMessage()); return Command::FAILURE; } return Command::SUCCESS; } }