up
This commit is contained in:
@@ -0,0 +1,144 @@
|
||||
<?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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user