Files
pos_heidiver/app/Console/Commands/MigrarVariantesBodegaPrincipal.php
T
2026-01-06 15:35:59 -05:00

144 lines
5.5 KiB
PHP

<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Models\Bodega;
use App\Models\ProductVariant;
use App\Models\Producto;
use Illuminate\Support\Facades\DB;
class MigrarVariantesBodegaPrincipal extends Command
{
/**
* The name and signature of the console command.
*/
protected $signature = 'stock:migrar-todo-principal';
/**
* The console command description.
*/
protected $description = 'Migra el stock de productos y variantes a la bodega principal';
/**
* Execute the console command.
*/
public function handle()
{
$this->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;
}
}