@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.
@@ -450,20 +450,15 @@ interface FilledDocumentFileValue {
450
450
 
451
451
  /**
452
452
  * Product used in procedures
453
- * Can be consumables, equipment, or any other product needed for performing procedures
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 - ID of the brand that manufactures this product
458
- * @property brandName - Name of the brand (denormalized for display)
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 description - Detailed description of the product and its purpose
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 */
@@ -450,20 +450,15 @@ interface FilledDocumentFileValue {
450
450
 
451
451
  /**
452
452
  * Product used in procedures
453
- * Can be consumables, equipment, or any other product needed for performing procedures
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 - ID of the brand that manufactures this product
458
- * @property brandName - Name of the brand (denormalized for display)
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 description - Detailed description of the product and its purpose
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 */
@@ -9111,7 +9111,8 @@ var AnalyticsService = class extends BaseService {
9111
9111
  return metrics;
9112
9112
  }
9113
9113
  }
9114
- const appointments = await this.fetchAppointments(void 0, dateRange);
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 appointments = await this.fetchAppointments(void 0, dateRange);
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: #2C8E99;
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: 28px;
13201
+ font-size: 24px;
13210
13202
  font-weight: bold;
13211
- color: #2C8E99;
13212
- padding: 15px 25px;
13213
- background-color: #e0f4f6;
13214
- border-radius: 8px;
13203
+ color: #4A90E2;
13204
+ padding: 10px;
13205
+ background-color: #e9f0f9;
13206
+ border-radius: 4px;
13215
13207
  display: inline-block;
13216
- letter-spacing: 4px;
13217
- margin: 15px 0;
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 #2C8E99;
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 MetaEstetics</h1>
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 MetaEstetics Patient app or visit {{registrationUrl}}</li>
13259
- <li>Create an account using your email address</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>&copy; {{currentYear}} MetaEstetics. All rights reserved.</p>
13259
+ <p>&copy; {{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 - MetaEstetics";
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) || `MetaEstetics <no-reply@${((_d = data.options) == null ? void 0 : _d.mailgunDomain) || this.DEFAULT_MAILGUN_DOMAIN}>`;
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 = `MetaEstetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
13471
+ mailgunConfig.fromAddress = `MetaEsthetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
13485
13472
  }
13486
13473
  const emailData = {
13487
13474
  token: {
@@ -9035,7 +9035,8 @@ var AnalyticsService = class extends BaseService {
9035
9035
  return metrics;
9036
9036
  }
9037
9037
  }
9038
- const appointments = await this.fetchAppointments(void 0, dateRange);
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 appointments = await this.fetchAppointments(void 0, dateRange);
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: #2C8E99;
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: 28px;
13125
+ font-size: 24px;
13134
13126
  font-weight: bold;
13135
- color: #2C8E99;
13136
- padding: 15px 25px;
13137
- background-color: #e0f4f6;
13138
- border-radius: 8px;
13127
+ color: #4A90E2;
13128
+ padding: 10px;
13129
+ background-color: #e9f0f9;
13130
+ border-radius: 4px;
13139
13131
  display: inline-block;
13140
- letter-spacing: 4px;
13141
- margin: 15px 0;
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 #2C8E99;
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 MetaEstetics</h1>
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 MetaEstetics Patient app or visit {{registrationUrl}}</li>
13183
- <li>Create an account using your email address</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>&copy; {{currentYear}} MetaEstetics. All rights reserved.</p>
13183
+ <p>&copy; {{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 - MetaEstetics";
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) || `MetaEstetics <no-reply@${((_d = data.options) == null ? void 0 : _d.mailgunDomain) || this.DEFAULT_MAILGUN_DOMAIN}>`;
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 = `MetaEstetics <no-reply@${this.DEFAULT_MAILGUN_DOMAIN}>`;
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 and category.
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, category?: string): Promise<{
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 and category.
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, category?: string): Promise<number>;
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
- * Can be consumables, equipment, or any other product needed for performing procedures
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 - ID of the brand that manufactures this product
640
- * @property brandName - Name of the brand (denormalized for display)
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 description - Detailed description of the product and its purpose
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(brandId: string, product: Omit<Product, 'id' | 'createdAt' | 'updatedAt' | 'brandId' | 'assignedTechnologyIds'>, technologyIds?: string[]): Promise<Product>;
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' | 'brandId'>>): Promise<Product | null>;
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(brandId: string, product: Omit<Product, 'id' | 'createdAt' | 'updatedAt' | 'brandId' | 'assignedTechnologyIds'>, technologyIds?: string[]): Promise<Product>;
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' | 'brandId'>>): Promise<Product | null>;
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;