import 'package:flutter_riverpod/flutter_riverpod.dart'; import '../../../../core/utils/active_option.dart'; import '../../../../shared/models/purchase_order_model.dart'; import '../../../../shared/models/user_management_models.dart'; import '../../../masters/data/datasources/master_remote_data_source.dart'; import '../../../purchase_orders/data/repositories/purchase_order_repository_impl.dart'; import '../../../users/data/repositories/user_repository_impl.dart'; class GrnLookups { const GrnLookups({ this.locations = const [], this.receivablePurchaseOrders = const [], this.users = const [], }); /// Plants and warehouses (any location type) for list filters. final List locations; final List receivablePurchaseOrders; final List users; } final grnLookupsProvider = FutureProvider.autoDispose((ref) async { final master = ref.watch(masterRemoteDataSourceProvider); final poRepo = ref.watch(purchaseOrderRepositoryProvider); final locations = await _safeOptions(master.listLocations); final users = await _safeUserOptions(ref); final receivablePos = []; for (final status in ['APPROVED', 'PARTIALLY_RECEIVED']) { final result = await poRepo.listPurchaseOrderOptions(status: status); if (result.failure == null && result.data != null) { receivablePos.addAll(result.data!); } } return GrnLookups( locations: locations, receivablePurchaseOrders: receivablePos, users: users, ); }); Future> _safeOptions( Future> Function() load, ) async { try { return await load(); } catch (_) { return const []; } } Future> _safeUserOptions(Ref ref) async { try { final result = await ref.read(userRepositoryProvider).listUserOptions(); if (result.failure != null || result.data == null) return const []; return result.data! .where( (user) => isActiveUserOption( status: user.status, isActive: user.isActive, ), ) .map( (user) => FilterOptionModel( id: user.id, name: user.fullName, ), ) .toList(); } catch (_) { return const []; } } final grnPurchaseOrderProvider = FutureProvider.autoDispose.family((ref, poId) async { final result = await ref.read(purchaseOrderRepositoryProvider).getPurchaseOrderById(poId); if (result.failure != null) throw result.failure!; return result.data; });