@medicus.ai/medicus-report-pdf-generator 1.3.10 → 1.3.12

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,40 @@
1
+ {
2
+ "title": "HealthRiskAssessment",
3
+ "logo": "data:image/png;base64,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",
4
+ "body_icon": "https://i.ibb.co/2hfhHM3/body-section.png",
5
+ "lifestyle_icon": "https://i.ibb.co/ZNkkF12/lifestyle-section.png",
6
+ "mind_icon": "https://i.ibb.co/gVjxNZ7/mind-section.png",
7
+ "bulb_icon": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACUAAAAoCAYAAAB5ADPdAAABYWlDQ1BrQ0dDb2xvclNwYWNlRGlzcGxheVAzAAAokWNgYFJJLCjIYWFgYMjNKykKcndSiIiMUmB/yMAOhLwMYgwKicnFBY4BAT5AJQwwGhV8u8bACKIv64LMOiU1tUm1XsDXYqbw1YuvRJsw1aMArpTU4mQg/QeIU5MLikoYGBhTgGzl8pICELsDyBYpAjoKyJ4DYqdD2BtA7CQI+whYTUiQM5B9A8hWSM5IBJrB+API1klCEk9HYkPtBQFul8zigpzESoUAYwKuJQOUpFaUgGjn/ILKosz0jBIFR2AopSp45iXr6SgYGRiaMzCAwhyi+nMgOCwZxc4gxJrvMzDY7v",
8
+ "first-level-color": "#A43B2F",
9
+ "second-level-color": "#ED6D59",
10
+ "third-level-color": "#F4A837",
11
+ "forth-level-color": "#F8E242",
12
+ "fifth-level-color": "#02D9D1",
13
+ "score-header-color": "#0F2062",
14
+ "score-description-color": "#0F2062",
15
+ "svg-icon-color": "#2D4A8C",
16
+ "low-score-text-color": "#2D4A8C",
17
+ "section-title-border-color": "#0F2062",
18
+ "first-section-scores-border-color": "#0F2062",
19
+ "general-font-color": "#A43B2F",
20
+ "disclaimer-text-color": "rgba(15, 32, 98, 0.3)",
21
+ "top-box-background": "#f0f4ff",
22
+ "footer-background": "rgba(15, 32, 98, 0.14)",
23
+ "footer-border-color": "#0F2062",
24
+ "body_font_color": "#0F2062",
25
+ "list_icons_font_color": "#0F2062",
26
+ "insights_font_color": "#1A3A7A",
27
+ "signature": "Team Medicus",
28
+ "big_integral_questionnaire": {
29
+ "title": "Key to the Big Integral Questionnaire",
30
+ "showHormonalFemale": true,
31
+ "showHormonalMale": true,
32
+ "colors": {
33
+ "headerBg": "#0F2062",
34
+ "subheaderBg": "#1B4080",
35
+ "headerText": "#FFFFFF",
36
+ "rowBorder": "rgba(15, 32, 98, 0.12)",
37
+ "elevatedText": "#A43B2F"
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,298 @@
1
+ "use strict";
2
+
3
+ // ---------------------------------------------------------------------------
4
+ // Dummy data — structure mirrors the Excel RESULTS KEY sheet.
5
+ // result = 0 for all rows (questionnaire not yet filled in).
6
+ // Hormonal Health rows have no High/Questions/Maximum — rendered as "—".
7
+ // ---------------------------------------------------------------------------
8
+ function getDummyData() {
9
+ return {
10
+ rows: [
11
+ {
12
+ system: "STOMACH and GI (Gastrointestinal) Tract",
13
+ high: ">8",
14
+ questions: 9,
15
+ result: 0,
16
+ maximum: 27,
17
+ },
18
+ {
19
+ system: "Small Intestine",
20
+ high: ">7",
21
+ questions: 8,
22
+ result: 0,
23
+ maximum: 24,
24
+ },
25
+ {
26
+ system: "Infections/Invasions of the GI (Gastrointestinal Tract)",
27
+ high: ">3",
28
+ questions: 4,
29
+ result: 0,
30
+ maximum: 12,
31
+ },
32
+ {
33
+ system: "Large Intestine",
34
+ high: ">2",
35
+ questions: 3,
36
+ result: 0,
37
+ maximum: 9,
38
+ },
39
+ {
40
+ system: "Liver and Gallbladder",
41
+ high: ">7",
42
+ questions: 8,
43
+ result: 0,
44
+ maximum: 22,
45
+ },
46
+ {
47
+ system: "Essential Nutrients",
48
+ high: ">25",
49
+ questions: 26,
50
+ result: 0,
51
+ maximum: 68,
52
+ },
53
+ {
54
+ system: "Carbohydrate Metabolism",
55
+ high: ">4",
56
+ questions: 4,
57
+ result: 0,
58
+ maximum: 12,
59
+ },
60
+ {
61
+ system: "Immune System",
62
+ high: ">3",
63
+ questions: 4,
64
+ result: 0,
65
+ maximum: 10,
66
+ },
67
+ { system: "Lifestyle", high: ">7", questions: 7, result: 0, maximum: 7 },
68
+ {
69
+ system: "Hormonal Health Female",
70
+ high: null,
71
+ questions: null,
72
+ result: 0,
73
+ maximum: null,
74
+ },
75
+ {
76
+ system: "Hormonal Health Male",
77
+ high: null,
78
+ questions: null,
79
+ result: 0,
80
+ maximum: null,
81
+ },
82
+ ],
83
+ meta: {
84
+ patientName: "Final Test 3",
85
+ age: "37",
86
+ bmi: "23.67",
87
+ },
88
+ };
89
+ }
90
+
91
+ // ---------------------------------------------------------------------------
92
+ // Helpers
93
+ // ---------------------------------------------------------------------------
94
+ function fmt(val, decimals) {
95
+ if (val === null || val === undefined) return "\u2014"; // em dash
96
+ if (typeof val === "number") {
97
+ const rounded =
98
+ Math.round(val * Math.pow(10, decimals)) / Math.pow(10, decimals);
99
+ return String(rounded);
100
+ }
101
+ return String(val);
102
+ }
103
+
104
+ // ---------------------------------------------------------------------------
105
+ // Single render — faithful to the reference image, Maison Sante colours.
106
+ //
107
+ // Structure:
108
+ // ┌──────────────────────────────────────────────────────┐
109
+ // │ Key to the Big Integral Questionnaire [title bar] │
110
+ // ├──────────────────────────────────────────────────────┤
111
+ // │ Client/Patient Full Name … Age … BMI … │
112
+ // ├──────────────────────────────────────────────────────┤
113
+ // │ SYSTEM SCORES [subheader band] │
114
+ // ├────────────┬──────┬─────────┬────────┬───────┬──┬───┤
115
+ // │ SYSTEM │ High │Questions│ Result │Maximum│/3 │Cmt│
116
+ // ├────────────┼──────┼─────────┼────────┼───────┼──┼───┤
117
+ // │ ...rows... │
118
+ // └──────────────────────────────────────────────────────┘
119
+ // ---------------------------------------------------------------------------
120
+ function renderTable(rows, meta, cfg) {
121
+ const c = cfg.colors;
122
+ const title = cfg.title || "Key to the Big Integral Questionnaire";
123
+
124
+ // ── patient info bar ──────────────────────────────────────────────────
125
+ const infoBar = `
126
+ <div style="background:#ffffff;border-bottom:1px solid ${c.rowBorder};">
127
+ <table style="border-collapse:collapse;">
128
+ <tr>
129
+ <td style="padding:7px 40px 7px 14px;font-size:9px;color:#1a1a1a;white-space:nowrap;vertical-align:middle;">
130
+ <span style="color:${c.headerBg};font-weight:700;">Client/Patient Full Name</span>
131
+ &nbsp;&nbsp;&nbsp;${meta.patientName}
132
+ </td>
133
+ <td style="padding:7px 40px 7px 0;font-size:9px;color:#1a1a1a;white-space:nowrap;vertical-align:middle;">
134
+ <span style="color:${c.headerBg};font-weight:700;">Age</span>
135
+ &nbsp;&nbsp;&nbsp;${meta.age}
136
+ </td>
137
+ <td style="padding:7px 0 7px 0;font-size:9px;color:#1a1a1a;white-space:nowrap;vertical-align:middle;">
138
+ <span style="color:${c.headerBg};font-weight:700;">BMI</span>
139
+ &nbsp;&nbsp;&nbsp;${meta.bmi}
140
+ </td>
141
+ </tr>
142
+ </table>
143
+ </div>`;
144
+
145
+ // ── "SYSTEM SCORES" subheader band ───────────────────────────────────
146
+ const subheaderBg = c.subheaderBg || "#1B4080";
147
+ const subheaderBand = `
148
+ <div style="
149
+ padding: 5px 14px;
150
+ background: ${subheaderBg};
151
+ color: #ffffff;
152
+ font-size: 8.5px;
153
+ font-weight: 700;
154
+ letter-spacing: 0.8px;
155
+ text-transform: uppercase;
156
+ ">SYSTEM SCORES</div>`;
157
+
158
+ // ── column widths ──────────────────────────────────────────────────────
159
+ const COL = {
160
+ system: "width:34%;text-align:left;",
161
+ high: "width:8%; text-align:center;",
162
+ questions: "width:9%; text-align:center;",
163
+ result: "width:8%; text-align:center;",
164
+ maximum: "width:9%; text-align:center;",
165
+ perThree: "width:8%; text-align:center;",
166
+ comments: "width:24%;text-align:left;",
167
+ };
168
+
169
+ const TH_BASE = `padding:6px 14px;font-size:8px;font-weight:700;color:#ffffff;
170
+ background:${c.headerBg};border-bottom:2px solid rgba(255,255,255,0.2);`;
171
+
172
+ const th = (label, colKey) =>
173
+ `<th style="${TH_BASE}${COL[colKey]}">${label}</th>`;
174
+
175
+ const tableHeader = `
176
+ <tr>
177
+ ${th("SYSTEM", "system")}
178
+ ${th("High", "high")}
179
+ ${th("Questions", "questions")}
180
+ ${th("Result", "result")}
181
+ ${th("Maximum", "maximum")}
182
+ ${th("/3", "perThree")}
183
+ ${th("Comments", "comments")}
184
+ </tr>`;
185
+
186
+ // ── data rows ─────────────────────────────────────────────────────────
187
+ const TD = (content, colKey, extra = "") =>
188
+ `<td style="padding:5px 14px;font-size:8.5px;${COL[colKey]}border-bottom:1px solid ${c.rowBorder};${extra}">${content}</td>`;
189
+
190
+ const dataRows = rows
191
+ .map((row, i) => {
192
+ const hasThreshold = row.high !== null && row.high !== undefined;
193
+ const hasQuantity = row.questions !== null && row.questions !== undefined;
194
+ const hasMaximum = row.maximum !== null && row.maximum !== undefined;
195
+
196
+ const highDisplay = hasThreshold
197
+ ? `<span style="color:${c.elevatedText};font-weight:600;">${row.high}</span>`
198
+ : "\u2014";
199
+
200
+ const questionsDisplay = hasQuantity ? String(row.questions) : "\u2014";
201
+ const resultDisplay = String(row.result);
202
+ const maximumDisplay = hasMaximum ? fmt(row.maximum, 0) : "\u2014";
203
+ const perThreeDisplay = hasMaximum ? fmt(row.maximum / 3, 2) : "\u2014";
204
+
205
+ const rowBg = i % 2 === 0 ? "#ffffff" : "rgba(15, 32, 98, 0.03)";
206
+
207
+ return `
208
+ <tr style="background:${rowBg};">
209
+ ${TD(`<span style="color:#1a1a1a;">${row.system}</span>`, "system")}
210
+ ${TD(highDisplay, "high")}
211
+ ${TD(questionsDisplay, "questions")}
212
+ ${TD(resultDisplay, "result", `font-weight:600;color:#444;`)}
213
+ ${TD(maximumDisplay, "maximum")}
214
+ ${TD(perThreeDisplay, "perThree")}
215
+ ${TD("", "comments")}
216
+ </tr>`;
217
+ })
218
+ .join("");
219
+
220
+ // ── assemble ──────────────────────────────────────────────────────────
221
+ // Outer wrapper uses padding-top instead of an empty spacer div, because
222
+ // empty divs with only `height` get collapsed by wkhtmltopdf. Padding
223
+ // always renders.
224
+ return `
225
+ <div style="padding-top:25px;font-family:'Open Sans',sans-serif;">
226
+ <div class="biq-wrapper" style="
227
+ font-family: 'Open Sans', sans-serif;
228
+ page-break-inside: avoid;
229
+ border-radius: 4px;
230
+ overflow: hidden;
231
+ border: 1px solid ${c.rowBorder};
232
+ ">
233
+ <!-- title bar -->
234
+ <div style="
235
+ background: ${c.headerBg};
236
+ border-radius: 4px 4px 0 0;
237
+ color: #ffffff;
238
+ padding: 9px 14px;
239
+ font-size: 11px;
240
+ font-weight: 700;
241
+ letter-spacing: 0.3px;
242
+ ">${title}</div>
243
+
244
+ ${infoBar}
245
+ ${subheaderBand}
246
+
247
+ <table style="width:100%;border-collapse:collapse;table-layout:fixed;">
248
+ <thead>${tableHeader}</thead>
249
+ <tbody>${dataRows}</tbody>
250
+ </table>
251
+ </div>
252
+ </div>`;
253
+ }
254
+
255
+ // ---------------------------------------------------------------------------
256
+ // Public entry
257
+ // ---------------------------------------------------------------------------
258
+ /**
259
+ * Render the Big Integral Questionnaire section for Maison Sante doctor PDFs.
260
+ *
261
+ * @param {object} opts
262
+ * @param {object} opts.clientConfig - The full maisonsante.json config object
263
+ * @param {object} opts.localeService - localeService with .t(key) method (unused for now; strings are hardcoded to match the reference design)
264
+ * @returns {string} HTML string to inject into #big-integral-section
265
+ */
266
+ function renderBigIntegralQuestionnaire({ clientConfig }) {
267
+ const cfg = (clientConfig && clientConfig.big_integral_questionnaire) || {};
268
+
269
+ const colors = Object.assign(
270
+ {
271
+ headerBg: "#0F2062",
272
+ subheaderBg: "#1B4080",
273
+ headerText: "#FFFFFF",
274
+ rowBorder: "rgba(15, 32, 98, 0.12)",
275
+ elevatedText: "#A43B2F",
276
+ },
277
+ cfg.colors || {},
278
+ );
279
+
280
+ const resolvedCfg = Object.assign({}, cfg, { colors });
281
+
282
+ const { rows: allRows, meta } = getDummyData();
283
+
284
+ const rows = allRows.filter((row) => {
285
+ if (
286
+ row.system === "Hormonal Health Female" &&
287
+ cfg.showHormonalFemale === false
288
+ )
289
+ return false;
290
+ if (row.system === "Hormonal Health Male" && cfg.showHormonalMale === false)
291
+ return false;
292
+ return true;
293
+ });
294
+
295
+ return renderTable(rows, meta, resolvedCfg);
296
+ }
297
+
298
+ module.exports = { renderBigIntegralQuestionnaire };
package/lib/template.js CHANGED
@@ -3,6 +3,9 @@ const i18n = require('../app/i18n_wellbeing.config.js');
3
3
  fetchFileContents
4
4
  const fs = require("fs");
5
5
  const path = require('path');
6
+
7
+ let useMonospace = false;
8
+ function setUseMonospace(val) { useMonospace = val; }
6
9
  const INDENTATION = {
7
10
  PANEL_TITLE: 12,
8
11
  BIOMARKER_DETAILS: 12,
@@ -1165,7 +1168,12 @@ function renderBiomarkerV3(biomarker, nestingLevel, isChildBiomarker, isCompactV
1165
1168
  }
1166
1169
  let notesPadding = isRtl ? 'padding: 0px 16px 10px 0px;' : 'padding: 0px 0px 10px 16px;';
1167
1170
  let classNote = !isCompactView ? 'note-margin-bottom' : '';
1168
- newBiomarkerHtml += `<div class="biomarker-notes 2 ${classNote}" style="color: #8F8F92; ${notesPadding} ${BioNoteStyle}">${biomarker.notes.join('<br/>')}</div>`;
1171
+ if (useMonospace) {
1172
+ const monoStyle = `font-style: normal; font-size: 13px; color: #333; font-family: 'Roboto Mono', monospace; white-space: pre-wrap; overflow-x: auto;`;
1173
+ newBiomarkerHtml += `<div class="biomarker-notes 2 ${classNote}" style="${notesPadding} ${BioNoteStyle}"><span style="${monoStyle}">${biomarker.notes.join('<br/>')}</span></div>`;
1174
+ } else {
1175
+ newBiomarkerHtml += `<div class="biomarker-notes 2 ${classNote}" style="color: #8F8F92; ${notesPadding} ${BioNoteStyle}">${biomarker.notes.join('<br/>')}</div>`;
1176
+ }
1169
1177
  }
1170
1178
  }
1171
1179
 
@@ -1323,6 +1331,10 @@ function renderDetailsListV3(detailsList, nestingLevel, isCompactView) {
1323
1331
  }
1324
1332
 
1325
1333
  function renderNoteV3(note, nestingLevel, isCompactView, showInCompactView, showInDetailsView) {
1334
+ if (!note) return '';
1335
+ if (isCompactView && !showInCompactView) return '';
1336
+ if (!isCompactView && !showInDetailsView) return '';
1337
+
1326
1338
  let blockStyle = '';
1327
1339
  let plusPadding = 18;
1328
1340
  if (nestingLevel > 0) {
@@ -1331,10 +1343,11 @@ function renderNoteV3(note, nestingLevel, isCompactView, showInCompactView, show
1331
1343
  let levelNesting = extraPadding + nestingLevel * INDENTATION.BIOMARKER_DETAILS + plusPadding;
1332
1344
  blockStyle = `padding-left: ${levelNesting}px`;
1333
1345
  }
1334
- // if (note) {
1335
- // return `<div style="padding: 2px ${plusPadding}px; ${blockStyle}" class="note-block">${note}</div>`;
1336
- // }
1337
- return '';
1346
+ if (useMonospace) {
1347
+ const monoStyle = `padding: 2px 0; clear: both; margin-bottom: 3px; font-style: normal; display: block; font-size: 13px; color: #333; font-family: 'Roboto Mono', monospace; white-space: pre-wrap; overflow-x: auto;`;
1348
+ return `<div style="padding: 2px ${plusPadding}px; ${blockStyle}" class="note-block"><span style="${monoStyle}">${note}</span></div>`;
1349
+ }
1350
+ return `<div style="padding: 2px ${plusPadding}px; ${blockStyle}" class="note-block">${note}</div>`;
1338
1351
  }
1339
1352
 
1340
1353
  function renderAllergyClasses(allergyClasses, isRtl = false) {
@@ -1585,9 +1598,16 @@ function renderOneAllergyBiomarker(biomarker, isRtl, nestingLevel, isChildBiomar
1585
1598
  }
1586
1599
  bioIndentStyle = isRtl ? 'padding-right: 16px;' : 'padding-left: 16px;';
1587
1600
 
1588
- biomarkerDetailsHtml += '<div class="biomarker-notes 1" style="color: #8F8F92;padding-top: 10px;' + bioIndentStyle + '">';
1589
- biomarkerDetailsHtml += biomarker.notes.join('<br/>');
1590
- biomarkerDetailsHtml += '</div>';
1601
+ if (useMonospace) {
1602
+ const monoStyle = `font-style: normal; font-size: 13px; color: #333; font-family: 'Roboto Mono', monospace; white-space: pre-wrap; overflow-x: auto;`;
1603
+ biomarkerDetailsHtml += '<div class="biomarker-notes 1" style="padding-top: 10px;' + bioIndentStyle + '">';
1604
+ biomarkerDetailsHtml += `<span style="${monoStyle}">` + biomarker.notes.join('<br/>') + '</span>';
1605
+ biomarkerDetailsHtml += '</div>';
1606
+ } else {
1607
+ biomarkerDetailsHtml += '<div class="biomarker-notes 1" style="color: #8F8F92;padding-top: 10px;' + bioIndentStyle + '">';
1608
+ biomarkerDetailsHtml += biomarker.notes.join('<br/>');
1609
+ biomarkerDetailsHtml += '</div>';
1610
+ }
1591
1611
  }
1592
1612
  biomarkerDetailsHtml += '</div> <!-- end first col -->';
1593
1613
 
@@ -2196,8 +2216,9 @@ module.exports = {
2196
2216
  find,
2197
2217
  renderSummary,
2198
2218
  renderReportSummary,
2199
- renderHTMLTemplate
2200
-
2219
+ renderHTMLTemplate,
2220
+ renderAllergyClasses,
2221
+ setUseMonospace,
2201
2222
  }
2202
2223
 
2203
2224
 
@@ -7,7 +7,7 @@ const path = require("path");
7
7
  const LocaleService = require('../app/services/localeService.js');
8
8
  const i18n = require('../app/i18n_wellbeing.config.js');
9
9
  const puppeteer = require("puppeteer");
10
- const { renderReportItems, find, renderSummary, renderReportSummary, renderHTMLTemplate, renderAllergyClasses } = require("./template.js");
10
+ const { renderReportItems, find, renderSummary, renderReportSummary, renderHTMLTemplate, renderAllergyClasses, setUseMonospace } = require("./template.js");
11
11
  const { cli } = require("webpack");
12
12
 
13
13
 
@@ -90,6 +90,16 @@ const loadColorTheme = (clientName = 'default') => {
90
90
  insightSecondary: '#1C2833',
91
91
  warningIcon: '#F4D03F'
92
92
  },
93
+ maisonsante: {
94
+ headerText: '#2C3E50',
95
+ headerBackground: '#ECF0F1',
96
+ headerDivider: '#0F2062',
97
+ footerText: '#95A5A6',
98
+ listIcon: '#7F8C8D',
99
+ insightPrimary: '#0F2062',
100
+ insightSecondary: '#2C3E50',
101
+ warningIcon: '#F39C12'
102
+ },
93
103
 
94
104
  };
95
105
  return themes[clientName?.toLowerCase()] || themes.mediclinic;
@@ -765,6 +775,7 @@ const generateExtendedReportStyles = (iconColor) => {
765
775
  const styles = {
766
776
  '.tips-text': `color: ${config.insights_font_color} !important;`,
767
777
  '.first-level-font-color': `color: ${config.general_font_color} !important;`,
778
+ 'h5.recommended-tips-title': `color: ${config.colors.insightPrimary} !important;`,
768
779
  '.first-section-scores': `border-color: ${config.section_title_border_color} !important;`,
769
780
  '.physical-score-section': `border-color: ${config.section_title_border_color} !important;`,
770
781
  '.psychological-score-section, .psychological-score-section1, .psychological-score-section2': `border-color: ${config.body_font_color} !important;`,
@@ -1326,12 +1337,29 @@ let generateHTMLWellbeingReportWithSmartReport = async (data, isDebugging, clien
1326
1337
  $('.doctor-details').html(doctorDetailsHtml);
1327
1338
  }
1328
1339
 
1340
+ // Render Big Integral Questionnaire section (Maison Sante doctor PDF only)
1341
+ if (client.toLowerCase() === 'maisonsante' && data.IsDoctor) {
1342
+ const { renderBigIntegralQuestionnaire } = require('./big_integral_questionnaire');
1343
+ const rawClientConfig = (() => {
1344
+ try {
1345
+ const cfgPath = path.resolve(__dirname + '/../config/maisonsante.json');
1346
+ return JSON.parse(require('fs').readFileSync(cfgPath, 'utf8'));
1347
+ } catch (e) { return {}; }
1348
+ })();
1349
+ const integralHtml = renderBigIntegralQuestionnaire({
1350
+ clientConfig: rawClientConfig,
1351
+ });
1352
+ $('#big-integral-section').html(integralHtml);
1353
+ }
1354
+
1329
1355
  // Update report info
1330
1356
  $('.report-info').html(headerInfoHtml);
1331
1357
 
1332
1358
  // Add smart report if available
1333
1359
  if (!empty(smartReport)) {
1360
+ setUseMonospace(client.toLowerCase() === 'pha');
1334
1361
  let smartReportHtml = generateReportHtml(smartReport, isRtl, false, false, language).html;
1362
+ setUseMonospace(false);
1335
1363
 
1336
1364
  if (shouldHideWellbeingUI) {
1337
1365
  // Parse and clean smart report HTML to remove page breaks when wellbeing is missing
@@ -1722,6 +1750,10 @@ const getPdfFooterTemplate = (client = 'mediclinic', selectedLabs = [], footerFr
1722
1750
  <div style="font-family: 'Open Sans', sans-serif; font-feature-settings: 'tnum';">Tel: (877) 345-7775</div>
1723
1751
  <div style="font-family: 'Open Sans', sans-serif;">Email: processing@wellness-partners.org</div>`;
1724
1752
  }
1753
+ } else if (clientKey === 'maisonsante') {
1754
+ contactBlock = `
1755
+ <div style="font-family: 'Open Sans', sans-serif;">Address: Meyan Mall, Umm Suqeim 2, Dubai, United Arab Emirates</div>
1756
+ <div style="font-family: 'Open Sans', sans-serif;">Email: info@maisonsante.ae</div>`;
1725
1757
  } else {
1726
1758
  contactBlock = `
1727
1759
  <div style="font-family: 'Open Sans', sans-serif;">&nbsp;</div>`;
@@ -1967,7 +1999,7 @@ const renderInsightTips = (tips, clientName) => {
1967
1999
  return '';
1968
2000
  }
1969
2001
 
1970
- const partImages = clientName.toLowerCase() === 'pha' ? {
2002
+ const partImages = (clientName.toLowerCase() === 'pha' || clientName.toLowerCase() === 'maisonsante') ? {
1971
2003
  1: config.lifestyleImage,
1972
2004
  2: config.bodyImage,
1973
2005
  3: config.mindImage
@@ -1977,7 +2009,7 @@ const renderInsightTips = (tips, clientName) => {
1977
2009
  3: config.bodyImage
1978
2010
  };
1979
2011
 
1980
- const partTitles = clientName.toLowerCase() === 'pha' ? {
2012
+ const partTitles = (clientName.toLowerCase() === 'pha' || clientName.toLowerCase() === 'maisonsante') ? {
1981
2013
  1: localeService.t('lifeStyle'),
1982
2014
  2: localeService.t('body'),
1983
2015
  3: localeService.t('mind')
@@ -1987,7 +2019,7 @@ const renderInsightTips = (tips, clientName) => {
1987
2019
  3: localeService.t('body')
1988
2020
  };
1989
2021
 
1990
- if (clientName === 'Mediclinic' || clientName.toLowerCase() === 'pha') {
2022
+ if (clientName === 'Mediclinic' || clientName.toLowerCase() === 'pha' || clientName.toLowerCase() === 'maisonsante') {
1991
2023
  const tip = tips[0];
1992
2024
  const tipImage = partImages[tip.partId] || '';
1993
2025
  const translatedTitle = partTitles[tip.partId] || '';
package/locales/en.json CHANGED
@@ -162,5 +162,69 @@
162
162
  "signedBy": {
163
163
  "message": "Signed by",
164
164
  "description": "Label showing above the doctors who signed on this report"
165
+ },
166
+ "bigIntegralTitle": {
167
+ "message": "Key to the Big Integral Questionnaire",
168
+ "description": "Title of the Big Integral Questionnaire section in the Maison Sante doctor PDF"
169
+ },
170
+ "bigIntegralSystem": {
171
+ "message": "System",
172
+ "description": "Column header: body system name"
173
+ },
174
+ "bigIntegralHigh": {
175
+ "message": "High",
176
+ "description": "Column header: threshold above which result is considered elevated"
177
+ },
178
+ "bigIntegralQuestions": {
179
+ "message": "Questions",
180
+ "description": "Column header: number of questions for this system"
181
+ },
182
+ "bigIntegralResult": {
183
+ "message": "Result",
184
+ "description": "Column header: patient's result score"
185
+ },
186
+ "bigIntegralComments": {
187
+ "message": "Comments",
188
+ "description": "Column header: free-text comments area"
189
+ },
190
+ "bigIntegralMaximum": {
191
+ "message": "Maximum",
192
+ "description": "Column header: maximum possible score for this system"
193
+ },
194
+ "bigIntegralPerThree": {
195
+ "message": "/3",
196
+ "description": "Column header: score divided by 3"
197
+ },
198
+ "bigIntegralDateOfCompletion": {
199
+ "message": "Date of completion",
200
+ "description": "Footer meta label"
201
+ },
202
+ "bigIntegralPatientName": {
203
+ "message": "Client / Patient Full Name",
204
+ "description": "Footer meta label"
205
+ },
206
+ "bigIntegralAge": {
207
+ "message": "Age",
208
+ "description": "Footer meta label"
209
+ },
210
+ "bigIntegralBmi": {
211
+ "message": "BMI",
212
+ "description": "Footer meta label"
213
+ },
214
+ "bigIntegralElevated": {
215
+ "message": "ELEVATED",
216
+ "description": "Badge text shown when a system result exceeds its threshold"
217
+ },
218
+ "bigIntegralVariantClinical": {
219
+ "message": "Clinical View",
220
+ "description": "Variant label shown in the section header for the clinical table design"
221
+ },
222
+ "bigIntegralVariantScorecard": {
223
+ "message": "Scorecard View",
224
+ "description": "Variant label shown in the section header for the scorecard bar design"
225
+ },
226
+ "bigIntegralVariantHybrid": {
227
+ "message": "Hybrid View",
228
+ "description": "Variant label shown in the section header for the hybrid (table + bar) design"
165
229
  }
166
230
  }