@measurequick/measurequick-report-generator 1.5.184 → 1.5.185

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,153 @@
1
+ import { PDFDocument, rgb, StandardFonts } from "pdf-lib";
2
+ import * as fs from "fs";
3
+ import * as coolingTemplate from "./base-64/mq-vitals-cooling.js";
4
+
5
+ function _base64ToArrayBuffer(base64) {
6
+ const binary_string = atob(base64);
7
+ const len = binary_string.length;
8
+ const bytes = new Uint8Array(len);
9
+ for (let i = 0; i < len; i++) {
10
+ bytes[i] = binary_string.charCodeAt(i);
11
+ }
12
+ return bytes;
13
+ }
14
+
15
+ async function updateHeatPumpHeatingPdf() {
16
+ // Use ORIGINAL cooling template as source (from base64)
17
+ const outputPath = "/Users/bobby/Desktop/vitals-heat-pump-heating.pdf";
18
+
19
+ console.log("Loading original cooling template from base64...");
20
+ const pdfBytes = _base64ToArrayBuffer(coolingTemplate.base64);
21
+ const pdfDoc = await PDFDocument.load(pdfBytes);
22
+
23
+ // Embed fonts
24
+ const helveticaBold = await pdfDoc.embedFont(StandardFonts.HelveticaBold);
25
+ const helvetica = await pdfDoc.embedFont(StandardFonts.Helvetica);
26
+
27
+ const pages = pdfDoc.getPages();
28
+ const page1 = pages[0];
29
+ const page2 = pages[1];
30
+
31
+ // Get page dimensions for reference
32
+ const { width, height } = page1.getSize();
33
+ console.log(`Page dimensions: ${width} x ${height}`);
34
+
35
+ // Colors
36
+ const sectionHeaderColor = rgb(0.384, 0.604, 0.196); // MeasureQuick green
37
+ const labelColor = rgb(0.2, 0.2, 0.2);
38
+ const whiteColor = rgb(1, 1, 1);
39
+
40
+ // Font sizes
41
+ const sectionHeaderFontSize = 18;
42
+ const measurementLabelFontSize = 11;
43
+ const factorTitleFontSize = 20;
44
+ const factorDescFontSize = 10;
45
+
46
+ console.log("Updating Page 1 labels...");
47
+
48
+ // ========================================
49
+ // PAGE 1: Heat pump heating measurement labels
50
+ // ========================================
51
+ // Based on standard letter size (612 x 792), y=0 is at bottom
52
+ // Need to fully cover original labels with larger white rectangles
53
+
54
+ // Section 1: "Refrigerant Charge" -> "Heat Pump Performance"
55
+ // Cover entire original header area
56
+ page1.drawRectangle({ x: 40, y: 470, width: 250, height: 35, color: whiteColor });
57
+ page1.drawText("Heat Pump Performance", { x: 44, y: 478, size: sectionHeaderFontSize, font: helveticaBold, color: sectionHeaderColor });
58
+
59
+ // "Superheat:" label -> "Temperature Rise:"
60
+ page1.drawRectangle({ x: 44, y: 443, width: 100, height: 22, color: whiteColor });
61
+ page1.drawText("Temperature Rise:", { x: 46, y: 449, size: measurementLabelFontSize, font: helveticaBold, color: labelColor });
62
+
63
+ // "Subcooling:" label -> "Liquid Line Temp:"
64
+ page1.drawRectangle({ x: 295, y: 443, width: 100, height: 22, color: whiteColor });
65
+ page1.drawText("Liquid Line Temp:", { x: 297, y: 449, size: measurementLabelFontSize, font: helveticaBold, color: labelColor });
66
+
67
+ // Section 2: "Heat Transfer" -> "Efficiency Metrics"
68
+ page1.drawRectangle({ x: 40, y: 358, width: 200, height: 35, color: whiteColor });
69
+ page1.drawText("Efficiency Metrics", { x: 44, y: 366, size: sectionHeaderFontSize, font: helveticaBold, color: sectionHeaderColor });
70
+
71
+ // "Condenser Approach:" -> "COP:"
72
+ page1.drawRectangle({ x: 44, y: 331, width: 140, height: 22, color: whiteColor });
73
+ page1.drawText("COP:", { x: 46, y: 337, size: measurementLabelFontSize, font: helveticaBold, color: labelColor });
74
+
75
+ // "Temperature Split:" -> "Outdoor Air Temp:"
76
+ page1.drawRectangle({ x: 295, y: 331, width: 130, height: 22, color: whiteColor });
77
+ page1.drawText("Outdoor Air Temp:", { x: 297, y: 337, size: measurementLabelFontSize, font: helveticaBold, color: labelColor });
78
+
79
+ // "Filter Face Velocity:" -> "Airflow:"
80
+ page1.drawRectangle({ x: 295, y: 219, width: 140, height: 22, color: whiteColor });
81
+ page1.drawText("Airflow:", { x: 297, y: 225, size: measurementLabelFontSize, font: helveticaBold, color: labelColor });
82
+
83
+ console.log("Updating Page 2 labels...");
84
+
85
+ // ========================================
86
+ // PAGE 2: Heat pump heating scoring factor labels
87
+ // ========================================
88
+ // Page 2 layout from top to bottom (y decreases as you go down)
89
+ // Each factor section: Title (green text) + description paragraph
90
+ // Using larger rectangles to fully cover original text
91
+
92
+ // Factor 1: "Age & Efficiency Losses" -> "Static Pressure / Filter"
93
+ page2.drawRectangle({ x: 40, y: 625, width: 350, height: 38, color: whiteColor });
94
+ page2.drawText("Static Pressure / Filter", { x: 44, y: 633, size: factorTitleFontSize, font: helveticaBold, color: sectionHeaderColor });
95
+ // Description
96
+ page2.drawRectangle({ x: 40, y: 570, width: 530, height: 55, color: whiteColor });
97
+ page2.drawText("High system static pressure reduces airflow and efficiency. Points are deducted", { x: 44, y: 605, size: factorDescFontSize, font: helvetica, color: labelColor });
98
+ page2.drawText("based on how much the measured static pressure exceeds the target. Dirty", { x: 44, y: 592, size: factorDescFontSize, font: helvetica, color: labelColor });
99
+ page2.drawText("filters and restricted ductwork are common causes of high static pressure.", { x: 44, y: 579, size: factorDescFontSize, font: helvetica, color: labelColor });
100
+
101
+ // Factor 2: "Temperature Split Losses" -> "Air-Side Heat Delivery"
102
+ page2.drawRectangle({ x: 40, y: 530, width: 350, height: 38, color: whiteColor });
103
+ page2.drawText("Air-Side Heat Delivery", { x: 44, y: 538, size: factorTitleFontSize, font: helveticaBold, color: sectionHeaderColor });
104
+ // Description
105
+ page2.drawRectangle({ x: 40, y: 475, width: 530, height: 55, color: whiteColor });
106
+ page2.drawText("Measures the temperature rise across the indoor coil. This indicates how", { x: 44, y: 510, size: factorDescFontSize, font: helvetica, color: labelColor });
107
+ page2.drawText("effectively the heat pump is delivering heat to the air. Low temperature rise", { x: 44, y: 497, size: factorDescFontSize, font: helvetica, color: labelColor });
108
+ page2.drawText("may indicate airflow issues, refrigerant problems, or outdoor conditions.", { x: 44, y: 484, size: factorDescFontSize, font: helvetica, color: labelColor });
109
+
110
+ // Factor 3: "Static Pressure Losses" -> "Capacity Delivery"
111
+ page2.drawRectangle({ x: 40, y: 435, width: 320, height: 38, color: whiteColor });
112
+ page2.drawText("Capacity Delivery", { x: 44, y: 443, size: factorTitleFontSize, font: helveticaBold, color: sectionHeaderColor });
113
+ // Description
114
+ page2.drawRectangle({ x: 40, y: 378, width: 530, height: 57, color: whiteColor });
115
+ page2.drawText("Evaluates the heat pump's actual heating output compared to expected", { x: 44, y: 415, size: factorDescFontSize, font: helvetica, color: labelColor });
116
+ page2.drawText("capacity for the current outdoor temperature. Heat pump capacity naturally", { x: 44, y: 402, size: factorDescFontSize, font: helvetica, color: labelColor });
117
+ page2.drawText("decreases as outdoor temperature drops - this factor accounts for that.", { x: 44, y: 389, size: factorDescFontSize, font: helvetica, color: labelColor });
118
+
119
+ // Factor 4: "Approach Losses" -> "System Balance"
120
+ page2.drawRectangle({ x: 40, y: 340, width: 280, height: 38, color: whiteColor });
121
+ page2.drawText("System Balance", { x: 44, y: 348, size: factorTitleFontSize, font: helveticaBold, color: sectionHeaderColor });
122
+ // Description
123
+ page2.drawRectangle({ x: 40, y: 283, width: 530, height: 57, color: whiteColor });
124
+ page2.drawText("Assesses the balance between refrigerant-side and air-side heat transfer", { x: 44, y: 320, size: factorDescFontSize, font: helvetica, color: labelColor });
125
+ page2.drawText("using liquid line temperature as an indicator. Poor system balance can", { x: 44, y: 307, size: factorDescFontSize, font: helvetica, color: labelColor });
126
+ page2.drawText("indicate refrigerant charge issues, airflow restrictions, or heat exchanger problems.", { x: 44, y: 294, size: factorDescFontSize, font: helvetica, color: labelColor });
127
+
128
+ // Factor 5: "Refrigerant Charge Losses" -> "Efficiency (COP)"
129
+ page2.drawRectangle({ x: 40, y: 245, width: 350, height: 38, color: whiteColor });
130
+ page2.drawText("Efficiency (COP)", { x: 44, y: 253, size: factorTitleFontSize, font: helveticaBold, color: sectionHeaderColor });
131
+ // Description
132
+ page2.drawRectangle({ x: 40, y: 188, width: 530, height: 57, color: whiteColor });
133
+ page2.drawText("Coefficient of Performance measures how efficiently the heat pump converts", { x: 44, y: 225, size: factorDescFontSize, font: helvetica, color: labelColor });
134
+ page2.drawText("electrical energy into heat. Higher COP means better efficiency. This factor", { x: 44, y: 212, size: factorDescFontSize, font: helvetica, color: labelColor });
135
+ page2.drawText("compares actual COP to the expected COP for current outdoor conditions.", { x: 44, y: 199, size: factorDescFontSize, font: helvetica, color: labelColor });
136
+
137
+ // Your System Score section - green background header
138
+ page2.drawRectangle({ x: 40, y: 148, width: 280, height: 40, color: sectionHeaderColor });
139
+ page2.drawText("Your System Score", { x: 52, y: 160, size: 22, font: helveticaBold, color: whiteColor });
140
+ // Description
141
+ page2.drawRectangle({ x: 40, y: 93, width: 530, height: 55, color: whiteColor });
142
+ page2.drawText("Heat pump heating performance is scored on a 100-point scale based on five", { x: 44, y: 130, size: factorDescFontSize, font: helvetica, color: labelColor });
143
+ page2.drawText("factors, each worth up to 20 points. A well-performing heat pump system in", { x: 44, y: 117, size: factorDescFontSize, font: helvetica, color: labelColor });
144
+ page2.drawText("heating mode should score 80-100 points under favorable outdoor conditions.", { x: 44, y: 104, size: factorDescFontSize, font: helvetica, color: labelColor });
145
+
146
+ console.log("Saving updated PDF to:", outputPath);
147
+ const updatedPdfBytes = await pdfDoc.save();
148
+ fs.writeFileSync(outputPath, updatedPdfBytes);
149
+
150
+ console.log("Done! Heat pump heating vitals PDF created at:", outputPath);
151
+ }
152
+
153
+ updateHeatPumpHeatingPdf().catch(console.error);