Implementation
Future<Uint8List> generateReport(
PdfPageFormat pageFormat, Map<String, dynamic> json) async {
const baseColor = Constant.basecolor;
final document = pw.Document();
final theme = pw.ThemeData.withFont(
base: await PdfGoogleFonts.openSansRegular(),
bold: await PdfGoogleFonts.openSansBold(),
);
// Future<String> getJson() {
// return rootBundle.loadString('report_data.json');
// }
Map<String, dynamic> reportData = json;
var newFormat = DateFormat("jm");
DateTime startTime = DateTime.parse(reportData["created_at"]);
DateTime finishTime = DateTime.parse(reportData["finished_at"]);
Duration difference = finishTime.difference(startTime);
List<int> xAxis = [];
List<int> yAxis = [];
List<int> stressplot = [];
List<int> recoveryplot = [];
List<int> stepcount = [];
List<int> activityplot = [];
List<Map<String, dynamic>> seriesdata = [];
Details user = Details();
ChartBar barlist = ChartBar();
Conversion convert = Conversion();
LegendList legendinfo = LegendList();
ChartTitle chartname = ChartTitle();
List<String> charttitle = Constant.charttitle;
List<dynamic> reportActivities = reportData["activities"];
reportActivities
.map((activity) => convert.activitytoseriesdata(activity, seriesdata))
.toList();
List<dynamic> reportCommontime = reportData["common_time"];
xaxisTimestampconvert(commontime) {
int commontimeConvert = DateTime.parse(commontime).millisecondsSinceEpoch;
xAxis.add(commontimeConvert);
}
reportCommontime
.map((timestamp) => xaxisTimestampconvert(timestamp))
.toList();
List<dynamic> reportProcessedhr = reportData["processed_hr"];
reportProcessedhr.map((hrvalue) => yAxis.add(hrvalue)).toList();
List<dynamic> reportStressscore = reportData["stress_scores"];
reportStressscore.map((stressvalue) => stressplot.add(stressvalue)).toList();
List<dynamic> reportRecoverylabel = reportData["recovery_label"];
reportRecoverylabel
.map((recoveryvalue) => recoveryplot.add(recoveryvalue))
.toList();
List<dynamic> reportStepcount = reportData["step_count"];
reportStepcount.map((countvalue) => stepcount.add(countvalue)).toList();
List<dynamic> reportActivitylevel = reportData["activity_level"];
reportActivitylevel
.map((activityvalue) => activityplot.add(activityvalue))
.toList();
String filterXaxis(int time) {
DateTime timestamp = DateTime.fromMillisecondsSinceEpoch(time);
return convert.xaxisTimestampFilter(timestamp, difference);
}
List<Userinfo> title = [];
title.add(Userinfo(field: Constant.name, value: reportData["name"]));
title.add(Userinfo(field: Constant.age, value: reportData["age"]));
title.add(Userinfo(field: Constant.height, value: reportData["height"]));
title.add(Userinfo(field: Constant.weight, value: reportData["weight"]));
title.add(Userinfo(field: Constant.gender, value: reportData["gender"]));
title.add(Userinfo(field: Constant.bmi, value: reportData["bmi"]));
title.add(
Userinfo(field: Constant.restinghr, value: reportData["resting_hr"]));
title.add(
Userinfo(field: Constant.maximumhr, value: reportData["maximum_hr"]));
String formattedstartsession = user.format(reportData["created_at"]);
title.add(
Userinfo(field: Constant.sessionstartdate, value: formattedstartsession));
String formattedStopSession = user.format(reportData["finished_at"]);
title.add(
Userinfo(field: Constant.sessionstarttime, value: formattedStopSession));
format(Duration d) => d.toString().split('.').first.padLeft(8, "0");
String sessionduration = format(difference).toString();
title.add(Userinfo(field: Constant.sessionduration, value: sessionduration));
int lowhr = reportData["min_session_hr_bpm"];
int avghr = reportData["avg_session_hr_bpm"];
int maxhr = reportData["max_session_hr_bpm"];
String hrvalue = "$lowhr/$avghr/$maxhr bpm";
title.add(Userinfo(field: Constant.hrLAH, value: hrvalue));
final chart1 = pw.Chart(
left: chartname.leftlabel(),
grid: chartname.chartaxis(xAxis, filterXaxis),
datasets: [
chartname.linegraph(baseColor, yAxis, xAxis),
for (int i = 0; i < seriesdata.length; i++)
barlist.bardataList(reportData, newFormat, seriesdata, i),
],
);
final chart2 = pw.Chart(
left: chartname.leftlabel(),
grid: chartname.chartaxis(xAxis, filterXaxis),
datasets: [
chartname.linegraph(baseColor, yAxis, xAxis),
for (int i = 0; i < stressplot.length; i++)
barlist.stressBar(stressplot, xAxis, yAxis, i)
],
);
final chart3 = pw.Chart(
left: chartname.leftlabel(),
grid: chartname.chartaxis(xAxis, filterXaxis),
datasets: [
chartname.linegraph(baseColor, yAxis, xAxis),
for (int i = 0; i < reportData["recovery_label"].length; i++)
barlist.recoverybar(recoveryplot, xAxis, yAxis, i)
],
);
final chart4 = pw.Chart(
left: pw.Container(
alignment: pw.Alignment.center,
margin: const pw.EdgeInsets.only(right: 5, top: 10),
child: pw.Transform.rotateBox(
angle: pi / 2,
child: pw.Text(Constant.leftlabel_atv,
style: const pw.TextStyle(fontSize: 8))),
),
grid: pw.CartesianGrid(
xAxis: pw.FixedAxis(xAxis,
textStyle: pw.TextStyle(fontSize: 8),
format: (axisvalue) => filterXaxis(axisvalue as int),
divisions: false),
yAxis: pw.FixedAxis(
[0, 30, 60, 90, 120],
textStyle: pw.TextStyle(fontSize: 8),
format: (v) => '$v',
divisions: false,
),
),
datasets: [
for (int i = 0; i < reportData["step_count"].length; i++)
barlist.activitybar(activityplot, xAxis, stepcount, i)
],
);
document.addPage(
pw.Page(
pageFormat: pageFormat,
theme: theme,
build: (context) {
// Page layout
return pw.Column(
children: [
pw.Container(
width: double.infinity,
height: 25,
color: Constant.titlebackground,
child: chartname.sessionheading()),
user.user_info(title),
chartname.graphtitle(charttitle[0], baseColor),
pw.SizedBox(
width: double.infinity,
height: 80,
child: pw.Container(child: chart1)),
legendinfo.legendone(seriesdata, reportData),
pw.SizedBox(height: 5),
chartname.graphtitle(charttitle[1], baseColor),
pw.SizedBox(
width: double.infinity,
height: 80,
child: pw.Container(child: chart2),
),
legendinfo.legendtwo(),
pw.SizedBox(height: 5),
chartname.graphtitle(charttitle[2], baseColor),
pw.SizedBox(
width: double.infinity,
height: 80,
child: pw.Container(child: chart3),
),
legendinfo.legendthree(),
pw.SizedBox(height: 5),
chartname.graphtitle(charttitle[3], baseColor),
pw.SizedBox(
width: double.infinity,
height: 80,
child: pw.Container(child: chart4),
),
legendinfo.legendfour()
],
);
},
),
);
return document.save();
}