@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,6 +1,6 @@
1
1
  {
2
2
  "name": "@measurequick/measurequick-report-generator",
3
- "version": "1.1.53",
3
+ "version": "1.1.55",
4
4
  "description": "Generates PDF documents for various MeasureQuick applications.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -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 pdfDoc = await PDFDocument.load(util._base64ToArrayBuffer(pdf.base64));
11
- const form = pdfDoc.getForm();
12
- let mapImage;
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")) mapImage = await pdfDoc.embedJpg(util._base64ToArrayBuffer(payload.map));
15
- else if (payload.map.includes("image/png")) mapImage = await pdfDoc.embedPng(util._base64ToArrayBuffer(payload.map));
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 pdfDoc.embedPng(util._base64ToArrayBuffer(base64[label]));
22
-
23
- let date = new Date();
24
- if (payload.meta.cName && payload.meta.address && payload.meta.city && payload.meta.state && payload.meta.zip) {
25
- form.getTextField('Name').setText(`${payload.meta.cName}`);
26
- form.getTextField('Address 1').setText(`${payload.meta.address}`);
27
- if (payload.meta.address2) {
28
- form.getTextField('Address 2').setText(`${payload.meta.address2}`);
29
- form.getTextField('City State Zip').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
30
- } else form.getTextField('Address 2').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
31
- form.getTextField('Date of Service').setText(date.toLocaleDateString("en-US"));
32
- form.getTextField('Time of Service').setText(date.toLocaleTimeString("en-US"));
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
- let scoreDeduction = payload.meta.score_deduction? payload.meta.score_deduction : 0;
36
- let systemScorePercentage = +(100 - +(scoreDeduction.toFixed(0)));
37
- let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
38
- let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
39
- form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
40
-
41
- if (mapImage) form.getButton('Map Image').setImage(mapImage);
42
- 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.");
43
-
44
- let test = payload.tests[0].testInfo;
45
- for (let blockNum = 1; blockNum < 5; blockNum++) {
46
- form.getTextField(`Block${blockNum}-Title`).setText(payload.titles[`block${blockNum}`]);
47
- for (let rowNum = 1; rowNum < 14; rowNum++) {
48
- let measurement = payload.measurements[`block${blockNum}`][rowNum-1];
49
- if (measurement) {
50
- let units = measurement.units ? `(${measurement.units})` : "";
51
- form.getTextField(`Block${blockNum}-Row${rowNum}-Col1`).setText(`${measurement.label} ${units}`);
52
- let val = measurement.value ? measurement.value : (+test.data[measurement.ref]);
53
- if (!val) val = "--";
54
- else if (measurement.fixTo) val = val.toFixed(measurement.fixTo);
55
- form.getTextField(`Block${blockNum}-Row${rowNum}-Col2`).setText(`${val}`);
56
- if (blockNum != 4) {
57
- let rangeIcon = util.getRangeIcon(test, measurement.ref, embeddedIcons);
58
- if (rangeIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col3`).setImage(rangeIcon);
59
- let toolIcon = util.getToolIcon(test, measurement.ref, embeddedIcons);
60
- if (toolIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(toolIcon);
61
- }
62
- } else break;
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
- form.flatten();
66
- return await pdfDoc.saveAsBase64({ dataUri: true });
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.tests[0].testInfo;
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.tests[0].testInfo.data[targetKeys[i]];
130
- let mid = +payload.tests[0].testInfo.targets[targetKeys[i]];
131
- let low = +payload.tests[0].testInfo.targets[`${targetKeys[i]}_ideal_low`];
132
- let high = +payload.tests[0].testInfo.targets[`${targetKeys[i]}_ideal_high`];
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.tests[0].testInfo[passFails[i - 1]];
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.tests[0].testInfo;
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.tests[0].testInfo.data.efficiency_gcv;
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.tests[0];
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.tests[0][passFails[i - 1]];
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.tests[0].testInfo;
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
+ }