import 'dart:async'; import 'package:cloud_firestore/cloud_firestore.dart'; import 'package:fcs/data/services/services.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/domain/vo/message.dart'; import 'package:fcs/helpers/paginator.dart'; import 'package:fcs/pages/main/model/base_model.dart'; import 'package:logging/logging.dart'; import 'package:fcs/domain/constants.dart'; class InvoiceModel extends BaseModel { final log = Logger('InvoiceModel'); StreamSubscription listener; List _invoices = [ 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: '1 Jun 2020'), ], 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 get invoices => _selectedIndex == 1 ? _invoices : List.from(_paid.values); Paginator _paid; bool endOfPaidInvoices = false; bool isLoading = false; int _selectedIndex = 1; set selectedIndex(int index) { _selectedIndex = index; notifyListeners(); } get selectedIndex => _selectedIndex; @override void privilegeChanged() { super.privilegeChanged(); } initData(bool forCustomer) { _selectedIndex = 1; // _loadFcsInvoices(forCustomer); if (_paid != null) _paid.close(); _paid = _getPaid(forCustomer); } Future _loadFcsInvoices(bool forCustomer) async { if (user == null) return; if (!forCustomer && !user.hasInvoices()) return; String path = "/$invoices_collection"; if (listener != null) listener.cancel(); _invoices = []; try { var q = Firestore.instance .collection("$path") .where("is_paid", isEqualTo: false) .where("is_deleted", isEqualTo: false); if (forCustomer) { q = q.where("user_id", isEqualTo: user.id); } listener = q.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"); } } Paginator _getPaid(bool isCustomer) { if (!isCustomer) { if (user == null || !(user.hasInvoices())) throw "No privilege"; } var pageQuery = Firestore.instance .collection("/$packages_collection") .where("is_delivered", isEqualTo: true) .where("is_deleted", isEqualTo: false); if (isCustomer) { pageQuery = pageQuery.where("user_id", isEqualTo: user.id); } pageQuery = pageQuery.orderBy("status_date", descending: true); var paginator = new Paginator(pageQuery, rowPerLoad: 20, toObj: (data, id) { return Invoice.fromMap(data, id); }); return paginator; } Future loadMore({bool isCustomer}) async { if (_selectedIndex == 1) return; // when paid menu is not selected return if (_paid.ended) return; isLoading = true; notifyListeners(); await _paid.load(onFinished: () { isLoading = false; notifyListeners(); }); } Future refresh({bool isCustomer}) async { if (_selectedIndex == 1) return; // when paid menu is not selected return await _paid.refresh(onFinished: () { notifyListeners(); }); } void initUser(user) { super.initUser(user); } logout() async { if (_paid != null) _paid.close(); if (listener != null) await listener.cancel(); _invoices = []; } Future createInvoice(Invoice invoice) { // return Services.instance.invoiceService.createInvoice(invoice); } Future updateInvoice(Invoice invoice) { // return Services.instance.invoiceService.updateInvoice(invoice); } }