120 lines
3.2 KiB
Dart
120 lines
3.2 KiB
Dart
|
|
import 'package:cloud_firestore/cloud_firestore.dart';
|
||
|
|
import 'package:logging/logging.dart';
|
||
|
|
import 'package:fcs/vo/product.dart';
|
||
|
|
import 'package:fcs/vo/setting.dart';
|
||
|
|
|
||
|
|
import 'base_model.dart';
|
||
|
|
import 'constants.dart';
|
||
|
|
import 'firebase_helper.dart';
|
||
|
|
|
||
|
|
class ProductModel extends BaseModel {
|
||
|
|
final log = Logger('ProductModel');
|
||
|
|
|
||
|
|
List<Product> products = [];
|
||
|
|
List<Product> tempProducts = [];
|
||
|
|
|
||
|
|
List<ProductPrice> get getPrices {
|
||
|
|
List<ProductPrice> productPrices = [];
|
||
|
|
this.products.forEach((p) => productPrices.addAll(p.getPrices));
|
||
|
|
productPrices.sort((p1, p2) => p1.compareTo(p2));
|
||
|
|
return productPrices;
|
||
|
|
}
|
||
|
|
|
||
|
|
String getProductName(String productID) {
|
||
|
|
return products.firstWhere((p) => p.id == productID).name;
|
||
|
|
}
|
||
|
|
|
||
|
|
Product getProduct(String productID) {
|
||
|
|
return products.firstWhere((p) => p.id == productID);
|
||
|
|
}
|
||
|
|
|
||
|
|
List<Product> get productsToEdit {
|
||
|
|
// clone products
|
||
|
|
tempProducts = products.map((p) => Product.clone(p)).toList();
|
||
|
|
tempProducts.sort((p1, p2) => p1.displayOrder.compareTo(p2.displayOrder));
|
||
|
|
// set old price with price
|
||
|
|
tempProducts.forEach((p) {
|
||
|
|
p.oldPirce = p.price;
|
||
|
|
p.action = "update";
|
||
|
|
});
|
||
|
|
|
||
|
|
return tempProducts;
|
||
|
|
}
|
||
|
|
|
||
|
|
void saveProduct(Product product, String name, price, displayOrder, int color,
|
||
|
|
bool isDisable) {
|
||
|
|
if (product == null) {
|
||
|
|
tempProducts.add(Product(
|
||
|
|
action: "create",
|
||
|
|
name: name,
|
||
|
|
price: int.parse(price),
|
||
|
|
color: color,
|
||
|
|
displayOrder: int.parse(displayOrder),
|
||
|
|
isDisable: isDisable));
|
||
|
|
} else {
|
||
|
|
Product _product = product;
|
||
|
|
_product.name = name;
|
||
|
|
_product.price = int.parse(price);
|
||
|
|
_product.color = color;
|
||
|
|
_product.displayOrder = int.parse(displayOrder);
|
||
|
|
_product.isDisable = isDisable;
|
||
|
|
if (_product.id == null) {
|
||
|
|
_product.action = "create";
|
||
|
|
} else {
|
||
|
|
_product.action = "update";
|
||
|
|
}
|
||
|
|
}
|
||
|
|
notifyListeners();
|
||
|
|
}
|
||
|
|
|
||
|
|
void deleteProduct(Product product) {
|
||
|
|
if (product == null) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
if (product.id == null) {
|
||
|
|
tempProducts.remove(product);
|
||
|
|
} else {
|
||
|
|
Product _product = tempProducts.firstWhere((p) => p.id == product.id);
|
||
|
|
_product.action = "delete";
|
||
|
|
}
|
||
|
|
notifyListeners();
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
void initSetting(Setting setting) {
|
||
|
|
super.initSetting(setting);
|
||
|
|
|
||
|
|
try {
|
||
|
|
getQuerySnapshot(
|
||
|
|
"/$biz_collection/${setting.okEnergyId}/$product_collection")
|
||
|
|
.listen((QuerySnapshot snapshot) {
|
||
|
|
products.clear();
|
||
|
|
products = snapshot.documents.map((documentSnapshot) {
|
||
|
|
var data = Product.fromMap(
|
||
|
|
documentSnapshot.data, documentSnapshot.documentID);
|
||
|
|
return data;
|
||
|
|
}).toList();
|
||
|
|
products.sort((p1, p2) => p1.displayOrder.compareTo(p2.displayOrder));
|
||
|
|
notifyListeners();
|
||
|
|
}).onError((e) {
|
||
|
|
log.warning("Error! $e");
|
||
|
|
});
|
||
|
|
} catch (e) {
|
||
|
|
log.warning("Error!! $e");
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
@override
|
||
|
|
logout() async {
|
||
|
|
tempProducts = [];
|
||
|
|
}
|
||
|
|
|
||
|
|
updateProducts(List<Product> products) async {
|
||
|
|
var items = [];
|
||
|
|
products.forEach((p) {
|
||
|
|
if (p.action != null) items.add(p.toMap());
|
||
|
|
});
|
||
|
|
await request("/products", "PUT", payload: items, token: await getToken());
|
||
|
|
}
|
||
|
|
}
|