@measurequick/measurequick-report-generator 1.0.98 → 1.0.99

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.
@@ -0,0 +1,224 @@
1
+ import { PDFDocument } from 'pdf-lib';
2
+ import * as base64 from '../graphics.js';
3
+ import * as pdf from '../templates/base-64/mq-vitals-cooling.js';
4
+
5
+ export async function generateReport(payload) {
6
+
7
+ // fetch and load form
8
+ const formPdfBytes = _base64ToArrayBuffer(base64.systemVitalsPdfTemplate);
9
+ const pdfDoc = await PDFDocument.load(formPdfBytes);
10
+
11
+ // fetch resources
12
+ const iconRangeGreenBytes = _base64ToArrayBuffer(base64.iconRangeGreen);
13
+ const iconRangeRedBytes = _base64ToArrayBuffer(base64.iconRangeRed);
14
+ const iconFlagBlackBytes = _base64ToArrayBuffer(base64.iconFlagBlack);
15
+ const iconFlagGreenBytes = _base64ToArrayBuffer(base64.iconFlagGreen);
16
+ const iconFlagRedBytes = _base64ToArrayBuffer(base64.iconFlagRed);
17
+ const iconFlagYellowBytes = _base64ToArrayBuffer(base64.iconFlagYellow);
18
+ const iconStabilityBytes = _base64ToArrayBuffer(base64.iconStability);
19
+ const iconThumbprintGreenBytes = _base64ToArrayBuffer(base64.iconThumbprintGreen);
20
+ const iconThumbprintRedBytes = _base64ToArrayBuffer(base64.iconThumbprintRed);
21
+
22
+ // load resources
23
+ const iconRangeGreen = await pdfDoc.embedPng(iconRangeGreenBytes);
24
+ const iconRangeRed = await pdfDoc.embedPng(iconRangeRedBytes);
25
+ const iconFlagBlack = await pdfDoc.embedPng(iconFlagBlackBytes);
26
+ const iconFlagGreen = await pdfDoc.embedPng(iconFlagGreenBytes);
27
+ const iconFlagRed = await pdfDoc.embedPng(iconFlagRedBytes);
28
+ const iconFlagYellow = await pdfDoc.embedPng(iconFlagYellowBytes);
29
+ const iconStability = await pdfDoc.embedPng(iconStabilityBytes);
30
+ const iconThumbprintGreen = await pdfDoc.embedPng(iconThumbprintGreenBytes);
31
+ const iconThumbprintRed = await pdfDoc.embedPng(iconThumbprintRedBytes);
32
+
33
+ // get form for filling
34
+ const form = pdfDoc.getForm();
35
+
36
+ // print system diagnostics section
37
+ let scoreDeduction = 0;
38
+ if (payload.test.diagnostics.multi_point_analysis && payload.test.diagnostics.multi_point_analysis.length > 0) {
39
+ for (let i = 0; i < 9; i++) {
40
+ let d = payload.test.diagnostics.multi_point_analysis[i];
41
+ if (d) {
42
+ let diagnosticIcon = iconFlagBlack;
43
+ if (d.type === 'stability')
44
+ diagnosticIcon = iconStability;
45
+ else if (d.score > 1 && d.score < 10) {
46
+ diagnosticIcon = iconFlagRed;
47
+ scoreDeduction += d.score;
48
+ } else if (d.score >= 10 && d.score < 15)
49
+ diagnosticIcon = iconFlagYellow;
50
+ form.getButton(`ImageDiagnostics${i+1}_af_image`).setImage(diagnosticIcon);
51
+ form.getTextField(`SystemDiagnostics${i+1}`).setText(`${d.title}`);
52
+ form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${d.score}`);
53
+ }
54
+ }
55
+ } else {
56
+ form.getButton("ImageDiagnostics1_af_image").setImage(iconFlagGreen);
57
+ form.getTextField("SystemDiagnostics1").setText("No system-wide issues were detected.");
58
+ }
59
+ if (payload.test.score_deduction) {
60
+ scoreDeduction = payload.test.score_deduction;
61
+ }
62
+
63
+ let systemScorePercentage = +(100 - +(scoreDeduction.toFixed(0)));
64
+ let systemScoreGrade = getGradeFromScore(systemScorePercentage);
65
+ let systemScoreColor = getColorFromGrade(systemScoreGrade);
66
+
67
+ // get text fields
68
+ let textFields = getTextFields(payload);
69
+
70
+ // print customer data
71
+ let dateTimePlacement = "Upper";
72
+ let e = "";
73
+ let d = "";
74
+
75
+ let date = new Date();
76
+ if (textFields.cName && textFields.address && textFields.city && textFields.state && textFields.zip) {
77
+ dateTimePlacement = "Lower";
78
+ form.getTextField('Name').setText(`${textFields.cName}`);
79
+ form.getTextField('Address1').setText(`${textFields.address}`);
80
+ if (textFields.address2) {
81
+ form.getTextField('Address2').setText(`${textFields.address2}`);
82
+ form.getTextField('CityStateZip').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
83
+ } else form.getTextField('Address2').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
84
+ form.getTextField('DateOfServiceLabelUpper').setText("");
85
+ form.getTextField('TimeOfServiceLabelUpper').setText("");
86
+ form.getTextField('DateOfServiceLabelLower').setText("Date of Service:");
87
+ form.getTextField('TimeOfServiceLabelLower').setText("Time of Service:");
88
+ form.getTextField('DateOfServiceLower').setText(date.toLocaleDateString("en-US"));
89
+ form.getTextField('TimeOfServiceLower').setText(date.toLocaleTimeString("en-US"));
90
+ } else {
91
+ form.getTextField('DateOfServiceLabelLower').setText("");
92
+ form.getTextField('TimeOfServiceLabelLower').setText("");
93
+ form.getTextField('DateOfServiceLabelUpper').setText("Date of Service:");
94
+ form.getTextField('TimeOfServiceLabelUpper').setText("Time of Service:");
95
+ form.getTextField('DateOfServiceUpper').setText(date.toLocaleDateString("en-US"));
96
+ form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
97
+ }
98
+
99
+ // print measurement data (first page)
100
+ form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
101
+ form.getTextField('Superheat').setText(`${textFields.superheat} °${payload.units.temperature}`);
102
+ form.getTextField('Subcooling').setText(`${textFields.subcooling} °${payload.units.temperature}`);
103
+ form.getTextField('CondenserApproach').setText(`${textFields.approach} °${payload.units.temperature}`);
104
+ form.getTextField('TemperatureSplit').setText(`${textFields.tempSplit} °${payload.units.temperature}`);
105
+ form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
106
+ form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
107
+
108
+ // print losses data (second page)
109
+ let lossColor = textFields.ageLosses < 3 ? "Green" : "Red";
110
+ form.getTextField(`AgeLosses${lossColor}`).setText(`- ${textFields.ageLosses}`);
111
+ lossColor = textFields.tempSplitLosses < 3 ? "Green" : "Red";
112
+ form.getTextField(`TemperatureSplitLosses${lossColor}`).setText(`- ${textFields.tempSplitLosses}`);
113
+ lossColor = textFields.staticLosses < 3 ? "Green" : "Red";
114
+ form.getTextField(`StaticPressureLosses${lossColor}`).setText(`- ${textFields.staticLosses}`);
115
+ lossColor = textFields.approachLosses < 3 ? "Green" : "Red";
116
+ form.getTextField(`ApproachLosses${lossColor}`).setText(`- ${textFields.approachLosses}`);
117
+ lossColor = textFields.refChargeLosses < 3 ? "Green" : "Red";
118
+ form.getTextField(`RefrigerantChargeIssues${lossColor}`).setText(`- ${textFields.refChargeLosses}`);
119
+ form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage}% ${systemScoreGrade}`);
120
+
121
+ // print targets and range icons
122
+ const measureLabels = ["Superheat", "Subcooling", "Condenser", "TempSplit", "Tesp", "FilterFace"];
123
+ const targetKeys = ["superheat", "subcooling", "approach", "temperature_split", "pressure_static_total_external", "velocity_face_filter1"];
124
+ for (let i = 0; i < measureLabels.length; i++) {
125
+ let iconPlacement = "Mid";
126
+ let icon = iconRangeRed;
127
+ let actual = +payload.test.data[targetKeys[i]];
128
+ let mid = +payload.test.targets[targetKeys[i]];
129
+ let low = +payload.test.targets[`${targetKeys[i]}_ideal_low`];
130
+ let high = +payload.test.targets[`${targetKeys[i]}_ideal_high`];
131
+ low = mid - low;
132
+ high = mid + high;
133
+ if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
134
+ else if (targetKeys[i] == "velocity_face_filter1") high = 500;
135
+ if (actual < low && targetKeys[i] != "velocity_face_filter1") iconPlacement = "Low";
136
+ else if (actual > high) iconPlacement = "High";
137
+ else icon = iconRangeGreen;
138
+ form.getButton(`Image${measureLabels[i]}${iconPlacement}_af_image`).setImage(icon);
139
+ let targetZone = "";
140
+ if (targetKeys[i] == "pressure_static_total_external" || targetKeys[i] == "velocity_face_filter1") targetZone = `(< ${high})`;
141
+ else if (!isNaN(low) && low != "NaN" && !isNaN(high) && high != "NaN" ) targetZone = `(${low.toFixed(1)} - ${high.toFixed(1)})`;
142
+ form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
143
+ }
144
+
145
+ // print pass fail measures
146
+ 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"];
147
+ for (let i = 1; i <= passFails.length; i++) {
148
+ let meas = payload.test[passFails[i - 1]];
149
+ let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
150
+ form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
151
+ }
152
+
153
+ // flatten and return as base64
154
+ form.flatten();
155
+ const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
156
+ return pdfBase64;
157
+
158
+ // if (payload.project.isCordova) {
159
+ // const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
160
+ // return pdfBase64;
161
+ // } else {
162
+ // const pdfBytes = await pdfDoc.save();
163
+ // const fn = "vitals-test.pdf";
164
+ // //require("downloadjs").download(pdfBytes, fn, "application/pdf");
165
+ // return fn;
166
+ // }
167
+ }
168
+
169
+ function getGradeFromScore(score) {
170
+ let grade = "F";
171
+ if (score == 100) return "A+";
172
+ else if (score >= 94) return "A";
173
+ else if (score >= 90) return "A-";
174
+ else if (score >= 87) return "B+";
175
+ else if (score >= 84) return "B";
176
+ else if (score >= 80) return "B-";
177
+ else if (score >= 77) return "C+";
178
+ else if (score >= 74) return "C";
179
+ else if (score >= 70) return "C-";
180
+ else if (score >= 67) return "D+";
181
+ else if (score >= 64) return "D";
182
+ else if (score >= 60) return "D-";
183
+ else return "F";
184
+ }
185
+
186
+ function getColorFromGrade(grade) {
187
+ if (grade.includes("A")) return "Green";
188
+ else if (grade.includes("B")) return "Yellow";
189
+ else if (grade.includes("C")) return "Orange";
190
+ else return "Red";
191
+ }
192
+
193
+ function getTextFields(payload) {
194
+ return {
195
+ "cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
196
+ "address": payload.site.location.address ? payload.site.location.address : "",
197
+ "address2": payload.site.location.address2 ? payload.site.location.address2 : "",
198
+ "city": payload.site.location.city ? payload.site.location.city : "",
199
+ "state": payload.site.location.state ? `, ${payload.site.location.state}` : "",
200
+ "zip": payload.site.location.zip ? ` ${payload.site.location.zip}` : "",
201
+ "superheat": payload.test.data.superheat ? (+payload.test.data.superheat).toFixed(1) : "--",
202
+ "subcooling": payload.test.data.subcooling ? (+payload.test.data.subcooling).toFixed(1) : "--",
203
+ "approach": payload.test.data.approach ? (+payload.test.data.approach).toFixed(1) : "--",
204
+ "tempSplit": payload.test.data.temperature_split ? (+payload.test.data.temperature_split).toFixed(1) : "--",
205
+ "tesp": payload.test.data.pressure_static_total_external ? (+payload.test.data.pressure_static_total_external).toFixed(2) : "--",
206
+ "fltrFace": payload.test.data.velocity_face_filter1 ? (+payload.test.data.velocity_face_filter1).toFixed(1) : "--",
207
+ "ageLosses": payload.test.data.age_loss ? (+payload.test.data.age_loss).toFixed(0) : 0,
208
+ "tempSplitLosses": payload.test.data.temp_split_loss ? (+payload.test.data.temp_split_loss).toFixed(0) : 0,
209
+ "staticLosses": payload.test.data.static_loss ? (+payload.test.data.static_loss).toFixed(0) : 0,
210
+ "approachLosses": payload.test.data.approach_loss ? (+payload.test.data.approach_loss).toFixed(0) : 0,
211
+ "refChargeLosses": payload.test.data.refrigerant_charge_loss ? (+payload.test.data.refrigerant_charge_loss).toFixed(0) : 0
212
+ }
213
+ }
214
+
215
+ function _base64ToArrayBuffer(base64) {
216
+ base64 = base64.replace(/^[^,]+,/, '').replace(/\s/g, '');
217
+ var binary_string = window.atob(base64);
218
+ var len = binary_string.length;
219
+ var bytes = new Uint8Array(len);
220
+ for (var i = 0; i < len; i++) {
221
+ bytes[i] = binary_string.charCodeAt(i);
222
+ }
223
+ return bytes.buffer;
224
+ }
@@ -0,0 +1,199 @@
1
+ import { PDFDocument } from 'pdf-lib';
2
+ import * as base64 from '../graphics.js';
3
+ import * as pdf from '../templates/base-64/mq-vitals-heating.js';
4
+
5
+ export async function generateReport(payload) {
6
+
7
+ // fetch and load form
8
+ const formPdfBytes = _base64ToArrayBuffer(base64.systemVitalsHeatingPdfTemplate);
9
+ const pdfDoc = await PDFDocument.load(formPdfBytes);
10
+
11
+ // fetch resources
12
+ const iconRangeGreenBytes = _base64ToArrayBuffer(base64.iconRangeGreen);
13
+ const iconRangeRedBytes = _base64ToArrayBuffer(base64.iconRangeRed);
14
+ const iconFlagBlackBytes = _base64ToArrayBuffer(base64.iconFlagBlack);
15
+ const iconFlagGreenBytes = _base64ToArrayBuffer(base64.iconFlagGreen);
16
+ const iconFlagRedBytes = _base64ToArrayBuffer(base64.iconFlagRed);
17
+ const iconFlagYellowBytes = _base64ToArrayBuffer(base64.iconFlagYellow);
18
+ const iconStabilityBytes = _base64ToArrayBuffer(base64.iconStability);
19
+ const iconThumbprintGreenBytes = _base64ToArrayBuffer(base64.iconThumbprintGreen);
20
+ const iconThumbprintRedBytes = _base64ToArrayBuffer(base64.iconThumbprintRed);
21
+
22
+ // load resources
23
+ const iconRangeGreen = await pdfDoc.embedPng(iconRangeGreenBytes);
24
+ const iconRangeRed = await pdfDoc.embedPng(iconRangeRedBytes);
25
+ const iconFlagBlack = await pdfDoc.embedPng(iconFlagBlackBytes);
26
+ const iconFlagGreen = await pdfDoc.embedPng(iconFlagGreenBytes);
27
+ const iconFlagRed = await pdfDoc.embedPng(iconFlagRedBytes);
28
+ const iconFlagYellow = await pdfDoc.embedPng(iconFlagYellowBytes);
29
+ const iconStability = await pdfDoc.embedPng(iconStabilityBytes);
30
+ const iconThumbprintGreen = await pdfDoc.embedPng(iconThumbprintGreenBytes);
31
+ const iconThumbprintRed = await pdfDoc.embedPng(iconThumbprintRedBytes);
32
+
33
+ // get form for filling
34
+ const form = pdfDoc.getForm();
35
+
36
+ // print system diagnostics section
37
+ let scoreDeduction = 0;
38
+
39
+ let systemScorePercentage = payload.test.data.efficiency_gcv;
40
+ let systemScoreGrade = getGradeFromScore(systemScorePercentage);
41
+ let systemScoreColor = getColorFromGrade(systemScoreGrade);
42
+
43
+ // get text fields
44
+ let textFields = getTextFields(payload);
45
+
46
+ // print customer data
47
+ let dateTimePlacement = "Upper";
48
+ let e = "";
49
+ let d = "";
50
+
51
+ let date = new Date();
52
+ if (textFields.cName && textFields.address && textFields.city && textFields.state && textFields.zip) {
53
+ dateTimePlacement = "Lower";
54
+ form.getTextField('Name').setText(`${textFields.cName}`);
55
+ form.getTextField('Address1').setText(`${textFields.address}`);
56
+ if (textFields.address2) {
57
+ form.getTextField('Address2').setText(`${textFields.address2}`);
58
+ form.getTextField('CityStateZip').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
59
+ } else form.getTextField('Address2').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
60
+ form.getTextField('DateOfServiceLabelUpper').setText("");
61
+ form.getTextField('TimeOfServiceLabelUpper').setText("");
62
+ form.getTextField('DateOfServiceLabelLower').setText("Date of Service:");
63
+ form.getTextField('TimeOfServiceLabelLower').setText("Time of Service:");
64
+ form.getTextField('DateOfServiceLower').setText(date.toLocaleDateString("en-US"));
65
+ form.getTextField('TimeOfServiceLower').setText(date.toLocaleTimeString("en-US"));
66
+ } else {
67
+ form.getTextField('DateOfServiceLabelLower').setText("");
68
+ form.getTextField('TimeOfServiceLabelLower').setText("");
69
+ form.getTextField('DateOfServiceLabelUpper').setText("Date of Service:");
70
+ form.getTextField('TimeOfServiceLabelUpper').setText("Time of Service:");
71
+ form.getTextField('DateOfServiceUpper').setText(date.toLocaleDateString("en-US"));
72
+ form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
73
+ }
74
+
75
+ // print measurement data
76
+ form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
77
+
78
+ form.getTextField('COaf').setText(`${textFields.coaf} ppm`);
79
+ form.getTextField('Efficiency').setText(`${textFields.efficiency}`);
80
+ form.getTextField('ManifoldPressure').setText(`${textFields.manifoldPressure} inH2O`);
81
+ form.getTextField('TemperatureSplit').setText(`${textFields.tempSplit} °${payload.units.temperature}`);
82
+ form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
83
+ form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
84
+
85
+ // print targets and range icons
86
+ const measureLabels = ["ManifoldPressure", "TempSplit", "Tesp", "FilterFace"];
87
+ const targetKeys = ["pressure_manifold", "temperature_rise", "pressure_static_total_external", "velocity_face_filter1"];
88
+ for (let i = 0; i < measureLabels.length; i++) {
89
+ let iconPlacement = "Mid";
90
+ let icon = iconRangeRed;
91
+ let actual = +payload.test.data[targetKeys[i]];
92
+ let mid = +payload.test.targets[targetKeys[i]];
93
+ let low = +payload.test.targets[`${targetKeys[i]}_ideal_low`];
94
+ let high = +payload.test.targets[`${targetKeys[i]}_ideal_high`];
95
+ low = mid - low;
96
+ high = mid + high;
97
+ if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
98
+ else if (targetKeys[i] == "velocity_face_filter1") high = 500;
99
+ if (actual < low && targetKeys[i] != "velocity_face_filter1") iconPlacement = "Low";
100
+ else if (actual > high) iconPlacement = "High";
101
+ else icon = iconRangeGreen;
102
+ form.getButton(`Image${measureLabels[i]}${iconPlacement}`).setImage(icon);
103
+ let targetZone = "";
104
+ if (targetKeys[i] == "pressure_static_total_external" || targetKeys[i] == "velocity_face_filter1") targetZone = `(< ${high})`;
105
+ else if (!isNaN(low) && low != "NaN" && !isNaN(high) && high != "NaN" ) targetZone = `(${low.toFixed(1)} - ${high.toFixed(1)})`;
106
+ form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
107
+ }
108
+
109
+ let specialCaseIcon = iconRangeRed;
110
+ let specialCasePlacement = "Mid";
111
+ if (payload.test.data.coaf < 100) {
112
+ specialCaseIcon = iconRangeGreen;
113
+ specialCasePlacement = "Low";
114
+ } else if (payload.test.data.coaf > 400) specialCasePlacement = "High";
115
+ form.getButton(`ImageCOaf${specialCasePlacement}`).setImage(specialCaseIcon);
116
+
117
+ specialCaseIcon = iconRangeRed;
118
+ specialCasePlacement = "Low";
119
+ if (payload.test.data.efficiency_gcv >= 90) {
120
+ specialCasePlacement = "High";
121
+ specialCaseIcon = iconRangeGreen;
122
+ } else if (payload.test.data.efficiency_gcv >= 80) specialCasePlacement = "Mid";
123
+ form.getButton(`ImageEfficiency${specialCasePlacement}`).setImage(specialCaseIcon);
124
+
125
+ // print pass fail measures
126
+ 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"];
127
+ for (let i = 1; i <= passFails.length; i++) {
128
+ let meas = payload.test[passFails[i - 1]];
129
+ let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
130
+ form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
131
+ }
132
+
133
+ // flatten and return as base64
134
+ form.flatten();
135
+ const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
136
+ return pdfBase64;
137
+
138
+ // if (payload.project.isCordova) {
139
+ // const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
140
+ // return pdfBase64;
141
+ // } else {
142
+ // const pdfBytes = await pdfDoc.save();
143
+ // const fn = "vitals-heating-test.pdf";
144
+ // require("downloadjs").download(pdfBytes, fn, "application/pdf");
145
+ // return fn;
146
+ // }
147
+ }
148
+
149
+ function getGradeFromScore(score) {
150
+ let grade = "F";
151
+ if (score == 100) return "A+";
152
+ else if (score >= 94) return "A";
153
+ else if (score >= 90) return "A-";
154
+ else if (score >= 87) return "B+";
155
+ else if (score >= 84) return "B";
156
+ else if (score >= 80) return "B-";
157
+ else if (score >= 77) return "C+";
158
+ else if (score >= 74) return "C";
159
+ else if (score >= 70) return "C-";
160
+ else if (score >= 67) return "D+";
161
+ else if (score >= 64) return "D";
162
+ else if (score >= 60) return "D-";
163
+ else return "F";
164
+ }
165
+
166
+ function getColorFromGrade(grade) {
167
+ if (grade.includes("A")) return "Green";
168
+ else if (grade.includes("B")) return "Yellow";
169
+ else if (grade.includes("C")) return "Orange";
170
+ else return "Red";
171
+ }
172
+
173
+ function getTextFields(payload) {
174
+ return {
175
+ "cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
176
+ "address": payload.site.location.address ? payload.site.location.address : "",
177
+ "address2": payload.site.location.address2 ? payload.site.location.address2 : "",
178
+ "city": payload.site.location.city ? payload.site.location.city : "",
179
+ "state": payload.site.location.state ? `, ${payload.site.location.state}` : "",
180
+ "zip": payload.site.location.zip ? ` ${payload.site.location.zip}` : "",
181
+ "coaf": payload.test.data.coaf ? (+payload.test.data.coaf).toFixed(1) : "--",
182
+ "efficiency": payload.test.data.efficiency_gcv ? (+payload.test.data.efficiency_gcv).toFixed(1) : "--",
183
+ "manifoldPressure": payload.test.data.pressure_manifold ? (+payload.test.data.pressure_manifold).toFixed(1) : "--",
184
+ "tempSplit": payload.test.data.temperature_rise ? (+payload.test.data.temperature_rise).toFixed(1) : "--",
185
+ "tesp": payload.test.data.pressure_static_total_external ? (+payload.test.data.pressure_static_total_external).toFixed(2) : "--",
186
+ "fltrFace": payload.test.data.velocity_face_filter1 ? (+payload.test.data.velocity_face_filter1).toFixed(1) : "--"
187
+ }
188
+ }
189
+
190
+ function _base64ToArrayBuffer(base64) {
191
+ base64 = base64.replace(/^[^,]+,/, '').replace(/\s/g, '');
192
+ var binary_string = window.atob(base64);
193
+ var len = binary_string.length;
194
+ var bytes = new Uint8Array(len);
195
+ for (var i = 0; i < len; i++) {
196
+ bytes[i] = binary_string.charCodeAt(i);
197
+ }
198
+ return bytes.buffer;
199
+ }
@@ -0,0 +1,37 @@
1
+ import { PDFDocument } from 'pdf-lib';
2
+ import * as pdf from '../templates/base-64/ptcs-heat-pump.js';
3
+
4
+ export async function generateReport(payload) {
5
+ const formPdfBytes = _base64ToArrayBuffer(base64.ptcsPdfTemplate);
6
+ const pdfDoc = await PDFDocument.load(formPdfBytes);
7
+ const photoBytesStripHeat = _base64ToArrayBuffer(payload.images.imageStripHeatBase64);
8
+ const photoBytesHpThermostat = _base64ToArrayBuffer(payload.images.imageHpThermostatBase64);
9
+ var imageStripHeat;
10
+ var imageHpThermostat;
11
+ if (photoBytesStripHeat) imageStripHeat = await pdfDoc.embedJpg(photoBytesStripHeat);
12
+ if (photoBytesHpThermostat) imageHpThermostat = await pdfDoc.embedJpg(photoBytesHpThermostat);
13
+ const form = pdfDoc.getForm();
14
+ Object.keys(payload.textFields).forEach(fieldKey => {
15
+ if (payload.textFields[fieldKey]) form.getTextField(fieldKey).setText(`${payload.textFields[fieldKey]}`);
16
+ });
17
+ Object.keys(payload.checkFields).forEach(fieldKey => {
18
+ if (payload.checkFields[fieldKey]) form.getCheckBox(`${payload.checkFields[fieldKey]}`).check();
19
+ });
20
+ if (imageStripHeat) form.getButton("customImage1").setImage(imageStripHeat);
21
+ if (imageHpThermostat) form.getButton("customImage2").setImage(imageHpThermostat);
22
+ form.flatten();
23
+ const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
24
+ return pdfBase64;
25
+ }
26
+
27
+ function _base64ToArrayBuffer(base64) {
28
+ if (!base64) return "";
29
+ base64 = base64.replace(/^[^,]+,/, '').replace(/\s/g, '');
30
+ var binary_string = window.atob(base64);
31
+ var len = binary_string.length;
32
+ var bytes = new Uint8Array(len);
33
+ for (var i = 0; i < len; i++) {
34
+ bytes[i] = binary_string.charCodeAt(i);
35
+ }
36
+ return bytes.buffer;
37
+ }