up
This commit is contained in:
@@ -125,9 +125,6 @@ class OrdenProduccionResource extends Resource
|
|||||||
TextColumn::make('prenda_modelo')
|
TextColumn::make('prenda_modelo')
|
||||||
->searchable(),
|
->searchable(),
|
||||||
|
|
||||||
TextColumn::make('referencia')
|
|
||||||
->searchable(),
|
|
||||||
|
|
||||||
TextColumn::make('cantidad_total')
|
TextColumn::make('cantidad_total')
|
||||||
->label('Cantidad'),
|
->label('Cantidad'),
|
||||||
|
|
||||||
|
|||||||
@@ -58,95 +58,7 @@ class OrdenProduccion extends Model
|
|||||||
return $this->belongsTo(\App\Models\Producto::class, 'producto_id');
|
return $this->belongsTo(\App\Models\Producto::class, 'producto_id');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Total realizado: suma de cantidad_terminada en inventarios asociados
|
|
||||||
public function getRealizadoAttribute()
|
|
||||||
{
|
|
||||||
return (int) $this->inventarioPrenda()->sum('cantidad_terminada');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Faltantes = cantidad_total - realizado
|
|
||||||
public function getFaltantesAttribute()
|
|
||||||
{
|
|
||||||
return max(0, (int)$this->cantidad_total - $this->realizado);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function avanzarEstado(): void
|
|
||||||
{
|
|
||||||
$flujo = [
|
|
||||||
'en_corte',
|
|
||||||
'en_confeccion',
|
|
||||||
'en_tintoreria',
|
|
||||||
'en_acabados',
|
|
||||||
'finalizada',
|
|
||||||
];
|
|
||||||
|
|
||||||
$actual = array_search($this->estado, $flujo, true);
|
|
||||||
|
|
||||||
if ($actual !== false && isset($flujo[$actual + 1])) {
|
|
||||||
$this->update([
|
|
||||||
'estado' => $flujo[$actual + 1],
|
|
||||||
]);
|
|
||||||
|
|
||||||
// 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á)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
protected static function booted()
|
protected static function booted()
|
||||||
{
|
{
|
||||||
@@ -357,5 +269,5 @@ class OrdenProduccion extends Model
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} }
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,15 +80,8 @@ class ProcesoAcabado extends Model
|
|||||||
->exists();
|
->exists();
|
||||||
|
|
||||||
if (!$pendientes) {
|
if (!$pendientes) {
|
||||||
$op = $acabado->ordenProduccion;
|
// Intentar finalizar la OP solo si está completada según la lógica centralizada
|
||||||
if ($op) {
|
$acabado->ordenProduccion?->tryFinalize();
|
||||||
$realizado = (int) $op->inventarioPrenda()->sum('cantidad_terminada');
|
|
||||||
if ($realizado >= (int) ($op->cantidad_total ?? 0)) {
|
|
||||||
$op->update([
|
|
||||||
'estado' => 'finalizada',
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user