@measurequick/measurequick-report-generator 1.1.53 → 1.1.55
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
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { PDFDocument } from 'pdf-lib';
|
|
2
|
+
import fontkit from '@pdf-lib/fontkit';
|
|
2
3
|
import * as base64 from '../base-64/icons.js';
|
|
3
4
|
import * as util from '../util.js';
|
|
4
5
|
import * as pdf from '../base-64/measurement-details-page.js';
|
|
@@ -7,61 +8,99 @@ let embeddedIcons = {};
|
|
|
7
8
|
|
|
8
9
|
export async function getReport(payload) { console.log(payload);
|
|
9
10
|
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
|
|
11
|
+
const pdfDocPg1 = await PDFDocument.load(util._base64ToArrayBuffer(pdf.base64));
|
|
12
|
+
const pdfDocPg2 = await PDFDocument.load(util._base64ToArrayBuffer(pdf.base64));
|
|
13
|
+
|
|
14
|
+
const normalFontUrl = 'https://pdf-lib.js.org/assets/ubuntu/Ubuntu-R.ttf';
|
|
15
|
+
const boldFontUrl = 'https://pdf-lib.js.org/assets/ubuntu/Ubuntu-R.ttf';
|
|
16
|
+
|
|
17
|
+
const normalFontBytes = await fetch(normalFontUrl).then(res => res.arrayBuffer());
|
|
18
|
+
const boldFontBytes = await fetch(boldFontUrl).then(res => res.arrayBuffer());
|
|
19
|
+
|
|
20
|
+
pdfDocPg1.registerFontkit(fontkit);
|
|
21
|
+
pdfDocPg2.registerFontkit(fontkit);
|
|
22
|
+
|
|
23
|
+
const normalFontPg1 = await pdfDocPg1.embedFont(normalFontBytes);
|
|
24
|
+
const boldFontPg1 = await pdfDocPg1.embedFont(boldFontBytes);
|
|
25
|
+
|
|
26
|
+
const normalFontPg2 = await pdfDocPg2.embedFont(normalFontBytes);
|
|
27
|
+
const boldFontPg2 = await pdfDocPg2.embedFont(boldFontBytes);
|
|
28
|
+
|
|
29
|
+
const formPg1 = pdfDocPg1.getForm();
|
|
30
|
+
const formPg2 = pdfDocPg2.getForm();
|
|
31
|
+
|
|
32
|
+
formPg1.updateFieldAppearances(boldFontPg1);
|
|
33
|
+
formPg2.updateFieldAppearances(boldFontPg2);
|
|
34
|
+
|
|
35
|
+
let mapImagePg1, mapImagePg2;
|
|
13
36
|
if (payload.map) {
|
|
14
|
-
if (payload.map.includes("image/jpeg"))
|
|
15
|
-
|
|
37
|
+
if (payload.map.includes("image/jpeg")) {
|
|
38
|
+
mapImagePg1 = await pdfDocPg1.embedJpg(util._base64ToArrayBuffer(payload.map));
|
|
39
|
+
mapImagePg2 = await pdfDocPg2.embedJpg(util._base64ToArrayBuffer(payload.map));
|
|
40
|
+
} else if (payload.map.includes("image/png")) {
|
|
41
|
+
mapImagePg1 = await pdfDocPg1.embedPng(util._base64ToArrayBuffer(payload.map));
|
|
42
|
+
mapImagePg2 = await pdfDocPg2.embedPng(util._base64ToArrayBuffer(payload.map));
|
|
43
|
+
}
|
|
16
44
|
}
|
|
17
45
|
|
|
18
46
|
let labels = ["iconRangeHigh", "iconRangeLow", "iconRangeNormal", "iconTesto", "iconCalculator", "iconFieldpiece",
|
|
19
47
|
"iconUei", "iconSporlanPro", "iconSporlanLegacy", "iconIconnect", "iconImanifold", "iconSensi",
|
|
20
48
|
"iconBluflame", "iconRedfish510", "iconRedfish510333", "iconRedfish550", "iconDg1000", "iconTrueflow"];
|
|
21
|
-
for (let label of labels) embeddedIcons[label] = await
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
form.getTextField('
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
49
|
+
for (let label of labels) embeddedIcons[label] = await pdfDocPg1.embedPng(util._base64ToArrayBuffer(base64[label]));
|
|
50
|
+
for (let label of labels) embeddedIcons[label] = await pdfDocPg2.embedPng(util._base64ToArrayBuffer(base64[label]));
|
|
51
|
+
|
|
52
|
+
let form = formPg1;
|
|
53
|
+
for (let t = 0; t < 2; t++) {
|
|
54
|
+
if (t == 1) form = formPg2;
|
|
55
|
+
let date = new Date();
|
|
56
|
+
if (payload.meta.cName && payload.meta.address && payload.meta.city && payload.meta.state && payload.meta.zip) {
|
|
57
|
+
form.getTextField('Name').setText(`${payload.meta.cName}`);
|
|
58
|
+
form.getTextField('Address 1').setText(`${payload.meta.address}`);
|
|
59
|
+
if (payload.meta.address2) {
|
|
60
|
+
form.getTextField('Address 2').setText(`${payload.meta.address2}`);
|
|
61
|
+
form.getTextField('City State Zip').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
62
|
+
} else form.getTextField('Address 2').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
63
|
+
form.getTextField('Date of Service').setText(date.toLocaleDateString("en-US"));
|
|
64
|
+
form.getTextField('Time of Service').setText(date.toLocaleTimeString("en-US"));
|
|
65
|
+
}
|
|
34
66
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
let
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
let scoreDeduction = payload.meta.score_deduction? payload.meta.score_deduction : 0;
|
|
68
|
+
let systemScorePercentage = +(100 - +(scoreDeduction.toFixed(0)));
|
|
69
|
+
let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
|
|
70
|
+
let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
|
|
71
|
+
form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
|
|
72
|
+
|
|
73
|
+
if (mapImagePg1 && t == 0) form.getButton('Map Image').setImage(mapImagePg1);
|
|
74
|
+
if (mapImagePg2 && t == 1) form.getButton('Map Image').setImage(mapImagePg2);
|
|
75
|
+
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.");
|
|
76
|
+
|
|
77
|
+
let test = payload.test.testInfo;
|
|
78
|
+
for (let blockNum = 1; blockNum < 5; blockNum++) {
|
|
79
|
+
form.getTextField(`Block${blockNum}-Title`).setText(payload.titles[`block${blockNum}`]);
|
|
80
|
+
for (let rowNum = 1; rowNum < 14; rowNum++) {
|
|
81
|
+
let measurement = payload.measurements[`block${blockNum}`][rowNum-1];
|
|
82
|
+
if (measurement) {
|
|
83
|
+
let units = measurement.units ? `(${measurement.units})` : "";
|
|
84
|
+
form.getTextField(`Block${blockNum}-Row${rowNum}-Col1`).setText(`${measurement.label} ${units}`);
|
|
85
|
+
let val = measurement.value ? measurement.value : (+test.data[measurement.ref]);
|
|
86
|
+
if (!val) val = "--";
|
|
87
|
+
else if (measurement.fixTo) val = val.toFixed(measurement.fixTo);
|
|
88
|
+
form.getTextField(`Block${blockNum}-Row${rowNum}-Col2`).setText(`${val}`);
|
|
89
|
+
if (blockNum != 4) {
|
|
90
|
+
let rangeIcon = util.getRangeIcon(test, measurement.ref, embeddedIcons);
|
|
91
|
+
if (rangeIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col3`).setImage(rangeIcon);
|
|
92
|
+
let toolIcon = util.getToolIcon(test, measurement.ref, embeddedIcons);
|
|
93
|
+
if (toolIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(toolIcon);
|
|
94
|
+
}
|
|
95
|
+
} else break;
|
|
96
|
+
}
|
|
63
97
|
}
|
|
64
98
|
}
|
|
65
|
-
|
|
66
|
-
|
|
99
|
+
formPg1.flatten();
|
|
100
|
+
formPg2.flatten();
|
|
101
|
+
|
|
102
|
+
const [secondPage] = await pdfDocPg1.copyPages(pdfDocPg2, [0]);
|
|
103
|
+
pdfDocPg1.insertPage(1, secondPage);
|
|
104
|
+
|
|
105
|
+
return await pdfDocPg1.saveAsBase64({ dataUri: true });
|
|
67
106
|
}
|
|
@@ -36,7 +36,7 @@ export async function getReport(payload) { console.log(payload);
|
|
|
36
36
|
|
|
37
37
|
// print system diagnostics section
|
|
38
38
|
let scoreDeduction = 0;
|
|
39
|
-
let t = payload.
|
|
39
|
+
let t = payload.test.testInfo;
|
|
40
40
|
if (t && t.diagnostics && t.diagnostics.multi_point_analysis && t.diagnostics.multi_point_analysis.length > 0) {
|
|
41
41
|
for (let i = 0; i < 9; i++) {
|
|
42
42
|
let d = t.diagnostics.multi_point_analysis[i];
|
|
@@ -126,10 +126,10 @@ export async function getReport(payload) { console.log(payload);
|
|
|
126
126
|
for (let i = 0; i < measureLabels.length; i++) {
|
|
127
127
|
let iconPlacement = "Mid";
|
|
128
128
|
let icon = iconRangeRed;
|
|
129
|
-
let actual = +payload.
|
|
130
|
-
let mid = +payload.
|
|
131
|
-
let low = +payload.
|
|
132
|
-
let high = +payload.
|
|
129
|
+
let actual = +payload.test.testInfo.data[targetKeys[i]];
|
|
130
|
+
let mid = +payload.test.testInfo.targets[targetKeys[i]];
|
|
131
|
+
let low = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_low`];
|
|
132
|
+
let high = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_high`];
|
|
133
133
|
low = mid - low;
|
|
134
134
|
high = mid + high;
|
|
135
135
|
if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
|
|
@@ -147,7 +147,7 @@ export async function getReport(payload) { console.log(payload);
|
|
|
147
147
|
// print pass fail measures
|
|
148
148
|
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"];
|
|
149
149
|
for (let i = 1; i <= passFails.length; i++) {
|
|
150
|
-
let meas = payload.
|
|
150
|
+
let meas = payload.test.testInfo[passFails[i - 1]];
|
|
151
151
|
let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
|
|
152
152
|
console.log(passFails[i - 1] + " || " + meas + " || " + icon);
|
|
153
153
|
form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
|
|
@@ -160,7 +160,7 @@ export async function getReport(payload) { console.log(payload);
|
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
function getTextFields(payload) {
|
|
163
|
-
let test = payload.
|
|
163
|
+
let test = payload.test.testInfo;
|
|
164
164
|
return {
|
|
165
165
|
"cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
|
|
166
166
|
"address": payload.site.location.address ? payload.site.location.address : "",
|
|
@@ -37,7 +37,7 @@ export async function getReport(payload) { console.log("Vitals Heating Report");
|
|
|
37
37
|
// print system diagnostics section
|
|
38
38
|
let scoreDeduction = 0;
|
|
39
39
|
|
|
40
|
-
let systemScorePercentage = payload.
|
|
40
|
+
let systemScorePercentage = payload.test.testInfo.data.efficiency_gcv;
|
|
41
41
|
let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
|
|
42
42
|
let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
|
|
43
43
|
|
|
@@ -96,7 +96,7 @@ export async function getReport(payload) { console.log("Vitals Heating Report");
|
|
|
96
96
|
form.getTextField(`AirDistributionLosses${lossColor}`).setText(`-${textFields.staticLoss}`);
|
|
97
97
|
form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage}% ${systemScoreGrade}`);
|
|
98
98
|
|
|
99
|
-
let test = payload.
|
|
99
|
+
let test = payload.test;
|
|
100
100
|
|
|
101
101
|
// print targets and range icons
|
|
102
102
|
const measureLabels = ["ManifoldPressure", "TempSplit", "Tesp", "FilterFace"];
|
|
@@ -141,7 +141,7 @@ export async function getReport(payload) { console.log("Vitals Heating Report");
|
|
|
141
141
|
// print pass fail measures
|
|
142
142
|
let passFails = ["ambient_co_pass_fail", "control_system_pass_fail", "electrical_system_pass_fail", "air_distribution_system_pass_fail", "air_filtration_system_pass_fail", "condensate_drain_system_pass_fail", "indoor_equipment_pass_fail", "venting_system_pass_fail", "fuel_delivery_system_pass_fail", "make_up_air_system_pass_fail", "heat_exchanger_pass_fail", "safety_system_pass_fail", "heating_operation_pass_fail", "combustion_safety_pass_fail", "combustion_efficiency_pass_fail"];
|
|
143
143
|
for (let i = 1; i <= passFails.length; i++) {
|
|
144
|
-
let meas = payload.
|
|
144
|
+
let meas = payload.test[passFails[i - 1]];
|
|
145
145
|
let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
|
|
146
146
|
form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
|
|
147
147
|
}
|
|
@@ -153,7 +153,7 @@ export async function getReport(payload) { console.log("Vitals Heating Report");
|
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
function getTextFields(payload) {
|
|
156
|
-
let test = payload.
|
|
156
|
+
let test = payload.test.testInfo;
|
|
157
157
|
return {
|
|
158
158
|
"cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
|
|
159
159
|
"address": payload.site.location.address ? payload.site.location.address : "",
|
package/util.js
CHANGED
|
@@ -77,3 +77,57 @@ export function getRangeIcon(test, ref, embeddedIcons) {
|
|
|
77
77
|
}
|
|
78
78
|
return rangeIcon;
|
|
79
79
|
}
|
|
80
|
+
|
|
81
|
+
export function getElectricalData(test) {
|
|
82
|
+
let voltage = test.voltage_nominal;
|
|
83
|
+
let phase = test.phase;
|
|
84
|
+
let src = '_l1';
|
|
85
|
+
let vdDisplay, aDisplay;
|
|
86
|
+
|
|
87
|
+
if (test.electrical_capture_type !== 'Power') {
|
|
88
|
+
if (phase === 'Single') {
|
|
89
|
+
if ((voltage == '115' || voltage == '120') && test.data.voltage_l1 && test.data.amperage_l1) {
|
|
90
|
+
vDisplay = (+test.data.voltage_l1).toFixed(1);
|
|
91
|
+
aDisplay = (+test.data.amperage_l1).toFixed(1);
|
|
92
|
+
} else if ((voltage == '115' || voltage == '120') && test.data.voltage_l1_ph_to_gnd && test.data.amperage_l1_ph_to_gnd) {
|
|
93
|
+
vDisplay = (+test.data.voltage_l1_ph_to_gnd).toFixed(1);
|
|
94
|
+
aDisplay = (+test.data.amperage_l1_ph_to_gnd).toFixed(1);
|
|
95
|
+
src = '_l1_ph_to_gnd';
|
|
96
|
+
} else if ((voltage == '208' || voltage == '230' || voltage == '240' || voltage == '460' || voltage == '480') &&
|
|
97
|
+
test.data.voltage_l1 && test.data.amperage_l1) {
|
|
98
|
+
vDisplay = (+test.data.voltage_l1).toFixed(1);
|
|
99
|
+
aDisplay = (+test.data.amperage_l1).toFixed(1);
|
|
100
|
+
} else if ((voltage == '208' || voltage == '230' || voltage == '240' || voltage == '460' || voltage == '480') &&
|
|
101
|
+
test.data.voltage_l1_ph_to_gnd && test.data.voltage_l2_ph_to_gnd &&
|
|
102
|
+
test.data.amperage_l1_ph_to_gnd && test.data.amperage_l2_ph_to_gnd) {
|
|
103
|
+
vDisplay = (+test.data.voltage_l1_ph_to_gnd).toFixed(1) + " / " + (+test.data.voltage_l2_ph_to_gnd).toFixed(1);
|
|
104
|
+
aDisplay = (+test.data.amperage_l1_ph_to_gnd).toFixed(1) + " / " + (+test.data.amperage_l2_ph_to_gnd).toFixed(1);
|
|
105
|
+
src = '_l1_ph_to_gnd';
|
|
106
|
+
}
|
|
107
|
+
} else if (phase === 'Three' &&
|
|
108
|
+
test.data.voltage_l1 && test.data.voltage_l2 && test.data.voltage_l3 &&
|
|
109
|
+
test.data.amperage_l1 && test.data.amperage_l2 && test.data.amperage_l3) {
|
|
110
|
+
vDisplay = (+test.data.voltage_l1).toFixed(1) + " / " + (+test.data.voltage_l2).toFixed(1) + " / " + (+test.data.voltage_l3).toFixed(1);
|
|
111
|
+
aDisplay = (+test.data.amperage_l1).toFixed(1) + " / " + (+test.data.amperage_l2).toFixed(1) + " / " + (+test.data.amperage_l3).toFixed(1);
|
|
112
|
+
}
|
|
113
|
+
} else if (test.electrical_capture_type === 'Power') {
|
|
114
|
+
vDisplay = (+test.data.voltage_l1).toFixed(1);
|
|
115
|
+
aDisplay = (+test.data.amperage_l1).toFixed(1);
|
|
116
|
+
}
|
|
117
|
+
return { voltage: vDisplay, amperage: aDisplay };
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function prettify(type, val, units) {
|
|
121
|
+
switch (type) {
|
|
122
|
+
case "temp": return `${(val*1).toFixed(1)} ${units.temperature}`;
|
|
123
|
+
case "pres": return `${(val*1).toFixed(1)} ${units.pressurece_units}`;
|
|
124
|
+
case "pres_static": return `${(val*1).toFixed(2)} ${units.static_pressure_units}`;
|
|
125
|
+
case "power": return `${(val*1).toFixed(1)} W`;
|
|
126
|
+
case "airflow": return `${(val*1).toFixed(1)} ${units.airflow_units}`;
|
|
127
|
+
case "volts": return `${(val*1).toFixed(1)} ${units.voltage}`;
|
|
128
|
+
case "amps": return `${(val*1).toFixed(1)} ${units.amperage}`;
|
|
129
|
+
case "perc": return `${(val*1).toFixed(0)}%`;
|
|
130
|
+
case "capacity": return `${(val*1).toFixed(0)}`;
|
|
131
|
+
case "tons": return `${(val*1).toFixed(1)}`;
|
|
132
|
+
}
|
|
133
|
+
}
|