@blackcode_sa/metaestetics-api 1.14.32 → 1.14.36
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/dist/admin/index.d.mts +9 -18
- package/dist/admin/index.d.ts +9 -18
- package/dist/admin/index.js +20 -33
- package/dist/admin/index.mjs +20 -33
- package/dist/backoffice/index.d.mts +41 -54
- package/dist/backoffice/index.d.ts +41 -54
- package/dist/backoffice/index.js +23 -38
- package/dist/backoffice/index.mjs +23 -38
- package/dist/index.d.mts +21 -34
- package/dist/index.d.ts +21 -34
- package/dist/index.js +27 -40
- package/dist/index.mjs +27 -40
- package/package.json +1 -1
- package/src/admin/mailing/patientInvite/patientInvite.mailing.ts +3 -3
- package/src/admin/mailing/patientInvite/templates/invitation.template.ts +13 -28
- package/src/backoffice/services/brand.service.ts +4 -17
- package/src/backoffice/services/product.service.ts +12 -17
- package/src/backoffice/services/technology.service.ts +3 -1
- package/src/backoffice/types/brand.types.ts +0 -2
- package/src/backoffice/types/product.types.ts +18 -28
- package/src/services/analytics/analytics.service.ts +10 -4
package/dist/admin/index.d.mts
CHANGED
|
@@ -450,20 +450,15 @@ interface FilledDocumentFileValue {
|
|
|
450
450
|
|
|
451
451
|
/**
|
|
452
452
|
* Product used in procedures
|
|
453
|
-
*
|
|
453
|
+
* Simplified structure with only essential fields and flexible metadata
|
|
454
454
|
*
|
|
455
455
|
* @property id - Unique identifier of the product
|
|
456
456
|
* @property name - Name of the product
|
|
457
|
-
* @property brandId -
|
|
458
|
-
* @property brandName -
|
|
457
|
+
* @property brandId - Reference to the Brand document ID
|
|
458
|
+
* @property brandName - Display name of the brand (denormalized for performance)
|
|
459
|
+
* @property description - Detailed description of the product
|
|
459
460
|
* @property assignedTechnologyIds - Array of technology IDs this product is assigned to
|
|
460
|
-
* @property
|
|
461
|
-
* @property technicalDetails - Technical details and specifications
|
|
462
|
-
* @property warnings - List of warnings related to product use
|
|
463
|
-
* @property dosage - Dosage information (if applicable)
|
|
464
|
-
* @property composition - Product composition
|
|
465
|
-
* @property indications - List of indications for use
|
|
466
|
-
* @property contraindications - List of contraindications
|
|
461
|
+
* @property metadata - Flexible key-value pairs for additional product information
|
|
467
462
|
* @property isActive - Whether the product is active in the system
|
|
468
463
|
* @property createdAt - Creation date
|
|
469
464
|
* @property updatedAt - Last update date
|
|
@@ -473,17 +468,13 @@ interface Product {
|
|
|
473
468
|
name: string;
|
|
474
469
|
brandId: string;
|
|
475
470
|
brandName: string;
|
|
471
|
+
description: string;
|
|
472
|
+
category?: string;
|
|
476
473
|
assignedTechnologyIds?: string[];
|
|
474
|
+
metadata?: Record<string, string | number | boolean>;
|
|
475
|
+
isActive: boolean;
|
|
477
476
|
createdAt: Date;
|
|
478
477
|
updatedAt: Date;
|
|
479
|
-
isActive: boolean;
|
|
480
|
-
description?: string;
|
|
481
|
-
technicalDetails?: string;
|
|
482
|
-
warnings?: string[];
|
|
483
|
-
dosage?: string;
|
|
484
|
-
composition?: string;
|
|
485
|
-
indications?: string[];
|
|
486
|
-
contraindications?: ContraindicationDynamic[];
|
|
487
478
|
/** Present only in subcollections - synced from technology metadata */
|
|
488
479
|
technologyId?: string;
|
|
489
480
|
/** Present only in subcollections - synced from technology name */
|
package/dist/admin/index.d.ts
CHANGED
|
@@ -450,20 +450,15 @@ interface FilledDocumentFileValue {
|
|
|
450
450
|
|
|
451
451
|
/**
|
|
452
452
|
* Product used in procedures
|
|
453
|
-
*
|
|
453
|
+
* Simplified structure with only essential fields and flexible metadata
|
|
454
454
|
*
|
|
455
455
|
* @property id - Unique identifier of the product
|
|
456
456
|
* @property name - Name of the product
|
|
457
|
-
* @property brandId -
|
|
458
|
-
* @property brandName -
|
|
457
|
+
* @property brandId - Reference to the Brand document ID
|
|
458
|
+
* @property brandName - Display name of the brand (denormalized for performance)
|
|
459
|
+
* @property description - Detailed description of the product
|
|
459
460
|
* @property assignedTechnologyIds - Array of technology IDs this product is assigned to
|
|
460
|
-
* @property
|
|
461
|
-
* @property technicalDetails - Technical details and specifications
|
|
462
|
-
* @property warnings - List of warnings related to product use
|
|
463
|
-
* @property dosage - Dosage information (if applicable)
|
|
464
|
-
* @property composition - Product composition
|
|
465
|
-
* @property indications - List of indications for use
|
|
466
|
-
* @property contraindications - List of contraindications
|
|
461
|
+
* @property metadata - Flexible key-value pairs for additional product information
|
|
467
462
|
* @property isActive - Whether the product is active in the system
|
|
468
463
|
* @property createdAt - Creation date
|
|
469
464
|
* @property updatedAt - Last update date
|
|
@@ -473,17 +468,13 @@ interface Product {
|
|
|
473
468
|
name: string;
|
|
474
469
|
brandId: string;
|
|
475
470
|
brandName: string;
|
|
471
|
+
description: string;
|
|
472
|
+
category?: string;
|
|
476
473
|
assignedTechnologyIds?: string[];
|
|
474
|
+
metadata?: Record<string, string | number | boolean>;
|
|
475
|
+
isActive: boolean;
|
|
477
476
|
createdAt: Date;
|
|
478
477
|
updatedAt: Date;
|
|
479
|
-
isActive: boolean;
|
|
480
|
-
description?: string;
|
|
481
|
-
technicalDetails?: string;
|
|
482
|
-
warnings?: string[];
|
|
483
|
-
dosage?: string;
|
|
484
|
-
composition?: string;
|
|
485
|
-
indications?: string[];
|
|
486
|
-
contraindications?: ContraindicationDynamic[];
|
|
487
478
|
/** Present only in subcollections - synced from technology metadata */
|
|
488
479
|
technologyId?: string;
|
|
489
480
|
/** Present only in subcollections - synced from technology name */
|
package/dist/admin/index.js
CHANGED
|
@@ -9111,7 +9111,8 @@ var AnalyticsService = class extends BaseService {
|
|
|
9111
9111
|
return metrics;
|
|
9112
9112
|
}
|
|
9113
9113
|
}
|
|
9114
|
-
const
|
|
9114
|
+
const filters = (options == null ? void 0 : options.clinicBranchId) ? { clinicBranchId: options.clinicBranchId } : void 0;
|
|
9115
|
+
const appointments = await this.fetchAppointments(filters, dateRange);
|
|
9115
9116
|
const canceled = getCanceledAppointments(appointments);
|
|
9116
9117
|
if (groupBy === "clinic") {
|
|
9117
9118
|
return this.groupCancellationsByClinic(canceled, appointments);
|
|
@@ -9340,7 +9341,8 @@ var AnalyticsService = class extends BaseService {
|
|
|
9340
9341
|
return metrics;
|
|
9341
9342
|
}
|
|
9342
9343
|
}
|
|
9343
|
-
const
|
|
9344
|
+
const filters = (options == null ? void 0 : options.clinicBranchId) ? { clinicBranchId: options.clinicBranchId } : void 0;
|
|
9345
|
+
const appointments = await this.fetchAppointments(filters, dateRange);
|
|
9344
9346
|
const noShow = getNoShowAppointments(appointments);
|
|
9345
9347
|
if (groupBy === "clinic") {
|
|
9346
9348
|
return this.groupNoShowsByClinic(noShow, appointments);
|
|
@@ -13180,7 +13182,7 @@ var patientInvitationTemplate = `
|
|
|
13180
13182
|
padding: 20px;
|
|
13181
13183
|
}
|
|
13182
13184
|
.header {
|
|
13183
|
-
background-color: #
|
|
13185
|
+
background-color: #4A90E2;
|
|
13184
13186
|
padding: 20px;
|
|
13185
13187
|
text-align: center;
|
|
13186
13188
|
color: white;
|
|
@@ -13195,31 +13197,20 @@ var patientInvitationTemplate = `
|
|
|
13195
13197
|
font-size: 12px;
|
|
13196
13198
|
color: #888;
|
|
13197
13199
|
}
|
|
13198
|
-
.button {
|
|
13199
|
-
display: inline-block;
|
|
13200
|
-
background-color: #2C8E99;
|
|
13201
|
-
color: white;
|
|
13202
|
-
text-decoration: none;
|
|
13203
|
-
padding: 12px 24px;
|
|
13204
|
-
border-radius: 4px;
|
|
13205
|
-
margin: 20px 0;
|
|
13206
|
-
font-weight: bold;
|
|
13207
|
-
}
|
|
13208
13200
|
.token {
|
|
13209
|
-
font-size:
|
|
13201
|
+
font-size: 24px;
|
|
13210
13202
|
font-weight: bold;
|
|
13211
|
-
color: #
|
|
13212
|
-
padding:
|
|
13213
|
-
background-color: #
|
|
13214
|
-
border-radius:
|
|
13203
|
+
color: #4A90E2;
|
|
13204
|
+
padding: 10px;
|
|
13205
|
+
background-color: #e9f0f9;
|
|
13206
|
+
border-radius: 4px;
|
|
13215
13207
|
display: inline-block;
|
|
13216
|
-
letter-spacing:
|
|
13217
|
-
margin:
|
|
13218
|
-
font-family: monospace;
|
|
13208
|
+
letter-spacing: 2px;
|
|
13209
|
+
margin: 10px 0;
|
|
13219
13210
|
}
|
|
13220
13211
|
.info-box {
|
|
13221
13212
|
background-color: #fff;
|
|
13222
|
-
border-left: 4px solid #
|
|
13213
|
+
border-left: 4px solid #4A90E2;
|
|
13223
13214
|
padding: 15px;
|
|
13224
13215
|
margin: 20px 0;
|
|
13225
13216
|
}
|
|
@@ -13228,7 +13219,7 @@ var patientInvitationTemplate = `
|
|
|
13228
13219
|
<body>
|
|
13229
13220
|
<div class="container">
|
|
13230
13221
|
<div class="header">
|
|
13231
|
-
<h1>Welcome to
|
|
13222
|
+
<h1>Welcome to MetaEsthetics</h1>
|
|
13232
13223
|
</div>
|
|
13233
13224
|
<div class="content">
|
|
13234
13225
|
<p>Hello {{patientName}},</p>
|
|
@@ -13255,21 +13246,17 @@ var patientInvitationTemplate = `
|
|
|
13255
13246
|
|
|
13256
13247
|
<p>To create your account:</p>
|
|
13257
13248
|
<ol>
|
|
13258
|
-
<li>Download the
|
|
13259
|
-
<li>
|
|
13249
|
+
<li>Download the <strong>MetaEsthetics</strong> app from the App Store (iOS) or Google Play Store (Android)</li>
|
|
13250
|
+
<li>Open the app and create an account using your email address</li>
|
|
13260
13251
|
<li>When prompted, enter the token shown above</li>
|
|
13261
13252
|
<li>Your profile will be automatically linked to your new account</li>
|
|
13262
13253
|
</ol>
|
|
13263
13254
|
|
|
13264
|
-
<div style="text-align: center;">
|
|
13265
|
-
<a href="{{registrationUrl}}" class="button">Create Your Account</a>
|
|
13266
|
-
</div>
|
|
13267
|
-
|
|
13268
13255
|
<p>If you have any questions or didn't expect this email, please contact {{contactName}} at {{contactEmail}}.</p>
|
|
13269
13256
|
</div>
|
|
13270
13257
|
<div class="footer">
|
|
13271
13258
|
<p>This is an automated message from {{clinicName}}. Please do not reply to this email.</p>
|
|
13272
|
-
<p>© {{currentYear}}
|
|
13259
|
+
<p>© {{currentYear}} MetaEsthetics. All rights reserved.</p>
|
|
13273
13260
|
</div>
|
|
13274
13261
|
</div>
|
|
13275
13262
|
</body>
|
|
@@ -13286,7 +13273,7 @@ var PatientInviteMailingService = class extends BaseMailingService {
|
|
|
13286
13273
|
constructor(firestore19, mailgunClient) {
|
|
13287
13274
|
super(firestore19, mailgunClient);
|
|
13288
13275
|
this.DEFAULT_REGISTRATION_URL = "https://metaesthetics.net/patient/register";
|
|
13289
|
-
this.DEFAULT_SUBJECT = "Claim Your Patient Profile -
|
|
13276
|
+
this.DEFAULT_SUBJECT = "Claim Your Patient Profile - MetaEsthetics";
|
|
13290
13277
|
this.DEFAULT_MAILGUN_DOMAIN = "mg.metaesthetics.net";
|
|
13291
13278
|
}
|
|
13292
13279
|
/**
|
|
@@ -13311,7 +13298,7 @@ var PatientInviteMailingService = class extends BaseMailingService {
|
|
|
13311
13298
|
const contactName = data.clinic.contactName || "Clinic Administrator";
|
|
13312
13299
|
const contactEmail = data.clinic.contactEmail;
|
|
13313
13300
|
const subject = ((_b = data.options) == null ? void 0 : _b.customSubject) || this.DEFAULT_SUBJECT;
|
|
13314
|
-
const fromAddress = ((_c = data.options) == null ? void 0 : _c.fromAddress) || `
|
|
13301
|
+
const fromAddress = ((_c = data.options) == null ? void 0 : _c.fromAddress) || `MetaEsthetics <no-reply@${((_d = data.options) == null ? void 0 : _d.mailgunDomain) || this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
13315
13302
|
const currentYear = (/* @__PURE__ */ new Date()).getFullYear().toString();
|
|
13316
13303
|
const patientName = `${data.patient.firstName} ${data.patient.lastName}`;
|
|
13317
13304
|
const templateVariables = {
|
|
@@ -13481,7 +13468,7 @@ var PatientInviteMailingService = class extends BaseMailingService {
|
|
|
13481
13468
|
Logger.warn(
|
|
13482
13469
|
"[PatientInviteMailingService] No fromAddress provided, using default"
|
|
13483
13470
|
);
|
|
13484
|
-
mailgunConfig.fromAddress = `
|
|
13471
|
+
mailgunConfig.fromAddress = `MetaEsthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
13485
13472
|
}
|
|
13486
13473
|
const emailData = {
|
|
13487
13474
|
token: {
|
package/dist/admin/index.mjs
CHANGED
|
@@ -9035,7 +9035,8 @@ var AnalyticsService = class extends BaseService {
|
|
|
9035
9035
|
return metrics;
|
|
9036
9036
|
}
|
|
9037
9037
|
}
|
|
9038
|
-
const
|
|
9038
|
+
const filters = (options == null ? void 0 : options.clinicBranchId) ? { clinicBranchId: options.clinicBranchId } : void 0;
|
|
9039
|
+
const appointments = await this.fetchAppointments(filters, dateRange);
|
|
9039
9040
|
const canceled = getCanceledAppointments(appointments);
|
|
9040
9041
|
if (groupBy === "clinic") {
|
|
9041
9042
|
return this.groupCancellationsByClinic(canceled, appointments);
|
|
@@ -9264,7 +9265,8 @@ var AnalyticsService = class extends BaseService {
|
|
|
9264
9265
|
return metrics;
|
|
9265
9266
|
}
|
|
9266
9267
|
}
|
|
9267
|
-
const
|
|
9268
|
+
const filters = (options == null ? void 0 : options.clinicBranchId) ? { clinicBranchId: options.clinicBranchId } : void 0;
|
|
9269
|
+
const appointments = await this.fetchAppointments(filters, dateRange);
|
|
9268
9270
|
const noShow = getNoShowAppointments(appointments);
|
|
9269
9271
|
if (groupBy === "clinic") {
|
|
9270
9272
|
return this.groupNoShowsByClinic(noShow, appointments);
|
|
@@ -13104,7 +13106,7 @@ var patientInvitationTemplate = `
|
|
|
13104
13106
|
padding: 20px;
|
|
13105
13107
|
}
|
|
13106
13108
|
.header {
|
|
13107
|
-
background-color: #
|
|
13109
|
+
background-color: #4A90E2;
|
|
13108
13110
|
padding: 20px;
|
|
13109
13111
|
text-align: center;
|
|
13110
13112
|
color: white;
|
|
@@ -13119,31 +13121,20 @@ var patientInvitationTemplate = `
|
|
|
13119
13121
|
font-size: 12px;
|
|
13120
13122
|
color: #888;
|
|
13121
13123
|
}
|
|
13122
|
-
.button {
|
|
13123
|
-
display: inline-block;
|
|
13124
|
-
background-color: #2C8E99;
|
|
13125
|
-
color: white;
|
|
13126
|
-
text-decoration: none;
|
|
13127
|
-
padding: 12px 24px;
|
|
13128
|
-
border-radius: 4px;
|
|
13129
|
-
margin: 20px 0;
|
|
13130
|
-
font-weight: bold;
|
|
13131
|
-
}
|
|
13132
13124
|
.token {
|
|
13133
|
-
font-size:
|
|
13125
|
+
font-size: 24px;
|
|
13134
13126
|
font-weight: bold;
|
|
13135
|
-
color: #
|
|
13136
|
-
padding:
|
|
13137
|
-
background-color: #
|
|
13138
|
-
border-radius:
|
|
13127
|
+
color: #4A90E2;
|
|
13128
|
+
padding: 10px;
|
|
13129
|
+
background-color: #e9f0f9;
|
|
13130
|
+
border-radius: 4px;
|
|
13139
13131
|
display: inline-block;
|
|
13140
|
-
letter-spacing:
|
|
13141
|
-
margin:
|
|
13142
|
-
font-family: monospace;
|
|
13132
|
+
letter-spacing: 2px;
|
|
13133
|
+
margin: 10px 0;
|
|
13143
13134
|
}
|
|
13144
13135
|
.info-box {
|
|
13145
13136
|
background-color: #fff;
|
|
13146
|
-
border-left: 4px solid #
|
|
13137
|
+
border-left: 4px solid #4A90E2;
|
|
13147
13138
|
padding: 15px;
|
|
13148
13139
|
margin: 20px 0;
|
|
13149
13140
|
}
|
|
@@ -13152,7 +13143,7 @@ var patientInvitationTemplate = `
|
|
|
13152
13143
|
<body>
|
|
13153
13144
|
<div class="container">
|
|
13154
13145
|
<div class="header">
|
|
13155
|
-
<h1>Welcome to
|
|
13146
|
+
<h1>Welcome to MetaEsthetics</h1>
|
|
13156
13147
|
</div>
|
|
13157
13148
|
<div class="content">
|
|
13158
13149
|
<p>Hello {{patientName}},</p>
|
|
@@ -13179,21 +13170,17 @@ var patientInvitationTemplate = `
|
|
|
13179
13170
|
|
|
13180
13171
|
<p>To create your account:</p>
|
|
13181
13172
|
<ol>
|
|
13182
|
-
<li>Download the
|
|
13183
|
-
<li>
|
|
13173
|
+
<li>Download the <strong>MetaEsthetics</strong> app from the App Store (iOS) or Google Play Store (Android)</li>
|
|
13174
|
+
<li>Open the app and create an account using your email address</li>
|
|
13184
13175
|
<li>When prompted, enter the token shown above</li>
|
|
13185
13176
|
<li>Your profile will be automatically linked to your new account</li>
|
|
13186
13177
|
</ol>
|
|
13187
13178
|
|
|
13188
|
-
<div style="text-align: center;">
|
|
13189
|
-
<a href="{{registrationUrl}}" class="button">Create Your Account</a>
|
|
13190
|
-
</div>
|
|
13191
|
-
|
|
13192
13179
|
<p>If you have any questions or didn't expect this email, please contact {{contactName}} at {{contactEmail}}.</p>
|
|
13193
13180
|
</div>
|
|
13194
13181
|
<div class="footer">
|
|
13195
13182
|
<p>This is an automated message from {{clinicName}}. Please do not reply to this email.</p>
|
|
13196
|
-
<p>© {{currentYear}}
|
|
13183
|
+
<p>© {{currentYear}} MetaEsthetics. All rights reserved.</p>
|
|
13197
13184
|
</div>
|
|
13198
13185
|
</div>
|
|
13199
13186
|
</body>
|
|
@@ -13210,7 +13197,7 @@ var PatientInviteMailingService = class extends BaseMailingService {
|
|
|
13210
13197
|
constructor(firestore19, mailgunClient) {
|
|
13211
13198
|
super(firestore19, mailgunClient);
|
|
13212
13199
|
this.DEFAULT_REGISTRATION_URL = "https://metaesthetics.net/patient/register";
|
|
13213
|
-
this.DEFAULT_SUBJECT = "Claim Your Patient Profile -
|
|
13200
|
+
this.DEFAULT_SUBJECT = "Claim Your Patient Profile - MetaEsthetics";
|
|
13214
13201
|
this.DEFAULT_MAILGUN_DOMAIN = "mg.metaesthetics.net";
|
|
13215
13202
|
}
|
|
13216
13203
|
/**
|
|
@@ -13235,7 +13222,7 @@ var PatientInviteMailingService = class extends BaseMailingService {
|
|
|
13235
13222
|
const contactName = data.clinic.contactName || "Clinic Administrator";
|
|
13236
13223
|
const contactEmail = data.clinic.contactEmail;
|
|
13237
13224
|
const subject = ((_b = data.options) == null ? void 0 : _b.customSubject) || this.DEFAULT_SUBJECT;
|
|
13238
|
-
const fromAddress = ((_c = data.options) == null ? void 0 : _c.fromAddress) || `
|
|
13225
|
+
const fromAddress = ((_c = data.options) == null ? void 0 : _c.fromAddress) || `MetaEsthetics <no-reply@${((_d = data.options) == null ? void 0 : _d.mailgunDomain) || this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
13239
13226
|
const currentYear = (/* @__PURE__ */ new Date()).getFullYear().toString();
|
|
13240
13227
|
const patientName = `${data.patient.firstName} ${data.patient.lastName}`;
|
|
13241
13228
|
const templateVariables = {
|
|
@@ -13405,7 +13392,7 @@ var PatientInviteMailingService = class extends BaseMailingService {
|
|
|
13405
13392
|
Logger.warn(
|
|
13406
13393
|
"[PatientInviteMailingService] No fromAddress provided, using default"
|
|
13407
13394
|
);
|
|
13408
|
-
mailgunConfig.fromAddress = `
|
|
13395
|
+
mailgunConfig.fromAddress = `MetaEsthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
|
|
13409
13396
|
}
|
|
13410
13397
|
const emailData = {
|
|
13411
13398
|
token: {
|
|
@@ -14,7 +14,6 @@ import { z } from 'zod';
|
|
|
14
14
|
* @property manufacturer - Naziv proizvođača
|
|
15
15
|
* @property description - Detaljan opis brenda i njegovih proizvoda
|
|
16
16
|
* @property website - Web stranica brenda
|
|
17
|
-
* @property category - Kategorija brenda (npr. "laser", "peeling", "injectables") - za filtriranje
|
|
18
17
|
* @property isActive - Da li je brend aktivan u sistemu
|
|
19
18
|
* @property createdAt - Datum kreiranja
|
|
20
19
|
* @property updatedAt - Datum poslednjeg ažuriranja
|
|
@@ -29,7 +28,6 @@ interface Brand {
|
|
|
29
28
|
isActive: boolean;
|
|
30
29
|
website?: string;
|
|
31
30
|
description?: string;
|
|
32
|
-
category?: string;
|
|
33
31
|
}
|
|
34
32
|
/**
|
|
35
33
|
* Kolekcija u Firestore bazi gde se čuvaju brendovi
|
|
@@ -67,26 +65,23 @@ declare class BrandService extends BaseService {
|
|
|
67
65
|
isActive: boolean;
|
|
68
66
|
website?: string | undefined;
|
|
69
67
|
description?: string | undefined;
|
|
70
|
-
category?: string | undefined;
|
|
71
68
|
id: string;
|
|
72
69
|
}>;
|
|
73
70
|
/**
|
|
74
|
-
* Gets a paginated list of active brands, optionally filtered by name
|
|
71
|
+
* Gets a paginated list of active brands, optionally filtered by name.
|
|
75
72
|
* @param rowsPerPage - The number of brands to fetch.
|
|
76
73
|
* @param searchTerm - An optional string to filter brand names by (starts-with search).
|
|
77
74
|
* @param lastVisible - An optional document snapshot to use as a cursor for pagination.
|
|
78
|
-
* @param category - An optional category to filter brands by.
|
|
79
75
|
*/
|
|
80
|
-
getAll(rowsPerPage: number, searchTerm?: string, lastVisible?: any
|
|
76
|
+
getAll(rowsPerPage: number, searchTerm?: string, lastVisible?: any): Promise<{
|
|
81
77
|
brands: Brand[];
|
|
82
78
|
lastVisible: _firebase_firestore.QueryDocumentSnapshot<DocumentData, DocumentData>;
|
|
83
79
|
}>;
|
|
84
80
|
/**
|
|
85
|
-
* Gets the total count of active brands, optionally filtered by name
|
|
81
|
+
* Gets the total count of active brands, optionally filtered by name.
|
|
86
82
|
* @param searchTerm - An optional string to filter brand names by (starts-with search).
|
|
87
|
-
* @param category - An optional category to filter brands by.
|
|
88
83
|
*/
|
|
89
|
-
getBrandsCount(searchTerm?: string
|
|
84
|
+
getBrandsCount(searchTerm?: string): Promise<number>;
|
|
90
85
|
/**
|
|
91
86
|
* Gets all active brands for filter dropdowns (not paginated).
|
|
92
87
|
*/
|
|
@@ -632,20 +627,15 @@ interface UpdateDocumentTemplateData {
|
|
|
632
627
|
|
|
633
628
|
/**
|
|
634
629
|
* Product used in procedures
|
|
635
|
-
*
|
|
630
|
+
* Simplified structure with only essential fields and flexible metadata
|
|
636
631
|
*
|
|
637
632
|
* @property id - Unique identifier of the product
|
|
638
633
|
* @property name - Name of the product
|
|
639
|
-
* @property brandId -
|
|
640
|
-
* @property brandName -
|
|
634
|
+
* @property brandId - Reference to the Brand document ID
|
|
635
|
+
* @property brandName - Display name of the brand (denormalized for performance)
|
|
636
|
+
* @property description - Detailed description of the product
|
|
641
637
|
* @property assignedTechnologyIds - Array of technology IDs this product is assigned to
|
|
642
|
-
* @property
|
|
643
|
-
* @property technicalDetails - Technical details and specifications
|
|
644
|
-
* @property warnings - List of warnings related to product use
|
|
645
|
-
* @property dosage - Dosage information (if applicable)
|
|
646
|
-
* @property composition - Product composition
|
|
647
|
-
* @property indications - List of indications for use
|
|
648
|
-
* @property contraindications - List of contraindications
|
|
638
|
+
* @property metadata - Flexible key-value pairs for additional product information
|
|
649
639
|
* @property isActive - Whether the product is active in the system
|
|
650
640
|
* @property createdAt - Creation date
|
|
651
641
|
* @property updatedAt - Last update date
|
|
@@ -655,17 +645,13 @@ interface Product {
|
|
|
655
645
|
name: string;
|
|
656
646
|
brandId: string;
|
|
657
647
|
brandName: string;
|
|
648
|
+
description: string;
|
|
649
|
+
category?: string;
|
|
658
650
|
assignedTechnologyIds?: string[];
|
|
651
|
+
metadata?: Record<string, string | number | boolean>;
|
|
652
|
+
isActive: boolean;
|
|
659
653
|
createdAt: Date;
|
|
660
654
|
updatedAt: Date;
|
|
661
|
-
isActive: boolean;
|
|
662
|
-
description?: string;
|
|
663
|
-
technicalDetails?: string;
|
|
664
|
-
warnings?: string[];
|
|
665
|
-
dosage?: string;
|
|
666
|
-
composition?: string;
|
|
667
|
-
indications?: string[];
|
|
668
|
-
contraindications?: ContraindicationDynamic[];
|
|
669
655
|
/** Present only in subcollections - synced from technology metadata */
|
|
670
656
|
technologyId?: string;
|
|
671
657
|
/** Present only in subcollections - synced from technology name */
|
|
@@ -688,11 +674,10 @@ declare const PRODUCTS_COLLECTION = "products";
|
|
|
688
674
|
interface IProductService {
|
|
689
675
|
/**
|
|
690
676
|
* Creates a new product in the top-level collection
|
|
691
|
-
* @param brandId - ID of the brand that manufactures this product
|
|
692
677
|
* @param product - Product data
|
|
693
678
|
* @param technologyIds - Optional array of technology IDs to assign this product to
|
|
694
679
|
*/
|
|
695
|
-
createTopLevel(
|
|
680
|
+
createTopLevel(product: Omit<Product, 'id' | 'createdAt' | 'updatedAt' | 'assignedTechnologyIds'>, technologyIds?: string[]): Promise<Product>;
|
|
696
681
|
/**
|
|
697
682
|
* Gets all products from the top-level collection
|
|
698
683
|
* @param options - Query options
|
|
@@ -701,6 +686,7 @@ interface IProductService {
|
|
|
701
686
|
rowsPerPage: number;
|
|
702
687
|
lastVisible?: any;
|
|
703
688
|
brandId?: string;
|
|
689
|
+
category?: string;
|
|
704
690
|
}): Promise<{
|
|
705
691
|
products: Product[];
|
|
706
692
|
lastVisible: any;
|
|
@@ -715,7 +701,7 @@ interface IProductService {
|
|
|
715
701
|
* @param productId - ID of the product to update
|
|
716
702
|
* @param product - Updated product data
|
|
717
703
|
*/
|
|
718
|
-
updateTopLevel(productId: string, product: Partial<Omit<Product, 'id' | 'createdAt'
|
|
704
|
+
updateTopLevel(productId: string, product: Partial<Omit<Product, 'id' | 'createdAt'>>): Promise<Product | null>;
|
|
719
705
|
/**
|
|
720
706
|
* Deletes a product from the top-level collection (soft delete)
|
|
721
707
|
* @param productId - ID of the product to delete
|
|
@@ -1754,7 +1740,7 @@ declare class ProductService extends BaseService implements IProductService {
|
|
|
1754
1740
|
/**
|
|
1755
1741
|
* Creates a new product in the top-level collection
|
|
1756
1742
|
*/
|
|
1757
|
-
createTopLevel(
|
|
1743
|
+
createTopLevel(product: Omit<Product, 'id' | 'createdAt' | 'updatedAt' | 'assignedTechnologyIds'>, technologyIds?: string[]): Promise<Product>;
|
|
1758
1744
|
/**
|
|
1759
1745
|
* Gets all products from the top-level collection
|
|
1760
1746
|
*/
|
|
@@ -1762,6 +1748,7 @@ declare class ProductService extends BaseService implements IProductService {
|
|
|
1762
1748
|
rowsPerPage: number;
|
|
1763
1749
|
lastVisible?: any;
|
|
1764
1750
|
brandId?: string;
|
|
1751
|
+
category?: string;
|
|
1765
1752
|
}): Promise<{
|
|
1766
1753
|
products: Product[];
|
|
1767
1754
|
lastVisible: any;
|
|
@@ -1773,7 +1760,7 @@ declare class ProductService extends BaseService implements IProductService {
|
|
|
1773
1760
|
/**
|
|
1774
1761
|
* Updates a product in the top-level collection
|
|
1775
1762
|
*/
|
|
1776
|
-
updateTopLevel(productId: string, product: Partial<Omit<Product, 'id' | 'createdAt'
|
|
1763
|
+
updateTopLevel(productId: string, product: Partial<Omit<Product, 'id' | 'createdAt'>>): Promise<Product | null>;
|
|
1777
1764
|
/**
|
|
1778
1765
|
* Deletes a product from the top-level collection (soft delete)
|
|
1779
1766
|
*/
|
|
@@ -2074,15 +2061,15 @@ declare class TechnologyService extends BaseService implements ITechnologyServic
|
|
|
2074
2061
|
isActive: boolean;
|
|
2075
2062
|
description: string;
|
|
2076
2063
|
family: ProcedureFamily;
|
|
2077
|
-
technicalDetails?: string | undefined;
|
|
2078
|
-
contraindications: ContraindicationDynamic[];
|
|
2079
2064
|
categoryId: string;
|
|
2080
2065
|
subcategoryId: string;
|
|
2066
|
+
technicalDetails?: string | undefined;
|
|
2081
2067
|
requirements: {
|
|
2082
2068
|
pre: Requirement[];
|
|
2083
2069
|
post: Requirement[];
|
|
2084
2070
|
};
|
|
2085
2071
|
blockingConditions: BlockingCondition[];
|
|
2072
|
+
contraindications: ContraindicationDynamic[];
|
|
2086
2073
|
benefits: TreatmentBenefitDynamic[];
|
|
2087
2074
|
certificationRequirement: CertificationRequirement;
|
|
2088
2075
|
documentationTemplates?: TechnologyDocumentationTemplate[] | undefined;
|
|
@@ -5240,11 +5227,6 @@ declare const technologySchema: z.ZodObject<{
|
|
|
5240
5227
|
name: string;
|
|
5241
5228
|
isActive: boolean;
|
|
5242
5229
|
family: ProcedureFamily;
|
|
5243
|
-
contraindications: {
|
|
5244
|
-
id: string;
|
|
5245
|
-
name: string;
|
|
5246
|
-
description?: string | undefined;
|
|
5247
|
-
}[];
|
|
5248
5230
|
categoryId: string;
|
|
5249
5231
|
subcategoryId: string;
|
|
5250
5232
|
requirements: {
|
|
@@ -5274,6 +5256,11 @@ declare const technologySchema: z.ZodObject<{
|
|
|
5274
5256
|
}[];
|
|
5275
5257
|
};
|
|
5276
5258
|
blockingConditions: BlockingCondition[];
|
|
5259
|
+
contraindications: {
|
|
5260
|
+
id: string;
|
|
5261
|
+
name: string;
|
|
5262
|
+
description?: string | undefined;
|
|
5263
|
+
}[];
|
|
5277
5264
|
benefits: {
|
|
5278
5265
|
id: string;
|
|
5279
5266
|
name: string;
|
|
@@ -5386,14 +5373,14 @@ declare const technologySchema: z.ZodObject<{
|
|
|
5386
5373
|
}, {
|
|
5387
5374
|
name: string;
|
|
5388
5375
|
family: ProcedureFamily;
|
|
5376
|
+
categoryId: string;
|
|
5377
|
+
subcategoryId: string;
|
|
5378
|
+
blockingConditions: BlockingCondition[];
|
|
5389
5379
|
contraindications: {
|
|
5390
5380
|
id: string;
|
|
5391
5381
|
name: string;
|
|
5392
5382
|
description?: string | undefined;
|
|
5393
5383
|
}[];
|
|
5394
|
-
categoryId: string;
|
|
5395
|
-
subcategoryId: string;
|
|
5396
|
-
blockingConditions: BlockingCondition[];
|
|
5397
5384
|
benefits: {
|
|
5398
5385
|
id: string;
|
|
5399
5386
|
name: string;
|
|
@@ -6257,14 +6244,9 @@ declare const technologyUpdateSchema: z.ZodObject<{
|
|
|
6257
6244
|
isActive?: boolean | undefined;
|
|
6258
6245
|
description?: string | undefined;
|
|
6259
6246
|
family?: ProcedureFamily | undefined;
|
|
6260
|
-
technicalDetails?: string | undefined;
|
|
6261
|
-
contraindications?: {
|
|
6262
|
-
id: string;
|
|
6263
|
-
name: string;
|
|
6264
|
-
description?: string | undefined;
|
|
6265
|
-
}[] | undefined;
|
|
6266
6247
|
categoryId?: string | undefined;
|
|
6267
6248
|
subcategoryId?: string | undefined;
|
|
6249
|
+
technicalDetails?: string | undefined;
|
|
6268
6250
|
requirements?: {
|
|
6269
6251
|
pre: {
|
|
6270
6252
|
name: string;
|
|
@@ -6292,6 +6274,11 @@ declare const technologyUpdateSchema: z.ZodObject<{
|
|
|
6292
6274
|
}[];
|
|
6293
6275
|
} | undefined;
|
|
6294
6276
|
blockingConditions?: BlockingCondition[] | undefined;
|
|
6277
|
+
contraindications?: {
|
|
6278
|
+
id: string;
|
|
6279
|
+
name: string;
|
|
6280
|
+
description?: string | undefined;
|
|
6281
|
+
}[] | undefined;
|
|
6295
6282
|
benefits?: {
|
|
6296
6283
|
id: string;
|
|
6297
6284
|
name: string;
|
|
@@ -6404,14 +6391,9 @@ declare const technologyUpdateSchema: z.ZodObject<{
|
|
|
6404
6391
|
isActive?: boolean | undefined;
|
|
6405
6392
|
description?: string | undefined;
|
|
6406
6393
|
family?: ProcedureFamily | undefined;
|
|
6407
|
-
technicalDetails?: string | undefined;
|
|
6408
|
-
contraindications?: {
|
|
6409
|
-
id: string;
|
|
6410
|
-
name: string;
|
|
6411
|
-
description?: string | undefined;
|
|
6412
|
-
}[] | undefined;
|
|
6413
6394
|
categoryId?: string | undefined;
|
|
6414
6395
|
subcategoryId?: string | undefined;
|
|
6396
|
+
technicalDetails?: string | undefined;
|
|
6415
6397
|
requirements?: {
|
|
6416
6398
|
pre: {
|
|
6417
6399
|
name: string;
|
|
@@ -6439,6 +6421,11 @@ declare const technologyUpdateSchema: z.ZodObject<{
|
|
|
6439
6421
|
}[];
|
|
6440
6422
|
} | undefined;
|
|
6441
6423
|
blockingConditions?: BlockingCondition[] | undefined;
|
|
6424
|
+
contraindications?: {
|
|
6425
|
+
id: string;
|
|
6426
|
+
name: string;
|
|
6427
|
+
description?: string | undefined;
|
|
6428
|
+
}[] | undefined;
|
|
6442
6429
|
benefits?: {
|
|
6443
6430
|
id: string;
|
|
6444
6431
|
name: string;
|