@measurequick/measurequick-report-generator 1.0.97 → 1.0.98

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.
@@ -2,31 +2,191 @@ import { PDFDocument } from 'pdf-lib';
2
2
  import * as base64 from './graphics.js';
3
3
 
4
4
  export async function generateReport(payload) {
5
+
6
+ // fetch and load form
5
7
  const formPdfBytes = _base64ToArrayBuffer(base64.mqStandardPdfTemplate);
6
8
  const pdfDoc = await PDFDocument.load(formPdfBytes);
7
- const photoBytes = _base64ToArrayBuffer(base64);
8
- const image = await pdfDoc.embedJpg(photoBytes);
9
+
10
+ // fetch resources
11
+ const iconRangeGreenBytes = _base64ToArrayBuffer(base64.iconRangeGreen);
12
+ const iconRangeRedBytes = _base64ToArrayBuffer(base64.iconRangeRed);
13
+ const iconFlagBlackBytes = _base64ToArrayBuffer(base64.iconFlagBlack);
14
+ const iconFlagGreenBytes = _base64ToArrayBuffer(base64.iconFlagGreen);
15
+ const iconFlagRedBytes = _base64ToArrayBuffer(base64.iconFlagRed);
16
+ const iconFlagYellowBytes = _base64ToArrayBuffer(base64.iconFlagYellow);
17
+ const iconStabilityBytes = _base64ToArrayBuffer(base64.iconStability);
18
+ const iconThumbprintGreenBytes = _base64ToArrayBuffer(base64.iconThumbprintGreen);
19
+ const iconThumbprintRedBytes = _base64ToArrayBuffer(base64.iconThumbprintRed);
20
+
21
+ // load resources
22
+ const iconRangeGreen = await pdfDoc.embedPng(iconRangeGreenBytes);
23
+ const iconRangeRed = await pdfDoc.embedPng(iconRangeRedBytes);
24
+ const iconFlagBlack = await pdfDoc.embedPng(iconFlagBlackBytes);
25
+ const iconFlagGreen = await pdfDoc.embedPng(iconFlagGreenBytes);
26
+ const iconFlagRed = await pdfDoc.embedPng(iconFlagRedBytes);
27
+ const iconFlagYellow = await pdfDoc.embedPng(iconFlagYellowBytes);
28
+ const iconStability = await pdfDoc.embedPng(iconStabilityBytes);
29
+ const iconThumbprintGreen = await pdfDoc.embedPng(iconThumbprintGreenBytes);
30
+ const iconThumbprintRed = await pdfDoc.embedPng(iconThumbprintRedBytes);
31
+
32
+ // get form for filling
9
33
  const form = pdfDoc.getForm();
10
34
 
11
35
  // cover page
12
-
36
+ form.getTextField("Report Title").setText();
37
+ form.getTextField("Technician Name").setText();
38
+ form.getTextField("Date of Service Cover").setText();
39
+ form.getTextField("Time of Service Cover").setText();
40
+
41
+ // inject vitals report here
42
+
43
+ /******************************************/
44
+
45
+ let scoreDeduction = 0;
46
+ if (payload.test.diagnostics.multi_point_analysis && payload.test.diagnostics.multi_point_analysis.length > 0) {
47
+ for (let i = 0; i < 9; i++) {
48
+ let d = payload.test.diagnostics.multi_point_analysis[i];
49
+ if (d) {
50
+ let diagnosticIcon = iconFlagBlack;
51
+ if (d.type === 'stability')
52
+ diagnosticIcon = iconStability;
53
+ else if (d.score > 1 && d.score < 10) {
54
+ diagnosticIcon = iconFlagRed;
55
+ scoreDeduction += d.score;
56
+ } else if (d.score >= 10 && d.score < 15)
57
+ diagnosticIcon = iconFlagYellow;
58
+ form.getButton(`ImageDiagnostics${i+1}_af_image`).setImage(diagnosticIcon);
59
+ form.getTextField(`SystemDiagnostics${i+1}`).setText(`${d.title}`);
60
+ form.getTextField(`SystemDiagnostics${i+1}a`).setText(`${d.score}`);
61
+ }
62
+ }
63
+ } else {
64
+ form.getButton("ImageDiagnostics1_af_image").setImage(iconFlagGreen);
65
+ form.getTextField("SystemDiagnostics1").setText("No system-wide issues were detected.");
66
+ }
67
+ if (payload.test.score_deduction) {
68
+ scoreDeduction = payload.test.score_deduction;
69
+ }
13
70
 
14
- // vitals page
71
+ let systemScorePercentage = +(100 - +(scoreDeduction.toFixed(0)));
72
+ let systemScoreGrade = getGradeFromScore(systemScorePercentage);
73
+ let systemScoreColor = getColorFromGrade(systemScoreGrade);
74
+
75
+ // get text fields
76
+ let textFields = getTextFields(payload);
77
+
78
+ // print customer data
79
+ let dateTimePlacement = "Upper";
80
+ let e = "";
81
+ let d = "";
82
+
83
+ let date = new Date();
84
+ if (textFields.cName && textFields.address && textFields.city && textFields.state && textFields.zip) {
85
+ dateTimePlacement = "Lower";
86
+ form.getTextField('Name').setText(`${textFields.cName}`);
87
+ form.getTextField('Address1').setText(`${textFields.address}`);
88
+ if (textFields.address2) {
89
+ form.getTextField('Address2').setText(`${textFields.address2}`);
90
+ form.getTextField('CityStateZip').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
91
+ } else form.getTextField('Address2').setText(`${textFields.city}${textFields.state}${textFields.zip}`);
92
+ form.getTextField('DateOfServiceLabelUpper').setText("");
93
+ form.getTextField('TimeOfServiceLabelUpper').setText("");
94
+ form.getTextField('DateOfServiceLabelLower').setText("Date of Service:");
95
+ form.getTextField('TimeOfServiceLabelLower').setText("Time of Service:");
96
+ form.getTextField('DateOfServiceLower').setText(date.toLocaleDateString("en-US"));
97
+ form.getTextField('TimeOfServiceLower').setText(date.toLocaleTimeString("en-US"));
98
+ } else {
99
+ form.getTextField('DateOfServiceLabelLower').setText("");
100
+ form.getTextField('TimeOfServiceLabelLower').setText("");
101
+ form.getTextField('DateOfServiceLabelUpper').setText("Date of Service:");
102
+ form.getTextField('TimeOfServiceLabelUpper').setText("Time of Service:");
103
+ form.getTextField('DateOfServiceUpper').setText(date.toLocaleDateString("en-US"));
104
+ form.getTextField('TimeOfServiceUpper').setText(date.toLocaleTimeString("en-US"));
105
+ }
15
106
 
107
+ // print measurement data (first page)
108
+ form.getTextField(`YourSystemScore${systemScoreColor}`).setText(`${systemScorePercentage}% ${systemScoreGrade}`);
109
+ form.getTextField('Superheat').setText(`${textFields.superheat} °${payload.units.temperature}`);
110
+ form.getTextField('Subcooling').setText(`${textFields.subcooling} °${payload.units.temperature}`);
111
+ form.getTextField('CondenserApproach').setText(`${textFields.approach} °${payload.units.temperature}`);
112
+ form.getTextField('TemperatureSplit').setText(`${textFields.tempSplit} °${payload.units.temperature}`);
113
+ form.getTextField('TotalExternalStaticPressure').setText(`${textFields.tesp} inH2O`);
114
+ form.getTextField('FilterFaceVelocity').setText(`${textFields.fltrFace} FPM`);
115
+
116
+ // print losses data (second page)
117
+ let lossColor = textFields.ageLosses < 3 ? "Green" : "Red";
118
+ form.getTextField(`AgeLosses${lossColor}`).setText(`- ${textFields.ageLosses}`);
119
+ lossColor = textFields.tempSplitLosses < 3 ? "Green" : "Red";
120
+ form.getTextField(`TemperatureSplitLosses${lossColor}`).setText(`- ${textFields.tempSplitLosses}`);
121
+ lossColor = textFields.staticLosses < 3 ? "Green" : "Red";
122
+ form.getTextField(`StaticPressureLosses${lossColor}`).setText(`- ${textFields.staticLosses}`);
123
+ lossColor = textFields.approachLosses < 3 ? "Green" : "Red";
124
+ form.getTextField(`ApproachLosses${lossColor}`).setText(`- ${textFields.approachLosses}`);
125
+ lossColor = textFields.refChargeLosses < 3 ? "Green" : "Red";
126
+ form.getTextField(`RefrigerantChargeIssues${lossColor}`).setText(`- ${textFields.refChargeLosses}`);
127
+ form.getTextField('YourSystemScorePage2').setText(`${systemScorePercentage}% ${systemScoreGrade}`);
128
+
129
+ // print targets and range icons
130
+ const measureLabels = ["Superheat", "Subcooling", "Condenser", "TempSplit", "Tesp", "FilterFace"];
131
+ const targetKeys = ["superheat", "subcooling", "approach", "temperature_split", "pressure_static_total_external", "velocity_face_filter1"];
132
+ for (let i = 0; i < measureLabels.length; i++) {
133
+ let iconPlacement = "Mid";
134
+ let icon = iconRangeRed;
135
+ let actual = +payload.test.data[targetKeys[i]];
136
+ let mid = +payload.test.targets[targetKeys[i]];
137
+ let low = +payload.test.targets[`${targetKeys[i]}_ideal_low`];
138
+ let high = +payload.test.targets[`${targetKeys[i]}_ideal_high`];
139
+ low = mid - low;
140
+ high = mid + high;
141
+ if (targetKeys[i] == "pressure_static_total_external") high = mid * 1.4;
142
+ else if (targetKeys[i] == "velocity_face_filter1") high = 500;
143
+ if (actual < low && targetKeys[i] != "velocity_face_filter1") iconPlacement = "Low";
144
+ else if (actual > high) iconPlacement = "High";
145
+ else icon = iconRangeGreen;
146
+ form.getButton(`Image${measureLabels[i]}${iconPlacement}_af_image`).setImage(icon);
147
+ let targetZone = "";
148
+ if (targetKeys[i] == "pressure_static_total_external" || targetKeys[i] == "velocity_face_filter1") targetZone = `(< ${high})`;
149
+ else if (!isNaN(low) && low != "NaN" && !isNaN(high) && high != "NaN" ) targetZone = `(${low.toFixed(1)} - ${high.toFixed(1)})`;
150
+ form.getTextField(`${measureLabels[i]}Target`).setText(targetZone);
151
+ }
16
152
 
17
- // score page
153
+ // print pass fail measures
154
+ 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"];
155
+ for (let i = 1; i <= passFails.length; i++) {
156
+ let meas = payload.test[passFails[i - 1]];
157
+ let icon = meas == "Pass" || meas == "High" || meas == "Mid" ? iconRangeGreen : iconRangeRed;
158
+ form.getButton(`ImageSubsystem${i}_af_image`).setImage(icon);
159
+ }
18
160
 
161
+ /******************************************/
19
162
 
20
163
  // equipment information page
21
-
164
+ form.getTextField(`EI Title 1`).setText();
165
+ form.getTextField(`EI Title 2`).setText();
166
+ form.getTextField(`EI Title 3`).setText();
167
+ for (let fieldNum = 1; fieldNum <= 41; fieldNum++) {
168
+ form.getTextField(`Equip_Info-Field ${fieldNum}a`).setText();
169
+ form.getTextField(`Equip_Info-Field ${fieldNum}b`).setText();
170
+ }
22
171
 
23
172
  // system review page
24
-
173
+ for (let catNum = 1; catNum <= 10; catNum++) {
174
+ for (let fieldNum = 1; fieldNum <= 5; fieldNum++) {
175
+ form.getTextField(`SR Title ${catNum}`).setText();
176
+ form.getTextField(`Category ${catNum} Field ${fieldNum}a`).setText();
177
+ form.getTextField(`Category ${catNum} Field ${fieldNum}b`).setText();
178
+ }
179
+ }
25
180
 
26
181
  // measurement details page
182
+ let numCols = payload.meta.numberOfColumns;
183
+ for (let rowNum = 1; rowNum <= 35; rowNum++) {
184
+ for (let colNum = 1; colNum <= numCols; colNum++) {
185
+ form.getTextField(`MD${numCols} ${rowNum}${colNum}`).setText();
186
+ }
187
+ }
27
188
 
28
-
29
- // photos page
189
+ // photos page: take code from standard report
30
190
 
31
191
 
32
192
  form.flatten();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@measurequick/measurequick-report-generator",
3
- "version": "1.0.97",
3
+ "version": "1.0.98",
4
4
  "description": "Generates PDF documents for various MeasureQuick applications.",
5
5
  "main": "index.js",
6
6
  "scripts": {