diff --git a/app/Filament/Resources/ConfeccionResource.php b/app/Filament/Resources/ConfeccionResource.php index 9a2f0be..e55ae13 100644 --- a/app/Filament/Resources/ConfeccionResource.php +++ b/app/Filament/Resources/ConfeccionResource.php @@ -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') diff --git a/app/Filament/Resources/InventarioPrendaResource.php b/app/Filament/Resources/InventarioPrendaResource.php index 3afd92f..33da7a5 100644 --- a/app/Filament/Resources/InventarioPrendaResource.php +++ b/app/Filament/Resources/InventarioPrendaResource.php @@ -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') diff --git a/app/Filament/Resources/OrdenProduccionResource.php b/app/Filament/Resources/OrdenProduccionResource.php index 076aa8b..0952bb5 100644 --- a/app/Filament/Resources/OrdenProduccionResource.php +++ b/app/Filament/Resources/OrdenProduccionResource.php @@ -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([ diff --git a/app/Filament/Resources/ProcesoAcabadoResource.php b/app/Filament/Resources/ProcesoAcabadoResource.php index 5376981..ac27d5b 100644 --- a/app/Filament/Resources/ProcesoAcabadoResource.php +++ b/app/Filament/Resources/ProcesoAcabadoResource.php @@ -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') diff --git a/app/Filament/Resources/TelaResource.php b/app/Filament/Resources/TelaResource.php index b729af3..73601fd 100644 --- a/app/Filament/Resources/TelaResource.php +++ b/app/Filament/Resources/TelaResource.php @@ -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([ diff --git a/app/Filament/Resources/TintoreriaResource.php b/app/Filament/Resources/TintoreriaResource.php index 95a60c6..a709d3d 100644 --- a/app/Filament/Resources/TintoreriaResource.php +++ b/app/Filament/Resources/TintoreriaResource.php @@ -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') diff --git a/app/Filament/Resources/TrasladoPrendaResource.php b/app/Filament/Resources/TrasladoPrendaResource.php index a0e1fe9..3a6edcf 100644 --- a/app/Filament/Resources/TrasladoPrendaResource.php +++ b/app/Filament/Resources/TrasladoPrendaResource.php @@ -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') diff --git a/app/Models/OrdenProduccion.php b/app/Models/OrdenProduccion.php index b7dafcf..4d7f41e 100644 --- a/app/Models/OrdenProduccion.php +++ b/app/Models/OrdenProduccion.php @@ -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 = [