@measurequick/measurequick-report-generator 1.4.1 → 1.4.2
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/index.js
CHANGED
|
@@ -9,8 +9,6 @@ import * as vitalsCoolingReport from "./report-gen-scripts/vitals-cooling-report
|
|
|
9
9
|
import * as vitalsHeatingReport from "./report-gen-scripts/vitals-heating-report.js";
|
|
10
10
|
import * as bluvacReport from "./report-gen-scripts/bluvac-report.js";
|
|
11
11
|
import * as classicReport from "./report-gen-scripts/classic-report.js";
|
|
12
|
-
import * as accaCoolingReport from "./report-gen-scripts/acca-cooling-report.js";
|
|
13
|
-
import * as accaHeatingReport from "./report-gen-scripts/acca-heating-report.js";
|
|
14
12
|
import * as accaCertificate from "./report-gen-scripts/acca-certificate.js";
|
|
15
13
|
import * as energyStarCertificate from "./report-gen-scripts/energy-star-certificate.js";
|
|
16
14
|
import * as franklinEnergyReport from "./report-gen-scripts/franklin-energy-report.js";
|
|
@@ -28,9 +26,8 @@ export function getReport(payload) {
|
|
|
28
26
|
case "VitalsHeatingReport": return vitalsHeatingReport.getReport(payload, false);
|
|
29
27
|
case "BluVacReport": return bluvacReport.getReport(payload);
|
|
30
28
|
case "ClassicReport": return classicReport.getReport(payload);
|
|
31
|
-
case "
|
|
32
|
-
case "
|
|
33
|
-
case "AccaCertificate": return accaCertificate.getReport(payload);
|
|
29
|
+
case "AccaVeoCertificate":
|
|
30
|
+
case "AccaQiCertificate": return accaCertificate.getReport(payload);
|
|
34
31
|
case "EnergyStarCertificate": return energyStarCertificate.getReport(payload);
|
|
35
32
|
case "FranklinInstallReport":
|
|
36
33
|
case "FranklinServiceReport": return franklinEnergyReport.getReport(payload);
|
package/package.json
CHANGED
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import { PDFDocument } from 'pdf-lib';
|
|
2
|
-
import * as base64 from '../base-64/icons.js';
|
|
3
|
-
import * as pdf from '../base-64/measurement-details-page.js';
|
|
4
|
-
import * as systemInfoPage from './system-info-page.js';
|
|
5
|
-
import * as util from '../util.js';
|
|
6
|
-
|
|
7
|
-
export async function getReport(payload, _test) {
|
|
8
|
-
try {
|
|
9
|
-
// fetch and load form
|
|
10
|
-
const formPdfBytes = util._base64ToArrayBuffer(pdf.base64);
|
|
11
|
-
const pdfDoc = await PDFDocument.load(formPdfBytes);
|
|
12
|
-
|
|
13
|
-
// fetch resources
|
|
14
|
-
const iconRangeGreenBytes = util._base64ToArrayBuffer(base64.iconRangeGreen);
|
|
15
|
-
const iconRangeRedBytes = util._base64ToArrayBuffer(base64.iconRangeRed);
|
|
16
|
-
const iconFlagBlackBytes = util._base64ToArrayBuffer(base64.iconFlagBlack);
|
|
17
|
-
const iconFlagGreenBytes = util._base64ToArrayBuffer(base64.iconFlagGreen);
|
|
18
|
-
const iconFlagRedBytes = util._base64ToArrayBuffer(base64.iconFlagRed);
|
|
19
|
-
const iconFlagYellowBytes = util._base64ToArrayBuffer(base64.iconFlagYellow);
|
|
20
|
-
const iconStabilityBytes = util._base64ToArrayBuffer(base64.iconStability);
|
|
21
|
-
const iconThumbprintGreenBytes = util._base64ToArrayBuffer(base64.iconThumbprintGreen);
|
|
22
|
-
const iconThumbprintRedBytes = util._base64ToArrayBuffer(base64.iconThumbprintRed);
|
|
23
|
-
const mqLogoBytes = util._base64ToArrayBuffer(base64.mqLogo);
|
|
24
|
-
|
|
25
|
-
// load resources
|
|
26
|
-
const iconRangeGreen = await pdfDoc.embedPng(iconRangeGreenBytes);
|
|
27
|
-
const iconRangeRed = await pdfDoc.embedPng(iconRangeRedBytes);
|
|
28
|
-
const iconFlagBlack = await pdfDoc.embedPng(iconFlagBlackBytes);
|
|
29
|
-
const iconFlagGreen = await pdfDoc.embedPng(iconFlagGreenBytes);
|
|
30
|
-
const iconFlagRed = await pdfDoc.embedPng(iconFlagRedBytes);
|
|
31
|
-
const iconFlagYellow = await pdfDoc.embedPng(iconFlagYellowBytes);
|
|
32
|
-
const iconStability = await pdfDoc.embedPng(iconStabilityBytes);
|
|
33
|
-
const iconThumbprintGreen = await pdfDoc.embedPng(iconThumbprintGreenBytes);
|
|
34
|
-
const iconThumbprintRed = await pdfDoc.embedPng(iconThumbprintRedBytes);
|
|
35
|
-
const mqLogo = await pdfDoc.embedPng(mqLogoBytes);
|
|
36
|
-
|
|
37
|
-
// embed company logo and profile picture
|
|
38
|
-
let profileImage, companyImage;
|
|
39
|
-
let profileImageType = util.checkProfilePicture(payload.meta);
|
|
40
|
-
let companyImageType = util.checkCompanyLogo(payload.meta);
|
|
41
|
-
if (profileImageType) {
|
|
42
|
-
if (profileImageType.shape == "square") profileImage = payload.meta.profile_settings.profilePicSquareBase64;
|
|
43
|
-
else if (profileImageType.shape == "circle") profileImage = payload.meta.profile_settings.profilePicCircleBase64;
|
|
44
|
-
if (profileImageType.type == "jpg") profileImage = await pdfDoc.embedJpg(util._base64ToArrayBuffer(profileImage));
|
|
45
|
-
else if (profileImageType.type == "png") profileImage = await pdfDoc.embedPng(util._base64ToArrayBuffer(profileImage));
|
|
46
|
-
}
|
|
47
|
-
if (companyImageType == "jpg") companyImage = await pdfDoc.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
48
|
-
else if (companyImageType == "png") companyImage = await pdfDoc.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
49
|
-
|
|
50
|
-
// get form for filling
|
|
51
|
-
const form = pdfDoc.getForm();
|
|
52
|
-
|
|
53
|
-
// print system diagnostics section
|
|
54
|
-
let t = payload.tests[0].testInfo;
|
|
55
|
-
if (_test) t = _test.testInfo;
|
|
56
|
-
if (t && t.diagnostics && t.diagnostics.multi_point_analysis && t.diagnostics.multi_point_analysis.length > 0) {
|
|
57
|
-
for (let i = 0; i < 9; i++) {
|
|
58
|
-
let d = t.diagnostics.multi_point_analysis[i];
|
|
59
|
-
if (d) {
|
|
60
|
-
let diagnosticIcon = iconFlagBlack;
|
|
61
|
-
if (d.type === 'stability') diagnosticIcon = iconStability;
|
|
62
|
-
else if (d.score > 1 && d.score < 10) diagnosticIcon = iconFlagRed;
|
|
63
|
-
else if (d.score >= 10 && d.score < 15) diagnosticIcon = iconFlagYellow;
|
|
64
|
-
form.getButton(`ImageDiagnostics${i+1}_af_image`).setImage(diagnosticIcon);
|
|
65
|
-
form.getTextField(`SystemDiagnostics${i+1}`).setText(`${d.title}`);
|
|
66
|
-
form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${d.score}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
} else {
|
|
70
|
-
form.getButton("ImageDiagnostics1_af_image").setImage(iconFlagGreen);
|
|
71
|
-
form.getTextField("SystemDiagnostics1").setText("No system-wide issues were detected.");
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
let header = payload.meta.header ? payload.meta.header : "A/C System Vitals";
|
|
75
|
-
form.getTextField('Header').setText(header);
|
|
76
|
-
|
|
77
|
-
// get text fields
|
|
78
|
-
let textFields = getTextFields(payload, t);
|
|
79
|
-
|
|
80
|
-
// print company logo and profile picture
|
|
81
|
-
if (profileImage && companyImage) { // both images are embedded in the document
|
|
82
|
-
form.getButton("ProfilePicture").setImage(profileImage);
|
|
83
|
-
form.getButton("HalfWidthLogo").setImage(companyImage);
|
|
84
|
-
if (payload.meta.profile_settings.techFirstName || payload.meta.profile_settings.techLastName)
|
|
85
|
-
form.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
86
|
-
} else if (profileImage) { // no company logo is embedded in the document
|
|
87
|
-
form.getButton("ProfilePicture").setImage(profileImage);
|
|
88
|
-
form.getButton("HalfWidthLogo").setImage(mqLogo);
|
|
89
|
-
if (payload.meta.profile_settings.techFirstName || payload.meta.profile_settings.techLastName)
|
|
90
|
-
form.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
91
|
-
} else { // no profile picture is embedded in the document
|
|
92
|
-
if (companyImage) form.getButton("FullWidthLogo").setImage(companyImage);
|
|
93
|
-
else form.getButton("FullWidthLogo").setImage(mqLogo);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// print customer data
|
|
97
|
-
let dateTimePlacement = "Upper";
|
|
98
|
-
let e = "";
|
|
99
|
-
let d = "";
|
|
100
|
-
|
|
101
|
-
let date = new Date();
|
|
102
|
-
if (textFields.cName && textFields.address && textFields.city && textFields.state && textFields.zip) {
|
|
103
|
-
dateTimePlacement = "Lower";
|
|
104
|
-
form.getTextField('Name').setText(`${textFields.cName}`);
|
|
105
|
-
form.getTextField('Address1').setText(`${textFields.address}`);
|
|
106
|
-
if (textFields.address2) {
|
|
107
|
-
form.getTextField('Address2').setText(`${textFields.address2}`);
|
|
108
|
-
form.getTextField('CityStateZip').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
|
|
109
|
-
} else form.getTextField('Address2').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
|
|
110
|
-
form.getTextField('DateOfServiceLabelUpper').setText("");
|
|
111
|
-
form.getTextField('TimeOfServiceLabelUpper').setText("");
|
|
112
|
-
form.getTextField('DateOfServiceLabelLower').setText("Date of Service:");
|
|
113
|
-
form.getTextField('TimeOfServiceLabelLower').setText("Time of Service:");
|
|
114
|
-
form.getTextField('DateOfServiceLower').setText(date.toLocaleDateString("en-US"));
|
|
115
|
-
form.getTextField('TimeOfServiceLower').setText(date.toLocaleTimeString("en-US"));
|
|
116
|
-
} else {
|
|
117
|
-
form.getTextField('DateOfServiceLabelLower').setText("");
|
|
118
|
-
form.getTextField('TimeOfServiceLabelLower').setText("");
|
|
119
|
-
form.getTextField('DateOfServiceLabelUpper').setText("Date of Service:");
|
|
120
|
-
form.getTextField('TimeOfServiceLabelUpper').setText("Time of Service:");
|
|
121
|
-
form.getTextField('DateOfServiceUpper').setText(date.toLocaleDateString("en-US"));
|
|
122
|
-
form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
let systemScorePercentage = t.data.vitals_score ? +t.data.vitals_score.toFixed(0) : 0;
|
|
126
|
-
let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
|
|
127
|
-
let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
|
|
128
|
-
if (!t.data.vitals_score) {
|
|
129
|
-
systemScorePercentage = "--";
|
|
130
|
-
systemScoreGrade = "";
|
|
131
|
-
} else systemScorePercentage += "%";
|
|
132
|
-
|
|
133
|
-
// print measurement data (first page)
|
|
134
|
-
form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage} ${systemScoreGrade}`);
|
|
135
|
-
form.getTextField('Superheat').setText(`${textFields.superheat} °${payload.units.temperature}`);
|
|
136
|
-
form.getTextField('Subcooling').setText(`${textFields.subcooling} °${payload.units.temperature}`);
|
|
137
|
-
form.getTextField('CondenserApproach').setText(`${textFields.approach} °${payload.units.temperature}`);
|
|
138
|
-
form.getTextField('TemperatureSplit').setText(`${textFields.tempSplit} °${payload.units.temperature}`);
|
|
139
|
-
form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
|
|
140
|
-
form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
|
|
141
|
-
|
|
142
|
-
// print losses data (second page)
|
|
143
|
-
let prefix;
|
|
144
|
-
let lossColor = textFields.ageLosses < 3 ? "Green" : "Red";
|
|
145
|
-
prefix = textFields.ageLosses == 0 ? "" : "-";
|
|
146
|
-
form.getTextField(`AgeLosses${lossColor}`).setText(`${prefix}${textFields.ageLosses}`);
|
|
147
|
-
lossColor = textFields.tempSplitLosses < 3 ? "Green" : "Red";
|
|
148
|
-
prefix = textFields.tempSplitLosses == 0 ? "" : "-";
|
|
149
|
-
form.getTextField(`TemperatureSplitLosses${lossColor}`).setText(`${prefix}${textFields.tempSplitLosses}`);
|
|
150
|
-
lossColor = textFields.staticLosses < 3 ? "Green" : "Red";
|
|
151
|
-
prefix = textFields.staticLosses == 0 ? "" : "-";
|
|
152
|
-
form.getTextField(`StaticPressureLosses${lossColor}`).setText(`${prefix}${textFields.staticLosses}`);
|
|
153
|
-
lossColor = textFields.approachLosses < 3 ? "Green" : "Red";
|
|
154
|
-
prefix = textFields.approachLosses == 0 ? "" : "-";
|
|
155
|
-
form.getTextField(`ApproachLosses${lossColor}`).setText(`${prefix}${textFields.approachLosses}`);
|
|
156
|
-
lossColor = textFields.refChargeLosses < 3 ? "Green" : "Red";
|
|
157
|
-
prefix = textFields.refChargeLosses == 0 ? "" : "-";
|
|
158
|
-
form.getTextField(`RefrigerantChargeIssues${lossColor}`).setText(`${prefix}${textFields.refChargeLosses}`);
|
|
159
|
-
form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage} ${systemScoreGrade}`);
|
|
160
|
-
|
|
161
|
-
// print targets and range icons
|
|
162
|
-
const measureLabels = ["Superheat", "Subcooling", "Condenser", "TempSplit", "Tesp", "FilterFace"];
|
|
163
|
-
const targetKeys = ["superheat", "subcooling", "approach", "temperature_split", "pressure_static_total_external", "velocity_face_filter1"];
|
|
164
|
-
for (let i = 0; i < measureLabels.length; i++) {
|
|
165
|
-
let iconPlacement = "Mid";
|
|
166
|
-
let icon = iconRangeRed;
|
|
167
|
-
let actual = +t.data[targetKeys[i]];
|
|
168
|
-
let mid = +t.targets[targetKeys[i]];
|
|
169
|
-
let low = +t.targets[`${targetKeys[i]}_ideal_low`];
|
|
170
|
-
let high = +t.targets[`${targetKeys[i]}_ideal_high`];
|
|
171
|
-
low = mid - low;
|
|
172
|
-
high = mid + high;
|
|
173
|
-
if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
|
|
174
|
-
else if (targetKeys[i] == "velocity_face_filter1") high = 500;
|
|
175
|
-
let val = t.data[targetKeys[i]];
|
|
176
|
-
if (actual < low && targetKeys[i] != "velocity_face_filter1") iconPlacement = "Low";
|
|
177
|
-
else if (actual > high) iconPlacement = "High";
|
|
178
|
-
else if (val) icon = iconRangeGreen;
|
|
179
|
-
if (icon) form.getButton(`Image${measureLabels[i]}${iconPlacement}_af_image`).setImage(icon);
|
|
180
|
-
let targetZone = "";
|
|
181
|
-
if (targetKeys[i] == "pressure_static_total_external" || targetKeys[i] == "velocity_face_filter1") targetZone = `(< ${high.toFixed(1)})`;
|
|
182
|
-
else if (!isNaN(low) && low != "NaN" && !isNaN(high) && high != "NaN" ) targetZone = `(${low.toFixed(1)} - ${high.toFixed(1)})`;
|
|
183
|
-
form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// print pass fail measures
|
|
187
|
-
if (t.subsystem_review_complete) {
|
|
188
|
-
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"];
|
|
189
|
-
let pfLabels = ["Electrical system", "Air distribution system", "Air filtration system", "Condensate drain system", "Refrigerant charge", "Outdoor equipment", "Indoor equipment", "Cooling capacity", "Cooling electrical efficiency"];
|
|
190
|
-
for (let i = 1; i <= passFails.length; i++) {
|
|
191
|
-
let meas = t[passFails[i - 1]];
|
|
192
|
-
let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
|
|
193
|
-
form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
|
|
194
|
-
form.getTextField(`SSR${i}`).setText(pfLabels[i-1]);
|
|
195
|
-
}
|
|
196
|
-
} else form.getTextField(`SSR1`).setText("Not yet reviewed");
|
|
197
|
-
|
|
198
|
-
if (payload.meta.report_type != "FullReport") {
|
|
199
|
-
let systemInfoPageBase64 = await systemInfoPage.getReport(payload);
|
|
200
|
-
const systemInfoPageDoc = systemInfoPageBase64 ? await PDFDocument.load(util._base64ToArrayBuffer(systemInfoPageBase64)) : false;
|
|
201
|
-
const [_systemInfoPageDoc] = systemInfoPageDoc ? await pdfDoc.copyPages(systemInfoPageDoc, [0]) : false;
|
|
202
|
-
if (_systemInfoPageDoc) pdfDoc.insertPage(pdfDoc.getPages().length, _systemInfoPageDoc);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// flatten and return as base64
|
|
206
|
-
form.flatten();
|
|
207
|
-
const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
|
|
208
|
-
return pdfBase64;
|
|
209
|
-
} catch (error) { }
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function getTextFields(payload, test) {
|
|
213
|
-
return {
|
|
214
|
-
"cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
|
|
215
|
-
"address": payload.site.location.address ? payload.site.location.address : "",
|
|
216
|
-
"address2": payload.site.location.address2 ? payload.site.location.address2 : "",
|
|
217
|
-
"city": payload.site.location.city ? payload.site.location.city : "",
|
|
218
|
-
"state": payload.site.location.state ? `, ${payload.site.location.state}` : "",
|
|
219
|
-
"zip": payload.site.location.zip ? ` ${payload.site.location.zip}` : "",
|
|
220
|
-
"superheat": test.data.superheat ? (+test.data.superheat).toFixed(1) : "--",
|
|
221
|
-
"subcooling": test.data.subcooling ? (+test.data.subcooling).toFixed(1) : "--",
|
|
222
|
-
"approach": test.data.approach ? (+test.data.approach).toFixed(1) : "--",
|
|
223
|
-
"tempSplit": test.data.temperature_split ? (+test.data.temperature_split).toFixed(1) : "--",
|
|
224
|
-
"tesp": test.data.pressure_static_total_external ? (+test.data.pressure_static_total_external).toFixed(2) : "--",
|
|
225
|
-
"fltrFace": test.data.velocity_face_filter1 ? (+test.data.velocity_face_filter1).toFixed(1) : "--",
|
|
226
|
-
"ageLosses": test.data.age_loss ? (+test.data.age_loss).toFixed(0) : 0,
|
|
227
|
-
"tempSplitLosses": test.data.temp_split_loss ? (+test.data.temp_split_loss).toFixed(0) : 0,
|
|
228
|
-
"staticLosses": test.data.static_loss ? (+test.data.static_loss).toFixed(0) : 0,
|
|
229
|
-
"approachLosses": test.data.approach_loss ? (+test.data.approach_loss).toFixed(0) : 0,
|
|
230
|
-
"refChargeLosses": test.data.refrigerant_charge_loss ? (+test.data.refrigerant_charge_loss).toFixed(0) : 0
|
|
231
|
-
}
|
|
232
|
-
}
|
|
@@ -1,232 +0,0 @@
|
|
|
1
|
-
import { PDFDocument } from 'pdf-lib';
|
|
2
|
-
import * as base64 from '../base-64/icons.js';
|
|
3
|
-
import * as pdf from '../base-64/measurement-details-page.js';
|
|
4
|
-
import * as systemInfoPage from './system-info-page.js';
|
|
5
|
-
import * as util from '../util.js';
|
|
6
|
-
|
|
7
|
-
export async function getReport(payload, _test) {
|
|
8
|
-
try {
|
|
9
|
-
// fetch and load form
|
|
10
|
-
const formPdfBytes = util._base64ToArrayBuffer(pdf.base64);
|
|
11
|
-
const pdfDoc = await PDFDocument.load(formPdfBytes);
|
|
12
|
-
|
|
13
|
-
// fetch resources
|
|
14
|
-
const iconRangeGreenBytes = util._base64ToArrayBuffer(base64.iconRangeGreen);
|
|
15
|
-
const iconRangeRedBytes = util._base64ToArrayBuffer(base64.iconRangeRed);
|
|
16
|
-
const iconFlagBlackBytes = util._base64ToArrayBuffer(base64.iconFlagBlack);
|
|
17
|
-
const iconFlagGreenBytes = util._base64ToArrayBuffer(base64.iconFlagGreen);
|
|
18
|
-
const iconFlagRedBytes = util._base64ToArrayBuffer(base64.iconFlagRed);
|
|
19
|
-
const iconFlagYellowBytes = util._base64ToArrayBuffer(base64.iconFlagYellow);
|
|
20
|
-
const iconStabilityBytes = util._base64ToArrayBuffer(base64.iconStability);
|
|
21
|
-
const iconThumbprintGreenBytes = util._base64ToArrayBuffer(base64.iconThumbprintGreen);
|
|
22
|
-
const iconThumbprintRedBytes = util._base64ToArrayBuffer(base64.iconThumbprintRed);
|
|
23
|
-
const mqLogoBytes = util._base64ToArrayBuffer(base64.mqLogo);
|
|
24
|
-
|
|
25
|
-
// load resources
|
|
26
|
-
const iconRangeGreen = await pdfDoc.embedPng(iconRangeGreenBytes);
|
|
27
|
-
const iconRangeRed = await pdfDoc.embedPng(iconRangeRedBytes);
|
|
28
|
-
const iconFlagBlack = await pdfDoc.embedPng(iconFlagBlackBytes);
|
|
29
|
-
const iconFlagGreen = await pdfDoc.embedPng(iconFlagGreenBytes);
|
|
30
|
-
const iconFlagRed = await pdfDoc.embedPng(iconFlagRedBytes);
|
|
31
|
-
const iconFlagYellow = await pdfDoc.embedPng(iconFlagYellowBytes);
|
|
32
|
-
const iconStability = await pdfDoc.embedPng(iconStabilityBytes);
|
|
33
|
-
const iconThumbprintGreen = await pdfDoc.embedPng(iconThumbprintGreenBytes);
|
|
34
|
-
const iconThumbprintRed = await pdfDoc.embedPng(iconThumbprintRedBytes);
|
|
35
|
-
const mqLogo = await pdfDoc.embedPng(mqLogoBytes);
|
|
36
|
-
|
|
37
|
-
// embed company logo and profile picture
|
|
38
|
-
let profileImage, companyImage;
|
|
39
|
-
let profileImageType = util.checkProfilePicture(payload.meta);
|
|
40
|
-
let companyImageType = util.checkCompanyLogo(payload.meta);
|
|
41
|
-
if (profileImageType) {
|
|
42
|
-
if (profileImageType.shape == "square") profileImage = payload.meta.profile_settings.profilePicSquareBase64;
|
|
43
|
-
else if (profileImageType.shape == "circle") profileImage = payload.meta.profile_settings.profilePicCircleBase64;
|
|
44
|
-
if (profileImageType.type == "jpg") profileImage = await pdfDoc.embedJpg(util._base64ToArrayBuffer(profileImage));
|
|
45
|
-
else if (profileImageType.type == "png") profileImage = await pdfDoc.embedPng(util._base64ToArrayBuffer(profileImage));
|
|
46
|
-
}
|
|
47
|
-
if (companyImageType == "jpg") companyImage = await pdfDoc.embedJpg(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
48
|
-
else if (companyImageType == "png") companyImage = await pdfDoc.embedPng(util._base64ToArrayBuffer(payload.meta.profile_settings.companyLogoBase64));
|
|
49
|
-
|
|
50
|
-
// get form for filling
|
|
51
|
-
const form = pdfDoc.getForm();
|
|
52
|
-
|
|
53
|
-
// print system diagnostics section
|
|
54
|
-
let t = payload.tests[0].testInfo;
|
|
55
|
-
if (_test) t = _test.testInfo;
|
|
56
|
-
if (t && t.diagnostics && t.diagnostics.multi_point_analysis && t.diagnostics.multi_point_analysis.length > 0) {
|
|
57
|
-
for (let i = 0; i < 9; i++) {
|
|
58
|
-
let d = t.diagnostics.multi_point_analysis[i];
|
|
59
|
-
if (d) {
|
|
60
|
-
let diagnosticIcon = iconFlagBlack;
|
|
61
|
-
if (d.type === 'stability') diagnosticIcon = iconStability;
|
|
62
|
-
else if (d.score > 1 && d.score < 10) diagnosticIcon = iconFlagRed;
|
|
63
|
-
else if (d.score >= 10 && d.score < 15) diagnosticIcon = iconFlagYellow;
|
|
64
|
-
form.getButton(`ImageDiagnostics${i+1}_af_image`).setImage(diagnosticIcon);
|
|
65
|
-
form.getTextField(`SystemDiagnostics${i+1}`).setText(`${d.title}`);
|
|
66
|
-
form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${d.score}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
} else {
|
|
70
|
-
form.getButton("ImageDiagnostics1_af_image").setImage(iconFlagGreen);
|
|
71
|
-
form.getTextField("SystemDiagnostics1").setText("No system-wide issues were detected.");
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
let header = payload.meta.header ? payload.meta.header : "A/C System Vitals";
|
|
75
|
-
form.getTextField('Header').setText(header);
|
|
76
|
-
|
|
77
|
-
// get text fields
|
|
78
|
-
let textFields = getTextFields(payload, t);
|
|
79
|
-
|
|
80
|
-
// print company logo and profile picture
|
|
81
|
-
if (profileImage && companyImage) { // both images are embedded in the document
|
|
82
|
-
form.getButton("ProfilePicture").setImage(profileImage);
|
|
83
|
-
form.getButton("HalfWidthLogo").setImage(companyImage);
|
|
84
|
-
if (payload.meta.profile_settings.techFirstName || payload.meta.profile_settings.techLastName)
|
|
85
|
-
form.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
86
|
-
} else if (profileImage) { // no company logo is embedded in the document
|
|
87
|
-
form.getButton("ProfilePicture").setImage(profileImage);
|
|
88
|
-
form.getButton("HalfWidthLogo").setImage(mqLogo);
|
|
89
|
-
if (payload.meta.profile_settings.techFirstName || payload.meta.profile_settings.techLastName)
|
|
90
|
-
form.getTextField('TechName').setText(`${payload.meta.profile_settings.techFirstName} ${payload.meta.profile_settings.techLastName}`);
|
|
91
|
-
} else { // no profile picture is embedded in the document
|
|
92
|
-
if (companyImage) form.getButton("FullWidthLogo").setImage(companyImage);
|
|
93
|
-
else form.getButton("FullWidthLogo").setImage(mqLogo);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// print customer data
|
|
97
|
-
let dateTimePlacement = "Upper";
|
|
98
|
-
let e = "";
|
|
99
|
-
let d = "";
|
|
100
|
-
|
|
101
|
-
let date = new Date();
|
|
102
|
-
if (textFields.cName && textFields.address && textFields.city && textFields.state && textFields.zip) {
|
|
103
|
-
dateTimePlacement = "Lower";
|
|
104
|
-
form.getTextField('Name').setText(`${textFields.cName}`);
|
|
105
|
-
form.getTextField('Address1').setText(`${textFields.address}`);
|
|
106
|
-
if (textFields.address2) {
|
|
107
|
-
form.getTextField('Address2').setText(`${textFields.address2}`);
|
|
108
|
-
form.getTextField('CityStateZip').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
|
|
109
|
-
} else form.getTextField('Address2').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
|
|
110
|
-
form.getTextField('DateOfServiceLabelUpper').setText("");
|
|
111
|
-
form.getTextField('TimeOfServiceLabelUpper').setText("");
|
|
112
|
-
form.getTextField('DateOfServiceLabelLower').setText("Date of Service:");
|
|
113
|
-
form.getTextField('TimeOfServiceLabelLower').setText("Time of Service:");
|
|
114
|
-
form.getTextField('DateOfServiceLower').setText(date.toLocaleDateString("en-US"));
|
|
115
|
-
form.getTextField('TimeOfServiceLower').setText(date.toLocaleTimeString("en-US"));
|
|
116
|
-
} else {
|
|
117
|
-
form.getTextField('DateOfServiceLabelLower').setText("");
|
|
118
|
-
form.getTextField('TimeOfServiceLabelLower').setText("");
|
|
119
|
-
form.getTextField('DateOfServiceLabelUpper').setText("Date of Service:");
|
|
120
|
-
form.getTextField('TimeOfServiceLabelUpper').setText("Time of Service:");
|
|
121
|
-
form.getTextField('DateOfServiceUpper').setText(date.toLocaleDateString("en-US"));
|
|
122
|
-
form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
let systemScorePercentage = t.data.vitals_score ? +t.data.vitals_score.toFixed(0) : 0;
|
|
126
|
-
let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
|
|
127
|
-
let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
|
|
128
|
-
if (!t.data.vitals_score) {
|
|
129
|
-
systemScorePercentage = "--";
|
|
130
|
-
systemScoreGrade = "";
|
|
131
|
-
} else systemScorePercentage += "%";
|
|
132
|
-
|
|
133
|
-
// print measurement data (first page)
|
|
134
|
-
form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage} ${systemScoreGrade}`);
|
|
135
|
-
form.getTextField('Superheat').setText(`${textFields.superheat} °${payload.units.temperature}`);
|
|
136
|
-
form.getTextField('Subcooling').setText(`${textFields.subcooling} °${payload.units.temperature}`);
|
|
137
|
-
form.getTextField('CondenserApproach').setText(`${textFields.approach} °${payload.units.temperature}`);
|
|
138
|
-
form.getTextField('TemperatureSplit').setText(`${textFields.tempSplit} °${payload.units.temperature}`);
|
|
139
|
-
form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
|
|
140
|
-
form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
|
|
141
|
-
|
|
142
|
-
// print losses data (second page)
|
|
143
|
-
let prefix;
|
|
144
|
-
let lossColor = textFields.ageLosses < 3 ? "Green" : "Red";
|
|
145
|
-
prefix = textFields.ageLosses == 0 ? "" : "-";
|
|
146
|
-
form.getTextField(`AgeLosses${lossColor}`).setText(`${prefix}${textFields.ageLosses}`);
|
|
147
|
-
lossColor = textFields.tempSplitLosses < 3 ? "Green" : "Red";
|
|
148
|
-
prefix = textFields.tempSplitLosses == 0 ? "" : "-";
|
|
149
|
-
form.getTextField(`TemperatureSplitLosses${lossColor}`).setText(`${prefix}${textFields.tempSplitLosses}`);
|
|
150
|
-
lossColor = textFields.staticLosses < 3 ? "Green" : "Red";
|
|
151
|
-
prefix = textFields.staticLosses == 0 ? "" : "-";
|
|
152
|
-
form.getTextField(`StaticPressureLosses${lossColor}`).setText(`${prefix}${textFields.staticLosses}`);
|
|
153
|
-
lossColor = textFields.approachLosses < 3 ? "Green" : "Red";
|
|
154
|
-
prefix = textFields.approachLosses == 0 ? "" : "-";
|
|
155
|
-
form.getTextField(`ApproachLosses${lossColor}`).setText(`${prefix}${textFields.approachLosses}`);
|
|
156
|
-
lossColor = textFields.refChargeLosses < 3 ? "Green" : "Red";
|
|
157
|
-
prefix = textFields.refChargeLosses == 0 ? "" : "-";
|
|
158
|
-
form.getTextField(`RefrigerantChargeIssues${lossColor}`).setText(`${prefix}${textFields.refChargeLosses}`);
|
|
159
|
-
form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage} ${systemScoreGrade}`);
|
|
160
|
-
|
|
161
|
-
// print targets and range icons
|
|
162
|
-
const measureLabels = ["Superheat", "Subcooling", "Condenser", "TempSplit", "Tesp", "FilterFace"];
|
|
163
|
-
const targetKeys = ["superheat", "subcooling", "approach", "temperature_split", "pressure_static_total_external", "velocity_face_filter1"];
|
|
164
|
-
for (let i = 0; i < measureLabels.length; i++) {
|
|
165
|
-
let iconPlacement = "Mid";
|
|
166
|
-
let icon = iconRangeRed;
|
|
167
|
-
let actual = +t.data[targetKeys[i]];
|
|
168
|
-
let mid = +t.targets[targetKeys[i]];
|
|
169
|
-
let low = +t.targets[`${targetKeys[i]}_ideal_low`];
|
|
170
|
-
let high = +t.targets[`${targetKeys[i]}_ideal_high`];
|
|
171
|
-
low = mid - low;
|
|
172
|
-
high = mid + high;
|
|
173
|
-
if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
|
|
174
|
-
else if (targetKeys[i] == "velocity_face_filter1") high = 500;
|
|
175
|
-
let val = t.data[targetKeys[i]];
|
|
176
|
-
if (actual < low && targetKeys[i] != "velocity_face_filter1") iconPlacement = "Low";
|
|
177
|
-
else if (actual > high) iconPlacement = "High";
|
|
178
|
-
else if (val) icon = iconRangeGreen;
|
|
179
|
-
if (icon) form.getButton(`Image${measureLabels[i]}${iconPlacement}_af_image`).setImage(icon);
|
|
180
|
-
let targetZone = "";
|
|
181
|
-
if (targetKeys[i] == "pressure_static_total_external" || targetKeys[i] == "velocity_face_filter1") targetZone = `(< ${high.toFixed(1)})`;
|
|
182
|
-
else if (!isNaN(low) && low != "NaN" && !isNaN(high) && high != "NaN" ) targetZone = `(${low.toFixed(1)} - ${high.toFixed(1)})`;
|
|
183
|
-
form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
|
|
184
|
-
}
|
|
185
|
-
|
|
186
|
-
// print pass fail measures
|
|
187
|
-
if (t.subsystem_review_complete) {
|
|
188
|
-
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"];
|
|
189
|
-
let pfLabels = ["Electrical system", "Air distribution system", "Air filtration system", "Condensate drain system", "Refrigerant charge", "Outdoor equipment", "Indoor equipment", "Cooling capacity", "Cooling electrical efficiency"];
|
|
190
|
-
for (let i = 1; i <= passFails.length; i++) {
|
|
191
|
-
let meas = t[passFails[i - 1]];
|
|
192
|
-
let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
|
|
193
|
-
form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
|
|
194
|
-
form.getTextField(`SSR${i}`).setText(pfLabels[i-1]);
|
|
195
|
-
}
|
|
196
|
-
} else form.getTextField(`SSR1`).setText("Not yet reviewed");
|
|
197
|
-
|
|
198
|
-
if (payload.meta.report_type != "FullReport") {
|
|
199
|
-
let systemInfoPageBase64 = await systemInfoPage.getReport(payload);
|
|
200
|
-
const systemInfoPageDoc = systemInfoPageBase64 ? await PDFDocument.load(util._base64ToArrayBuffer(systemInfoPageBase64)) : false;
|
|
201
|
-
const [_systemInfoPageDoc] = systemInfoPageDoc ? await pdfDoc.copyPages(systemInfoPageDoc, [0]) : false;
|
|
202
|
-
if (_systemInfoPageDoc) pdfDoc.insertPage(pdfDoc.getPages().length, _systemInfoPageDoc);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
// flatten and return as base64
|
|
206
|
-
form.flatten();
|
|
207
|
-
const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
|
|
208
|
-
return pdfBase64;
|
|
209
|
-
} catch (error) { }
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function getTextFields(payload, test) {
|
|
213
|
-
return {
|
|
214
|
-
"cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
|
|
215
|
-
"address": payload.site.location.address ? payload.site.location.address : "",
|
|
216
|
-
"address2": payload.site.location.address2 ? payload.site.location.address2 : "",
|
|
217
|
-
"city": payload.site.location.city ? payload.site.location.city : "",
|
|
218
|
-
"state": payload.site.location.state ? `, ${payload.site.location.state}` : "",
|
|
219
|
-
"zip": payload.site.location.zip ? ` ${payload.site.location.zip}` : "",
|
|
220
|
-
"superheat": test.data.superheat ? (+test.data.superheat).toFixed(1) : "--",
|
|
221
|
-
"subcooling": test.data.subcooling ? (+test.data.subcooling).toFixed(1) : "--",
|
|
222
|
-
"approach": test.data.approach ? (+test.data.approach).toFixed(1) : "--",
|
|
223
|
-
"tempSplit": test.data.temperature_split ? (+test.data.temperature_split).toFixed(1) : "--",
|
|
224
|
-
"tesp": test.data.pressure_static_total_external ? (+test.data.pressure_static_total_external).toFixed(2) : "--",
|
|
225
|
-
"fltrFace": test.data.velocity_face_filter1 ? (+test.data.velocity_face_filter1).toFixed(1) : "--",
|
|
226
|
-
"ageLosses": test.data.age_loss ? (+test.data.age_loss).toFixed(0) : 0,
|
|
227
|
-
"tempSplitLosses": test.data.temp_split_loss ? (+test.data.temp_split_loss).toFixed(0) : 0,
|
|
228
|
-
"staticLosses": test.data.static_loss ? (+test.data.static_loss).toFixed(0) : 0,
|
|
229
|
-
"approachLosses": test.data.approach_loss ? (+test.data.approach_loss).toFixed(0) : 0,
|
|
230
|
-
"refChargeLosses": test.data.refrigerant_charge_loss ? (+test.data.refrigerant_charge_loss).toFixed(0) : 0
|
|
231
|
-
}
|
|
232
|
-
}
|