Files
fcs/lib/model/buyer_model.dart

178 lines
5.0 KiB
Dart
Raw Normal View History

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();
}
}