@measurequick/measurequick-report-generator 1.1.0 → 1.1.1

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.0",
3
+ "version": "1.1.1",
4
4
  "description": "Generates PDF documents for various MeasureQuick applications.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -2,99 +2,107 @@ import { PDFDocument } from 'pdf-lib';
2
2
  import * as base64 from '../graphics.js';
3
3
  import * as pdf from '../templates/base-64/mq-standard.js';
4
4
 
5
- export async function generateReport(payload) {
6
-
5
+ /***************************************************
6
+ [Page # || Page Index ]: Purpose
7
+ ============================================
8
+ [1 || 0]: Cover Sheet
9
+ [2 || 1]: A/C Vitals Measurements
10
+ [3 || 2: A/C Vitals Score Breakdown
11
+ [4 || 3]: A/C Vitals Information
12
+ [5 || 4]: Heating Vitals Measurements
13
+ [6 || 5]: Heating Vitals Score Breakdown
14
+ [7 || 6]: Heating Vitals Information
15
+ [8 || 7]: Equipment Information
16
+ [9 || 8]: System Review
17
+ [10 || 9]: 2-Column Measurement Details
18
+ [11 || 10]: 3-Column Measurement Details
19
+ [12 || 11]: 4-Column Measurement Details
20
+ [13 || 12]: Understanding A/C Subsystems
21
+ [14 || 13]: Understanding Heating Subsystems
22
+ [15 || 14]: 2x3 Photo Grid
23
+ [16 || 15]: 2x2 Photo Grid
24
+ [17 || 16]: 2x1 Photo Grid
25
+ ***************************************************/
26
+
27
+ export async function generateReport(payload) { console.log(payload);
28
+
29
+ // Initialize pdf-lib
7
30
  const pdfDoc = await PDFDocument.load(_base64ToArrayBuffer(pdf.base64));
8
31
 
9
- console.log(payload);
10
-
11
- let numCols = payload.project.numReportColumns;
12
-
13
- // pages[1, 2, 3, 12]: Cooling Specific Pages
14
- // pages[4, 5, 6, 13]: Heating Specific Pages
15
- // pages[9, 10, 11]: MD 2 Columns, MD 3 Columns, MD 4 Columns
16
- // pages[14, 15, 16]: 6 Photos, 4 Photos, 2 Photos
17
-
18
- // remove 2 of 3 photo pages
19
- if (numCols !== 4) pdfDoc.removePage(13); // 4-column measurement page
20
- if (numCols !== 2) pdfDoc.removePage(12); // 2-column measurement page
21
- if (numCols !== 3) pdfDoc.removePage(11); // 3-column measurement page
22
-
23
- let numPhotos = 0;
24
-
25
- // remove 2 of 3 measurement pages
26
- if (numPhotos >= 2) pdfDoc.removePage(8); // 2-photo page
27
- if (numPhotos >= 4) pdfDoc.removePage(7); // 4-photo page
28
- if (numPhotos === 0) pdfDoc.removePage(6); // 6-photo page
29
-
30
- // fetch resources
31
- const iconRangeGreenBytes = _base64ToArrayBuffer(base64.iconRangeGreen);
32
- const iconRangeRedBytes = _base64ToArrayBuffer(base64.iconRangeRed);
33
- const iconFlagBlackBytes = _base64ToArrayBuffer(base64.iconFlagBlack);
34
- const iconFlagGreenBytes = _base64ToArrayBuffer(base64.iconFlagGreen);
35
- const iconFlagRedBytes = _base64ToArrayBuffer(base64.iconFlagRed);
36
- const iconFlagYellowBytes = _base64ToArrayBuffer(base64.iconFlagYellow);
37
- const iconStabilityBytes = _base64ToArrayBuffer(base64.iconStability);
38
- const iconThumbprintGreenBytes = _base64ToArrayBuffer(base64.iconThumbprintGreen);
39
- const iconThumbprintRedBytes = _base64ToArrayBuffer(base64.iconThumbprintRed);
40
-
41
- // load resources
42
- const iconRangeGreen = await pdfDoc.embedPng(iconRangeGreenBytes);
43
- const iconRangeRed = await pdfDoc.embedPng(iconRangeRedBytes);
44
- const iconFlagBlack = await pdfDoc.embedPng(iconFlagBlackBytes);
45
- const iconFlagGreen = await pdfDoc.embedPng(iconFlagGreenBytes);
46
- const iconFlagRed = await pdfDoc.embedPng(iconFlagRedBytes);
47
- const iconFlagYellow = await pdfDoc.embedPng(iconFlagYellowBytes);
48
- const iconStability = await pdfDoc.embedPng(iconStabilityBytes);
49
- const iconThumbprintGreen = await pdfDoc.embedPng(iconThumbprintGreenBytes);
50
- const iconThumbprintRed = await pdfDoc.embedPng(iconThumbprintRedBytes);
51
-
52
- // get form for filling
32
+ // Remove Unnecessary Photo Pages
33
+ if (payload.meta.max_photos_per_page === 2) { pdfDoc.removePage(15); pdfDoc.removePage(14); }
34
+ else if (payload.meta.max_photos_per_page === 4) { pdfDoc.removePage(16); pdfDoc.removePage(14); }
35
+ else if (payload.meta.max_photos_per_page === 6) { pdfDoc.removePage(16); pdfDoc.removePage(15); }
36
+
37
+ // Remove Unnecessary Info Page
38
+ if (payload.meta.report_type === "cooling") pdfDoc.removePage(13);
39
+ else if (payload.meta.report_type === "heating") pdfDoc.removePage(12);
40
+
41
+ // Remove Unnecessary Measurement Pages
42
+ if (payload.meta.number_of_measurement_columns === 2) { pdfDoc.removePage(11); pdfDoc.removePage(10); }
43
+ else if (payload.meta.number_of_measurement_columns === 3) { pdfDoc.removePage(11); pdfDoc.removePage(9); }
44
+ else if (payload.meta.number_of_measurement_columns === 4) { pdfDoc.removePage(10); pdfDoc.removePage(9); }
45
+
46
+ // Remove System Review Page (If Chosen)
47
+ if (!payload.meta.system_review) pdfDoc.removePage(8);
48
+
49
+ // Remove Equipment Info Page (If Chosen)
50
+ if (!payload.meta.include_equipment_info) pdfDoc.removePage(7);
51
+
52
+ // Remove Unnecessary Vitals Pages
53
+ if (payload.meta.report_type === "cooling") { pdfDoc.removePage(6); pdfDoc.removePage(5); pdfDoc.removePage(4); }
54
+ else if (payload.meta.report_type === "heating") { pdfDoc.removePage(3); pdfDoc.removePage(2); pdfDoc.removePage(1); }
55
+
56
+ // Remove Cover Sheet (If Chosen)
57
+ if (!payload.meta.include_cover_sheet) pdfDoc.removePage(0);
58
+
59
+ // Fetch & Load Image Resources
60
+ const iconRangeGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconRangeGreen));
61
+ const iconRangeRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconRangeRed));
62
+ const iconFlagBlack = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagBlack));
63
+ const iconFlagGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagGreen));
64
+ const iconFlagRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagRed));
65
+ const iconFlagYellow = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagYellow));
66
+ const iconStability = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconStability));
67
+ const iconThumbprintGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconThumbprintGreen));
68
+ const iconThumbprintRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconThumbprintRed));
69
+
70
+ // Initialize Form For Population
53
71
  const form = pdfDoc.getForm();
54
72
 
55
- // cover page
56
- form.getTextField("Report Title").setText();
57
- form.getTextField("Technician Name").setText();
58
- form.getTextField("Date of Service Cover").setText();
59
- form.getTextField("Time of Service Cover").setText();
60
-
61
- let test = payload.project.tests[0];
73
+ // Populate Cover Sheet
74
+ form.getTextField("Report Title").setText(payload.meta.report_title);
75
+ form.getTextField("Technician Name").setText(payload.meta.technician_name);
76
+ form.getTextField("Date of Service Cover").setText(payload.meta.date_of_service);
77
+ form.getTextField("Time of Service Cover").setText(payload.meta.time_of_service);
62
78
 
63
- // vitals report
64
- let scoreDeduction = 0;
65
- if (test.testInfo.diagnostics.multi_point_analysis && test.testInfo.diagnostics.multi_point_analysis.length > 0) {
79
+ // Populate Vitals Measurements
80
+ if (payload.diagnostics) {
66
81
  for (let i = 0; i < 9; i++) {
67
- let d = test.testInfo.diagnostics.multi_point_analysis[i];
68
- if (d) {
82
+ if (payload.diagnostics[i]) {
69
83
  let diagnosticIcon = iconFlagBlack;
70
- if (d.type === 'stability')
84
+ if (payload.diagnostics[i].type === 'stability')
71
85
  diagnosticIcon = iconStability;
72
- else if (d.score > 1 && d.score < 10) {
86
+ else if (payload.diagnostics[i].score > 1 && payload.diagnostics[i].score < 10) {
73
87
  diagnosticIcon = iconFlagRed;
74
- scoreDeduction += d.score;
75
- } else if (d.score >= 10 && d.score < 15)
88
+ } else if (payload.diagnostics[i].score >= 10 && payload.diagnostics[i].score < 15)
76
89
  diagnosticIcon = iconFlagYellow;
77
90
  form.getButton(`ImageDiagnostics${i+1}_af_image`).setImage(diagnosticIcon);
78
- form.getTextField(`SystemDiagnostics${i+1}`).setText(`${d.title}`);
79
- form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${d.score}`);
91
+ form.getTextField(`SystemDiagnostics${i+1}`).setText(`${payload.diagnostics[i].title}`);
92
+ form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${payload.diagnostics[i].score}`);
80
93
  }
81
94
  }
82
95
  } else {
83
96
  form.getButton("ImageDiagnostics1_af_image").setImage(iconFlagGreen);
84
97
  form.getTextField("SystemDiagnostics1").setText("No system-wide issues were detected.");
85
98
  }
86
- if (test.testInfo.score_deduction) {
87
- scoreDeduction = test.testInfo.score_deduction;
88
- }
89
99
 
90
- let systemScorePercentage = +(100 - +(scoreDeduction.toFixed(0)));
100
+ let systemScorePercentage = +(100 - +(payload.meta.score_deduction.toFixed(0)));
91
101
  let systemScoreGrade = getGradeFromScore(systemScorePercentage);
92
102
  let systemScoreColor = getColorFromGrade(systemScoreGrade);
93
-
94
- // get text fields
95
103
  let textFields = getTextFields(payload);
96
104
 
97
- // print customer data
105
+ // customer data
98
106
  let dateTimePlacement = "Upper";
99
107
  let e = "";
100
108
  let d = "";
@@ -123,7 +131,7 @@ export async function generateReport(payload) {
123
131
  form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
124
132
  }
125
133
 
126
- // print measurement data (first page)
134
+ // vitals measurement values
127
135
  form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
128
136
  form.getTextField('Superheat').setText(`${textFields.superheat} °${payload.units.temperature}`);
129
137
  form.getTextField('Subcooling').setText(`${textFields.subcooling} °${payload.units.temperature}`);
@@ -132,7 +140,7 @@ export async function generateReport(payload) {
132
140
  form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
133
141
  form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
134
142
 
135
- // print losses data (second page)
143
+ // Populate Vitals Score Breakdown
136
144
  let lossColor = textFields.ageLosses < 3 ? "Green" : "Red";
137
145
  form.getTextField(`AgeLosses${lossColor}`).setText(`- ${textFields.ageLosses}`);
138
146
  lossColor = textFields.tempSplitLosses < 3 ? "Green" : "Red";
@@ -145,16 +153,16 @@ export async function generateReport(payload) {
145
153
  form.getTextField(`RefrigerantChargeIssues${lossColor}`).setText(`- ${textFields.refChargeLosses}`);
146
154
  form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage}% ${systemScoreGrade}`);
147
155
 
148
- // print targets and range icons
156
+ // target & range icons
149
157
  const measureLabels = ["Superheat", "Subcooling", "Condenser", "TempSplit", "Tesp", "FilterFace"];
150
158
  const targetKeys = ["superheat", "subcooling", "approach", "temperature_split", "pressure_static_total_external", "velocity_face_filter1"];
151
159
  for (let i = 0; i < measureLabels.length; i++) {
152
160
  let iconPlacement = "Mid";
153
161
  let icon = iconRangeRed;
154
- let actual = +test.testInfo.data[targetKeys[i]];
155
- let mid = +test.testInfo.targets[targetKeys[i]];
156
- let low = +test.testInfo.targets[`${targetKeys[i]}_ideal_low`];
157
- let high = +test.testInfo.targets[`${targetKeys[i]}_ideal_high`];
162
+ let actual = +payload.test.testInfo.data[targetKeys[i]];
163
+ let mid = +payload.test.testInfo.targets[targetKeys[i]];
164
+ let low = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_low`];
165
+ let high = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_high`];
158
166
  low = mid - low;
159
167
  high = mid + high;
160
168
  if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
@@ -169,15 +177,15 @@ export async function generateReport(payload) {
169
177
  form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
170
178
  }
171
179
 
172
- // print pass fail measures
180
+ // pass fail section
173
181
  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"];
174
182
  for (let i = 1; i <= passFails.length; i++) {
175
- let meas = test.testInfo[passFails[i - 1]];
183
+ let meas = payload.test[passFails[i - 1]];
176
184
  let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
177
185
  form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
178
186
  }
179
187
 
180
- // equipment information page
188
+ // Populate Equipment Info Page
181
189
  form.getTextField(`EI Title 1`).setText();
182
190
  form.getTextField(`EI Title 2`).setText();
183
191
  form.getTextField(`EI Title 3`).setText();
@@ -186,7 +194,7 @@ export async function generateReport(payload) {
186
194
  form.getTextField(`Equip_Info-Field ${fieldNum}b`).setText();
187
195
  }
188
196
 
189
- // system review page
197
+ // Populate System Review Page
190
198
  for (let catNum = 1; catNum <= 10; catNum++) {
191
199
  for (let fieldNum = 1; fieldNum <= 5; fieldNum++) {
192
200
  form.getTextField(`SR Title ${catNum}`).setText();
@@ -195,32 +203,19 @@ export async function generateReport(payload) {
195
203
  }
196
204
  }
197
205
 
198
-
199
-
200
-
201
-
202
-
203
-
204
-
205
-
206
- // measurement details page
207
- for (let rowNum = 1; rowNum <= 35; rowNum++) {
208
- for (let colNum = 1; colNum <= numCols; colNum++) {
209
- form.getTextField(`MD${numCols} ${rowNum}${colNum}`).setText();
210
- }
206
+ // Populate Measurement Details Page
207
+ for (let rowNum = 0; rowNum < payload.measurement_details.outdoor_measurements.length; rowNum++) {
208
+ let measurement = payload.measurement_details.outdoor_measurements[rowNum];
209
+ form.getTextField(`MD4 ${rowNum+1}1`).setText(`${measurement.label} (${measurement.units})`);
210
+ form.getTextField(`MD4 ${rowNum+1}2`).setText(measurement.testInValue);
211
+ form.getTextField(`MD4 ${rowNum+1}3`).setText(measurement.testOutValue);
212
+ form.getTextField(`MD4 ${rowNum+1}4`).setText(measurement.referenceKey);
211
213
  }
212
214
 
215
+ // Populate Photo Page(s)
213
216
 
214
217
 
215
-
216
-
217
-
218
-
219
-
220
-
221
- // photos page: take code from standard report
222
-
223
-
218
+ // Flatten Form, Convert & Return PDF as Base64
224
219
  form.flatten();
225
220
  const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
226
221
  return pdfBase64;
@@ -252,7 +247,6 @@ function getColorFromGrade(grade) {
252
247
  }
253
248
 
254
249
  function getTextFields(payload) {
255
- let test = payload.project.tests[0];
256
250
  return {
257
251
  "cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
258
252
  "address": payload.site.location.address ? payload.site.location.address : "",
@@ -260,17 +254,17 @@ function getTextFields(payload) {
260
254
  "city": payload.site.location.city ? payload.site.location.city : "",
261
255
  "state": payload.site.location.state ? `, ${payload.site.location.state}` : "",
262
256
  "zip": payload.site.location.zip ? ` ${payload.site.location.zip}` : "",
263
- "superheat": test.testInfo.data.superheat ? (+test.testInfo.data.superheat).toFixed(1) : "--",
264
- "subcooling": test.testInfo.data.subcooling ? (+test.testInfo.data.subcooling).toFixed(1) : "--",
265
- "approach": test.testInfo.data.approach ? (+test.testInfo.data.approach).toFixed(1) : "--",
266
- "tempSplit": test.testInfo.data.temperature_split ? (+test.testInfo.data.temperature_split).toFixed(1) : "--",
267
- "tesp": test.testInfo.data.pressure_static_total_external ? (+test.testInfo.data.pressure_static_total_external).toFixed(2) : "--",
268
- "fltrFace": test.testInfo.data.velocity_face_filter1 ? (+test.testInfo.data.velocity_face_filter1).toFixed(1) : "--",
269
- "ageLosses": test.testInfo.data.age_loss ? (+test.testInfo.data.age_loss).toFixed(0) : 0,
270
- "tempSplitLosses": test.testInfo.data.temp_split_loss ? (+test.testInfo.data.temp_split_loss).toFixed(0) : 0,
271
- "staticLosses": test.testInfo.data.static_loss ? (+test.testInfo.data.static_loss).toFixed(0) : 0,
272
- "approachLosses": test.testInfo.data.approach_loss ? (+test.testInfo.data.approach_loss).toFixed(0) : 0,
273
- "refChargeLosses": test.testInfo.data.refrigerant_charge_loss ? (+test.testInfo.data.refrigerant_charge_loss).toFixed(0) : 0
257
+ "superheat": payload.test.testInfo.data.superheat ? (+payload.test.testInfo.data.superheat).toFixed(1) : "--",
258
+ "subcooling": payload.test.testInfo.data.subcooling ? (+payload.test.testInfo.data.subcooling).toFixed(1) : "--",
259
+ "approach": payload.test.testInfo.data.approach ? (+payload.test.testInfo.data.approach).toFixed(1) : "--",
260
+ "tempSplit": payload.test.testInfo.data.temperature_split ? (+payload.test.testInfo.data.temperature_split).toFixed(1) : "--",
261
+ "tesp": payload.test.testInfo.data.pressure_static_total_external ? (+payload.test.testInfo.data.pressure_static_total_external).toFixed(2) : "--",
262
+ "fltrFace": payload.test.testInfo.data.velocity_face_filter1 ? (+payload.test.testInfo.data.velocity_face_filter1).toFixed(1) : "--",
263
+ "ageLosses": payload.test.testInfo.data.age_loss ? (+payload.test.testInfo.data.age_loss).toFixed(0) : 0,
264
+ "tempSplitLosses": payload.test.testInfo.data.temp_split_loss ? (+payload.test.testInfo.data.temp_split_loss).toFixed(0) : 0,
265
+ "staticLosses": payload.test.testInfo.data.static_loss ? (+payload.test.testInfo.data.static_loss).toFixed(0) : 0,
266
+ "approachLosses": payload.test.testInfo.data.approach_loss ? (+payload.test.testInfo.data.approach_loss).toFixed(0) : 0,
267
+ "refChargeLosses": payload.test.testInfo.data.refrigerant_charge_loss ? (+payload.test.testInfo.data.refrigerant_charge_loss).toFixed(0) : 0
274
268
  }
275
269
  }
276
270
 
Binary file