@measurequick/measurequick-report-generator 1.2.4 → 1.2.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/report-gen-scripts/measurement-details.js +160 -148
- package/util.js +1 -1
package/package.json
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
PDFDocument
|
|
3
|
+
} from 'pdf-lib';
|
|
2
4
|
import * as base64 from '../base-64/icons.js';
|
|
3
5
|
import * as util from '../util.js';
|
|
4
6
|
import * as pdf from '../base-64/measurement-details-page.js';
|
|
@@ -6,159 +8,169 @@ import * as pdf from '../base-64/measurement-details-page.js';
|
|
|
6
8
|
let embeddedIconsTestIn = {};
|
|
7
9
|
let embeddedIconsTestOut = {};
|
|
8
10
|
|
|
9
|
-
export async function getReport(payload) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
11
|
+
export async function getReport(payload) {
|
|
12
|
+
console.log(payload);
|
|
13
|
+
const pdfDocPg1 = await PDFDocument.load(util._base64ToArrayBuffer(pdf.base64));
|
|
14
|
+
const pdfDocPg2 = await PDFDocument.load(util._base64ToArrayBuffer(pdf.base64));
|
|
15
|
+
|
|
16
|
+
const formPg1 = pdfDocPg1.getForm();
|
|
17
|
+
const formPg2 = pdfDocPg2.getForm();
|
|
18
|
+
|
|
19
|
+
let mapImagePg1, mapImagePg2;
|
|
20
|
+
if (payload.map) {
|
|
21
|
+
if (payload.map.includes("image/jpeg")) {
|
|
22
|
+
mapImagePg1 = await pdfDocPg1.embedJpg(util._base64ToArrayBuffer(payload.map));
|
|
23
|
+
mapImagePg2 = await pdfDocPg2.embedJpg(util._base64ToArrayBuffer(payload.map));
|
|
24
|
+
} else if (payload.map.includes("image/png")) {
|
|
25
|
+
mapImagePg1 = await pdfDocPg1.embedPng(util._base64ToArrayBuffer(payload.map));
|
|
26
|
+
mapImagePg2 = await pdfDocPg2.embedPng(util._base64ToArrayBuffer(payload.map));
|
|
25
27
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
let labels = ["iconRangeHigh", "iconRangeLow", "iconRangeNormal", "iconTesto", "iconCalculator", "iconFieldpiece",
|
|
31
|
+
"iconUei", "iconSporlanPro", "iconSporlanLegacy", "iconIconnect", "iconImanifold", "iconSensi",
|
|
32
|
+
"iconBluflame", "iconRedfish510", "iconRedfish510333", "iconRedfish550", "iconDg1000", "iconTrueflow", "iconThumbprintRed", "iconThumbprintGreen", "iconThumbprintYellow"
|
|
33
|
+
];
|
|
34
|
+
for (let label of labels) embeddedIconsTestIn[label] = await pdfDocPg1.embedPng(util._base64ToArrayBuffer(base64[label]));
|
|
35
|
+
for (let label of labels) embeddedIconsTestOut[label] = await pdfDocPg2.embedPng(util._base64ToArrayBuffer(base64[label]));
|
|
36
|
+
|
|
37
|
+
const mqLogoBytes = util._base64ToArrayBuffer(base64.mqLogo);
|
|
38
|
+
const mqLogoPg1 = await pdfDocPg1.embedPng(mqLogoBytes);
|
|
39
|
+
const mqLogoPg2 = await pdfDocPg2.embedPng(mqLogoBytes);
|
|
40
|
+
|
|
41
|
+
// embed company logo and profile picture
|
|
42
|
+
let profileImagePg1, companyImagePg1, profileImagePg2, companyImagePg2;
|
|
43
|
+
if (payload.meta.pdf_settings.includeProfilePic) {
|
|
44
|
+
if (payload.meta.pdf_settings.shapeProfilePic && payload.meta.profile_settings.profilePicCircleBase64) {
|
|
45
|
+
if (payload.meta.profile_settings.profilePicCircleBase64.includes("image/jpeg")) {
|
|
46
|
+
profileImagePg1 = await pdfDocPg1.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicCircleBase64));
|
|
47
|
+
profileImagePg2 = await pdfDocPg2.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicCircleBase64));
|
|
48
|
+
} else if (payload.meta.profile_settings.profilePicCircleBase64.includes("image/png")) {
|
|
49
|
+
profileImagePg1 = await pdfDocPg1.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicCircleBase64));
|
|
50
|
+
profileImagePg2 = await pdfDocPg2.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicCircleBase64));
|
|
51
|
+
}
|
|
52
|
+
} else if (payload.meta.profile_settings.profilePicSquareBase64) {
|
|
53
|
+
if (payload.meta.profile_settings.profilePicSquareBase64.includes("image/jpeg")) {
|
|
54
|
+
profileImagePg1 = await pdfDocPg1.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicSquareBase64));
|
|
55
|
+
profileImagePg2 = await pdfDocPg2.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicSquareBase64));
|
|
56
|
+
} else if (payload.meta.profile_settings.profilePicSquareBase64.includes("image/png")) {
|
|
57
|
+
profileImagePg1 = await pdfDocPg1.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicSquareBase64));
|
|
58
|
+
profileImagePg2 = await pdfDocPg2.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.profilePicSquareBase64));
|
|
59
|
+
}
|
|
57
60
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
}
|
|
62
|
+
if (payload.meta.pdf_settings.includeCompanyLogo && payload.meta.profile_settings.companyLogoBase64) {
|
|
63
|
+
if (payload.meta.profile_settings.companyLogoBase64.includes("image/jpeg")) {
|
|
64
|
+
companyImagePg1 = await pdfDocPg1.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
65
|
+
companyImagePg2 = await pdfDocPg2.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
66
|
+
} else if (payload.meta.profile_settings.companyLogoBase64.includes("image/png")) {
|
|
67
|
+
companyImagePg1 = await pdfDocPg1.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
68
|
+
companyImagePg2 = await pdfDocPg2.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
66
69
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// print company logo and profile picture
|
|
73
|
+
if (profileImagePg1 && companyImagePg1) {
|
|
74
|
+
formPg1.getButton("ProfilePicture").setImage(profileImagePg1);
|
|
75
|
+
formPg1.getButton("HalfWidthLogo").setImage(companyImagePg1);
|
|
76
|
+
formPg2.getButton("ProfilePicture").setImage(profileImagePg2);
|
|
77
|
+
formPg2.getButton("HalfWidthLogo").setImage(companyImagePg2);
|
|
78
|
+
if (payload.meta.profile_settings.techFirstName || payload.meta.profile_settings.techLastName) {
|
|
79
|
+
formPg1.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
80
|
+
formPg2.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
81
|
+
}
|
|
82
|
+
} else if (profileImagePg1) {
|
|
83
|
+
formPg1.getButton("ProfilePicture").setImage(profileImagePg1);
|
|
84
|
+
formPg1.getButton("HalfWidthLogo").setImage(mqLogoPg1);
|
|
85
|
+
formPg2.getButton("ProfilePicture").setImage(profileImagePg2);
|
|
86
|
+
formPg2.getButton("HalfWidthLogo").setImage(mqLogoPg2);
|
|
87
|
+
if (payload.meta.profile_settings.techFirstName || payload.meta.profile_settings.techLastName) {
|
|
88
|
+
formPg1.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
89
|
+
formPg2.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
90
|
+
}
|
|
91
|
+
} else {
|
|
92
|
+
if (companyImagePg1) {
|
|
93
|
+
formPg1.getButton("FullWidthLogo").setImage(companyImagePg1);
|
|
94
|
+
formPg2.getButton("FullWidthLogo").setImage(companyImagePg2);
|
|
87
95
|
} else {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
formPg2.getButton("FullWidthLogo").setImage(companyImagePg2);
|
|
91
|
-
} else {
|
|
92
|
-
formPg1.getButton("FullWidthLogo").setImage(mqLogoPg1);
|
|
93
|
-
formPg2.getButton("FullWidthLogo").setImage(mqLogoPg2);
|
|
94
|
-
}
|
|
96
|
+
formPg1.getButton("FullWidthLogo").setImage(mqLogoPg1);
|
|
97
|
+
formPg2.getButton("FullWidthLogo").setImage(mqLogoPg2);
|
|
95
98
|
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
let systemScorePercentage = +payload.meta.system_score.toFixed(0);
|
|
114
|
-
let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
|
|
115
|
-
let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
|
|
116
|
-
form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
|
|
117
|
-
|
|
118
|
-
if (mapImagePg1 && t == 0) form.getButton('Map Image').setImage(mapImagePg1);
|
|
119
|
-
if (mapImagePg2 && t == 1) form.getButton('Map Image').setImage(mapImagePg2);
|
|
120
|
-
form.getTextField('Information Text').setText("What Are Your System Vitals?\nJust like your health vitals, temperature, pulse, blood pressure etc, your A/C system vitals show the overall health of your air conditioning system. These vitals account for both the refrigerant and air delivery side of the system. System targets that are out of range are typically related to a system diagnostic listed below. Correcting the diagnostic faults, if possible, should put the system vitals back in the normal range.");
|
|
121
|
-
|
|
122
|
-
for (let blockNum = 1; blockNum < 5; blockNum++) {
|
|
123
|
-
form.getTextField(`Block${blockNum}-Title`).setText(payload[section][`title${blockNum}`]);
|
|
124
|
-
for (let rowNum = 1; rowNum < 14; rowNum++) {
|
|
125
|
-
let measurement;// = payload.test_in[`block${blockNum}`][rowNum-1];
|
|
126
|
-
//let measurement1, measurement2;
|
|
127
|
-
if (t == 0) measurement = payload.test_in[`block${blockNum}`][rowNum-1];
|
|
128
|
-
else if (t == 1) measurement = payload.test_out[`block${blockNum}`][rowNum-1];
|
|
129
|
-
if (measurement) {
|
|
130
|
-
let units = measurement.units ? `(${measurement.units})` : "";
|
|
131
|
-
form.getTextField(`Block${blockNum}-Row${rowNum}-Col1`).setText(`${measurement.label} ${units}`);
|
|
132
|
-
let val = measurement.value ? measurement.value : (+test.data[measurement.ref]);
|
|
133
|
-
if (!val) val = "--";
|
|
134
|
-
else if (measurement.fixTo) val = val.toFixed(measurement.fixTo);
|
|
135
|
-
form.getTextField(`Block${blockNum}-Row${rowNum}-Col2`).setText(`${val}`);
|
|
136
|
-
let embeddedIcons = section == "test_in" ? embeddedIconsTestIn : embeddedIconsTestOut;
|
|
137
|
-
if (blockNum != 4) {
|
|
138
|
-
let rangeIcon = util.getRangeIcon(test, measurement.ref, embeddedIcons);
|
|
139
|
-
if (rangeIcon && payload.meta.pdf_settings._includeRangeIndicators) form.getButton(`Block${blockNum}-Row${rowNum}-Col3`).setImage(rangeIcon);
|
|
140
|
-
let toolIcon = false;
|
|
141
|
-
if (measurement.ref == "superheat" || measurement.ref == "subcooling" || measurement.ref == "compression_ratio" || measurement.ref == "airflow_estimated") toolIcon = embeddedIcons.iconCalculator;
|
|
142
|
-
else toolIcon = util.getToolIcon(test, measurement.ref, embeddedIcons);
|
|
143
|
-
|
|
144
|
-
let benchmarkIcon = embeddedIcons.iconThumbprintRed;
|
|
145
|
-
if (measurement.value == "Yes, under duress") benchmarkIcon = embeddedIcons.iconThumbprintYellow;
|
|
146
|
-
else if (measurement.value == "Yes") benchmarkIcon = embeddedIcons.iconThumbprintGreen;
|
|
147
|
-
|
|
148
|
-
toolIcon = measurement.ref == "benchmark" ? benchmarkIcon : toolIcon;
|
|
149
|
-
if (toolIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(toolIcon);
|
|
150
|
-
}
|
|
151
|
-
} else break;
|
|
152
|
-
}
|
|
153
|
-
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
for (let t = 0; t < payload.tests.length; t++) {
|
|
102
|
+
let section = t == 0 ? 'test_in' : 'test_out';
|
|
103
|
+
let form = t == 0 ? formPg1 : formPg2;
|
|
104
|
+
let test = payload.tests[t].testInfo;
|
|
105
|
+
let date = new Date();
|
|
106
|
+
if (payload.meta.cName && payload.meta.address && payload.meta.city && payload.meta.state && payload.meta.zip) {
|
|
107
|
+
form.getTextField('Name').setText(`${payload.meta.cName}`);
|
|
108
|
+
form.getTextField('Address 1').setText(`${payload.meta.address}`);
|
|
109
|
+
if (payload.meta.address2) {
|
|
110
|
+
form.getTextField('Address 2').setText(`${payload.meta.address2}`);
|
|
111
|
+
form.getTextField('City State Zip').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
112
|
+
} else form.getTextField('Address 2').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
113
|
+
form.getTextField('Date of Service').setText(date.toLocaleDateString("en-US"));
|
|
114
|
+
form.getTextField('Time of Service').setText(date.toLocaleTimeString("en-US"));
|
|
154
115
|
}
|
|
155
|
-
formPg1.flatten();
|
|
156
|
-
formPg2.flatten();
|
|
157
116
|
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
117
|
+
let systemScorePercentage = +payload.meta.system_score.toFixed(0);
|
|
118
|
+
let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
|
|
119
|
+
let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
|
|
120
|
+
form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
|
|
121
|
+
|
|
122
|
+
if (mapImagePg1 && t == 0) form.getButton('Map Image').setImage(mapImagePg1);
|
|
123
|
+
if (mapImagePg2 && t == 1) form.getButton('Map Image').setImage(mapImagePg2);
|
|
124
|
+
form.getTextField('Information Text').setText("What Are Your System Vitals?\nJust like your health vitals, temperature, pulse, blood pressure etc, your A/C system vitals show the overall health of your air conditioning system. These vitals account for both the refrigerant and air delivery side of the system. System targets that are out of range are typically related to a system diagnostic listed below. Correcting the diagnostic faults, if possible, should put the system vitals back in the normal range.");
|
|
125
|
+
|
|
126
|
+
for (let blockNum = 1; blockNum < 5; blockNum++) {
|
|
127
|
+
form.getTextField(`Block${blockNum}-Title`).setText(payload[section][`title${blockNum}`]);
|
|
128
|
+
for (let rowNum = 1; rowNum < 14; rowNum++) {
|
|
129
|
+
let measurement;
|
|
130
|
+
if (t == 0) measurement = payload.test_in[`block${blockNum}`][rowNum - 1];
|
|
131
|
+
else if (t == 1) measurement = payload.test_out[`block${blockNum}`][rowNum - 1];
|
|
132
|
+
if (measurement) {
|
|
133
|
+
if (measurement.label == "Cond. Volts/Amps") {
|
|
134
|
+
let condDisplay = util.getElectricalData(test, "");
|
|
135
|
+
if (condDisplay.voltageIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(condDisplay.voltageIcon);
|
|
136
|
+
} else if (measurement.label == "AHU Volts/Amps") {
|
|
137
|
+
let ahuDisplay = util.getElectricalData(test, "_ahu");
|
|
138
|
+
if (ahuDisplay.voltageIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(ahuDisplay.voltageIcon);
|
|
139
|
+
}
|
|
140
|
+
let units = measurement.units ? `(${measurement.units})` : "";
|
|
141
|
+
form.getTextField(`Block${blockNum}-Row${rowNum}-Col1`).setText(`${measurement.label} ${units}`);
|
|
142
|
+
let val = measurement.value ? measurement.value : (+test.data[measurement.ref]);
|
|
143
|
+
if (!val) val = "--";
|
|
144
|
+
else if (measurement.fixTo) val = val.toFixed(measurement.fixTo);
|
|
145
|
+
form.getTextField(`Block${blockNum}-Row${rowNum}-Col2`).setText(`${val}`);
|
|
146
|
+
let embeddedIcons = section == "test_in" ? embeddedIconsTestIn : embeddedIconsTestOut;
|
|
147
|
+
if (blockNum != 4) {
|
|
148
|
+
let rangeIcon = util.getRangeIcon(test, measurement.ref, embeddedIcons);
|
|
149
|
+
if (rangeIcon && payload.meta.pdf_settings._includeRangeIndicators) form.getButton(`Block${blockNum}-Row${rowNum}-Col3`).setImage(rangeIcon);
|
|
150
|
+
let toolIcon = false;
|
|
151
|
+
if (measurement.ref == "superheat" || measurement.ref == "subcooling" || measurement.ref == "compression_ratio" || measurement.ref == "airflow_estimated") toolIcon = embeddedIcons.iconCalculator;
|
|
152
|
+
else toolIcon = util.getToolIcon(test, measurement.ref, embeddedIcons);
|
|
153
|
+
|
|
154
|
+
let benchmarkIcon = embeddedIcons.iconThumbprintRed;
|
|
155
|
+
if (measurement.value == "Yes, under duress") benchmarkIcon = embeddedIcons.iconThumbprintYellow;
|
|
156
|
+
else if (measurement.value == "Yes") benchmarkIcon = embeddedIcons.iconThumbprintGreen;
|
|
157
|
+
|
|
158
|
+
toolIcon = measurement.ref == "benchmark" ? benchmarkIcon : toolIcon;
|
|
159
|
+
if (toolIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(toolIcon);
|
|
160
|
+
}
|
|
161
|
+
} else break;
|
|
162
|
+
}
|
|
161
163
|
}
|
|
162
|
-
|
|
163
|
-
|
|
164
|
+
}
|
|
165
|
+
formPg1.flatten();
|
|
166
|
+
formPg2.flatten();
|
|
167
|
+
|
|
168
|
+
if (payload.tests.length > 1) {
|
|
169
|
+
const [secondPage] = await pdfDocPg1.copyPages(pdfDocPg2, [0]);
|
|
170
|
+
pdfDocPg1.insertPage(1, secondPage);
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
return await pdfDocPg1.saveAsBase64({
|
|
174
|
+
dataUri: true
|
|
175
|
+
});
|
|
164
176
|
}
|
package/util.js
CHANGED
|
@@ -87,7 +87,7 @@ export function getElectricalData(test) {
|
|
|
87
87
|
let voltage = test.voltage_nominal;
|
|
88
88
|
let phase = test.phase;
|
|
89
89
|
let src = '_l1';
|
|
90
|
-
let
|
|
90
|
+
let vDisplay, aDisplay, vIcon, aIcon;
|
|
91
91
|
|
|
92
92
|
if (test.electrical_capture_type !== 'Power') {
|
|
93
93
|
if (phase === 'Single') {
|