116 lines
4.1 KiB
PHP
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;
|
|
}
|
|
}
|