This commit is contained in:
lizandrogd
2026-01-20 00:18:49 -05:00
parent c532a686f5
commit afaea4063c
8 changed files with 77 additions and 7 deletions
@@ -166,6 +166,7 @@ class ConfeccionResource extends Resource
TextColumn::make('total_pagar')
->money('COP'),
])
->defaultSort('created_at', 'desc')
->filters([
Tables\Filters\SelectFilter::make('orden_produccion_id')
->label('Orden de Producción')
@@ -135,6 +135,7 @@ class InventarioPrendaResource extends Resource
'success' => 'lista_despacho',
]),
])
->defaultSort('created_at', 'desc')
->filters([
Tables\Filters\SelectFilter::make('orden_produccion_id')
->label('Orden de Producción')
@@ -140,7 +140,8 @@ class OrdenProduccionResource extends Resource
->label('Tela')
->toggleable(),
BadgeColumn::make('estado')
BadgeColumn::make('estado_display')
->label('Estado')
->colors([
'warning' => 'en_corte',
'info' => 'en_confeccion',
@@ -159,11 +160,37 @@ class OrdenProduccionResource extends Resource
TextColumn::make('fecha_entrega_estimada')
->date(),
])
->defaultSort('created_at', 'desc')
->filters([
//
])
->actions([
Tables\Actions\EditAction::make(),
Tables\Actions\Action::make('finalizar')
->label('Finalizar')
->icon('heroicon-o-check')
->color('success')
->requiresConfirmation()
->visible(fn($record) => $record->estado !== 'finalizada')
->action(function ($record) {
try {
// Forzar finalización
$record->manualFinalize();
\Filament\Notifications\Notification::make()
->success()
->title('Orden finalizada')
->body('La orden se marcó como finalizada manualmente.')
->send();
} catch (\Throwable $e) {
\Filament\Notifications\Notification::make()
->danger()
->title('Error')
->body($e->getMessage())
->send();
}
}),
])
->bulkActions([
Tables\Actions\BulkActionGroup::make([
@@ -51,15 +51,14 @@ class ProcesoAcabadoResource extends Resource
->required()
->afterStateUpdated(function ($state, $set) {
if ($state) {
// Sumar lo recibido en Tintorería
// Total recibido en Tintorería para esta OP
$sumTint = \App\Models\Tintoreria::where('orden_produccion_id', $state)->sum('cantidad_recibida');
// Restar lo ya enviado a acabados y aún en proceso
$sentInProcess = \App\Models\ProcesoAcabado::where('orden_produccion_id', $state)
->whereNull('fecha_recepcion')
// Restar todo lo ya enviado a procesos de acabados (de la misma OP)
$sentToAcabados = \App\Models\ProcesoAcabado::where('orden_produccion_id', $state)
->sum('cantidad_enviada');
$pending = max(0, (int)$sumTint - (int)$sentInProcess);
$pending = max(0, (int)$sumTint - (int)$sentToAcabados);
$set('cantidad_enviada', $pending ?: 0);
$set('fecha_envio', now()->toDateString());
@@ -85,7 +84,8 @@ class ProcesoAcabadoResource extends Resource
->numeric()
->required()
->reactive()
->helperText(fn ($get) => 'Sugerido: ' . (\App\Models\Tintoreria::where('orden_produccion_id', $get('orden_produccion_id'))->sum('cantidad_recibida') ?: 0)),
->helperText(fn ($get) => 'Sugerido: ' . (max(0, (int)\App\Models\Tintoreria::where('orden_produccion_id', $get('orden_produccion_id'))->sum('cantidad_recibida') - (int)\App\Models\ProcesoAcabado::where('orden_produccion_id', $get('orden_produccion_id'))->sum('cantidad_enviada')) ?: 0)),
DatePicker::make('fecha_envio')
->required()
@@ -144,6 +144,7 @@ class ProcesoAcabadoResource extends Resource
'success' => fn($state) => $state !== null,
]),
])
->defaultSort('created_at', 'desc')
->filters([
Tables\Filters\SelectFilter::make('orden_produccion_id')
->label('Orden de Producción')
+1
View File
@@ -98,6 +98,7 @@ class TelaResource extends Resource
Tables\Columns\TextColumn::make('costo_por_metro')->money('USD')->sortable(),
Tables\Columns\TextColumn::make('fecha_compra')->date()->sortable(),
])
->defaultSort('created_at', 'desc')
->filters([
Tables\Filters\SelectFilter::make('tipo')
->options([
@@ -167,6 +167,7 @@ class TintoreriaResource extends Resource
->getStateUsing(fn($record) => optional($record->recepciones()->latest('fecha_recepcion')->first())->fecha_recepcion)
->date(),
])
->defaultSort('created_at', 'desc')
->filters([
Tables\Filters\SelectFilter::make('orden_produccion_id')
->label('Orden de Producción')
@@ -78,6 +78,7 @@ class TrasladoPrendaResource extends Resource
TextColumn::make('fecha_recepcion')->dateTime(),
TextColumn::make('referencia_type')->label('Referencia'),
])
->defaultSort('created_at', 'desc')
->filters([
SelectFilter::make('orden_produccion_id')
->label('Orden de Producción')
+37
View File
@@ -190,6 +190,43 @@ class OrdenProduccion extends Model
return false;
}
/**
* Estado calculado para mostrar en UI: si está completada o la última etapa que tiene tareas pendientes.
*/
public function getEstadoDisplayAttribute()
{
if ($this->canBeFinalized() || $this->estado === 'finalizada') {
return 'finalizada';
}
// Revisar etapas de último a primero para encontrar la etapa que aún tiene tareas pendientes
if (\App\Models\ProcesoAcabado::where('orden_produccion_id', $this->id)->whereNull('fecha_recepcion')->exists()) {
return 'en_acabados';
}
if (\App\Models\Tintoreria::where('orden_produccion_id', $this->id)->whereNull('fecha_recepcion')->exists()) {
return 'en_tintoreria';
}
if (\App\Models\Confeccion::where('orden_produccion_id', $this->id)->whereNull('fecha_recepcion')->exists()) {
return 'en_confeccion';
}
// Por defecto devolver el estado actual (incluye en_corte u otros)
return $this->estado ?? 'en_corte';
}
/**
* Forzar finalización manualmente (útil si desea marcar como finalizada aunque no esté totalmente recibida)
*/
public function manualFinalize(): void
{
$this->update(['estado' => 'finalizada']);
// Intentar crear inventario con lo recibido hasta ahora
$this->crearInventarioPorFinalizacion();
}
public function avanzarEstado(): void
{
$flujo = [