add pickup provider
This commit is contained in:
20
lib/data/provider/pickup_data_provider.dart
Normal file
20
lib/data/provider/pickup_data_provider.dart
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
import 'dart:convert';
|
||||||
|
|
||||||
|
import 'package:fcs/config.dart';
|
||||||
|
import 'package:fcs/domain/constants.dart';
|
||||||
|
import 'package:fcs/domain/entities/package.dart';
|
||||||
|
import 'package:fcs/domain/entities/pickup.dart';
|
||||||
|
import 'package:fcs/helpers/api_helper.dart';
|
||||||
|
import 'package:fcs/helpers/firebase_helper.dart';
|
||||||
|
import 'package:logging/logging.dart';
|
||||||
|
|
||||||
|
class PickupDataProvider {
|
||||||
|
final log = Logger('PickupDataProvider');
|
||||||
|
static final PickupDataProvider instance = PickupDataProvider._();
|
||||||
|
PickupDataProvider._();
|
||||||
|
|
||||||
|
Future<void> completePickup(Pickup pickup) async {
|
||||||
|
return await requestAPI("/pickups/complete", "PUT",
|
||||||
|
payload: pickup.toMapForComplete(), token: await getToken());
|
||||||
|
}
|
||||||
|
}
|
||||||
19
lib/data/services/pickup_imp.dart
Normal file
19
lib/data/services/pickup_imp.dart
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
import 'package:fcs/data/provider/pickup_data_provider.dart';
|
||||||
|
import 'package:fcs/data/services/pickup_service.dart';
|
||||||
|
import 'package:fcs/domain/entities/connectivity.dart';
|
||||||
|
import 'package:fcs/domain/entities/pickup.dart';
|
||||||
|
|
||||||
|
class PickupServiceImp implements PickupService {
|
||||||
|
PickupServiceImp({
|
||||||
|
required this.connectivity,
|
||||||
|
required this.pickupDataProvider,
|
||||||
|
});
|
||||||
|
|
||||||
|
final Connectivity? connectivity;
|
||||||
|
final PickupDataProvider pickupDataProvider;
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<void> completePickup(Pickup pickup) {
|
||||||
|
return pickupDataProvider.completePickup(pickup);
|
||||||
|
}
|
||||||
|
}
|
||||||
6
lib/data/services/pickup_service.dart
Normal file
6
lib/data/services/pickup_service.dart
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import 'package:fcs/domain/entities/package.dart';
|
||||||
|
import 'package:fcs/domain/entities/pickup.dart';
|
||||||
|
|
||||||
|
abstract class PickupService {
|
||||||
|
Future<void> completePickup(Pickup pickup);
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@ import 'package:fcs/data/provider/delivery_address_data_provider.dart';
|
|||||||
import 'package:fcs/data/provider/fcs_shipment_data_provider.dart';
|
import 'package:fcs/data/provider/fcs_shipment_data_provider.dart';
|
||||||
import 'package:fcs/data/provider/invoice_data_provider.dart';
|
import 'package:fcs/data/provider/invoice_data_provider.dart';
|
||||||
import 'package:fcs/data/provider/package_data_provider.dart';
|
import 'package:fcs/data/provider/package_data_provider.dart';
|
||||||
|
import 'package:fcs/data/provider/pickup_data_provider.dart';
|
||||||
import 'package:fcs/data/provider/rate_data_provider.dart';
|
import 'package:fcs/data/provider/rate_data_provider.dart';
|
||||||
import 'package:fcs/data/provider/shipment_data_provider.dart';
|
import 'package:fcs/data/provider/shipment_data_provider.dart';
|
||||||
import 'package:fcs/data/provider/user_data_provider.dart';
|
import 'package:fcs/data/provider/user_data_provider.dart';
|
||||||
@@ -16,6 +17,8 @@ import 'package:fcs/data/services/fcs_shipment_imp.dart';
|
|||||||
import 'package:fcs/data/services/fcs_shipment_service.dart';
|
import 'package:fcs/data/services/fcs_shipment_service.dart';
|
||||||
import 'package:fcs/data/services/invoice_imp.dart';
|
import 'package:fcs/data/services/invoice_imp.dart';
|
||||||
import 'package:fcs/data/services/invoice_service.dart';
|
import 'package:fcs/data/services/invoice_service.dart';
|
||||||
|
import 'package:fcs/data/services/pickup_imp.dart';
|
||||||
|
import 'package:fcs/data/services/pickup_service.dart';
|
||||||
import 'package:fcs/data/services/rate_imp.dart';
|
import 'package:fcs/data/services/rate_imp.dart';
|
||||||
import 'package:fcs/data/services/rate_service.dart';
|
import 'package:fcs/data/services/rate_service.dart';
|
||||||
import 'package:fcs/data/services/shipment_imp.dart';
|
import 'package:fcs/data/services/shipment_imp.dart';
|
||||||
@@ -46,6 +49,7 @@ class Services {
|
|||||||
late ShipmentService _shipmentService;
|
late ShipmentService _shipmentService;
|
||||||
late CartonService _cartonService;
|
late CartonService _cartonService;
|
||||||
late InvoiceService _invoiceService;
|
late InvoiceService _invoiceService;
|
||||||
|
late PickupService _pickupService;
|
||||||
|
|
||||||
Services._() {
|
Services._() {
|
||||||
_authService = AuthServiceImp(
|
_authService = AuthServiceImp(
|
||||||
@@ -72,6 +76,8 @@ class Services {
|
|||||||
cartonDataProvider: CartonDataProvider.instance, connectivity: null);
|
cartonDataProvider: CartonDataProvider.instance, connectivity: null);
|
||||||
_invoiceService = InvoiceServiceImp(
|
_invoiceService = InvoiceServiceImp(
|
||||||
invoiceDataProvider: InvoiceDataProvider.instance, connectivity: null);
|
invoiceDataProvider: InvoiceDataProvider.instance, connectivity: null);
|
||||||
|
_pickupService = PickupServiceImp(
|
||||||
|
connectivity: null, pickupDataProvider: PickupDataProvider.instance);
|
||||||
}
|
}
|
||||||
|
|
||||||
AuthService get authService => _authService;
|
AuthService get authService => _authService;
|
||||||
@@ -85,4 +91,5 @@ class Services {
|
|||||||
ShipmentService get shipmentService => _shipmentService;
|
ShipmentService get shipmentService => _shipmentService;
|
||||||
CartonService get cartonService => _cartonService;
|
CartonService get cartonService => _cartonService;
|
||||||
InvoiceService get invoiceService => _invoiceService;
|
InvoiceService get invoiceService => _invoiceService;
|
||||||
|
PickupService get pickupService => _pickupService;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,7 @@ const user_joined_status = "joined";
|
|||||||
const pkg_files_path = "/packages";
|
const pkg_files_path = "/packages";
|
||||||
const shipment_labels_files_path = "/shipment_labels";
|
const shipment_labels_files_path = "/shipment_labels";
|
||||||
const receipt_labels_files_path = "/receipts";
|
const receipt_labels_files_path = "/receipts";
|
||||||
|
const pickups_files_path = "/pickups";
|
||||||
|
|
||||||
// Link page
|
// Link page
|
||||||
const page_payment_methods = "payment_methods";
|
const page_payment_methods = "payment_methods";
|
||||||
|
|||||||
@@ -20,6 +20,10 @@ class Pickup {
|
|||||||
String? shipperPhoneNumber;
|
String? shipperPhoneNumber;
|
||||||
String? status;
|
String? status;
|
||||||
|
|
||||||
|
// for complete
|
||||||
|
String? completeRemark;
|
||||||
|
List<String> photoUrls;
|
||||||
|
|
||||||
List<Package> packages;
|
List<Package> packages;
|
||||||
|
|
||||||
Pickup(
|
Pickup(
|
||||||
@@ -37,7 +41,8 @@ class Pickup {
|
|||||||
this.shipperName,
|
this.shipperName,
|
||||||
this.shipperPhoneNumber,
|
this.shipperPhoneNumber,
|
||||||
this.status,
|
this.status,
|
||||||
this.packages = const []});
|
this.packages = const [],
|
||||||
|
this.photoUrls = const []});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) => other is Pickup && other.id == id;
|
bool operator ==(Object other) => other is Pickup && other.id == id;
|
||||||
@@ -83,6 +88,14 @@ class Pickup {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Map<String, dynamic> toMapForComplete() {
|
||||||
|
return {
|
||||||
|
"id": id,
|
||||||
|
"complete_remark": completeRemark,
|
||||||
|
'photo_urls': photoUrls ?? [],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() {
|
String toString() {
|
||||||
return 'Pickup{id: $id}';
|
return 'Pickup{id: $id}';
|
||||||
|
|||||||
@@ -1,15 +1,20 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
import 'dart:math';
|
||||||
|
|
||||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||||
|
import 'package:fcs/data/services/services.dart';
|
||||||
|
import 'package:fcs/domain/constants.dart';
|
||||||
import 'package:fcs/domain/entities/package.dart';
|
import 'package:fcs/domain/entities/package.dart';
|
||||||
|
import 'package:fcs/domain/entities/pickup.dart';
|
||||||
import 'package:fcs/domain/entities/processing.dart';
|
import 'package:fcs/domain/entities/processing.dart';
|
||||||
|
import 'package:fcs/helpers/firebase_helper.dart';
|
||||||
import 'package:fcs/pages/main/model/base_model.dart';
|
import 'package:fcs/pages/main/model/base_model.dart';
|
||||||
import 'package:fcs/pagination/paginator_listener.dart';
|
import 'package:fcs/pagination/paginator_listener.dart';
|
||||||
import 'package:logging/logging.dart';
|
import 'package:logging/logging.dart';
|
||||||
|
import 'package:path/path.dart' as Path;
|
||||||
|
|
||||||
class PickupModel extends BaseModel {
|
class PickupModel extends BaseModel {
|
||||||
// List<Processing> pickups = [];
|
|
||||||
final log = Logger('PickupModel');
|
final log = Logger('PickupModel');
|
||||||
|
|
||||||
StreamSubscription<QuerySnapshot>? listener;
|
StreamSubscription<QuerySnapshot>? listener;
|
||||||
@@ -48,7 +53,33 @@ class PickupModel extends BaseModel {
|
|||||||
// pickups = [];
|
// pickups = [];
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> createProcessing(Processing processing) async {}
|
Future<void> complete(
|
||||||
|
Pickup pickup, List<File?> files, List<String?> deletedUrls) async {
|
||||||
Future<void> updateProcessing(Processing processing) async {}
|
for (String? url in deletedUrls) {
|
||||||
|
pickup.photoUrls.remove(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
// check files count
|
||||||
|
var count = (pickup.photoUrls.length) + files.length - (deletedUrls.length);
|
||||||
|
if (count > uploadPhotoLimit)
|
||||||
|
throw Exception("Exceed number of file upload");
|
||||||
|
|
||||||
|
List<String> uploadedURLs = [];
|
||||||
|
String path = Path.join(pickups_files_path, pickup.id);
|
||||||
|
uploadedURLs = await uploadFiles(path, files);
|
||||||
|
pickup.photoUrls.addAll(uploadedURLs);
|
||||||
|
pickup.photoUrls.removeWhere((e) => deletedUrls.contains(e));
|
||||||
|
|
||||||
|
try {
|
||||||
|
await Services.instance.pickupService.completePickup(pickup);
|
||||||
|
} catch (e) {
|
||||||
|
// delete newly uploaded photos if fails
|
||||||
|
try {
|
||||||
|
deleteStorageFromUrls(uploadedURLs);
|
||||||
|
pickup.photoUrls.removeWhere((i) => uploadedURLs.contains(i));
|
||||||
|
} catch (e) {}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
return deleteStorageFromUrls(deletedUrls);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user