@measurequick/measurequick-report-generator 1.1.0 → 1.1.1
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/scripts/mq-standard.js +110 -116
- package/templates/pdf/MqStandard.pdf +0 -0
package/package.json
CHANGED
package/scripts/mq-standard.js
CHANGED
|
@@ -2,99 +2,107 @@ import { PDFDocument } from 'pdf-lib';
|
|
|
2
2
|
import * as base64 from '../graphics.js';
|
|
3
3
|
import * as pdf from '../templates/base-64/mq-standard.js';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
/***************************************************
|
|
6
|
+
[Page # || Page Index ]: Purpose
|
|
7
|
+
============================================
|
|
8
|
+
[1 || 0]: Cover Sheet
|
|
9
|
+
[2 || 1]: A/C Vitals Measurements
|
|
10
|
+
[3 || 2: A/C Vitals Score Breakdown
|
|
11
|
+
[4 || 3]: A/C Vitals Information
|
|
12
|
+
[5 || 4]: Heating Vitals Measurements
|
|
13
|
+
[6 || 5]: Heating Vitals Score Breakdown
|
|
14
|
+
[7 || 6]: Heating Vitals Information
|
|
15
|
+
[8 || 7]: Equipment Information
|
|
16
|
+
[9 || 8]: System Review
|
|
17
|
+
[10 || 9]: 2-Column Measurement Details
|
|
18
|
+
[11 || 10]: 3-Column Measurement Details
|
|
19
|
+
[12 || 11]: 4-Column Measurement Details
|
|
20
|
+
[13 || 12]: Understanding A/C Subsystems
|
|
21
|
+
[14 || 13]: Understanding Heating Subsystems
|
|
22
|
+
[15 || 14]: 2x3 Photo Grid
|
|
23
|
+
[16 || 15]: 2x2 Photo Grid
|
|
24
|
+
[17 || 16]: 2x1 Photo Grid
|
|
25
|
+
***************************************************/
|
|
26
|
+
|
|
27
|
+
export async function generateReport(payload) { console.log(payload);
|
|
28
|
+
|
|
29
|
+
// Initialize pdf-lib
|
|
7
30
|
const pdfDoc = await PDFDocument.load(_base64ToArrayBuffer(pdf.base64));
|
|
8
31
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
//
|
|
19
|
-
if (
|
|
20
|
-
if (
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
const
|
|
44
|
-
const
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const iconStability = await pdfDoc.embedPng(iconStabilityBytes);
|
|
49
|
-
const iconThumbprintGreen = await pdfDoc.embedPng(iconThumbprintGreenBytes);
|
|
50
|
-
const iconThumbprintRed = await pdfDoc.embedPng(iconThumbprintRedBytes);
|
|
51
|
-
|
|
52
|
-
// get form for filling
|
|
32
|
+
// Remove Unnecessary Photo Pages
|
|
33
|
+
if (payload.meta.max_photos_per_page === 2) { pdfDoc.removePage(15); pdfDoc.removePage(14); }
|
|
34
|
+
else if (payload.meta.max_photos_per_page === 4) { pdfDoc.removePage(16); pdfDoc.removePage(14); }
|
|
35
|
+
else if (payload.meta.max_photos_per_page === 6) { pdfDoc.removePage(16); pdfDoc.removePage(15); }
|
|
36
|
+
|
|
37
|
+
// Remove Unnecessary Info Page
|
|
38
|
+
if (payload.meta.report_type === "cooling") pdfDoc.removePage(13);
|
|
39
|
+
else if (payload.meta.report_type === "heating") pdfDoc.removePage(12);
|
|
40
|
+
|
|
41
|
+
// Remove Unnecessary Measurement Pages
|
|
42
|
+
if (payload.meta.number_of_measurement_columns === 2) { pdfDoc.removePage(11); pdfDoc.removePage(10); }
|
|
43
|
+
else if (payload.meta.number_of_measurement_columns === 3) { pdfDoc.removePage(11); pdfDoc.removePage(9); }
|
|
44
|
+
else if (payload.meta.number_of_measurement_columns === 4) { pdfDoc.removePage(10); pdfDoc.removePage(9); }
|
|
45
|
+
|
|
46
|
+
// Remove System Review Page (If Chosen)
|
|
47
|
+
if (!payload.meta.system_review) pdfDoc.removePage(8);
|
|
48
|
+
|
|
49
|
+
// Remove Equipment Info Page (If Chosen)
|
|
50
|
+
if (!payload.meta.include_equipment_info) pdfDoc.removePage(7);
|
|
51
|
+
|
|
52
|
+
// Remove Unnecessary Vitals Pages
|
|
53
|
+
if (payload.meta.report_type === "cooling") { pdfDoc.removePage(6); pdfDoc.removePage(5); pdfDoc.removePage(4); }
|
|
54
|
+
else if (payload.meta.report_type === "heating") { pdfDoc.removePage(3); pdfDoc.removePage(2); pdfDoc.removePage(1); }
|
|
55
|
+
|
|
56
|
+
// Remove Cover Sheet (If Chosen)
|
|
57
|
+
if (!payload.meta.include_cover_sheet) pdfDoc.removePage(0);
|
|
58
|
+
|
|
59
|
+
// Fetch & Load Image Resources
|
|
60
|
+
const iconRangeGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconRangeGreen));
|
|
61
|
+
const iconRangeRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconRangeRed));
|
|
62
|
+
const iconFlagBlack = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagBlack));
|
|
63
|
+
const iconFlagGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagGreen));
|
|
64
|
+
const iconFlagRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagRed));
|
|
65
|
+
const iconFlagYellow = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagYellow));
|
|
66
|
+
const iconStability = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconStability));
|
|
67
|
+
const iconThumbprintGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconThumbprintGreen));
|
|
68
|
+
const iconThumbprintRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconThumbprintRed));
|
|
69
|
+
|
|
70
|
+
// Initialize Form For Population
|
|
53
71
|
const form = pdfDoc.getForm();
|
|
54
72
|
|
|
55
|
-
//
|
|
56
|
-
form.getTextField("Report Title").setText();
|
|
57
|
-
form.getTextField("Technician Name").setText();
|
|
58
|
-
form.getTextField("Date of Service Cover").setText();
|
|
59
|
-
form.getTextField("Time of Service Cover").setText();
|
|
60
|
-
|
|
61
|
-
let test = payload.project.tests[0];
|
|
73
|
+
// Populate Cover Sheet
|
|
74
|
+
form.getTextField("Report Title").setText(payload.meta.report_title);
|
|
75
|
+
form.getTextField("Technician Name").setText(payload.meta.technician_name);
|
|
76
|
+
form.getTextField("Date of Service Cover").setText(payload.meta.date_of_service);
|
|
77
|
+
form.getTextField("Time of Service Cover").setText(payload.meta.time_of_service);
|
|
62
78
|
|
|
63
|
-
//
|
|
64
|
-
|
|
65
|
-
if (test.testInfo.diagnostics.multi_point_analysis && test.testInfo.diagnostics.multi_point_analysis.length > 0) {
|
|
79
|
+
// Populate Vitals Measurements
|
|
80
|
+
if (payload.diagnostics) {
|
|
66
81
|
for (let i = 0; i < 9; i++) {
|
|
67
|
-
|
|
68
|
-
if (d) {
|
|
82
|
+
if (payload.diagnostics[i]) {
|
|
69
83
|
let diagnosticIcon = iconFlagBlack;
|
|
70
|
-
if (
|
|
84
|
+
if (payload.diagnostics[i].type === 'stability')
|
|
71
85
|
diagnosticIcon = iconStability;
|
|
72
|
-
else if (
|
|
86
|
+
else if (payload.diagnostics[i].score > 1 && payload.diagnostics[i].score < 10) {
|
|
73
87
|
diagnosticIcon = iconFlagRed;
|
|
74
|
-
|
|
75
|
-
} else if (d.score >= 10 && d.score < 15)
|
|
88
|
+
} else if (payload.diagnostics[i].score >= 10 && payload.diagnostics[i].score < 15)
|
|
76
89
|
diagnosticIcon = iconFlagYellow;
|
|
77
90
|
form.getButton(`ImageDiagnostics${i+1}_af_image`).setImage(diagnosticIcon);
|
|
78
|
-
form.getTextField(`SystemDiagnostics${i+1}`).setText(`${
|
|
79
|
-
form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${
|
|
91
|
+
form.getTextField(`SystemDiagnostics${i+1}`).setText(`${payload.diagnostics[i].title}`);
|
|
92
|
+
form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${payload.diagnostics[i].score}`);
|
|
80
93
|
}
|
|
81
94
|
}
|
|
82
95
|
} else {
|
|
83
96
|
form.getButton("ImageDiagnostics1_af_image").setImage(iconFlagGreen);
|
|
84
97
|
form.getTextField("SystemDiagnostics1").setText("No system-wide issues were detected.");
|
|
85
98
|
}
|
|
86
|
-
if (test.testInfo.score_deduction) {
|
|
87
|
-
scoreDeduction = test.testInfo.score_deduction;
|
|
88
|
-
}
|
|
89
99
|
|
|
90
|
-
let systemScorePercentage = +(100 - +(
|
|
100
|
+
let systemScorePercentage = +(100 - +(payload.meta.score_deduction.toFixed(0)));
|
|
91
101
|
let systemScoreGrade = getGradeFromScore(systemScorePercentage);
|
|
92
102
|
let systemScoreColor = getColorFromGrade(systemScoreGrade);
|
|
93
|
-
|
|
94
|
-
// get text fields
|
|
95
103
|
let textFields = getTextFields(payload);
|
|
96
104
|
|
|
97
|
-
//
|
|
105
|
+
// customer data
|
|
98
106
|
let dateTimePlacement = "Upper";
|
|
99
107
|
let e = "";
|
|
100
108
|
let d = "";
|
|
@@ -123,7 +131,7 @@ export async function generateReport(payload) {
|
|
|
123
131
|
form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
|
|
124
132
|
}
|
|
125
133
|
|
|
126
|
-
//
|
|
134
|
+
// vitals measurement values
|
|
127
135
|
form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
|
|
128
136
|
form.getTextField('Superheat').setText(`${textFields.superheat} °${payload.units.temperature}`);
|
|
129
137
|
form.getTextField('Subcooling').setText(`${textFields.subcooling} °${payload.units.temperature}`);
|
|
@@ -132,7 +140,7 @@ export async function generateReport(payload) {
|
|
|
132
140
|
form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
|
|
133
141
|
form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
|
|
134
142
|
|
|
135
|
-
//
|
|
143
|
+
// Populate Vitals Score Breakdown
|
|
136
144
|
let lossColor = textFields.ageLosses < 3 ? "Green" : "Red";
|
|
137
145
|
form.getTextField(`AgeLosses${lossColor}`).setText(`- ${textFields.ageLosses}`);
|
|
138
146
|
lossColor = textFields.tempSplitLosses < 3 ? "Green" : "Red";
|
|
@@ -145,16 +153,16 @@ export async function generateReport(payload) {
|
|
|
145
153
|
form.getTextField(`RefrigerantChargeIssues${lossColor}`).setText(`- ${textFields.refChargeLosses}`);
|
|
146
154
|
form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage}% ${systemScoreGrade}`);
|
|
147
155
|
|
|
148
|
-
//
|
|
156
|
+
// target & range icons
|
|
149
157
|
const measureLabels = ["Superheat", "Subcooling", "Condenser", "TempSplit", "Tesp", "FilterFace"];
|
|
150
158
|
const targetKeys = ["superheat", "subcooling", "approach", "temperature_split", "pressure_static_total_external", "velocity_face_filter1"];
|
|
151
159
|
for (let i = 0; i < measureLabels.length; i++) {
|
|
152
160
|
let iconPlacement = "Mid";
|
|
153
161
|
let icon = iconRangeRed;
|
|
154
|
-
let actual = +test.testInfo.data[targetKeys[i]];
|
|
155
|
-
let mid = +test.testInfo.targets[targetKeys[i]];
|
|
156
|
-
let low = +test.testInfo.targets[`${targetKeys[i]}_ideal_low`];
|
|
157
|
-
let high = +test.testInfo.targets[`${targetKeys[i]}_ideal_high`];
|
|
162
|
+
let actual = +payload.test.testInfo.data[targetKeys[i]];
|
|
163
|
+
let mid = +payload.test.testInfo.targets[targetKeys[i]];
|
|
164
|
+
let low = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_low`];
|
|
165
|
+
let high = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_high`];
|
|
158
166
|
low = mid - low;
|
|
159
167
|
high = mid + high;
|
|
160
168
|
if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
|
|
@@ -169,15 +177,15 @@ export async function generateReport(payload) {
|
|
|
169
177
|
form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
|
|
170
178
|
}
|
|
171
179
|
|
|
172
|
-
//
|
|
180
|
+
// pass fail section
|
|
173
181
|
let passFails = ["electrical_system_pass_fail", "air_distribution_system_pass_fail", "air_filtration_system_pass_fail", "condensate_drain_system_pass_fail", "refrigerant_charge_pass_fail", "outdoor_equipment_pass_fail", "indoor_equipment_pass_fail", "cooling_capacity_pass_fail", "cooling_electrical_efficiency_pass_fail"];
|
|
174
182
|
for (let i = 1; i <= passFails.length; i++) {
|
|
175
|
-
let meas = test
|
|
183
|
+
let meas = payload.test[passFails[i - 1]];
|
|
176
184
|
let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
|
|
177
185
|
form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
|
|
178
186
|
}
|
|
179
187
|
|
|
180
|
-
//
|
|
188
|
+
// Populate Equipment Info Page
|
|
181
189
|
form.getTextField(`EI Title 1`).setText();
|
|
182
190
|
form.getTextField(`EI Title 2`).setText();
|
|
183
191
|
form.getTextField(`EI Title 3`).setText();
|
|
@@ -186,7 +194,7 @@ export async function generateReport(payload) {
|
|
|
186
194
|
form.getTextField(`Equip_Info-Field ${fieldNum}b`).setText();
|
|
187
195
|
}
|
|
188
196
|
|
|
189
|
-
//
|
|
197
|
+
// Populate System Review Page
|
|
190
198
|
for (let catNum = 1; catNum <= 10; catNum++) {
|
|
191
199
|
for (let fieldNum = 1; fieldNum <= 5; fieldNum++) {
|
|
192
200
|
form.getTextField(`SR Title ${catNum}`).setText();
|
|
@@ -195,32 +203,19 @@ export async function generateReport(payload) {
|
|
|
195
203
|
}
|
|
196
204
|
}
|
|
197
205
|
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
// measurement details page
|
|
207
|
-
for (let rowNum = 1; rowNum <= 35; rowNum++) {
|
|
208
|
-
for (let colNum = 1; colNum <= numCols; colNum++) {
|
|
209
|
-
form.getTextField(`MD${numCols} ${rowNum}${colNum}`).setText();
|
|
210
|
-
}
|
|
206
|
+
// Populate Measurement Details Page
|
|
207
|
+
for (let rowNum = 0; rowNum < payload.measurement_details.outdoor_measurements.length; rowNum++) {
|
|
208
|
+
let measurement = payload.measurement_details.outdoor_measurements[rowNum];
|
|
209
|
+
form.getTextField(`MD4 ${rowNum+1}1`).setText(`${measurement.label} (${measurement.units})`);
|
|
210
|
+
form.getTextField(`MD4 ${rowNum+1}2`).setText(measurement.testInValue);
|
|
211
|
+
form.getTextField(`MD4 ${rowNum+1}3`).setText(measurement.testOutValue);
|
|
212
|
+
form.getTextField(`MD4 ${rowNum+1}4`).setText(measurement.referenceKey);
|
|
211
213
|
}
|
|
212
214
|
|
|
215
|
+
// Populate Photo Page(s)
|
|
213
216
|
|
|
214
217
|
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
// photos page: take code from standard report
|
|
222
|
-
|
|
223
|
-
|
|
218
|
+
// Flatten Form, Convert & Return PDF as Base64
|
|
224
219
|
form.flatten();
|
|
225
220
|
const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
|
|
226
221
|
return pdfBase64;
|
|
@@ -252,7 +247,6 @@ function getColorFromGrade(grade) {
|
|
|
252
247
|
}
|
|
253
248
|
|
|
254
249
|
function getTextFields(payload) {
|
|
255
|
-
let test = payload.project.tests[0];
|
|
256
250
|
return {
|
|
257
251
|
"cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
|
|
258
252
|
"address": payload.site.location.address ? payload.site.location.address : "",
|
|
@@ -260,17 +254,17 @@ function getTextFields(payload) {
|
|
|
260
254
|
"city": payload.site.location.city ? payload.site.location.city : "",
|
|
261
255
|
"state": payload.site.location.state ? `, ${payload.site.location.state}` : "",
|
|
262
256
|
"zip": payload.site.location.zip ? ` ${payload.site.location.zip}` : "",
|
|
263
|
-
"superheat": test.testInfo.data.superheat ? (+test.testInfo.data.superheat).toFixed(1) : "--",
|
|
264
|
-
"subcooling": test.testInfo.data.subcooling ? (+test.testInfo.data.subcooling).toFixed(1) : "--",
|
|
265
|
-
"approach": test.testInfo.data.approach ? (+test.testInfo.data.approach).toFixed(1) : "--",
|
|
266
|
-
"tempSplit": test.testInfo.data.temperature_split ? (+test.testInfo.data.temperature_split).toFixed(1) : "--",
|
|
267
|
-
"tesp": test.testInfo.data.pressure_static_total_external ? (+test.testInfo.data.pressure_static_total_external).toFixed(2) : "--",
|
|
268
|
-
"fltrFace": test.testInfo.data.velocity_face_filter1 ? (+test.testInfo.data.velocity_face_filter1).toFixed(1) : "--",
|
|
269
|
-
"ageLosses": test.testInfo.data.age_loss ? (+test.testInfo.data.age_loss).toFixed(0) : 0,
|
|
270
|
-
"tempSplitLosses": test.testInfo.data.temp_split_loss ? (+test.testInfo.data.temp_split_loss).toFixed(0) : 0,
|
|
271
|
-
"staticLosses": test.testInfo.data.static_loss ? (+test.testInfo.data.static_loss).toFixed(0) : 0,
|
|
272
|
-
"approachLosses": test.testInfo.data.approach_loss ? (+test.testInfo.data.approach_loss).toFixed(0) : 0,
|
|
273
|
-
"refChargeLosses": test.testInfo.data.refrigerant_charge_loss ? (+test.testInfo.data.refrigerant_charge_loss).toFixed(0) : 0
|
|
257
|
+
"superheat": payload.test.testInfo.data.superheat ? (+payload.test.testInfo.data.superheat).toFixed(1) : "--",
|
|
258
|
+
"subcooling": payload.test.testInfo.data.subcooling ? (+payload.test.testInfo.data.subcooling).toFixed(1) : "--",
|
|
259
|
+
"approach": payload.test.testInfo.data.approach ? (+payload.test.testInfo.data.approach).toFixed(1) : "--",
|
|
260
|
+
"tempSplit": payload.test.testInfo.data.temperature_split ? (+payload.test.testInfo.data.temperature_split).toFixed(1) : "--",
|
|
261
|
+
"tesp": payload.test.testInfo.data.pressure_static_total_external ? (+payload.test.testInfo.data.pressure_static_total_external).toFixed(2) : "--",
|
|
262
|
+
"fltrFace": payload.test.testInfo.data.velocity_face_filter1 ? (+payload.test.testInfo.data.velocity_face_filter1).toFixed(1) : "--",
|
|
263
|
+
"ageLosses": payload.test.testInfo.data.age_loss ? (+payload.test.testInfo.data.age_loss).toFixed(0) : 0,
|
|
264
|
+
"tempSplitLosses": payload.test.testInfo.data.temp_split_loss ? (+payload.test.testInfo.data.temp_split_loss).toFixed(0) : 0,
|
|
265
|
+
"staticLosses": payload.test.testInfo.data.static_loss ? (+payload.test.testInfo.data.static_loss).toFixed(0) : 0,
|
|
266
|
+
"approachLosses": payload.test.testInfo.data.approach_loss ? (+payload.test.testInfo.data.approach_loss).toFixed(0) : 0,
|
|
267
|
+
"refChargeLosses": payload.test.testInfo.data.refrigerant_charge_loss ? (+payload.test.testInfo.data.refrigerant_charge_loss).toFixed(0) : 0
|
|
274
268
|
}
|
|
275
269
|
}
|
|
276
270
|
|
|
Binary file
|