2020-05-29 07:45:27 +06:30
|
|
|
import 'dart:async';
|
|
|
|
|
import 'dart:convert' show HtmlEscape, base64, utf8;
|
|
|
|
|
|
|
|
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
|
|
|
import 'package:logging/logging.dart';
|
|
|
|
|
import 'package:fcs/config.dart';
|
2020-08-30 21:26:37 +06:30
|
|
|
import 'package:fcs/fcs/common/theme.dart';
|
2020-05-29 07:45:27 +06:30
|
|
|
import 'package:fcs/vo/buyer.dart';
|
|
|
|
|
import 'package:fcs/vo/popup_menu.dart';
|
|
|
|
|
|
|
|
|
|
import 'base_model.dart';
|
|
|
|
|
import 'constants.dart';
|
|
|
|
|
import 'firebase_helper.dart';
|
|
|
|
|
|
|
|
|
|
class BuyerModel extends BaseModel {
|
|
|
|
|
final log = Logger('BuyerModel');
|
|
|
|
|
|
|
|
|
|
StreamSubscription<QuerySnapshot> listener;
|
|
|
|
|
|
|
|
|
|
List<Buyer> buyers = [];
|
|
|
|
|
PopupMenu popupMenu = new PopupMenu(index: 0);
|
|
|
|
|
PopupMenu sortMenu = new PopupMenu();
|
|
|
|
|
Buyer searchBuyer;
|
|
|
|
|
void initUser(user) {
|
|
|
|
|
super.initUser(user);
|
|
|
|
|
_loadBuyers();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> _loadBuyers() async {
|
|
|
|
|
if (!user.isOwnerAndAbove() && !user.hasBuyer()) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
listener = getQuerySnapshotByOrder(
|
|
|
|
|
"/$biz_collection/${setting.okEnergyId}/$buyer_collection",
|
|
|
|
|
'user_name')
|
|
|
|
|
.listen((snaps) async {
|
|
|
|
|
buyers.clear();
|
|
|
|
|
snaps.documents.forEach((d) {
|
|
|
|
|
buyers.add(Buyer.fromMap(d.data, d.documentID));
|
|
|
|
|
});
|
|
|
|
|
notifyListeners();
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@override
|
|
|
|
|
logout() async {
|
|
|
|
|
if (listener != null) await listener.cancel();
|
|
|
|
|
buyers = [];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Buyer> getBuyer(String buyerID) async {
|
|
|
|
|
var snap = await getDocSnap(
|
|
|
|
|
"/$biz_collection/${setting.okEnergyId}/$buyer_collection", buyerID);
|
|
|
|
|
return Buyer.fromMap(snap.data, snap.documentID);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<Buyer> loadBuyerProducts(Buyer buyer, {bool force = false}) async {
|
|
|
|
|
if (!force && buyer.buyerProducts != null && buyer.buyerProducts.length > 0)
|
|
|
|
|
return buyer;
|
|
|
|
|
var snaps = await getSnapshot(
|
|
|
|
|
"/$biz_collection/${setting.okEnergyId}/$buyer_collection/${buyer.id}/$product_collection");
|
|
|
|
|
buyer.buyerProducts = snaps.documents
|
|
|
|
|
.map((s) => BuyerProduct.fromMap(s.data, s.documentID))
|
|
|
|
|
.toList();
|
|
|
|
|
return buyer;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> delete(Buyer buyer) async {
|
|
|
|
|
await request("/buyer/${buyer.id}", "DELETE", token: await getToken());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> approve(Buyer buyer) async {
|
|
|
|
|
await request("/buyer/approve", "PUT",
|
|
|
|
|
payload: buyer.toMap(), token: await getToken());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> reject(Buyer buyer) async {
|
|
|
|
|
await request("/buyer/reject", "POST",
|
|
|
|
|
payload: buyer.toMap(), token: await getToken());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<void> allocate(Buyer buyer) async {
|
|
|
|
|
await request("/buyer/allocate", "POST",
|
|
|
|
|
payload: buyer.toMap(), token: await getToken());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void filterStatus(String status, int _selectedIndex, int _sleectedSortIndex) {
|
|
|
|
|
this.sortMenu.index = _sleectedSortIndex;
|
|
|
|
|
buyers.clear();
|
|
|
|
|
if (listener != null) {
|
|
|
|
|
listener.cancel();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.popupMenu.index = _selectedIndex;
|
|
|
|
|
String path = "/$biz_collection/${setting.okEnergyId}/$buyer_collection";
|
|
|
|
|
listener = getFilterStatusSnapshot(path, status, 'user_name')
|
|
|
|
|
.listen((snaps) async {
|
|
|
|
|
buyers.clear();
|
|
|
|
|
snaps.documents.forEach((d) {
|
|
|
|
|
buyers.add(Buyer.fromMap(d.data, d.documentID));
|
|
|
|
|
});
|
|
|
|
|
notifyListeners();
|
|
|
|
|
});
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Future<List<Buyer>> search(String searchBuyer) async {
|
|
|
|
|
if (searchBuyer == null || searchBuyer == '') return List();
|
|
|
|
|
|
|
|
|
|
var bytes = utf8.encode(searchBuyer);
|
|
|
|
|
var base64Str = base64.encode(bytes);
|
|
|
|
|
HtmlEscape htmlEscape = const HtmlEscape();
|
|
|
|
|
String escapeBuyer = htmlEscape.convert(base64Str);
|
|
|
|
|
|
|
|
|
|
int limit = 20;
|
|
|
|
|
List<Buyer> _buyers = [];
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
var data = await request(
|
|
|
|
|
"/api/fts/$buyer_collection/$escapeBuyer/$limit", "GET",
|
|
|
|
|
token: await getToken(), url: Config.instance.reportURL);
|
|
|
|
|
if (data == null) return List();
|
|
|
|
|
|
|
|
|
|
data.forEach((buyer) {
|
|
|
|
|
var _buyer = Buyer.fromJson(buyer);
|
|
|
|
|
_buyers.add(_buyer);
|
|
|
|
|
});
|
|
|
|
|
} catch (e) {
|
|
|
|
|
// permission error
|
|
|
|
|
log.warning("buyer error:" + e.toString());
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
return _buyers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void filterSorting(int _sleectedSortIndex, int _selectedIndex) {
|
|
|
|
|
this.popupMenu.index = _selectedIndex;
|
|
|
|
|
buyers.clear();
|
|
|
|
|
if (listener != null) {
|
|
|
|
|
listener.cancel();
|
|
|
|
|
}
|
|
|
|
|
String _fieldName;
|
|
|
|
|
bool descending = false;
|
|
|
|
|
|
|
|
|
|
if (_sleectedSortIndex == 0) {
|
|
|
|
|
_fieldName = 'user_name';
|
|
|
|
|
descending = false;
|
|
|
|
|
}
|
|
|
|
|
if (_sleectedSortIndex == 1) {
|
|
|
|
|
_fieldName = 'user_name';
|
|
|
|
|
descending = true;
|
|
|
|
|
}
|
|
|
|
|
if (_sleectedSortIndex == 2) {
|
|
|
|
|
_fieldName = 'phone_number';
|
|
|
|
|
descending = false;
|
|
|
|
|
}
|
|
|
|
|
if (_sleectedSortIndex == 3) {
|
|
|
|
|
_fieldName = 'phone_number';
|
|
|
|
|
descending = true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.sortMenu.index = _sleectedSortIndex;
|
|
|
|
|
String path = "/$biz_collection/${setting.okEnergyId}/$buyer_collection";
|
|
|
|
|
listener =
|
|
|
|
|
getFilterSnapshot(path, descending, _fieldName).listen((snaps) async {
|
|
|
|
|
buyers.clear();
|
|
|
|
|
snaps.documents.forEach((d) {
|
|
|
|
|
buyers.add(Buyer.fromMap(d.data, d.documentID));
|
|
|
|
|
notifyListeners();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
notifyListeners();
|
|
|
|
|
});
|
|
|
|
|
notifyListeners();
|
|
|
|
|
}
|
|
|
|
|
}
|