info('🚀 Iniciando migración completa de stock a bodega principal...'); DB::beginTransaction(); try { // 1. Crear o encontrar la bodega principal $bodegaPrincipal = Bodega::firstOrCreate([ 'nombre' => 'Principal' ], [ 'descripcion' => 'Bodega principal del sistema', 'ubicacion' => 'Sede principal', 'estado' => true ]); $this->info("✅ Bodega principal: {$bodegaPrincipal->nombre}"); // 2. MIGRAR PRODUCTOS DIRECTOS (sin variantes) $this->info("\n📦 Migrando productos directos..."); $productosDirectos = Producto::where('estado', true) ->where('stock', '>', 0) ->whereDoesntHave('variants') // Solo productos sin variantes ->get(); $this->info("Encontrados {$productosDirectos->count()} productos directos con stock"); $productosActualizados = 0; foreach ($productosDirectos as $producto) { // 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 actual del producto $producto->bodegas()->attach($bodegaPrincipal->id, [ 'stock' => $producto->stock ]); $this->line("✓ {$producto->nombre}: {$producto->stock} unidades → Bodega Principal"); $productosActualizados++; } else { // Actualizar el stock existente $stockActual = $producto->bodegas() ->where('bodega_id', $bodegaPrincipal->id) ->first()->pivot->stock; $nuevoStock = $stockActual + $producto->stock; $producto->bodegas()->updateExistingPivot($bodegaPrincipal->id, [ 'stock' => $nuevoStock ]); $this->line("✓ {$producto->nombre}: {$stockActual} + {$producto->stock} = {$nuevoStock} unidades → Bodega Principal"); $productosActualizados++; } } // 3. MIGRAR VARIANTES DE PRODUCTOS $this->info("\n🔄 Migrando variantes de productos..."); $variantes = ProductVariant::with('producto') ->where('stock', '>', 0) ->get(); $this->info("Encontradas {$variantes->count()} variantes con stock"); $variantesActualizadas = 0; foreach ($variantes as $variante) { // Verificar si ya existe una relación con esta bodega $existeRelacion = $variante->bodegas() ->where('bodega_id', $bodegaPrincipal->id) ->exists(); if (!$existeRelacion) { // Crear la relación con el stock actual de la variante $variante->bodegas()->attach($bodegaPrincipal->id, [ 'stock' => $variante->stock ]); $this->line("✓ {$variante->producto->nombre} [{$variante->sku}]: {$variante->stock} unidades → Bodega Principal"); $variantesActualizadas++; } else { // Actualizar el stock existente sumando el stock de la variante $stockActual = $variante->bodegas() ->where('bodega_id', $bodegaPrincipal->id) ->first()->pivot->stock; $nuevoStock = $stockActual + $variante->stock; $variante->bodegas()->updateExistingPivot($bodegaPrincipal->id, [ 'stock' => $nuevoStock ]); $this->line("✓ {$variante->producto->nombre} [{$variante->sku}]: {$stockActual} + {$variante->stock} = {$nuevoStock} unidades → Bodega Principal"); $variantesActualizadas++; } } DB::commit(); $this->info("\n🎉 Migración completa de stock exitosa!"); $this->info("📦 Productos directos procesados: {$productosActualizados}"); $this->info("� Variantes procesadas: {$variantesActualizadas}"); $this->info("🏢 Bodega principal: {$bodegaPrincipal->nombre}"); $this->info("📊 Total de elementos migrados: " . ($productosActualizados + $variantesActualizadas)); } catch (\Exception $e) { DB::rollBack(); $this->error("❌ Error durante la migración: " . $e->getMessage()); $this->error("🔍 Línea: " . $e->getLine()); return Command::FAILURE; } return Command::SUCCESS; } }