701 lines
18 KiB
Dart
701 lines
18 KiB
Dart
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/fcs/common/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;
|
|
}
|
|
}
|