2024-02-05 17:49:12 +06:30
|
|
|
import 'dart:async';
|
|
|
|
|
|
|
|
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
|
|
|
import 'package:logging/logging.dart';
|
|
|
|
|
|
2024-09-22 16:49:59 +06:30
|
|
|
import '../../../constants.dart';
|
2024-02-05 17:49:12 +06:30
|
|
|
import '../../../domain/entities/package.dart';
|
2025-03-25 17:38:51 +06:30
|
|
|
import '../../../pagination/paginator_listener.dart';
|
2024-02-05 17:49:12 +06:30
|
|
|
import '../../main/model/base_model.dart';
|
|
|
|
|
|
|
|
|
|
class PackageSelectionModel extends BaseModel {
|
|
|
|
|
final log = Logger("PackageSelectionModel");
|
2025-03-25 17:38:51 +06:30
|
|
|
PaginatorListener<Package>? getPackages;
|
2024-02-05 17:49:12 +06:30
|
|
|
|
2025-03-25 17:38:51 +06:30
|
|
|
List<Package> packages = [];
|
2024-02-05 17:49:12 +06:30
|
|
|
bool isLoading = false;
|
|
|
|
|
DocumentSnapshot? _lastDocument;
|
|
|
|
|
bool ended = false;
|
|
|
|
|
|
2025-03-25 17:38:51 +06:30
|
|
|
@override
|
|
|
|
|
logout() async {
|
2024-02-05 17:49:12 +06:30
|
|
|
packages.clear();
|
2025-03-25 17:38:51 +06:30
|
|
|
getPackages?.close();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
loadPackages(
|
|
|
|
|
{required String senderId,
|
|
|
|
|
required String consigneeId,
|
|
|
|
|
required String shipmentId}) {
|
|
|
|
|
if (user == null) return;
|
|
|
|
|
|
|
|
|
|
String path = "/$packages_collection";
|
|
|
|
|
Query col = FirebaseFirestore.instance
|
|
|
|
|
.collection(path)
|
|
|
|
|
.where("sender_id", isEqualTo: senderId)
|
|
|
|
|
.where("user_id", isEqualTo: consigneeId)
|
|
|
|
|
.where("fcs_shipment_id", isEqualTo: shipmentId);
|
|
|
|
|
Query pageQuery = FirebaseFirestore.instance
|
|
|
|
|
.collection(path)
|
|
|
|
|
.where("sender_id", isEqualTo: senderId)
|
|
|
|
|
.where("user_id", isEqualTo: consigneeId)
|
|
|
|
|
.where("fcs_shipment_id", isEqualTo: shipmentId);
|
|
|
|
|
|
|
|
|
|
pageQuery = pageQuery.orderBy("created_date", descending: true);
|
|
|
|
|
getPackages?.close();
|
|
|
|
|
getPackages = PaginatorListener<Package>(
|
|
|
|
|
col, pageQuery, (data, id) => Package.fromMap(data, id),
|
|
|
|
|
rowPerLoad: 30);
|
2024-02-05 17:49:12 +06:30
|
|
|
}
|
|
|
|
|
|
2024-03-04 17:09:47 +06:30
|
|
|
Future<void> refresh(
|
2024-02-05 17:49:12 +06:30
|
|
|
{required String shipmentId,
|
|
|
|
|
required String senderId,
|
2025-03-25 17:38:51 +06:30
|
|
|
required String consigneeId}) async {
|
2024-02-05 17:49:12 +06:30
|
|
|
packages.clear();
|
|
|
|
|
_lastDocument = null;
|
|
|
|
|
ended = false;
|
|
|
|
|
await loadMoreData(
|
2025-03-25 17:38:51 +06:30
|
|
|
shipmentId: shipmentId,
|
|
|
|
|
senderId: senderId,
|
|
|
|
|
consigneeId: consigneeId,
|
|
|
|
|
);
|
2024-02-05 17:49:12 +06:30
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> loadMoreData(
|
|
|
|
|
{required String shipmentId,
|
|
|
|
|
required String senderId,
|
2025-03-25 17:38:51 +06:30
|
|
|
required String consigneeId}) async {
|
2024-02-05 17:49:12 +06:30
|
|
|
int rowPerPage = 20;
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
isLoading = true;
|
|
|
|
|
String path = "/$packages_collection";
|
|
|
|
|
Query query = FirebaseFirestore.instance
|
|
|
|
|
.collection(path)
|
2025-02-17 20:13:30 +06:30
|
|
|
.where("status",
|
|
|
|
|
whereIn: [package_processed_status, package_packed_status])
|
2024-03-04 17:09:47 +06:30
|
|
|
.where("sender_id", isEqualTo: senderId)
|
|
|
|
|
.where("user_id", isEqualTo: consigneeId)
|
2025-03-25 17:38:51 +06:30
|
|
|
.where("fcs_shipment_id", isEqualTo: shipmentId)
|
2024-03-04 17:09:47 +06:30
|
|
|
.where("is_deleted", isEqualTo: false);
|
|
|
|
|
|
|
|
|
|
query = query.orderBy("created_date", descending: true);
|
2024-02-05 17:49:12 +06:30
|
|
|
|
|
|
|
|
if (_lastDocument != null) {
|
|
|
|
|
query = query.startAfterDocument(_lastDocument!);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
QuerySnapshot querySnap = await query.limit(rowPerPage).get();
|
|
|
|
|
|
|
|
|
|
if (querySnap.docs.isEmpty) return;
|
|
|
|
|
_lastDocument = querySnap.docs[querySnap.docs.length - 1];
|
|
|
|
|
|
|
|
|
|
List<Package> list = querySnap.docs.map((documentSnapshot) {
|
|
|
|
|
var p = Package.fromMap(documentSnapshot.data() as Map<String, dynamic>,
|
|
|
|
|
documentSnapshot.id);
|
|
|
|
|
return p;
|
|
|
|
|
}).toList();
|
|
|
|
|
|
|
|
|
|
packages.addAll(list);
|
|
|
|
|
if (list.length < rowPerPage) ended = true;
|
|
|
|
|
notifyListeners();
|
|
|
|
|
} catch (e) {
|
|
|
|
|
log.warning("error:$e");
|
|
|
|
|
} finally {
|
|
|
|
|
isLoading = false;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearSelection() {
|
|
|
|
|
packages.clear();
|
|
|
|
|
}
|
2024-03-04 17:09:47 +06:30
|
|
|
|
|
|
|
|
Future<List<Package>> getPackagesBySenderAndConsigneeId(
|
|
|
|
|
{required String senderId, required String consigneeId}) async {
|
|
|
|
|
List<Package> list = [];
|
|
|
|
|
try {
|
|
|
|
|
String path = "/$packages_collection";
|
|
|
|
|
var snaps = await FirebaseFirestore.instance
|
|
|
|
|
.collection(path)
|
|
|
|
|
.where("sender_id", isEqualTo: senderId)
|
|
|
|
|
.where("user_id", isEqualTo: consigneeId)
|
|
|
|
|
.where("is_deleted", isEqualTo: false)
|
|
|
|
|
.get(const GetOptions(source: Source.server));
|
|
|
|
|
list = snaps.docs
|
|
|
|
|
.map((documentSnapshot) =>
|
|
|
|
|
Package.fromMap(documentSnapshot.data(), documentSnapshot.id))
|
|
|
|
|
.toList();
|
|
|
|
|
} catch (e) {
|
|
|
|
|
log.warning("Error!! $e");
|
|
|
|
|
list = [];
|
|
|
|
|
}
|
|
|
|
|
return list;
|
|
|
|
|
}
|
2025-03-12 17:49:27 +06:30
|
|
|
|
|
|
|
|
Future<List<Package>> getActivePackages(
|
|
|
|
|
{required String shipmentId,
|
|
|
|
|
required String senderId,
|
|
|
|
|
required String consigneeId}) async {
|
|
|
|
|
List<Package> list = [];
|
|
|
|
|
try {
|
|
|
|
|
String path = "/$packages_collection";
|
|
|
|
|
|
|
|
|
|
var snaps = await FirebaseFirestore.instance
|
|
|
|
|
.collection(path)
|
|
|
|
|
.where("status",
|
|
|
|
|
whereIn: [package_processed_status, package_packed_status])
|
|
|
|
|
.where("sender_id", isEqualTo: senderId)
|
|
|
|
|
.where("user_id", isEqualTo: consigneeId)
|
2025-03-21 18:19:52 +06:30
|
|
|
.where("fcs_shipment_id", isEqualTo: shipmentId)
|
2025-03-12 17:49:27 +06:30
|
|
|
.where("is_deleted", isEqualTo: false)
|
|
|
|
|
.orderBy("created_date", descending: true)
|
|
|
|
|
.get(const GetOptions(source: Source.server));
|
|
|
|
|
list = snaps.docs
|
|
|
|
|
.map((documentSnapshot) =>
|
|
|
|
|
Package.fromMap(documentSnapshot.data(), documentSnapshot.id))
|
|
|
|
|
.toList();
|
|
|
|
|
} catch (e) {
|
|
|
|
|
log.warning("Error!! $e");
|
|
|
|
|
list = [];
|
|
|
|
|
}
|
|
|
|
|
return list;
|
|
|
|
|
}
|
2025-03-25 17:38:51 +06:30
|
|
|
|
|
|
|
|
Future<int?> getPackageCount(
|
|
|
|
|
{required String senderId,
|
|
|
|
|
required String consigneeId,
|
|
|
|
|
required String shipmentId}) async {
|
|
|
|
|
String path = "/$packages_collection";
|
|
|
|
|
|
|
|
|
|
AggregateQuerySnapshot query = await FirebaseFirestore.instance
|
|
|
|
|
.collection(path)
|
|
|
|
|
.where("sender_id", isEqualTo: senderId)
|
|
|
|
|
.where("user_id", isEqualTo: consigneeId)
|
|
|
|
|
.where("fcs_shipment_id", isEqualTo: shipmentId)
|
|
|
|
|
.count()
|
|
|
|
|
.get();
|
|
|
|
|
|
|
|
|
|
return query.count;
|
|
|
|
|
}
|
2024-02-05 17:49:12 +06:30
|
|
|
}
|