add structure
This commit is contained in:
700
lib/model/report_model.dart
Normal file
700
lib/model/report_model.dart
Normal file
@@ -0,0 +1,700 @@
|
||||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
|
||||
import 'package:cloud_firestore/cloud_firestore.dart';
|
||||
import 'package:fcs/vo/report.dart';
|
||||
import 'package:fcs/vo/report_user.dart';
|
||||
import 'package:open_file/open_file.dart';
|
||||
import 'package:path_provider/path_provider.dart';
|
||||
import 'package:fcs/model/api_helper.dart' as api;
|
||||
import 'package:fcs/vo/report.dart';
|
||||
|
||||
import '../config.dart';
|
||||
import 'base_model.dart';
|
||||
import 'constants.dart';
|
||||
import 'firebase_helper.dart';
|
||||
import 'shared_pref.dart';
|
||||
|
||||
class ReportModel extends BaseModel {
|
||||
StreamSubscription<QuerySnapshot> listener;
|
||||
StreamSubscription<QuerySnapshot> listenerUser;
|
||||
|
||||
List<Report> reports = [];
|
||||
List<Report> userReports = [];
|
||||
List filterValue = [];
|
||||
|
||||
List<Report> get reportList {
|
||||
List<Report> _reports = [];
|
||||
if (user.isOwnerAndAbove() || user.hasAdmin()) {
|
||||
_reports = reports;
|
||||
} else {
|
||||
_reports.addAll(reports);
|
||||
userReports.forEach((r) {
|
||||
if (!_reports.contains(r)) {
|
||||
_reports.add(r);
|
||||
}
|
||||
});
|
||||
}
|
||||
_reports.sort((a, b) => a.display.compareTo(b.display));
|
||||
return _reports;
|
||||
}
|
||||
|
||||
void initUser(user) {
|
||||
super.initUser(user);
|
||||
reports = [];
|
||||
_loadReports();
|
||||
}
|
||||
|
||||
Future<void> _loadReports() async {
|
||||
if (listener != null) listener.cancel();
|
||||
if (listenerUser != null) listenerUser.cancel();
|
||||
|
||||
if (user.isOwnerAndAbove() || user.hasAdmin()) {
|
||||
listener = Firestore.instance
|
||||
.collection("/$reports_collection")
|
||||
.snapshots()
|
||||
.listen((snaps) async {
|
||||
reports.clear();
|
||||
reports = snaps.documents.map((documentSnapshot) {
|
||||
var report = Report.fromMap(
|
||||
documentSnapshot.data, documentSnapshot.documentID);
|
||||
return report;
|
||||
}).toList();
|
||||
notifyListeners();
|
||||
});
|
||||
} else {
|
||||
listener = Firestore.instance
|
||||
.collection("/$reports_collection")
|
||||
.where("for_all_users", isEqualTo: true)
|
||||
.snapshots()
|
||||
.listen((snaps) async {
|
||||
reports.clear();
|
||||
reports = snaps.documents.map((documentSnapshot) {
|
||||
var report = Report.fromMap(
|
||||
documentSnapshot.data, documentSnapshot.documentID);
|
||||
return report;
|
||||
}).toList();
|
||||
notifyListeners();
|
||||
});
|
||||
|
||||
listenerUser = Firestore.instance
|
||||
.collection("/$report_user_collection")
|
||||
.where("user_id", isEqualTo: user.docID)
|
||||
.snapshots()
|
||||
.listen((snaps) async {
|
||||
userReports.clear();
|
||||
userReports = snaps.documents.map((documentSnapshot) {
|
||||
var user = ReportUser.fromMap(
|
||||
documentSnapshot.data, documentSnapshot.documentID);
|
||||
var report = Report(id: user.reportID, display: user.reportName);
|
||||
return report;
|
||||
}).toList();
|
||||
notifyListeners();
|
||||
});
|
||||
}
|
||||
notifyListeners();
|
||||
}
|
||||
|
||||
@override
|
||||
void logout() {
|
||||
reports = [];
|
||||
if (listener != null) listener.cancel();
|
||||
if (listenerUser != null) listenerUser.cancel();
|
||||
}
|
||||
|
||||
Future<Report> getReport(String repID) async {
|
||||
String path = "/$reports_collection";
|
||||
|
||||
var snap = await Firestore.instance.collection(path).document(repID).get();
|
||||
Report report = Report.fromMap(snap.data, snap.documentID);
|
||||
return report;
|
||||
}
|
||||
|
||||
Future<List> getReportData(Report report, int limit, int offset) async {
|
||||
List reportDataList = [];
|
||||
var aggFun = [];
|
||||
var fields = [];
|
||||
var groupbys = [];
|
||||
// print('report => $report');
|
||||
try {
|
||||
report.fields.asMap().forEach((key, value) {
|
||||
if (value.aggFun == '') {
|
||||
aggFun.add('');
|
||||
} else {
|
||||
aggFun.add(value.aggFun);
|
||||
}
|
||||
});
|
||||
report.fields.asMap().forEach((key, value) {
|
||||
fields.add(value.name);
|
||||
});
|
||||
|
||||
String strFields;
|
||||
fields.forEach((element) {
|
||||
if (strFields == null) {
|
||||
strFields = element;
|
||||
} else {
|
||||
strFields = strFields + ',' + element;
|
||||
}
|
||||
});
|
||||
|
||||
String strAgg;
|
||||
aggFun.forEach((element) {
|
||||
if (strAgg == null) {
|
||||
strAgg = element;
|
||||
} else {
|
||||
strAgg = strAgg + ',' + element;
|
||||
}
|
||||
});
|
||||
|
||||
String strGroup;
|
||||
groupbys.forEach((element) {
|
||||
if (strGroup == null) {
|
||||
strGroup = element;
|
||||
} else {
|
||||
strGroup = strGroup + ',' + element;
|
||||
}
|
||||
});
|
||||
|
||||
var data = {
|
||||
"fields": strFields == null ? '' : strFields,
|
||||
"aggfuns": strAgg == null ? '' : strAgg,
|
||||
// "groupbys": strGroup == null ? '' : strGroup,
|
||||
"limit": limit,
|
||||
"offset": offset
|
||||
};
|
||||
print("payload:$data");
|
||||
|
||||
var rdata = {
|
||||
"fields": 'quantity,product_id,product_name',
|
||||
"aggfuns": ",,",
|
||||
"groupbys": 'product_id',
|
||||
"limit": limit,
|
||||
"offset": offset
|
||||
};
|
||||
var result = await request("/api/data/${report.object}", "POST",
|
||||
token: await getToken(),
|
||||
url: Config.instance.reportURL,
|
||||
payload: jsonEncode(data));
|
||||
|
||||
if (result == null) return [];
|
||||
result.forEach((rdata) {
|
||||
reportDataList.add(rdata);
|
||||
});
|
||||
// print('reportDataList => $reportDataList');
|
||||
notifyListeners();
|
||||
return reportDataList;
|
||||
} catch (e) {
|
||||
log.warning("Error get Summary>>>>${e.toString()}");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> downloadReportData(Report report) async {
|
||||
var aggFun = [];
|
||||
var fields = [];
|
||||
report.fields.asMap().forEach((key, value) {
|
||||
if (value.aggFun == '') {
|
||||
aggFun.add('');
|
||||
} else {
|
||||
aggFun.add(value.aggFun);
|
||||
}
|
||||
});
|
||||
report.fields.asMap().forEach((key, value) {
|
||||
fields.add(value.name);
|
||||
});
|
||||
|
||||
String strFields;
|
||||
fields.forEach((element) {
|
||||
if (strFields == null) {
|
||||
strFields = element;
|
||||
} else {
|
||||
strFields = strFields + ',' + element;
|
||||
}
|
||||
});
|
||||
|
||||
String strAgg;
|
||||
aggFun.forEach((element) {
|
||||
if (strAgg == null) {
|
||||
strAgg = element;
|
||||
} else {
|
||||
strAgg = strAgg + ',' + element;
|
||||
}
|
||||
});
|
||||
|
||||
// final directory = await getApplicationDocumentsDirectory();
|
||||
final directory = await getExternalStorageDirectory();
|
||||
String path = ('${directory.path}/${report.id}.pdf');
|
||||
log.info("download file path:$path");
|
||||
|
||||
var data = {
|
||||
"fields": strFields == null ? '' : strFields,
|
||||
"aggfuns": strAgg == null ? '' : strAgg,
|
||||
"greoupbys": '',
|
||||
"limit": 0,
|
||||
"offset": 0
|
||||
};
|
||||
|
||||
await api.requestDownloadPDFAPI("/api/report-pdf/${report.object}", "GET",
|
||||
filePath: path,
|
||||
url: Config.instance.reportURL,
|
||||
token: await getToken(),
|
||||
payload: jsonEncode(data));
|
||||
|
||||
final message = await OpenFile.open(path);
|
||||
log.info("Open file result:$message");
|
||||
}
|
||||
|
||||
Future<String> getJson(Report report) async {
|
||||
var aggFun = [];
|
||||
var fields = [];
|
||||
report.fields.asMap().forEach((key, value) {
|
||||
if (value.aggFun == '') {
|
||||
aggFun.add('');
|
||||
} else {
|
||||
aggFun.add(value.aggFun);
|
||||
}
|
||||
});
|
||||
report.fields.asMap().forEach((key, value) {
|
||||
fields.add(value.name);
|
||||
});
|
||||
|
||||
String strFields;
|
||||
fields.forEach((element) {
|
||||
if (strFields == null) {
|
||||
strFields = element;
|
||||
} else {
|
||||
strFields = strFields + ',' + element;
|
||||
}
|
||||
});
|
||||
|
||||
String strAgg;
|
||||
aggFun.forEach((element) {
|
||||
if (strAgg == null) {
|
||||
strAgg = element;
|
||||
} else {
|
||||
strAgg = strAgg + ',' + element;
|
||||
}
|
||||
});
|
||||
|
||||
var data = {
|
||||
"fields": strFields == null ? '' : strFields,
|
||||
"aggfuns": strAgg == null ? '' : strAgg,
|
||||
"greoupbys": '',
|
||||
"limit": 0,
|
||||
"offset": 0
|
||||
};
|
||||
return jsonEncode(data);
|
||||
}
|
||||
|
||||
Future<String> getEscapeJson(Report report) async {
|
||||
var bytes = utf8.encode(await getJson(report));
|
||||
var base64Str = base64.encode(bytes);
|
||||
return HtmlEscape().convert(base64Str);
|
||||
}
|
||||
|
||||
Future<List> getReportDataWithFilters(Report report, List filters) async {
|
||||
List reportDataList = [];
|
||||
var aggFun = [];
|
||||
var fields = [];
|
||||
var groupbys = [];
|
||||
|
||||
try {
|
||||
var data = report.convertArrayToString(report, filters);
|
||||
print('data=> $data');
|
||||
|
||||
var result = await request("/api/data/${report.object}", "POST",
|
||||
token: await getToken(),
|
||||
url: Config.instance.reportURL,
|
||||
payload: jsonEncode(data));
|
||||
|
||||
if (result == null) return [];
|
||||
result.forEach((rdata) {
|
||||
reportDataList.add(rdata);
|
||||
});
|
||||
|
||||
notifyListeners();
|
||||
return reportDataList;
|
||||
} catch (e) {
|
||||
log.warning("Error get Summary>>>>${e.toString()}");
|
||||
}
|
||||
}
|
||||
|
||||
Future<void> addreport() async {
|
||||
var data = [
|
||||
{
|
||||
"display": "Buyer Rpt",
|
||||
"object": "buyer_rpt",
|
||||
"display_filters": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"compare": "==",
|
||||
"data_type": "string",
|
||||
},
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "reg_date",
|
||||
"display_name": "Registered Date",
|
||||
"to_fixed": 0,
|
||||
"type": "intdate",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "biz_name",
|
||||
"display_name": "Business Name",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "biz_address",
|
||||
"display_name": "Business Address",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
],
|
||||
"display_fields": ['biz_name', 'biz_name', 'reg_date', 'user_name'],
|
||||
"sorts": [],
|
||||
"groupbys": []
|
||||
},
|
||||
{
|
||||
"display": "Delivery Rpt",
|
||||
"object": "delivery_rpt",
|
||||
"display_filters": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"compare": "==",
|
||||
"data_type": "string",
|
||||
},
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "delivery_ended_date",
|
||||
"display_name": "Delivery Ended Date",
|
||||
"to_fixed": 0,
|
||||
"type": "intdate",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_92",
|
||||
"display_name": "Qty 92",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_95",
|
||||
"display_name": "Qty 95",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_d",
|
||||
"display_name": "Qty D",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_p",
|
||||
"display_name": "Qty P",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
],
|
||||
"display_fields": [
|
||||
'qty_p',
|
||||
'qty_d',
|
||||
'qty_95',
|
||||
'qty_92',
|
||||
'delivery_ended_date',
|
||||
'user_name',
|
||||
],
|
||||
"sorts": [],
|
||||
"groupbys": []
|
||||
},
|
||||
{
|
||||
"display": "DOs Rpt",
|
||||
"object": "dos_rpt",
|
||||
"display_filters": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"compare": "==",
|
||||
"data_type": "string",
|
||||
},
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "doc_date",
|
||||
"display_name": "DO Date",
|
||||
"to_fixed": 0,
|
||||
"type": "intdate",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "doc_number",
|
||||
"display_name": "PO/DO Number",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_92",
|
||||
"display_name": "Qty 92",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_95",
|
||||
"display_name": "Qty 95",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_d",
|
||||
"display_name": "Qty D",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_p",
|
||||
"display_name": "Qty P",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
],
|
||||
"display_fields": [
|
||||
'qty_p',
|
||||
'qty_d',
|
||||
'qty_95',
|
||||
'qty_92',
|
||||
'doc_date',
|
||||
'user_name',
|
||||
'doc_number'
|
||||
],
|
||||
"sorts": [],
|
||||
"groupbys": []
|
||||
},
|
||||
{
|
||||
"display": "POs Rpt",
|
||||
"object": "pos_rpt",
|
||||
"display_filters": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"compare": "==",
|
||||
"data_type": "string",
|
||||
},
|
||||
{
|
||||
"name": "po_number",
|
||||
"display_name": "PO Number",
|
||||
"compare": "==",
|
||||
"data_type": "string",
|
||||
}
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "po_date",
|
||||
"display_name": "PO Date",
|
||||
"to_fixed": 0,
|
||||
"type": "intdate",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "po_number",
|
||||
"display_name": "PO Number",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_92",
|
||||
"display_name": "Qty 92",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_95",
|
||||
"display_name": "Qty 95",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_d",
|
||||
"display_name": "Qty D",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "qty_p",
|
||||
"display_name": "Qty P",
|
||||
"to_fixed": 0,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "price_92",
|
||||
"display_name": "Price 92",
|
||||
"to_fixed": 0,
|
||||
"type": "integer",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "price_95",
|
||||
"display_name": "Price 95",
|
||||
"to_fixed": 0,
|
||||
"type": "integer",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "price_d",
|
||||
"display_name": "Price D",
|
||||
"to_fixed": 0,
|
||||
"type": "integer",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "price_p",
|
||||
"display_name": "Price P",
|
||||
"to_fixed": 0,
|
||||
"type": "integer",
|
||||
"agg_fun": "",
|
||||
}
|
||||
],
|
||||
"display_fields": [
|
||||
'qty_p',
|
||||
'qty_d',
|
||||
'qty_95',
|
||||
'qty_92',
|
||||
'price_p',
|
||||
'price_d',
|
||||
'price_95',
|
||||
'price_92',
|
||||
'po_date',
|
||||
'user_name',
|
||||
'po_number'
|
||||
],
|
||||
"sorts": [],
|
||||
"groupbys": []
|
||||
},
|
||||
{
|
||||
"display": "Storage Charge Rpt",
|
||||
"object": "storage_charge_rpt",
|
||||
"display_filters": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"compare": "==",
|
||||
"data_type": "string",
|
||||
},
|
||||
],
|
||||
"fields": [
|
||||
{
|
||||
"name": "user_name",
|
||||
"display_name": "User Name",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "total_qty",
|
||||
"display_name": "Quantity",
|
||||
"to_fixed": 3,
|
||||
"type": "float",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "rate",
|
||||
"display_name": "Rate",
|
||||
"to_fixed": 0,
|
||||
"type": "string",
|
||||
"agg_fun": "",
|
||||
},
|
||||
{
|
||||
"name": "storage_charge",
|
||||
"display_name": "Amount",
|
||||
"to_fixed": 3,
|
||||
"type": "integer",
|
||||
"agg_fun": "",
|
||||
},
|
||||
],
|
||||
"display_fields": [
|
||||
'qty_p',
|
||||
'qty_d',
|
||||
'qty_95',
|
||||
'qty_92',
|
||||
'price_p',
|
||||
'price_d',
|
||||
'price_95',
|
||||
'price_92',
|
||||
'po_date',
|
||||
'user_name',
|
||||
'po_number'
|
||||
],
|
||||
"sorts": [],
|
||||
"groupbys": []
|
||||
}
|
||||
];
|
||||
|
||||
data.asMap().forEach((key, value) {
|
||||
Firestore.instance
|
||||
.collection("/$reports_collection")
|
||||
.document()
|
||||
.setData(value);
|
||||
});
|
||||
}
|
||||
|
||||
Future<void> saveSelectedFieldsAndPosition(
|
||||
String id, List<Field> positonFields, List selectedFields) async {
|
||||
// positonFields.toJson
|
||||
ReportFieldPositionSelection report = ReportFieldPositionSelection(
|
||||
fieldPosition: positonFields, fieldSelection: selectedFields);
|
||||
await SharedPref.saveReport(report);
|
||||
}
|
||||
|
||||
Future<ReportFieldPositionSelection> loadSelectedFieldsAndPosition(
|
||||
String id) async {
|
||||
var data = await SharedPref.getReport(id);
|
||||
return data;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user