up
This commit is contained in:
@@ -101,78 +101,118 @@ class OjalPresillaResource extends Resource
|
||||
->visible(fn ($get) => $get('orden_produccion_id') !== null)
|
||||
->helperText('Nombre de la prenda de la orden de producción seleccionada'),
|
||||
|
||||
TextInput::make('tipo')
|
||||
->label('Tipo')
|
||||
->placeholder('Ej: Ojal, Prensilla, Botón, etc.')
|
||||
Select::make('tipo')
|
||||
->label('Tipo de Proceso')
|
||||
->options([
|
||||
'Ojal' => 'Ojal',
|
||||
'Prensilla' => 'Prensilla',
|
||||
])
|
||||
->required()
|
||||
->helperText('Especifica el tipo de accesorio'),
|
||||
->reactive()
|
||||
->afterStateUpdated(function ($state, $set, $get) {
|
||||
$opId = $get('orden_produccion_id');
|
||||
if (!$opId) return;
|
||||
|
||||
$op = \App\Models\OrdenProduccion::find($opId);
|
||||
if (!$op) return;
|
||||
|
||||
// Calcular disponibilidad según el tipo
|
||||
$cantidadRecibida = $op->confecciones->sum('cantidad_recibida');
|
||||
$arreglos = \App\Models\Ajuste::where('referencia_type', \App\Models\Confeccion::class)
|
||||
->whereHas('referencia', function($q) use ($opId) {
|
||||
$q->where('orden_produccion_id', $opId);
|
||||
})->where('tipo', 'arreglo')->sum('cantidad');
|
||||
$cobros = \App\Models\Cobro::where('referencia_type', \App\Models\Confeccion::class)
|
||||
->whereHas('referencia', function($q) use ($opId) {
|
||||
$q->where('orden_produccion_id', $opId);
|
||||
})->sum('cantidad');
|
||||
$cantidadConfecciones = $cantidadRecibida - $arreglos - $cobros;
|
||||
|
||||
if ($state === 'Ojal') {
|
||||
// Para ojales: disponible desde confección
|
||||
$yaEnviado = \App\Models\Ojal::where('orden_produccion_id', $opId)
|
||||
->sum('cantidad_enviada');
|
||||
$disponible = $cantidadConfecciones - $yaEnviado;
|
||||
$set('cantidad_enviada', max(0, $disponible));
|
||||
} else if ($state === 'Prensilla') {
|
||||
// Para prensillas: solo lo que ya terminó en ojales
|
||||
$ojalesTerminados = \App\Models\Ojal::where('orden_produccion_id', $opId)
|
||||
->where('terminada', true)
|
||||
->sum('cantidad_enviada');
|
||||
|
||||
$yaEnviado = \App\Models\Prensilla::where('orden_produccion_id', $opId)
|
||||
->sum('cantidad_enviada');
|
||||
|
||||
$disponible = $ojalesTerminados - $yaEnviado;
|
||||
$set('cantidad_enviada', max(0, $disponible));
|
||||
}
|
||||
})
|
||||
->helperText(fn ($get) => $get('tipo') === 'Prensilla'
|
||||
? '⚠️ Solo se pueden enviar prendas que hayan terminado el proceso de Ojales'
|
||||
: 'Primer proceso: las prendas vienen desde Confección'),
|
||||
|
||||
Select::make('proveedor_id')
|
||||
->label('Proveedor/Usuario Principal')
|
||||
->options(fn () => \App\Models\Proveedor::where('categoria', 'ojales_prensillas')
|
||||
->orWhere('categoria', 'empleado')
|
||||
->pluck('nombre', 'id'))
|
||||
->searchable()
|
||||
->preload()
|
||||
->nullable()
|
||||
->helperText('Principal responsable del proceso'),
|
||||
|
||||
Select::make('usuario_asignado_id')
|
||||
->label('Usuario Asignado (Operario)')
|
||||
->relationship('usuarioAsignado', 'name')
|
||||
->searchable()
|
||||
->preload()
|
||||
->nullable()
|
||||
->helperText('Usuario del sistema responsable'),
|
||||
|
||||
TextInput::make('cantidad_enviada')
|
||||
->label('Cantidad total disponible')
|
||||
->label('Cantidad')
|
||||
->numeric()
|
||||
->readOnly()
|
||||
->helperText(function ($state) {
|
||||
if (!$state) return 'Selecciona una OP primero';
|
||||
return "Máximo disponible: {$state} unidades";
|
||||
})
|
||||
->live(),
|
||||
|
||||
Repeater::make('distribuciones')
|
||||
->label('Distribución entre proveedores')
|
||||
->schema([
|
||||
Select::make('proveedor_id')
|
||||
->label('Proveedor')
|
||||
->options(fn () => \App\Models\Proveedor::where('categoria', 'empleado')->pluck('nombre', 'id'))
|
||||
->searchable()
|
||||
->required(),
|
||||
|
||||
TextInput::make('cantidad')
|
||||
->label('Cantidad')
|
||||
->numeric()
|
||||
->required()
|
||||
->minValue(1)
|
||||
->live()
|
||||
->afterStateUpdated(function ($state, $set, $get) {
|
||||
// Validar que la suma no exceda el total
|
||||
$total = (int) ($get('../../cantidad_enviada') ?? 0);
|
||||
$distribuciones = $get('../../distribuciones') ?? [];
|
||||
$suma = 0;
|
||||
foreach ($distribuciones as $dist) {
|
||||
$suma += (int) ($dist['cantidad'] ?? 0);
|
||||
}
|
||||
|
||||
if ($suma > $total) {
|
||||
throw \Illuminate\Validation\ValidationException::withMessages([
|
||||
'cantidad' => "La suma de las distribuciones ({$suma}) excede el total disponible ({$total})."
|
||||
]);
|
||||
}
|
||||
}),
|
||||
])
|
||||
->defaultItems(1)
|
||||
->addActionLabel('Agregar proveedor')
|
||||
->required()
|
||||
->minValue(1)
|
||||
->reactive()
|
||||
->helperText(function ($get) {
|
||||
$total = (int) ($get('cantidad_enviada') ?? 0);
|
||||
$distribuciones = $get('distribuciones') ?? [];
|
||||
$suma = 0;
|
||||
foreach ($distribuciones as $dist) {
|
||||
$suma += (int) ($dist['cantidad'] ?? 0);
|
||||
}
|
||||
$restante = $total - $suma;
|
||||
$opId = $get('orden_produccion_id');
|
||||
$tipo = $get('tipo');
|
||||
|
||||
if ($restante < 0) {
|
||||
return "⚠️ Excede el total por " . abs($restante) . " unidades";
|
||||
} elseif ($restante > 0) {
|
||||
return "Faltan {$restante} unidades por distribuir";
|
||||
if (!$opId || !$tipo) return 'Selecciona una OP y tipo primero';
|
||||
|
||||
$op = \App\Models\OrdenProduccion::find($opId);
|
||||
if (!$op) return '';
|
||||
|
||||
if ($tipo === 'Ojal') {
|
||||
$cantidadRecibida = $op->confecciones->sum('cantidad_recibida');
|
||||
$arreglos = \App\Models\Ajuste::where('referencia_type', \App\Models\Confeccion::class)
|
||||
->whereHas('referencia', function($q) use ($opId) {
|
||||
$q->where('orden_produccion_id', $opId);
|
||||
})->where('tipo', 'arreglo')->sum('cantidad');
|
||||
$cobros = \App\Models\Cobro::where('referencia_type', \App\Models\Confeccion::class)
|
||||
->whereHas('referencia', function($q) use ($opId) {
|
||||
$q->where('orden_produccion_id', $opId);
|
||||
})->sum('cantidad');
|
||||
$cantidadConfecciones = $cantidadRecibida - $arreglos - $cobros;
|
||||
$yaEnviado = \App\Models\Ojal::where('orden_produccion_id', $opId)->sum('cantidad_enviada');
|
||||
$disponible = $cantidadConfecciones - $yaEnviado;
|
||||
return "Disponible desde Confección: {$disponible}";
|
||||
} else {
|
||||
return "✓ Total distribuido correctamente";
|
||||
$ojalesTerminados = \App\Models\Ojal::where('orden_produccion_id', $opId)
|
||||
->where('terminada', true)->sum('cantidad_enviada');
|
||||
$yaEnviado = \App\Models\Prensilla::where('orden_produccion_id', $opId)->sum('cantidad_enviada');
|
||||
$disponible = $ojalesTerminados - $yaEnviado;
|
||||
return "Disponible desde Ojales terminados: {$disponible}";
|
||||
}
|
||||
})
|
||||
->live(),
|
||||
}),
|
||||
|
||||
Checkbox::make('terminada')
|
||||
->label('Marcar como terminada')
|
||||
->helperText('Al marcar terminada, se enviará automáticamente a tintorería')
|
||||
->live(),
|
||||
->label('Marcar como terminado')
|
||||
->helperText(fn ($get) => $get('tipo') === 'Prensilla'
|
||||
? '✓ Al terminar Prensillas, las prendas quedarán disponibles para Tintorería'
|
||||
: '✓ Al terminar Ojales, las prendas quedarán disponibles para Prensillas')
|
||||
->reactive(),
|
||||
]);
|
||||
}
|
||||
|
||||
@@ -181,31 +221,73 @@ class OjalPresillaResource extends Resource
|
||||
return $table
|
||||
->columns([
|
||||
Tables\Columns\TextColumn::make('tipo')
|
||||
->label('Tipo')
|
||||
->label('Proceso')
|
||||
->searchable()
|
||||
->sortable()
|
||||
->badge()
|
||||
->color('info'),
|
||||
->color(fn ($state) => $state === 'Ojal' ? 'info' : 'warning'),
|
||||
|
||||
Tables\Columns\TextColumn::make('ordenProduccion.numero_orden')
|
||||
->label('OP')
|
||||
->searchable()
|
||||
->sortable(),
|
||||
|
||||
Tables\Columns\TextColumn::make('ordenProduccion.prenda_modelo')
|
||||
->label('Prenda')
|
||||
->searchable()
|
||||
->limit(30)
|
||||
->toggleable(),
|
||||
|
||||
Tables\Columns\TextColumn::make('cantidad_enviada')
|
||||
->label('Cantidad')
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
|
||||
Tables\Columns\TextColumn::make('proveedor.nombre')
|
||||
->label('Proveedor')
|
||||
->searchable()
|
||||
->toggleable()
|
||||
->default('Sin asignar'),
|
||||
|
||||
Tables\Columns\TextColumn::make('usuarioAsignado.name')
|
||||
->label('Operario')
|
||||
->searchable()
|
||||
->toggleable()
|
||||
->default('-'),
|
||||
|
||||
Tables\Columns\IconColumn::make('terminada')
|
||||
->boolean()
|
||||
->label('Terminada')
|
||||
->label('Terminado')
|
||||
->alignCenter()
|
||||
->sortable(),
|
||||
|
||||
Tables\Columns\BadgeColumn::make('estado_flujo')
|
||||
->label('Estado en Flujo')
|
||||
->getStateUsing(function ($record) {
|
||||
if ($record->tipo === 'Ojal') {
|
||||
if ($record->terminada) {
|
||||
// Verificar si ya se creó el proceso de prensillas
|
||||
$prensillasCreadas = \App\Models\Prensilla::where('orden_produccion_id', $record->orden_produccion_id)
|
||||
->where('cantidad_enviada', '>', 0)
|
||||
->exists();
|
||||
|
||||
return $prensillasCreadas ? 'En Prensillas' : 'Listo para Prensillas';
|
||||
}
|
||||
return 'En Proceso';
|
||||
} else {
|
||||
// Es Prensilla
|
||||
if ($record->terminada) {
|
||||
return 'Listo para Tintorería';
|
||||
}
|
||||
return 'En Proceso';
|
||||
}
|
||||
})
|
||||
->colors([
|
||||
'success' => fn ($state) => in_array($state, ['Listo para Prensillas', 'Listo para Tintorería']),
|
||||
'primary' => 'En Prensillas',
|
||||
'warning' => 'En Proceso',
|
||||
]),
|
||||
|
||||
Tables\Columns\TextColumn::make('fecha_envio')
|
||||
->date()
|
||||
->label('Fecha envío')
|
||||
@@ -219,13 +301,26 @@ class OjalPresillaResource extends Resource
|
||||
])
|
||||
->filters([
|
||||
SelectFilter::make('tipo')
|
||||
->label('Tipo'),
|
||||
->label('Tipo de Proceso')
|
||||
->options([
|
||||
'Ojal' => 'Ojal',
|
||||
'Prensilla' => 'Prensilla',
|
||||
]),
|
||||
|
||||
SelectFilter::make('terminada')
|
||||
->label('Estado')
|
||||
->options([
|
||||
'0' => 'Pendiente',
|
||||
'1' => 'Terminada',
|
||||
])
|
||||
'0' => 'En Proceso',
|
||||
'1' => 'Terminado',
|
||||
]),
|
||||
|
||||
SelectFilter::make('proveedor_id')
|
||||
->label('Proveedor')
|
||||
->relationship('proveedor', 'nombre'),
|
||||
|
||||
SelectFilter::make('usuario_asignado_id')
|
||||
->label('Operario')
|
||||
->relationship('usuarioAsignado', 'name'),
|
||||
])
|
||||
->actions([
|
||||
Tables\Actions\EditAction::make(),
|
||||
|
||||
Reference in New Issue
Block a user