import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/domain/entities/invoice.dart'; import 'package:fcs/domain/entities/package.dart'; import 'package:fcs/domain/entities/receipt.dart'; import 'package:fcs/helpers/pagination.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; class InvoiceModel extends BaseModel { final log = Logger('InvoiceModel'); Pagination pagination; StreamSubscription listener; List invoices = [ Invoice( invoiceNumber: 'A092(A)-30', invoiceDate: DateTime(2020, 4, 5, 12, 30), customerName: 'Ko Nyi', customerPhoneNumber: '+959 888888888', amount: 500, status: 'Pending', packages: [ Package( shipmentNumber: "A202", receiverNumber: "3", boxNumber: "1", rate: 7, packageType: "General", weight: 25, status: "Received", receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon', arrivedDate: DateTime(2020, 6, 1), ), Package( shipmentNumber: "A202", receiverNumber: "3", boxNumber: "2", rate: 7, packageType: "General", weight: 20, status: "Received", arrivedDate: DateTime(2020, 6, 1), receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), ], receipts: [ Receipt(amount: 200, date: DateTime(2020, 6, 1)), Receipt(amount: 100, date: DateTime(2020, 6, 16)), ]), Invoice( invoiceNumber: 'A092(A)-31', invoiceDate: DateTime(2020, 4, 5, 9, 30), customerName: 'Ko Aung Myo', customerPhoneNumber: '+959 444444444', amount: 300, status: 'Paid', packages: [ Package( shipmentNumber: "A202", receiverNumber: "3", boxNumber: "3", rate: 7, packageType: "General", weight: 15, status: "Received", arrivedDate: DateTime(2020, 6, 1), receiverAddress: '1 Bo Yar Nyunt St.\nDagon Tsp, Yangon'), Package( shipmentNumber: "A202", receiverNumber: "2", boxNumber: "1", rate: 8, packageType: "Medicine", weight: 15, status: "Processing", arrivedDate: DateTime(2020, 6, 1), receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), ], receipts: [ Receipt(amount: 200, date: DateTime(2020, 6, 1)), ]), Invoice( invoiceNumber: 'A092(A)-32', invoiceDate: DateTime(2020, 4, 6, 10, 10), customerName: 'Ko Zaw Thu', customerPhoneNumber: '+959 777777777', amount: 200, status: 'Paid', packages: [ Package( shipmentNumber: "A202", receiverNumber: "2", boxNumber: "2", rate: 7, packageType: "General", weight: 55, status: "Ready to ship", arrivedDate: DateTime(2020, 6, 1), receiverAddress: '2 Shwe Taung Kyar St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A201", receiverNumber: "1", boxNumber: "1", rate: 9, packageType: "Dangerous", weight: 25, status: "Delivered", arrivedDate: DateTime(2020, 5, 21), receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), ], receipts: [ Receipt(amount: 200, date: DateTime(2020, 6, 1)), ]), Invoice( invoiceNumber: 'A092(A)-33', invoiceDate: DateTime(2020, 4, 6, 12, 15), customerName: 'Ko Myo Min', customerPhoneNumber: '+959 555555555', amount: 300, status: 'Pending', receipts: [ Receipt(amount: 200, date: DateTime(2020, 6, 1)), ], packages: [ Package( shipmentNumber: "A201", receiverNumber: "1", boxNumber: "1", rate: 9, packageType: "Dangerous", weight: 25, status: "Delivered", arrivedDate: DateTime(2020, 5, 21), receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), Package( shipmentNumber: "A201", receiverNumber: "1", boxNumber: "2", rate: 7, packageType: "General", weight: 5, status: "Delivered", arrivedDate: DateTime(2020, 5, 21), receiverAddress: '3 Kambzwza St, Bahan Tsp, Yangon'), ]) ]; List paidInvoices = []; bool endOfPaidInvoices = false; bool isLoading = false; @override void privilegeChanged() { super.privilegeChanged(); // _loadInvoices(); } Future _loadInvoices() async { if (user == null || !user.hasInvoices()) return; String path = "/$invoices/"; if (listener != null) listener.cancel(); invoices = []; try { listener = Firestore.instance .collection("$path") .snapshots() .listen((QuerySnapshot snapshot) { invoices.clear(); invoices = snapshot.documents.map((documentSnapshot) { var s = Invoice.fromMap( documentSnapshot.data, documentSnapshot.documentID); return s; }).toList(); notifyListeners(); }); } catch (e) { log.warning("Error!! $e"); } } Future initPaidInvoice(bool onlyFcs) { if (onlyFcs) { if (user == null || !((user.hasPackages() || user.hasReceiving() || user.hasProcessing()))) return null; } if (pagination != null) pagination.close(); paidInvoices = []; endOfPaidInvoices = false; isLoading = false; var pageQuery = Firestore.instance .collection("/$invoices"); // .collection( // "/users/8OTfsbVvsUOn1SLxy1OrKk7Y_yNKkVoGalPcIlcHnAY/messages") // .orderBy("date", descending: true); // .where("is_delivered", isEqualTo: true) // .where("is_deleted", isEqualTo: false); if (!onlyFcs) { pageQuery = pageQuery.where("user_id", isEqualTo: user.id); } // pageQuery = pageQuery.orderBy("current_status_date", descending: true); pagination = new Pagination(pageQuery, rowPerLoad: 20); pagination.stream.listen((doc) { if (doc == null) { endOfPaidInvoices = true; } else { paidInvoices.add(Invoice.fromMap(doc.data, doc.documentID)); // var m = Message.fromMap(doc.data, doc.documentID); // deliveredPackages.add(Package( // id: m.id, // status: package_delivered_status, // currentStatus: package_delivered_status, // currentStatusDate: m.date, // trackingID: (count++).toString(), // market: m.message)); } }); return null; } Future loadMorePaidInvoices() { if (pagination != null && !isLoading && !endOfPaidInvoices) { isLoading = true; notifyListeners(); pagination.load().then((value) { isLoading = false; notifyListeners(); }); } return null; } void initUser(user) { super.initUser(user); } @override logout() async { if (listener != null) await listener.cancel(); invoices = []; } Future create(Invoice invoice) { // return Services.instance.fcsShipmentService.createFcsShipment(fcsShipment); } Future update(Invoice invoice) { // return Services.instance.fcsShipmentService.updateFcsShipment(fcsShipment); } }