user()?->can('ver ojals') ?? false; } public static function form(Forms\Form $form): Forms\Form { return $form->schema([ Select::make('orden_produccion_id') ->label('Orden de Producción') ->options(function () { // Solo OPs que tienen confecciones recibidas return \App\Models\OrdenProduccion::whereHas('confecciones', function ($q) { $q->where('cantidad_recibida', '>', 0); })->get()->mapWithKeys(function ($op) { // Calcular cantidad total de confecciones recibidas $cantidadConfecciones = $op->confecciones->sum('cantidad_recibida'); // Calcular cantidad ya enviada en ojales $cantidadEnOjales = \App\Models\Ojal::where('orden_produccion_id', $op->id) ->sum('cantidad_enviada'); // Calcular saldo disponible $saldoDisponible = $cantidadConfecciones - $cantidadEnOjales; // Solo incluir si hay saldo disponible if ($saldoDisponible > 0) { return [$op->id => "{$op->numero_orden} (Disponible: {$saldoDisponible})"]; } return []; })->filter(); // Eliminar valores vacíos }) ->searchable() ->required() ->live() ->afterStateUpdated(function ($state, $set) { if ($state) { $op = \App\Models\OrdenProduccion::find($state); if ($op) { // Calcular cantidad disponible (confecciones - ojales ya enviados) $cantidadConfecciones = $op->confecciones->sum('cantidad_recibida'); $cantidadEnOjales = \App\Models\Ojal::where('orden_produccion_id', $state) ->sum('cantidad_enviada'); $cantidadDisponible = $cantidadConfecciones - $cantidadEnOjales; $set('cantidad_enviada', $cantidadDisponible); } } }) ->helperText('Solo se muestran órdenes con prendas disponibles para enviar'), TextInput::make('tipo') ->label('Tipo') ->placeholder('Ej: Ojal, Prensilla, Botón, etc.') ->required() ->helperText('Especifica el tipo de accesorio'), TextInput::make('cantidad_enviada') ->label('Cantidad total') ->numeric() ->readOnly() ->helperText('Se calcula automáticamente desde confecciones recibidas'), 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), ]) ->defaultItems(1) ->addActionLabel('Agregar proveedor') ->helperText('Puedes distribuir la cantidad entre varios proveedores'), Checkbox::make('terminada') ->label('Marcar como terminada') ->helperText('Al marcar terminada, se enviará automáticamente a tintorería') ->live(), ]); } public static function table(Tables\Table $table): Tables\Table { return $table ->columns([ Tables\Columns\TextColumn::make('tipo') ->label('Tipo') ->searchable() ->sortable() ->badge() ->color('info'), Tables\Columns\TextColumn::make('ordenProduccion.numero_orden') ->label('OP') ->searchable() ->sortable(), Tables\Columns\TextColumn::make('cantidad_enviada') ->label('Cantidad') ->sortable(), Tables\Columns\TextColumn::make('proveedor.nombre') ->label('Proveedor') ->searchable() ->default('Sin asignar'), Tables\Columns\IconColumn::make('terminada') ->boolean() ->label('Terminada') ->sortable(), Tables\Columns\TextColumn::make('fecha_envio') ->date() ->label('Fecha envío') ->sortable(), Tables\Columns\TextColumn::make('created_at') ->dateTime() ->label('Creado') ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->filters([ SelectFilter::make('tipo') ->label('Tipo'), SelectFilter::make('terminada') ->options([ '0' => 'Pendiente', '1' => 'Terminada', ]) ]) ->actions([ Tables\Actions\EditAction::make(), Tables\Actions\Action::make('marcar_terminada') ->label('Terminar') ->icon('heroicon-o-check-circle') ->color('success') ->visible(fn ($record) => !$record->terminada) ->requiresConfirmation() ->modalHeading('Marcar como terminado') ->modalDescription('¿Confirmas que este proceso ha terminado?') ->action(function ($record) { $record->terminada = true; $record->save(); \Filament\Notifications\Notification::make() ->success() ->title('Marcado como terminado') ->send(); }), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), ]), ]) ->defaultSort('created_at', 'desc'); } public static function getPages(): array { return [ 'index' => Pages\ListOjalPresillas::route('/'), 'create' => Pages\CreateOjalPresilla::route('/create'), 'edit' => Pages\EditOjalPresilla::route('/{record}/edit'), ]; } }