diff --git a/app/Models/OrdenProduccion.php b/app/Models/OrdenProduccion.php index 1cf1272..b7dafcf 100644 --- a/app/Models/OrdenProduccion.php +++ b/app/Models/OrdenProduccion.php @@ -181,6 +181,10 @@ class OrdenProduccion extends Model { if ($this->canBeFinalized()) { $this->update(['estado' => 'finalizada']); + + // Crear inventario si corresponde + $this->crearInventarioPorFinalizacion(); + return true; } return false; @@ -212,62 +216,67 @@ class OrdenProduccion extends Model // Si la orden llega a finalizada, crear entrada en inventario con lo que haya ingresado if ($this->estado === 'finalizada') { - // Sumar procesos de acabados recibidos para determinar cantidad terminada - $cantidad = \App\Models\ProcesoAcabado::where('orden_produccion_id', $this->id) - ->whereNotNull('fecha_recepcion') - ->sum('cantidad_recibida'); - - // Crear inventario solo si hay traslados a bodega con cantidad - if ($cantidad > 0 && !\App\Models\InventarioPrenda::where('orden_produccion_id', $this->id)->exists()) { - // Determinar producto asociado: preferir producto_id en la OP, sino crear/buscar por prenda_modelo - $productoId = $this->producto_id; - - if (! $productoId) { - $nombre = $this->prenda_modelo ?? $this->referencia ?? null; - if ($nombre) { - // Generar código de barras único por defecto para productos creados automáticamente - $codigo = 'AUTOP-' . $this->id . '-' . time(); - $codigo = substr($codigo, 0, 50); - - // Asegurar unicidad - while (\App\Models\Producto::where('codigo_barras', $codigo)->exists()) { - $codigo .= '-' . rand(0, 9); - $codigo = substr($codigo, 0, 50); - } - - $producto = \App\Models\Producto::firstOrCreate( - ['nombre' => $nombre], - [ - 'descripcion' => 'Creado automáticamente desde OrdenProduccion #' . $this->id, - 'stock' => 0, - 'estado' => true, - 'precio_compra' => 0, - 'precio_venta' => 0, - 'unidad_medida' => 'unidad', - 'codigo_barras' => $codigo, - ] - ); - - $productoId = $producto->id; - - // Guardar vínculo en la OP para futuras referencias - $this->producto_id = $productoId; - $this->save(); - } - } - - \App\Models\InventarioPrenda::create([ - 'orden_produccion_id' => $this->id, - 'cantidad_terminada' => $cantidad, - 'cantidad_disponible' => $cantidad, - 'fecha_ingreso' => now(), - 'estado' => 'en_bodega', - 'producto_id' => $productoId ?? null, - ]); - - // Si se creó inventario, también actualizar stock del producto asociado (handler en InventarioPrenda lo hará) - } + $this->crearInventarioPorFinalizacion(); } } } + + protected function crearInventarioPorFinalizacion(): void + { + // Sumar procesos de acabados recibidos para determinar cantidad terminada + $cantidad = \App\Models\ProcesoAcabado::where('orden_produccion_id', $this->id) + ->whereNotNull('fecha_recepcion') + ->sum('cantidad_recibida'); + + // Crear inventario solo si hay traslados a bodega con cantidad + if ($cantidad > 0 && !\App\Models\InventarioPrenda::where('orden_produccion_id', $this->id)->exists()) { + // Determinar producto asociado: preferir producto_id en la OP, sino crear/buscar por prenda_modelo + $productoId = $this->producto_id; + + if (! $productoId) { + $nombre = $this->prenda_modelo ?? $this->referencia ?? null; + if ($nombre) { + // Generar código de barras único por defecto para productos creados automáticamente + $codigo = 'AUTOP-' . $this->id . '-' . time(); + $codigo = substr($codigo, 0, 50); + + // Asegurar unicidad + while (\App\Models\Producto::where('codigo_barras', $codigo)->exists()) { + $codigo .= '-' . rand(0, 9); + $codigo = substr($codigo, 0, 50); + } + + $producto = \App\Models\Producto::firstOrCreate( + ['nombre' => $nombre], + [ + 'descripcion' => 'Creado automáticamente desde OrdenProduccion #' . $this->id, + 'stock' => 0, + 'estado' => true, + 'precio_compra' => 0, + 'precio_venta' => 0, + 'unidad_medida' => 'unidad', + 'codigo_barras' => $codigo, + ] + ); + + $productoId = $producto->id; + + // Guardar vínculo en la OP para futuras referencias + $this->producto_id = $productoId; + $this->save(); + } + } + + \App\Models\InventarioPrenda::create([ + 'orden_produccion_id' => $this->id, + 'cantidad_terminada' => $cantidad, + 'cantidad_disponible' => $cantidad, + 'fecha_ingreso' => now(), + 'estado' => 'en_bodega', + 'producto_id' => $productoId ?? null, + ]); + + // Si se creó inventario, también actualizar stock del producto asociado (handler en InventarioPrenda lo hará) + } + } } diff --git a/resources/views/filament/widgets/pipeline-orders-widget.blade.php b/resources/views/filament/widgets/pipeline-orders-widget.blade.php index 209abea..6213bb3 100644 --- a/resources/views/filament/widgets/pipeline-orders-widget.blade.php +++ b/resources/views/filament/widgets/pipeline-orders-widget.blade.php @@ -8,7 +8,11 @@ @foreach($ordersByState[$stateKey] as $op)
#{{ $op->numero_orden }} — {{ $op->prenda_modelo }}
-
Cant: {{ $op->cantidad_total }} · Metros: {{ $op->metros_requeridos }} · Entrega: {{ $op->fecha_entrega_estimada }}
+ +
+ Cant: {{ $op->cantidad_total }} · Realizado: {{ $op->realizado }} · Faltan: {{ $op->faltantes }}
+ Tela: {{ $op->tela?->codigo ?? '—' }} · Estado: {{ \Illuminate\Support\Str::title(str_replace('_', ' ', $op->estado)) }} · Entrega: {{ $op->fecha_entrega_estimada }} +
Ver