@measurequick/measurequick-report-generator 1.1.0 → 1.1.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/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.2",
4
4
  "description": "Generates PDF documents for various MeasureQuick applications.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -2,99 +2,115 @@ 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.include_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
+ let geolocationMap, profilePicture, companyLogo;
61
+ if (payload.photos.map_image_base64) geolocationMap = await pdfDoc.embedPng(_base64ToArrayBuffer(payload.photos.map_image_base64));
62
+ if (payload.photos.profile_image_base64) profilePicture = await pdfDoc.embedPng(_base64ToArrayBuffer(payload.photos.profile_image_base64));
63
+ if (payload.photos.company_logo_base64) companyLogo = await pdfDoc.embedPng(_base64ToArrayBuffer(payload.photos.company_logo_base64));
64
+
65
+ const iconRangeGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconRangeGreen));
66
+ const iconRangeRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconRangeRed));
67
+ const iconFlagBlack = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagBlack));
68
+ const iconFlagGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagGreen));
69
+ const iconFlagRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagRed));
70
+ const iconFlagYellow = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconFlagYellow));
71
+ const iconStability = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconStability));
72
+ const iconThumbprintGreen = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconThumbprintGreen));
73
+ const iconThumbprintRed = await pdfDoc.embedPng(_base64ToArrayBuffer(base64.iconThumbprintRed));
74
+
75
+ // Initialize Form For Population
53
76
  const form = pdfDoc.getForm();
54
77
 
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];
62
-
63
- // vitals report
64
- let scoreDeduction = 0;
65
- if (test.testInfo.diagnostics.multi_point_analysis && test.testInfo.diagnostics.multi_point_analysis.length > 0) {
78
+ // Populate Cover Sheet
79
+ form.getTextField("Report Title").setText(payload.meta.report_title);
80
+ form.getTextField("Technician Name").setText(payload.meta.technician_name);
81
+ form.getTextField("Date of Service Cover").setText(payload.meta.date_of_service);
82
+ form.getTextField("Time of Service Cover").setText(payload.meta.time_of_service);
83
+ if (companyLogo) form.getButton("Company Logo").setImage(companyLogo);
84
+ if (profilePicture) form.getButton("Profile Picture").setImage(profilePicture);
85
+ if (geolocationMap) form.getButton("Photo Equipment").setImage(geolocationMap);
86
+
87
+ // Populate Vitals Measurements
88
+ if (payload.diagnostics) {
66
89
  for (let i = 0; i < 9; i++) {
67
- let d = test.testInfo.diagnostics.multi_point_analysis[i];
68
- if (d) {
90
+ if (payload.diagnostics[i]) {
69
91
  let diagnosticIcon = iconFlagBlack;
70
- if (d.type === 'stability')
92
+ if (payload.diagnostics[i].type === 'stability')
71
93
  diagnosticIcon = iconStability;
72
- else if (d.score > 1 && d.score < 10) {
94
+ else if (payload.diagnostics[i].score > 1 && payload.diagnostics[i].score < 10) {
73
95
  diagnosticIcon = iconFlagRed;
74
- scoreDeduction += d.score;
75
- } else if (d.score >= 10 && d.score < 15)
96
+ } else if (payload.diagnostics[i].score >= 10 && payload.diagnostics[i].score < 15)
76
97
  diagnosticIcon = iconFlagYellow;
77
98
  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}`);
99
+ form.getTextField(`SystemDiagnostics${i+1}`).setText(`${payload.diagnostics[i].title}`);
100
+ form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${payload.diagnostics[i].score}`);
80
101
  }
81
102
  }
82
103
  } else {
83
104
  form.getButton("ImageDiagnostics1_af_image").setImage(iconFlagGreen);
84
105
  form.getTextField("SystemDiagnostics1").setText("No system-wide issues were detected.");
85
106
  }
86
- if (test.testInfo.score_deduction) {
87
- scoreDeduction = test.testInfo.score_deduction;
88
- }
89
107
 
90
- let systemScorePercentage = +(100 - +(scoreDeduction.toFixed(0)));
108
+ let systemScorePercentage = +(100 - +(payload.meta.score_deduction.toFixed(0)));
91
109
  let systemScoreGrade = getGradeFromScore(systemScorePercentage);
92
110
  let systemScoreColor = getColorFromGrade(systemScoreGrade);
93
-
94
- // get text fields
95
111
  let textFields = getTextFields(payload);
96
112
 
97
- // print customer data
113
+ // customer data
98
114
  let dateTimePlacement = "Upper";
99
115
  let e = "";
100
116
  let d = "";
@@ -123,7 +139,7 @@ export async function generateReport(payload) {
123
139
  form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
124
140
  }
125
141
 
126
- // print measurement data (first page)
142
+ // vitals measurement values
127
143
  form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
128
144
  form.getTextField('Superheat').setText(`${textFields.superheat} °${payload.units.temperature}`);
129
145
  form.getTextField('Subcooling').setText(`${textFields.subcooling} °${payload.units.temperature}`);
@@ -132,7 +148,7 @@ export async function generateReport(payload) {
132
148
  form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
133
149
  form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
134
150
 
135
- // print losses data (second page)
151
+ // Populate Vitals Score Breakdown
136
152
  let lossColor = textFields.ageLosses < 3 ? "Green" : "Red";
137
153
  form.getTextField(`AgeLosses${lossColor}`).setText(`- ${textFields.ageLosses}`);
138
154
  lossColor = textFields.tempSplitLosses < 3 ? "Green" : "Red";
@@ -145,16 +161,16 @@ export async function generateReport(payload) {
145
161
  form.getTextField(`RefrigerantChargeIssues${lossColor}`).setText(`- ${textFields.refChargeLosses}`);
146
162
  form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage}% ${systemScoreGrade}`);
147
163
 
148
- // print targets and range icons
164
+ // target & range icons
149
165
  const measureLabels = ["Superheat", "Subcooling", "Condenser", "TempSplit", "Tesp", "FilterFace"];
150
166
  const targetKeys = ["superheat", "subcooling", "approach", "temperature_split", "pressure_static_total_external", "velocity_face_filter1"];
151
167
  for (let i = 0; i < measureLabels.length; i++) {
152
168
  let iconPlacement = "Mid";
153
169
  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`];
170
+ let actual = +payload.test.testInfo.data[targetKeys[i]];
171
+ let mid = +payload.test.testInfo.targets[targetKeys[i]];
172
+ let low = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_low`];
173
+ let high = +payload.test.testInfo.targets[`${targetKeys[i]}_ideal_high`];
158
174
  low = mid - low;
159
175
  high = mid + high;
160
176
  if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
@@ -169,64 +185,92 @@ export async function generateReport(payload) {
169
185
  form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
170
186
  }
171
187
 
172
- // print pass fail measures
188
+ // pass fail section
173
189
  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
190
  for (let i = 1; i <= passFails.length; i++) {
175
- let meas = test.testInfo[passFails[i - 1]];
191
+ let meas = payload.test[passFails[i - 1]];
176
192
  let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
177
193
  form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
178
194
  }
179
195
 
180
- // equipment information page
181
- form.getTextField(`EI Title 1`).setText();
182
- form.getTextField(`EI Title 2`).setText();
183
- form.getTextField(`EI Title 3`).setText();
196
+ // Populate Equipment Info Page
197
+ form.getTextField(`EI Title 1`).setText(payload.equipment_information.title1);
198
+ form.getTextField(`EI Title 2`).setText(payload.equipment_information.title2);
199
+ form.getTextField(`EI Title 3`).setText(payload.equipment_information.title3);
184
200
  for (let fieldNum = 1; fieldNum <= 41; fieldNum++) {
185
201
  form.getTextField(`Equip_Info-Field ${fieldNum}a`).setText();
186
202
  form.getTextField(`Equip_Info-Field ${fieldNum}b`).setText();
187
203
  }
188
204
 
189
- // system review page
205
+ // Populate System Review Page
190
206
  for (let catNum = 1; catNum <= 10; catNum++) {
191
207
  for (let fieldNum = 1; fieldNum <= 5; fieldNum++) {
192
- form.getTextField(`SR Title ${catNum}`).setText();
208
+ form.getTextField(`SR Title ${catNum}`).setText(payload.system_review[`title${catNum}`]);
193
209
  form.getTextField(`Category ${catNum} Field ${fieldNum}a`).setText();
194
210
  form.getTextField(`Category ${catNum} Field ${fieldNum}b`).setText();
195
211
  }
196
212
  }
197
213
 
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
- }
214
+ // Populate Measurement Details Page
215
+ let rowPrinting = 1;
216
+ let cNums = payload.meta.number_of_measurement_columns;
217
+ form.getTextField(`MD${cNums} Title 1`).setText(payload.measurement_details.title1);
218
+ form.getTextField(`MD${cNums} Title 2`).setText(payload.measurement_details.title2);
219
+ if (cNums >= 3) form.getTextField(`MD${cNums} Title 3`).setText(payload.measurement_details.title3);
220
+ if (cNums == 4) form.getTextField(`MD${cNums} Title 4`).setText(payload.measurement_details.title4);
221
+
222
+ // TODO: Add Section Header
223
+
224
+ for (let rowNum = 0; rowNum < payload.measurement_details.outdoor_measurements.length; rowNum++) {
225
+ let measurement = payload.measurement_details.outdoor_measurements[rowNum];
226
+ form.getTextField(`MD${cNums} ${rowPrinting}1`).setText(`${measurement.label} (${measurement.units})`);
227
+ form.getTextField(`MD${cNums} ${rowPrinting}2`).setText(measurement.testInValue);
228
+ if (cNums >= 3) form.getTextField(`MD${cNums} ${rowPrinting}3`).setText(measurement.testOutValue);
229
+ if (cNums == 4) form.getTextField(`MD${cNums} ${rowPrinting}4`).setText(measurement.referenceKey);
230
+ rowPrinting++;
211
231
  }
212
232
 
233
+ // TODO: Add Section Header
213
234
 
235
+ // TODO: Add Line Break
214
236
 
237
+ for (let rowNum = 0; rowNum < payload.measurement_details.weather_data.length; rowNum++) {
238
+ let measurement = payload.measurement_details.weather_data[rowNum];
239
+ form.getTextField(`MD${cNums} ${rowPrinting}1`).setText(`${measurement.label} (${measurement.units})`);
240
+ form.getTextField(`MD${cNums} ${rowPrinting}2`).setText(measurement.testInValue);
241
+ if (cNums >= 3) form.getTextField(`MD${cNums} ${rowPrinting}3`).setText(measurement.testOutValue);
242
+ if (cNums == 4) form.getTextField(`MD${cNums} ${rowPrinting}4`).setText(measurement.referenceKey);
243
+ rowPrinting++;
244
+ }
215
245
 
246
+ // TODO: Add Section Header
216
247
 
248
+ // TODO: Add Line Break
217
249
 
250
+ for (let rowNum = 0; rowNum < payload.measurement_details.indoor_measurements.length; rowNum++) {
251
+ let measurement = payload.measurement_details.indoor_measurements[rowNum];
252
+ form.getTextField(`MD${cNums} ${rowPrinting}1`).setText(`${measurement.label} (${measurement.units})`);
253
+ form.getTextField(`MD${cNums} ${rowPrinting}2`).setText(measurement.testInValue);
254
+ if (cNums >= 3) form.getTextField(`MD${cNums} ${rowPrinting}3`).setText(measurement.testOutValue);
255
+ if (cNums == 4) form.getTextField(`MD${cNums} ${rowPrinting}4`).setText(measurement.referenceKey);
256
+ rowPrinting++;
257
+ }
218
258
 
259
+ // TODO: Duplicate Active Measurement Details Page
219
260
 
261
+ // TODO: Populate Performance Calculations
220
262
 
221
- // photos page: take code from standard report
263
+ // Populate Photo Page(s)
222
264
 
265
+ // TODO: Duplicate Active Photo Page As Needed
223
266
 
267
+ // Flatten Form, Convert & Return PDF as Base64
224
268
  form.flatten();
225
269
  const pdfBase64 = await pdfDoc.saveAsBase64({ dataUri: true });
270
+ console.log(pdfBase64);
226
271
  return pdfBase64;
227
272
  }
228
273
 
229
-
230
274
  function getGradeFromScore(score) {
231
275
  let grade = "F";
232
276
  if (score == 100) return "A+";
@@ -252,7 +296,6 @@ function getColorFromGrade(grade) {
252
296
  }
253
297
 
254
298
  function getTextFields(payload) {
255
- let test = payload.project.tests[0];
256
299
  return {
257
300
  "cName": payload.site.customer.first_name && payload.site.customer.last_name ? `${payload.site.customer.first_name} ${payload.site.customer.last_name}` : "",
258
301
  "address": payload.site.location.address ? payload.site.location.address : "",
@@ -260,17 +303,17 @@ function getTextFields(payload) {
260
303
  "city": payload.site.location.city ? payload.site.location.city : "",
261
304
  "state": payload.site.location.state ? `, ${payload.site.location.state}` : "",
262
305
  "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
306
+ "superheat": payload.test.testInfo.data.superheat ? (+payload.test.testInfo.data.superheat).toFixed(1) : "--",
307
+ "subcooling": payload.test.testInfo.data.subcooling ? (+payload.test.testInfo.data.subcooling).toFixed(1) : "--",
308
+ "approach": payload.test.testInfo.data.approach ? (+payload.test.testInfo.data.approach).toFixed(1) : "--",
309
+ "tempSplit": payload.test.testInfo.data.temperature_split ? (+payload.test.testInfo.data.temperature_split).toFixed(1) : "--",
310
+ "tesp": payload.test.testInfo.data.pressure_static_total_external ? (+payload.test.testInfo.data.pressure_static_total_external).toFixed(2) : "--",
311
+ "fltrFace": payload.test.testInfo.data.velocity_face_filter1 ? (+payload.test.testInfo.data.velocity_face_filter1).toFixed(1) : "--",
312
+ "ageLosses": payload.test.testInfo.data.age_loss ? (+payload.test.testInfo.data.age_loss).toFixed(0) : 0,
313
+ "tempSplitLosses": payload.test.testInfo.data.temp_split_loss ? (+payload.test.testInfo.data.temp_split_loss).toFixed(0) : 0,
314
+ "staticLosses": payload.test.testInfo.data.static_loss ? (+payload.test.testInfo.data.static_loss).toFixed(0) : 0,
315
+ "approachLosses": payload.test.testInfo.data.approach_loss ? (+payload.test.testInfo.data.approach_loss).toFixed(0) : 0,
316
+ "refChargeLosses": payload.test.testInfo.data.refrigerant_charge_loss ? (+payload.test.testInfo.data.refrigerant_charge_loss).toFixed(0) : 0
274
317
  }
275
318
  }
276
319