Files
fcs/lib/model/report_model.dart
2020-09-04 15:30:10 +06:30

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/helpers/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;
}
}