schema([ Section::make('Información del Proceso') ->schema([ Select::make('orden_produccion_id') ->label('Orden de Producción') ->options(fn () => \App\Models\OrdenProduccion::all()->pluck('numero_orden', 'id')->toArray()) ->searchable() ->reactive() ->required() ->afterStateUpdated(function ($state, $set) { if ($state) { // Calcular cantidad disponible desde Tintorería $disponible = \App\Models\Tintoreria::where('orden_produccion_id', $state) ->sum('cantidad_recibida'); $set('cantidad_enviada', $disponible ?: 0); } }), TextInput::make('tipo_proceso') ->label('Tipo de proceso') ->placeholder('Ej: Planchado, Empacado, etc.') ->required(), TextInput::make('cantidad_enviada') ->label('Cantidad a enviar') ->numeric() ->required() ->minValue(1) ->reactive() ->helperText(function ($get) { $op_id = $get('orden_produccion_id'); if (!$op_id) return 'Selecciona una orden de producción primero'; $disponible = \App\Models\Tintoreria::where('orden_produccion_id', $op_id)->sum('cantidad_recibida'); return 'Disponible desde Tintorería: ' . $disponible; }), DatePicker::make('fecha_envio') ->label('Fecha de envío') ->required() ->default(now()), ]) ->columns(2), Section::make('Distribución de Proveedores') ->description('Asigna la cantidad a enviar a cada proveedor') ->schema([ Forms\Components\Repeater::make('distribucion_proveedores') ->label('') ->schema([ Select::make('proveedor_id') ->label('Proveedor') ->options(\App\Models\Proveedor::where('categoria', 'empleado')->pluck('nombre', 'id')) ->searchable() ->required(), TextInput::make('cantidad') ->label('Cantidad') ->numeric() ->required() ->minValue(1), ]) ->columns(2) ->defaultItems(1) ->addActionLabel('Agregar otro proveedor') ->collapsible() ->cloneable(), ]) ->collapsed(fn ($get) => !$get('distribucion_proveedores')), Section::make('Estado') ->schema([ Forms\Components\Checkbox::make('terminada') ->label('Marcar como terminada') ->helperText('Marca esta casilla cuando el proceso haya finalizado'), Textarea::make('observaciones') ->label('Observaciones') ->rows(3) ->nullable(), ]) ->columns(1), ]); } public static function table(Table $table): Table { return $table ->columns([ TextColumn::make('ordenProduccion.numero_orden') ->label('OP') ->searchable() ->sortable(), TextColumn::make('tipo_proceso') ->label('Tipo de proceso') ->searchable(), TextColumn::make('cantidad_enviada') ->label('Cantidad') ->sortable(), TextColumn::make('proveedores_asignados') ->label('Proveedores') ->getStateUsing(function ($record) { if (!$record->distribucion_proveedores) return 'Sin asignar'; $distribuciones = collect($record->distribucion_proveedores); return $distribuciones->map(function ($dist) { $proveedor = \App\Models\Proveedor::find($dist['proveedor_id'] ?? null); $nombre = $proveedor ? $proveedor->nombre : 'Desconocido'; return "{$nombre} ({$dist['cantidad']})"; })->join(', '); }) ->wrap() ->limit(50), BadgeColumn::make('terminada') ->label('Estado') ->formatStateUsing(fn($state) => $state ? 'Terminada' : 'En proceso') ->colors([ 'warning' => false, 'success' => true, ]), TextColumn::make('fecha_envio') ->label('Fecha envío') ->date() ->sortable(), TextColumn::make('created_at') ->label('Creado') ->dateTime() ->sortable() ->toggleable(isToggledHiddenByDefault: true), ]) ->defaultSort('created_at', 'desc') ->filters([ Tables\Filters\SelectFilter::make('orden_produccion_id') ->label('Orden de Producción') ->relationship('ordenProduccion', 'numero_orden') ->searchable() ->preload(), Tables\Filters\TernaryFilter::make('terminada') ->label('Estado') ->placeholder('Todos') ->trueLabel('Terminadas') ->falseLabel('En proceso'), ]) ->actions([ Tables\Actions\EditAction::make(), ]) ->bulkActions([ Tables\Actions\BulkActionGroup::make([ Tables\Actions\DeleteBulkAction::make(), ]), ]); } public static function getRelations(): array { return [ // ]; } public static function getPages(): array { return [ 'index' => Pages\ListProcesoAcabados::route('/'), 'create' => Pages\CreateProcesoAcabado::route('/create'), 'edit' => Pages\EditProcesoAcabado::route('/{record}/edit'), ]; } }