@measurequick/measurequick-report-generator 1.2.56 → 1.2.58
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/base-64/cover-page.js +1 -1
- package/package.json +1 -1
- package/report-gen-scripts/corrective-measures.js +94 -92
- package/report-gen-scripts/cover-page.js +28 -30
- package/report-gen-scripts/full-report.js +9 -22
- package/report-gen-scripts/measurement-details.js +162 -161
- package/report-gen-scripts/photos-report.js +59 -58
- package/report-gen-scripts/vitals-cooling-report.js +3 -2
- package/report-gen-scripts/vitals-heating-report.js +3 -2
|
@@ -8,174 +8,175 @@ import * as pdf from '../base-64/measurement-details-page.js';
|
|
|
8
8
|
let embeddedIconsTestIn = {};
|
|
9
9
|
let embeddedIconsTestOut = {};
|
|
10
10
|
|
|
11
|
-
export async function getReport(payload) {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
}
|
|
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));
|
|
11
|
+
export async function getReport(payload) { console.log("Measurement Details - Payload:"); console.log(payload);
|
|
12
|
+
try {
|
|
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));
|
|
59
27
|
}
|
|
60
28
|
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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
|
+
}
|
|
60
|
+
}
|
|
81
61
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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));
|
|
69
|
+
}
|
|
90
70
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
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
|
+
}
|
|
95
91
|
} else {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
let sectionLabel = t == 0 ? 'Test In ' : 'Test Out ';
|
|
104
|
-
if (payload.tests.length == 1) sectionLabel = "";
|
|
105
|
-
let form = t == 0 ? formPg1 : formPg2;
|
|
106
|
-
let test = payload.tests[t].testInfo;
|
|
107
|
-
form.getTextField('Header').setText(`${sectionLabel}Measurement Details`);
|
|
108
|
-
if (payload.meta.cName && payload.meta.address && payload.meta.city && payload.meta.state && payload.meta.zip) {
|
|
109
|
-
form.getTextField('Name').setText(`${payload.meta.cName}`);
|
|
110
|
-
form.getTextField('Address 1').setText(`${payload.meta.address}`);
|
|
111
|
-
if (payload.meta.address2) {
|
|
112
|
-
form.getTextField('Address 2').setText(`${payload.meta.address2}`);
|
|
113
|
-
form.getTextField('City State Zip').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
114
|
-
} else form.getTextField('Address 2').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
115
|
-
form.getTextField('Date of Service').setText(payload.tests[t].created_date_string);
|
|
116
|
-
form.getTextField('Time of Service').setText(payload.tests[t].created_time_string);
|
|
92
|
+
if (companyImagePg1) {
|
|
93
|
+
formPg1.getButton("FullWidthLogo").setImage(companyImagePg1);
|
|
94
|
+
formPg2.getButton("FullWidthLogo").setImage(companyImagePg2);
|
|
95
|
+
} else {
|
|
96
|
+
formPg1.getButton("FullWidthLogo").setImage(mqLogoPg1);
|
|
97
|
+
formPg2.getButton("FullWidthLogo").setImage(mqLogoPg2);
|
|
98
|
+
}
|
|
117
99
|
}
|
|
118
100
|
|
|
119
|
-
let
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (measurement.
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
101
|
+
for (let t = 0; t < payload.tests.length; t++) {
|
|
102
|
+
let section = t == 0 ? 'test_in' : 'test_out';
|
|
103
|
+
let sectionLabel = t == 0 ? 'Test In ' : 'Test Out ';
|
|
104
|
+
if (payload.tests.length == 1) sectionLabel = "";
|
|
105
|
+
let form = t == 0 ? formPg1 : formPg2;
|
|
106
|
+
let test = payload.tests[t].testInfo;
|
|
107
|
+
form.getTextField('Header').setText(`${sectionLabel}Measurement Details`);
|
|
108
|
+
if (payload.meta.cName && payload.meta.address && payload.meta.city && payload.meta.state && payload.meta.zip) {
|
|
109
|
+
form.getTextField('Name').setText(`${payload.meta.cName}`);
|
|
110
|
+
form.getTextField('Address 1').setText(`${payload.meta.address}`);
|
|
111
|
+
if (payload.meta.address2) {
|
|
112
|
+
form.getTextField('Address 2').setText(`${payload.meta.address2}`);
|
|
113
|
+
form.getTextField('City State Zip').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
114
|
+
} else form.getTextField('Address 2').setText(`${payload.meta.city}${payload.meta.state}${payload.meta.zip}`);
|
|
115
|
+
form.getTextField('Date of Service').setText(payload.tests[t].created_date_string);
|
|
116
|
+
form.getTextField('Time of Service').setText(payload.tests[t].created_time_string);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
let systemScorePercentage = payload.tests[t].testInfo.data.vitals_score ? +payload.tests[t].testInfo.data.vitals_score.toFixed(0) : 0;
|
|
120
|
+
let systemScoreGrade = util.getGradeFromScore(systemScorePercentage);
|
|
121
|
+
let systemScoreColor = util.getColorFromGrade(systemScoreGrade);
|
|
122
|
+
if (!payload.tests[0].testInfo.canScoreVitals) {
|
|
123
|
+
systemScorePercentage = "--";
|
|
124
|
+
systemScoreGrade = "";
|
|
125
|
+
} else systemScorePercentage += "%";
|
|
126
|
+
form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage} ${systemScoreGrade}`);
|
|
127
|
+
|
|
128
|
+
if (mapImagePg1 && t == 0) form.getButton('Map Image').setImage(mapImagePg1);
|
|
129
|
+
if (mapImagePg2 && t == 1) form.getButton('Map Image').setImage(mapImagePg2);
|
|
130
|
+
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.");
|
|
131
|
+
|
|
132
|
+
for (let blockNum = 1; blockNum < 5; blockNum++) {
|
|
133
|
+
form.getTextField(`Block${blockNum}-Title`).setText(payload[section][`title${blockNum}`]);
|
|
134
|
+
for (let rowNum = 1; rowNum < 14; rowNum++) {
|
|
135
|
+
let measurement;
|
|
136
|
+
if (t == 0) measurement = payload.test_in[`block${blockNum}`][rowNum - 1];
|
|
137
|
+
else if (t == 1) measurement = payload.test_out[`block${blockNum}`][rowNum - 1];
|
|
138
|
+
let embeddedIcons = section == "test_in" ? embeddedIconsTestIn : embeddedIconsTestOut;
|
|
139
|
+
let condDisplay = util.getElectricalData(test, "", embeddedIcons);
|
|
140
|
+
let ahuDisplay = util.getElectricalData(test, "_ahu", embeddedIcons);
|
|
141
|
+
if (measurement) {
|
|
142
|
+
if (measurement.label == "Cond. Volts" && condDisplay.voltageIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(condDisplay.voltageIcon);
|
|
143
|
+
if (measurement.label == "Cond. Amps" && condDisplay.amperageIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(condDisplay.amperageIcon);
|
|
144
|
+
if (measurement.label == "AHU Volts" && ahuDisplay.voltageIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(ahuDisplay.voltageIcon);
|
|
145
|
+
if (measurement.label == "AHU Amps" && ahuDisplay.amperageIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(ahuDisplay.amperageIcon);
|
|
146
|
+
let units = measurement.units ? `(${measurement.units})` : "";
|
|
147
|
+
form.getTextField(`Block${blockNum}-Row${rowNum}-Col1`).setText(`${measurement.label} ${units}`);
|
|
148
|
+
let val = measurement.value ? measurement.value : (+test.data[measurement.ref]);
|
|
149
|
+
if (!val) val = "--";
|
|
150
|
+
else if (measurement.fixTo) val = val.toFixed(measurement.fixTo);
|
|
151
|
+
form.getTextField(`Block${blockNum}-Row${rowNum}-Col2`).setText(`${val}`);
|
|
152
|
+
if (blockNum != 4) {
|
|
153
|
+
let rangeIcon = util.getRangeIcon(test, measurement.ref, embeddedIcons);
|
|
154
|
+
if (rangeIcon && payload.meta.pdf_settings._includeRangeIndicators) form.getButton(`Block${blockNum}-Row${rowNum}-Col3`).setImage(rangeIcon);
|
|
155
|
+
let toolIcon = false;
|
|
156
|
+
if (measurement.ref == "superheat" || measurement.ref == "subcooling" || measurement.ref == "compression_ratio" || measurement.ref == "airflow_estimated") toolIcon = embeddedIcons.iconCalculator;
|
|
157
|
+
else toolIcon = util.getToolIcon(test, measurement.ref, embeddedIcons);
|
|
158
|
+
|
|
159
|
+
let benchmarkIcon = embeddedIcons.iconThumbprintRed;
|
|
160
|
+
if (measurement.value == "Yes, under duress") benchmarkIcon = embeddedIcons.iconThumbprintYellow;
|
|
161
|
+
else if (measurement.value == "Yes") benchmarkIcon = embeddedIcons.iconThumbprintGreen;
|
|
162
|
+
|
|
163
|
+
toolIcon = measurement.ref == "benchmark" ? benchmarkIcon : toolIcon;
|
|
164
|
+
if (toolIcon) form.getButton(`Block${blockNum}-Row${rowNum}-Col4`).setImage(toolIcon);
|
|
165
|
+
}
|
|
166
|
+
} else break;
|
|
167
|
+
}
|
|
167
168
|
}
|
|
168
169
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
})
|
|
170
|
+
formPg1.flatten();
|
|
171
|
+
formPg2.flatten();
|
|
172
|
+
|
|
173
|
+
if (payload.tests.length > 1) {
|
|
174
|
+
const [secondPage] = await pdfDocPg1.copyPages(pdfDocPg2, [0]);
|
|
175
|
+
pdfDocPg1.insertPage(1, secondPage);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
return await pdfDocPg1.saveAsBase64({
|
|
179
|
+
dataUri: true
|
|
180
|
+
});
|
|
181
|
+
} catch (error) { console.log(error) }
|
|
181
182
|
}
|
|
@@ -5,69 +5,70 @@ import * as photos6 from '../base-64/photos6.js';
|
|
|
5
5
|
import * as base64 from '../base-64/icons.js';
|
|
6
6
|
import * as util from '../util.js';
|
|
7
7
|
|
|
8
|
-
export async function getReport(payload) {
|
|
8
|
+
export async function getReport(payload) { console.log("Photo Page(s) - Payload:"); console.log(payload);
|
|
9
|
+
try {
|
|
10
|
+
const mqLogoBytes = util._base64ToArrayBuffer(base64.mqLogo);
|
|
11
|
+
let maxPhotosPerPage = payload.meta.pdf_settings.maxPhotosPerPage;
|
|
9
12
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
page = photos2;
|
|
20
|
-
pSize = "Large";
|
|
21
|
-
}
|
|
13
|
+
// Layout Configuration
|
|
14
|
+
let docs = [], forms = [], page = photos6, pSize = "Small";
|
|
15
|
+
if (maxPhotosPerPage == 4) {
|
|
16
|
+
page = photos4;
|
|
17
|
+
pSize = "Mid";
|
|
18
|
+
} else if (maxPhotosPerPage == 2) {
|
|
19
|
+
page = photos2;
|
|
20
|
+
pSize = "Large";
|
|
21
|
+
}
|
|
22
22
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
23
|
+
// Process All Photos
|
|
24
|
+
let previousPhotoSectionName;
|
|
25
|
+
let docIndex = 0;
|
|
26
|
+
let photoSectionKeys = Object.keys(payload.photos.project);
|
|
27
|
+
if (photoSectionKeys && photoSectionKeys.length > 0) {
|
|
28
|
+
docs[docIndex] = await PDFDocument.load(util._base64ToArrayBuffer(page.base64));
|
|
29
|
+
forms[docIndex] = docs[docIndex].getForm();
|
|
30
|
+
forms[docIndex].getButton("FullWidthLogo").setImage(await docs[docIndex].embedPng(mqLogoBytes));
|
|
31
|
+
forms[docIndex].getTextField("Header").setText(`Project Photos`);
|
|
32
|
+
let photoPosition = 1;
|
|
33
|
+
for (let pskIndex = 0; pskIndex < photoSectionKeys.length; pskIndex++) { // Iterate over X user-defined photo sections within each photo collection
|
|
34
|
+
let photoSectionKey = photoSectionKeys[pskIndex];
|
|
35
|
+
let photoSection = payload.photos.project[photoSectionKey];
|
|
36
|
+
let photoSectionName = photoSection.name;
|
|
37
|
+
let photos = photoSection.photos;
|
|
38
|
+
if (photos && photos.length > 0) {
|
|
39
|
+
for (let pIndex = 1; pIndex <= photos.length; pIndex++) { // Iterate over X user-defined photos within each photo section
|
|
40
|
+
let photo = photos[pIndex-1];
|
|
41
|
+
if (photoPosition > maxPhotosPerPage) { // Need a new page
|
|
42
|
+
photoPosition = 1;
|
|
43
|
+
docIndex++;
|
|
44
|
+
docs[docIndex] = await PDFDocument.load(util._base64ToArrayBuffer(page.base64));
|
|
45
|
+
forms[docIndex] = docs[docIndex].getForm();
|
|
46
|
+
forms[docIndex].getButton("FullWidthLogo").setImage(await docs[docIndex].embedPng(mqLogoBytes));
|
|
47
|
+
forms[docIndex].getTextField("Header").setText(`Project Photos`);
|
|
48
|
+
}
|
|
49
|
+
let imageToSet;
|
|
50
|
+
if (photo.base64.includes("image/jpeg")) imageToSet = await docs[docIndex].embedJpg(util._base64ToArrayBuffer(photo.base64));
|
|
51
|
+
else if (photo.base64.includes("image/png")) imageToSet = await docs[docIndex].embedPng(util._base64ToArrayBuffer(photo.base64));
|
|
52
|
+
if (imageToSet) forms[docIndex].getButton(`photo${pSize}${photoPosition}`).setImage(imageToSet);
|
|
53
|
+
let photoSubText = photoSection.name;
|
|
54
|
+
let isFirstPhotoOfSection = previousPhotoSectionName !== photoSectionName;
|
|
55
|
+
if (isFirstPhotoOfSection && photoSection.hasNotes && photoSection.notes) photoSubText += `: ${photoSection.notes}`;
|
|
56
|
+
forms[docIndex].getTextField(`Notes${photoPosition}`).setText(`${photoSubText}`);
|
|
57
|
+
photoPosition++;
|
|
58
|
+
previousPhotoSectionName = photoSectionName;
|
|
48
59
|
}
|
|
49
|
-
let imageToSet;
|
|
50
|
-
if (photo.base64.includes("image/jpeg")) imageToSet = await docs[docIndex].embedJpg(util._base64ToArrayBuffer(photo.base64));
|
|
51
|
-
else if (photo.base64.includes("image/png")) imageToSet = await docs[docIndex].embedPng(util._base64ToArrayBuffer(photo.base64));
|
|
52
|
-
if (imageToSet) forms[docIndex].getButton(`photo${pSize}${photoPosition}`).setImage(imageToSet);
|
|
53
|
-
let photoSubText = photoSection.name;
|
|
54
|
-
let isFirstPhotoOfSection = previousPhotoSectionName !== photoSectionName;
|
|
55
|
-
if (isFirstPhotoOfSection && photoSection.hasNotes && photoSection.notes) photoSubText += `: ${photoSection.notes}`;
|
|
56
|
-
forms[docIndex].getTextField(`Notes${photoPosition}`).setText(`${photoSubText}`);
|
|
57
|
-
photoPosition++;
|
|
58
|
-
previousPhotoSectionName = photoSectionName;
|
|
59
60
|
}
|
|
60
61
|
}
|
|
62
|
+
docIndex++;
|
|
61
63
|
}
|
|
62
|
-
docIndex++;
|
|
63
|
-
}
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
65
|
+
// Prepare Deliverable
|
|
66
|
+
forms.forEach(form => { form.flatten() });
|
|
67
|
+
let pdfDoc = await PDFDocument.create();
|
|
68
|
+
for (let i = 0; i < docs.length; i++) {
|
|
69
|
+
const [nextPage] = await pdfDoc.copyPages(docs[i], [0]);
|
|
70
|
+
pdfDoc.insertPage(i, nextPage);
|
|
71
|
+
}
|
|
72
|
+
return await pdfDoc.saveAsBase64({ dataUri: true });
|
|
73
|
+
} catch (error) { console.log(error) }
|
|
73
74
|
}
|
|
@@ -3,8 +3,8 @@ import * as base64 from '../base-64/icons.js';
|
|
|
3
3
|
import * as pdf from '../base-64/mq-vitals-cooling.js';
|
|
4
4
|
import * as util from '../util.js';
|
|
5
5
|
|
|
6
|
-
export async function getReport(payload, _test) { console.log(payload);
|
|
7
|
-
|
|
6
|
+
export async function getReport(payload, _test) { console.log("Vitals Cooling - Payload:"); console.log(payload);
|
|
7
|
+
try {
|
|
8
8
|
// fetch and load form
|
|
9
9
|
const formPdfBytes = util._base64ToArrayBuffer(pdf.base64);
|
|
10
10
|
const pdfDoc = await PDFDocument.load(formPdfBytes);
|
|
@@ -198,6 +198,7 @@ export async function getReport(payload, _test) { console.log(payload);
|
|
|
198
198
|
form.flatten();
|
|
199
199
|
const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
|
|
200
200
|
return pdfBase64;
|
|
201
|
+
} catch (error) { console.log(error) }
|
|
201
202
|
}
|
|
202
203
|
|
|
203
204
|
function getTextFields(payload) {
|
|
@@ -3,8 +3,8 @@ import * as base64 from '../base-64/icons.js';
|
|
|
3
3
|
import * as pdf from '../base-64/mq-vitals-heating.js';
|
|
4
4
|
import * as util from '../util.js';
|
|
5
5
|
|
|
6
|
-
export async function getReport(payload, _test) { console.log("Vitals Heating
|
|
7
|
-
|
|
6
|
+
export async function getReport(payload, _test) { console.log("Vitals Heating - Payload:"); console.log(payload);
|
|
7
|
+
try {
|
|
8
8
|
// fetch and load form
|
|
9
9
|
const formPdfBytes = util._base64ToArrayBuffer(pdf.base64);
|
|
10
10
|
const pdfDoc = await PDFDocument.load(formPdfBytes);
|
|
@@ -194,6 +194,7 @@ export async function getReport(payload, _test) { console.log("Vitals Heating Re
|
|
|
194
194
|
form.flatten();
|
|
195
195
|
const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
|
|
196
196
|
return pdfBase64;
|
|
197
|
+
} catch (error) { console.log(error) }
|
|
197
198
|
}
|
|
198
199
|
|
|
199
200
|
function getTextFields(payload) {
|