144 lines
5.5 KiB
PHP
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;
|
|
}
|
|
} |