bharat_erp/lib/modules/grn/presentation/providers/grn_lookups_provider.dart
2026-07-17 11:07:08 +05:30

85 lines
2.6 KiB
Dart

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<FilterOptionModel> locations;
final List<PurchaseOrderModel> receivablePurchaseOrders;
final List<FilterOptionModel> users;
}
final grnLookupsProvider = FutureProvider.autoDispose<GrnLookups>((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 = <PurchaseOrderModel>[];
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<List<FilterOptionModel>> _safeOptions(
Future<List<FilterOptionModel>> Function() load,
) async {
try {
return await load();
} catch (_) {
return const [];
}
}
Future<List<FilterOptionModel>> _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<PurchaseOrderModel?, String>((ref, poId) async {
final result =
await ref.read(purchaseOrderRepositoryProvider).getPurchaseOrderById(poId);
if (result.failure != null) throw result.failure!;
return result.data;
});