85 lines
2.6 KiB
Dart
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;
|
|
});
|