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

116 lines
4.1 KiB
PHP

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