feat: Implement comprehensive staff document management with verification status tracking and complete document listing.
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
import 'package:firebase_data_connect/firebase_data_connect.dart';
|
||||
import 'package:krow_core/core.dart';
|
||||
import 'package:krow_data_connect/krow_data_connect.dart' as dc;
|
||||
import 'package:krow_domain/krow_domain.dart' as domain;
|
||||
import '../../domain/repositories/staff_connector_repository.dart';
|
||||
@@ -349,4 +350,178 @@ class StaffConnectorRepositoryImpl implements StaffConnectorRepository {
|
||||
throw Exception('Error signing out: ${e.toString()}');
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
Future<List<domain.StaffDocument>> getStaffDocuments() async {
|
||||
return _service.run(() async {
|
||||
final String staffId = await _service.getStaffId();
|
||||
|
||||
final List<QueryResult<Object, Object?>> results =
|
||||
await Future.wait<QueryResult<Object, Object?>>(
|
||||
<Future<QueryResult<Object, Object?>>>[
|
||||
_service.connector.listDocuments().execute(),
|
||||
_service.connector
|
||||
.listStaffDocumentsByStaffId(staffId: staffId)
|
||||
.execute(),
|
||||
],
|
||||
);
|
||||
|
||||
final QueryResult<dc.ListDocumentsData, void> documentsRes =
|
||||
results[0] as QueryResult<dc.ListDocumentsData, void>;
|
||||
final QueryResult<
|
||||
dc.ListStaffDocumentsByStaffIdData,
|
||||
dc.ListStaffDocumentsByStaffIdVariables
|
||||
>
|
||||
staffDocsRes =
|
||||
results[1]
|
||||
as QueryResult<
|
||||
dc.ListStaffDocumentsByStaffIdData,
|
||||
dc.ListStaffDocumentsByStaffIdVariables
|
||||
>;
|
||||
|
||||
final List<dc.ListStaffDocumentsByStaffIdStaffDocuments> staffDocs =
|
||||
staffDocsRes.data.staffDocuments;
|
||||
|
||||
return documentsRes.data.documents.map((dc.ListDocumentsDocuments doc) {
|
||||
// Find if this staff member has already uploaded this document
|
||||
final dc.ListStaffDocumentsByStaffIdStaffDocuments? currentDoc =
|
||||
staffDocs
|
||||
.where(
|
||||
(dc.ListStaffDocumentsByStaffIdStaffDocuments d) =>
|
||||
d.documentId == doc.id,
|
||||
)
|
||||
.firstOrNull;
|
||||
|
||||
return domain.StaffDocument(
|
||||
id: currentDoc?.id ?? '',
|
||||
staffId: staffId,
|
||||
documentId: doc.id,
|
||||
name: doc.name,
|
||||
description: doc.description,
|
||||
status: currentDoc != null
|
||||
? _mapDocumentStatus(currentDoc.status)
|
||||
: domain.DocumentStatus.missing,
|
||||
documentUrl: currentDoc?.documentUrl,
|
||||
expiryDate: currentDoc?.expiryDate == null
|
||||
? null
|
||||
: DateTimeUtils.toDeviceTime(
|
||||
currentDoc!.expiryDate!.toDateTime(),
|
||||
),
|
||||
verificationId: currentDoc?.verificationId,
|
||||
verificationStatus: currentDoc != null
|
||||
? _mapFromDCDocumentVerificationStatus(currentDoc.status)
|
||||
: null,
|
||||
);
|
||||
}).toList();
|
||||
});
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> upsertStaffDocument({
|
||||
required String documentId,
|
||||
required String documentUrl,
|
||||
domain.DocumentStatus? status,
|
||||
String? verificationId,
|
||||
}) async {
|
||||
await _service.run(() async {
|
||||
final String staffId = await _service.getStaffId();
|
||||
final domain.Staff staff = await getStaffProfile();
|
||||
|
||||
await _service.connector
|
||||
.upsertStaffDocument(
|
||||
staffId: staffId,
|
||||
staffName: staff.name,
|
||||
documentId: documentId,
|
||||
status: _mapToDCDocumentStatus(status),
|
||||
)
|
||||
.documentUrl(documentUrl)
|
||||
.verificationId(verificationId)
|
||||
.execute();
|
||||
});
|
||||
}
|
||||
|
||||
domain.DocumentStatus _mapDocumentStatus(
|
||||
dc.EnumValue<dc.DocumentStatus> status,
|
||||
) {
|
||||
if (status is dc.Unknown) {
|
||||
return domain.DocumentStatus.pending;
|
||||
}
|
||||
final dc.DocumentStatus value =
|
||||
(status as dc.Known<dc.DocumentStatus>).value;
|
||||
switch (value) {
|
||||
case dc.DocumentStatus.VERIFIED:
|
||||
return domain.DocumentStatus.verified;
|
||||
case dc.DocumentStatus.PENDING:
|
||||
return domain.DocumentStatus.pending;
|
||||
case dc.DocumentStatus.MISSING:
|
||||
return domain.DocumentStatus.missing;
|
||||
case dc.DocumentStatus.UPLOADED:
|
||||
case dc.DocumentStatus.EXPIRING:
|
||||
return domain.DocumentStatus.pending;
|
||||
case dc.DocumentStatus.PROCESSING:
|
||||
case dc.DocumentStatus.AUTO_PASS:
|
||||
case dc.DocumentStatus.AUTO_FAIL:
|
||||
case dc.DocumentStatus.NEEDS_REVIEW:
|
||||
case dc.DocumentStatus.APPROVED:
|
||||
case dc.DocumentStatus.REJECTED:
|
||||
case dc.DocumentStatus.ERROR:
|
||||
if (value == dc.DocumentStatus.AUTO_PASS ||
|
||||
value == dc.DocumentStatus.APPROVED) {
|
||||
return domain.DocumentStatus.verified;
|
||||
}
|
||||
if (value == dc.DocumentStatus.AUTO_FAIL ||
|
||||
value == dc.DocumentStatus.REJECTED ||
|
||||
value == dc.DocumentStatus.ERROR) {
|
||||
return domain.DocumentStatus.rejected;
|
||||
}
|
||||
return domain.DocumentStatus.pending;
|
||||
}
|
||||
}
|
||||
|
||||
domain.DocumentVerificationStatus _mapFromDCDocumentVerificationStatus(
|
||||
dc.EnumValue<dc.DocumentStatus> status,
|
||||
) {
|
||||
if (status is dc.Unknown) {
|
||||
return domain.DocumentVerificationStatus.error;
|
||||
}
|
||||
final String name = (status as dc.Known<dc.DocumentStatus>).value.name;
|
||||
switch (name) {
|
||||
case 'PENDING':
|
||||
return domain.DocumentVerificationStatus.pending;
|
||||
case 'PROCESSING':
|
||||
return domain.DocumentVerificationStatus.processing;
|
||||
case 'AUTO_PASS':
|
||||
return domain.DocumentVerificationStatus.autoPass;
|
||||
case 'AUTO_FAIL':
|
||||
return domain.DocumentVerificationStatus.autoFail;
|
||||
case 'NEEDS_REVIEW':
|
||||
return domain.DocumentVerificationStatus.needsReview;
|
||||
case 'APPROVED':
|
||||
return domain.DocumentVerificationStatus.approved;
|
||||
case 'REJECTED':
|
||||
return domain.DocumentVerificationStatus.rejected;
|
||||
case 'VERIFIED':
|
||||
return domain.DocumentVerificationStatus.approved;
|
||||
case 'ERROR':
|
||||
return domain.DocumentVerificationStatus.error;
|
||||
default:
|
||||
return domain.DocumentVerificationStatus.error;
|
||||
}
|
||||
}
|
||||
|
||||
dc.DocumentStatus _mapToDCDocumentStatus(domain.DocumentStatus? status) {
|
||||
if (status == null) return dc.DocumentStatus.PENDING;
|
||||
switch (status) {
|
||||
case domain.DocumentStatus.verified:
|
||||
return dc.DocumentStatus.VERIFIED;
|
||||
case domain.DocumentStatus.pending:
|
||||
return dc.DocumentStatus.PENDING;
|
||||
case domain.DocumentStatus.missing:
|
||||
return dc.DocumentStatus.MISSING;
|
||||
case domain.DocumentStatus.rejected:
|
||||
return dc.DocumentStatus.REJECTED;
|
||||
case domain.DocumentStatus.expired:
|
||||
return dc.DocumentStatus.EXPIRING;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,4 +72,15 @@ abstract interface class StaffConnectorRepository {
|
||||
String? bio,
|
||||
String? profilePictureUrl,
|
||||
});
|
||||
|
||||
/// Fetches the staff documents for the current authenticated user.
|
||||
Future<List<StaffDocument>> getStaffDocuments();
|
||||
|
||||
/// Upserts staff document information.
|
||||
Future<void> upsertStaffDocument({
|
||||
required String documentId,
|
||||
required String documentUrl,
|
||||
DocumentStatus? status,
|
||||
String? verificationId,
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user