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 listener; StreamSubscription listenerUser; List reports = []; List userReports = []; List filterValue = []; List get reportList { List _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 _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 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 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 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 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 getEscapeJson(Report report) async { var bytes = utf8.encode(await getJson(report)); var base64Str = base64.encode(bytes); return HtmlEscape().convert(base64Str); } Future 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 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 saveSelectedFieldsAndPosition( String id, List positonFields, List selectedFields) async { // positonFields.toJson ReportFieldPositionSelection report = ReportFieldPositionSelection( fieldPosition: positonFields, fieldSelection: selectedFields); await SharedPref.saveReport(report); } Future loadSelectedFieldsAndPosition( String id) async { var data = await SharedPref.getReport(id); return data; } }