@blackcode_sa/metaestetics-api 1.13.5 → 1.13.8
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 +20 -1
- package/dist/admin/index.d.ts +20 -1
- package/dist/admin/index.js +217 -1
- package/dist/admin/index.mjs +217 -1
- package/dist/index.d.mts +26 -3
- package/dist/index.d.ts +26 -3
- package/dist/index.js +168 -6
- package/dist/index.mjs +168 -6
- package/package.json +121 -121
- package/src/__mocks__/firstore.ts +10 -10
- package/src/admin/aggregation/README.md +79 -79
- package/src/admin/aggregation/appointment/README.md +128 -128
- package/src/admin/aggregation/appointment/appointment.aggregation.service.ts +1984 -1984
- package/src/admin/aggregation/appointment/index.ts +1 -1
- package/src/admin/aggregation/clinic/README.md +52 -52
- package/src/admin/aggregation/clinic/clinic.aggregation.service.ts +966 -703
- package/src/admin/aggregation/clinic/index.ts +1 -1
- package/src/admin/aggregation/forms/README.md +13 -13
- package/src/admin/aggregation/forms/filled-forms.aggregation.service.ts +322 -322
- package/src/admin/aggregation/forms/index.ts +1 -1
- package/src/admin/aggregation/index.ts +8 -8
- package/src/admin/aggregation/patient/README.md +27 -27
- package/src/admin/aggregation/patient/index.ts +1 -1
- package/src/admin/aggregation/patient/patient.aggregation.service.ts +141 -141
- package/src/admin/aggregation/practitioner/README.md +42 -42
- package/src/admin/aggregation/practitioner/index.ts +1 -1
- package/src/admin/aggregation/practitioner/practitioner.aggregation.service.ts +433 -433
- package/src/admin/aggregation/practitioner-invite/index.ts +1 -1
- package/src/admin/aggregation/practitioner-invite/practitioner-invite.aggregation.service.ts +961 -961
- package/src/admin/aggregation/procedure/README.md +43 -43
- package/src/admin/aggregation/procedure/index.ts +1 -1
- package/src/admin/aggregation/procedure/procedure.aggregation.service.ts +702 -702
- package/src/admin/aggregation/reviews/index.ts +1 -1
- package/src/admin/aggregation/reviews/reviews.aggregation.service.ts +689 -689
- package/src/admin/analytics/analytics.admin.service.ts +278 -278
- package/src/admin/analytics/index.ts +2 -2
- package/src/admin/booking/README.md +125 -125
- package/src/admin/booking/booking.admin.ts +1037 -1037
- package/src/admin/booking/booking.calculator.ts +712 -712
- package/src/admin/booking/booking.types.ts +59 -59
- package/src/admin/booking/index.ts +3 -3
- package/src/admin/booking/timezones-problem.md +185 -185
- package/src/admin/calendar/README.md +7 -7
- package/src/admin/calendar/calendar.admin.service.ts +345 -345
- package/src/admin/calendar/index.ts +1 -1
- package/src/admin/documentation-templates/document-manager.admin.ts +260 -260
- package/src/admin/documentation-templates/index.ts +1 -1
- package/src/admin/free-consultation/free-consultation-utils.admin.ts +148 -148
- package/src/admin/free-consultation/index.ts +1 -1
- package/src/admin/index.ts +81 -81
- package/src/admin/logger/index.ts +78 -78
- package/src/admin/mailing/README.md +95 -95
- package/src/admin/mailing/appointment/appointment.mailing.service.ts +732 -732
- package/src/admin/mailing/appointment/index.ts +1 -1
- package/src/admin/mailing/appointment/templates/patient/appointment-confirmed.html +40 -40
- package/src/admin/mailing/base.mailing.service.ts +208 -208
- package/src/admin/mailing/index.ts +3 -3
- package/src/admin/mailing/practitionerInvite/existing-practitioner-invite.mailing.ts +611 -611
- package/src/admin/mailing/practitionerInvite/index.ts +2 -2
- package/src/admin/mailing/practitionerInvite/practitionerInvite.mailing.ts +395 -395
- package/src/admin/mailing/practitionerInvite/templates/existing-practitioner-invitation.template.ts +155 -155
- package/src/admin/mailing/practitionerInvite/templates/invitation.template.ts +101 -101
- package/src/admin/mailing/practitionerInvite/templates/invite-accepted-notification.template.ts +228 -228
- package/src/admin/mailing/practitionerInvite/templates/invite-rejected-notification.template.ts +242 -242
- package/src/admin/notifications/index.ts +1 -1
- package/src/admin/notifications/notifications.admin.ts +710 -710
- package/src/admin/requirements/README.md +128 -128
- package/src/admin/requirements/index.ts +1 -1
- package/src/admin/requirements/patient-requirements.admin.service.ts +475 -475
- package/src/admin/users/index.ts +1 -1
- package/src/admin/users/user-profile.admin.ts +405 -405
- package/src/backoffice/constants/certification.constants.ts +13 -13
- package/src/backoffice/constants/index.ts +1 -1
- package/src/backoffice/errors/backoffice.errors.ts +181 -181
- package/src/backoffice/errors/index.ts +1 -1
- package/src/backoffice/expo-safe/README.md +26 -26
- package/src/backoffice/expo-safe/index.ts +41 -41
- package/src/backoffice/index.ts +5 -5
- package/src/backoffice/services/FIXES_README.md +102 -102
- package/src/backoffice/services/README.md +57 -57
- package/src/backoffice/services/analytics.service.proposal.md +863 -863
- package/src/backoffice/services/analytics.service.summary.md +143 -143
- package/src/backoffice/services/brand.service.ts +256 -256
- package/src/backoffice/services/category.service.ts +384 -384
- package/src/backoffice/services/constants.service.ts +385 -385
- package/src/backoffice/services/documentation-template.service.ts +202 -202
- package/src/backoffice/services/index.ts +10 -10
- package/src/backoffice/services/migrate-products.ts +116 -116
- package/src/backoffice/services/product.service.ts +553 -553
- package/src/backoffice/services/requirement.service.ts +235 -235
- package/src/backoffice/services/subcategory.service.ts +461 -461
- package/src/backoffice/services/technology.service.ts +1151 -1151
- package/src/backoffice/types/README.md +12 -12
- package/src/backoffice/types/admin-constants.types.ts +69 -69
- package/src/backoffice/types/brand.types.ts +29 -29
- package/src/backoffice/types/category.types.ts +67 -67
- package/src/backoffice/types/documentation-templates.types.ts +28 -28
- package/src/backoffice/types/index.ts +10 -10
- package/src/backoffice/types/procedure-product.types.ts +38 -38
- package/src/backoffice/types/product.types.ts +240 -240
- package/src/backoffice/types/requirement.types.ts +63 -63
- package/src/backoffice/types/static/README.md +18 -18
- package/src/backoffice/types/static/blocking-condition.types.ts +21 -21
- package/src/backoffice/types/static/certification.types.ts +37 -37
- package/src/backoffice/types/static/contraindication.types.ts +19 -19
- package/src/backoffice/types/static/index.ts +6 -6
- package/src/backoffice/types/static/pricing.types.ts +16 -16
- package/src/backoffice/types/static/procedure-family.types.ts +14 -14
- package/src/backoffice/types/static/treatment-benefit.types.ts +22 -22
- package/src/backoffice/types/subcategory.types.ts +34 -34
- package/src/backoffice/types/technology.types.ts +168 -168
- package/src/backoffice/validations/index.ts +1 -1
- package/src/backoffice/validations/schemas.ts +164 -164
- package/src/config/__mocks__/firebase.ts +99 -99
- package/src/config/firebase.ts +78 -78
- package/src/config/index.ts +9 -9
- package/src/errors/auth.error.ts +6 -6
- package/src/errors/auth.errors.ts +211 -200
- package/src/errors/clinic.errors.ts +32 -32
- package/src/errors/firebase.errors.ts +47 -47
- package/src/errors/user.errors.ts +99 -99
- package/src/index.backup.ts +407 -407
- package/src/index.ts +6 -6
- package/src/locales/en.ts +31 -31
- package/src/recommender/admin/index.ts +1 -1
- package/src/recommender/admin/services/recommender.service.admin.ts +5 -5
- package/src/recommender/front/index.ts +1 -1
- package/src/recommender/front/services/onboarding.service.ts +5 -5
- package/src/recommender/front/services/recommender.service.ts +3 -3
- package/src/recommender/index.ts +1 -1
- package/src/services/PATIENTAUTH.MD +197 -197
- package/src/services/README.md +106 -106
- package/src/services/__tests__/auth/auth.mock.test.ts +17 -17
- package/src/services/__tests__/auth/auth.setup.ts +293 -293
- package/src/services/__tests__/auth.service.test.ts +346 -346
- package/src/services/__tests__/base.service.test.ts +77 -77
- package/src/services/__tests__/user.service.test.ts +528 -528
- package/src/services/analytics/ARCHITECTURE.md +199 -199
- package/src/services/analytics/CLOUD_FUNCTIONS.md +225 -225
- package/src/services/analytics/GROUPED_ANALYTICS.md +501 -501
- package/src/services/analytics/QUICK_START.md +393 -393
- package/src/services/analytics/README.md +304 -304
- package/src/services/analytics/SUMMARY.md +141 -141
- package/src/services/analytics/TRENDS.md +380 -380
- package/src/services/analytics/USAGE_GUIDE.md +518 -518
- package/src/services/analytics/analytics-cloud.service.ts +222 -222
- package/src/services/analytics/analytics.service.ts +2142 -2142
- package/src/services/analytics/index.ts +4 -4
- package/src/services/analytics/review-analytics.service.ts +941 -941
- package/src/services/analytics/utils/appointment-filtering.utils.ts +138 -138
- package/src/services/analytics/utils/cost-calculation.utils.ts +182 -182
- package/src/services/analytics/utils/grouping.utils.ts +434 -434
- package/src/services/analytics/utils/stored-analytics.utils.ts +347 -347
- package/src/services/analytics/utils/time-calculation.utils.ts +186 -186
- package/src/services/analytics/utils/trend-calculation.utils.ts +200 -200
- package/src/services/appointment/README.md +17 -17
- package/src/services/appointment/appointment.service.ts +2558 -2558
- package/src/services/appointment/index.ts +1 -1
- package/src/services/appointment/utils/appointment.utils.ts +552 -552
- package/src/services/appointment/utils/extended-procedure.utils.ts +314 -314
- package/src/services/appointment/utils/form-initialization.utils.ts +225 -225
- package/src/services/appointment/utils/recommended-procedure.utils.ts +195 -195
- package/src/services/appointment/utils/zone-management.utils.ts +353 -353
- package/src/services/appointment/utils/zone-photo.utils.ts +152 -152
- package/src/services/auth/auth.service.ts +1043 -989
- package/src/services/auth/auth.v2.service.ts +961 -961
- package/src/services/auth/index.ts +7 -7
- package/src/services/auth/utils/error.utils.ts +90 -90
- package/src/services/auth/utils/firebase.utils.ts +49 -49
- package/src/services/auth/utils/index.ts +21 -21
- package/src/services/auth/utils/practitioner.utils.ts +125 -125
- package/src/services/base.service.ts +41 -41
- package/src/services/calendar/calendar.service.ts +1077 -1077
- package/src/services/calendar/calendar.v2.service.ts +1683 -1683
- package/src/services/calendar/calendar.v3.service.ts +313 -313
- package/src/services/calendar/externalCalendar.service.ts +178 -178
- package/src/services/calendar/index.ts +5 -5
- package/src/services/calendar/synced-calendars.service.ts +743 -743
- package/src/services/calendar/utils/appointment.utils.ts +265 -265
- package/src/services/calendar/utils/calendar-event.utils.ts +646 -646
- package/src/services/calendar/utils/clinic.utils.ts +237 -237
- package/src/services/calendar/utils/docs.utils.ts +157 -157
- package/src/services/calendar/utils/google-calendar.utils.ts +697 -697
- package/src/services/calendar/utils/index.ts +8 -8
- package/src/services/calendar/utils/patient.utils.ts +198 -198
- package/src/services/calendar/utils/practitioner.utils.ts +221 -221
- package/src/services/calendar/utils/synced-calendar.utils.ts +472 -472
- package/src/services/clinic/README.md +204 -204
- package/src/services/clinic/__tests__/clinic-admin.service.test.ts +287 -287
- package/src/services/clinic/__tests__/clinic-group.service.test.ts +352 -352
- package/src/services/clinic/__tests__/clinic.service.test.ts +354 -354
- package/src/services/clinic/billing-transactions.service.ts +217 -217
- package/src/services/clinic/clinic-admin.service.ts +202 -202
- package/src/services/clinic/clinic-group.service.ts +310 -310
- package/src/services/clinic/clinic.service.ts +708 -708
- package/src/services/clinic/index.ts +5 -5
- package/src/services/clinic/practitioner-invite.service.ts +519 -519
- package/src/services/clinic/utils/admin.utils.ts +551 -551
- package/src/services/clinic/utils/clinic-group.utils.ts +646 -646
- package/src/services/clinic/utils/clinic.utils.ts +949 -949
- package/src/services/clinic/utils/filter.utils.d.ts +23 -23
- package/src/services/clinic/utils/filter.utils.ts +446 -446
- package/src/services/clinic/utils/index.ts +11 -11
- package/src/services/clinic/utils/photos.utils.ts +188 -188
- package/src/services/clinic/utils/search.utils.ts +84 -84
- package/src/services/clinic/utils/tag.utils.ts +124 -124
- package/src/services/documentation-templates/documentation-template.service.ts +537 -537
- package/src/services/documentation-templates/filled-document.service.ts +587 -587
- package/src/services/documentation-templates/index.ts +2 -2
- package/src/services/index.ts +14 -14
- package/src/services/media/index.ts +1 -1
- package/src/services/media/media.service.ts +418 -418
- package/src/services/notifications/__tests__/notification.service.test.ts +242 -242
- package/src/services/notifications/index.ts +1 -1
- package/src/services/notifications/notification.service.ts +215 -215
- package/src/services/patient/README.md +48 -48
- package/src/services/patient/To-Do.md +43 -43
- package/src/services/patient/__tests__/patient.service.test.ts +294 -294
- package/src/services/patient/index.ts +2 -2
- package/src/services/patient/patient.service.ts +883 -883
- package/src/services/patient/patientRequirements.service.ts +285 -285
- package/src/services/patient/utils/aesthetic-analysis.utils.ts +176 -176
- package/src/services/patient/utils/clinic.utils.ts +80 -80
- package/src/services/patient/utils/docs.utils.ts +142 -142
- package/src/services/patient/utils/index.ts +9 -9
- package/src/services/patient/utils/location.utils.ts +126 -126
- package/src/services/patient/utils/medical-stuff.utils.ts +143 -143
- package/src/services/patient/utils/medical.utils.ts +458 -458
- package/src/services/patient/utils/practitioner.utils.ts +260 -260
- package/src/services/patient/utils/profile.utils.ts +510 -510
- package/src/services/patient/utils/sensitive.utils.ts +260 -260
- package/src/services/patient/utils/token.utils.ts +211 -211
- package/src/services/practitioner/README.md +145 -145
- package/src/services/practitioner/index.ts +1 -1
- package/src/services/practitioner/practitioner.service.ts +1799 -1742
- package/src/services/procedure/README.md +163 -163
- package/src/services/procedure/index.ts +1 -1
- package/src/services/procedure/procedure.service.ts +2307 -2200
- package/src/services/reviews/index.ts +1 -1
- package/src/services/reviews/reviews.service.ts +734 -734
- package/src/services/user/index.ts +1 -1
- package/src/services/user/user.service.ts +489 -489
- package/src/services/user/user.v2.service.ts +466 -466
- package/src/types/analytics/analytics.types.ts +597 -597
- package/src/types/analytics/grouped-analytics.types.ts +173 -173
- package/src/types/analytics/index.ts +4 -4
- package/src/types/analytics/stored-analytics.types.ts +137 -137
- package/src/types/appointment/index.ts +480 -480
- package/src/types/calendar/index.ts +258 -258
- package/src/types/calendar/synced-calendar.types.ts +66 -66
- package/src/types/clinic/index.ts +498 -498
- package/src/types/clinic/practitioner-invite.types.ts +91 -91
- package/src/types/clinic/preferences.types.ts +159 -159
- package/src/types/clinic/to-do +3 -3
- package/src/types/documentation-templates/index.ts +308 -308
- package/src/types/index.ts +47 -47
- package/src/types/notifications/README.md +77 -77
- package/src/types/notifications/index.ts +286 -286
- package/src/types/patient/aesthetic-analysis.types.ts +66 -66
- package/src/types/patient/allergies.ts +58 -58
- package/src/types/patient/index.ts +275 -275
- package/src/types/patient/medical-info.types.ts +152 -152
- package/src/types/patient/patient-requirements.ts +92 -92
- package/src/types/patient/token.types.ts +61 -61
- package/src/types/practitioner/index.ts +206 -206
- package/src/types/procedure/index.ts +181 -181
- package/src/types/profile/index.ts +39 -39
- package/src/types/reviews/index.ts +132 -132
- package/src/types/tz-lookup.d.ts +4 -4
- package/src/types/user/index.ts +38 -38
- package/src/utils/TIMESTAMPS.md +176 -176
- package/src/utils/TimestampUtils.ts +241 -241
- package/src/utils/index.ts +1 -1
- package/src/validations/appointment.schema.ts +574 -574
- package/src/validations/calendar.schema.ts +225 -225
- package/src/validations/clinic.schema.ts +494 -494
- package/src/validations/common.schema.ts +25 -25
- package/src/validations/documentation-templates/index.ts +1 -1
- package/src/validations/documentation-templates/template.schema.ts +220 -220
- package/src/validations/documentation-templates.schema.ts +10 -10
- package/src/validations/index.ts +20 -20
- package/src/validations/media.schema.ts +10 -10
- package/src/validations/notification.schema.ts +90 -90
- package/src/validations/patient/aesthetic-analysis.schema.ts +55 -55
- package/src/validations/patient/medical-info.schema.ts +125 -125
- package/src/validations/patient/patient-requirements.schema.ts +84 -84
- package/src/validations/patient/token.schema.ts +29 -29
- package/src/validations/patient.schema.ts +217 -217
- package/src/validations/practitioner.schema.ts +222 -222
- package/src/validations/procedure-product.schema.ts +41 -41
- package/src/validations/procedure.schema.ts +124 -124
- package/src/validations/profile-info.schema.ts +41 -41
- package/src/validations/reviews.schema.ts +195 -195
- package/src/validations/schemas.ts +104 -104
- package/src/validations/shared.schema.ts +78 -78
|
@@ -1,124 +1,124 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { ProcedureFamily } from "../backoffice/types/static/procedure-family.types";
|
|
3
|
-
import {
|
|
4
|
-
Currency,
|
|
5
|
-
PricingMeasure,
|
|
6
|
-
} from "../backoffice/types/static/pricing.types";
|
|
7
|
-
import { clinicInfoSchema, doctorInfoSchema } from "./shared.schema";
|
|
8
|
-
import { procedureReviewInfoSchema } from "./reviews.schema";
|
|
9
|
-
import { mediaResourceSchema } from "./media.schema";
|
|
10
|
-
import { procedureProductDataSchema } from "./procedure-product.schema";
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* Schema for validating stored procedure product data (with full product objects).
|
|
14
|
-
* This is used when validating complete procedure documents from Firestore.
|
|
15
|
-
*/
|
|
16
|
-
export const storedProcedureProductSchema = z.object({
|
|
17
|
-
/**
|
|
18
|
-
* The full product object used in the procedure.
|
|
19
|
-
*/
|
|
20
|
-
product: z.any(), // We'll validate the full product object separately
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* The price of the procedure when using this specific product.
|
|
24
|
-
*/
|
|
25
|
-
price: z.number().min(0, "Price must be a non-negative number"),
|
|
26
|
-
|
|
27
|
-
/**
|
|
28
|
-
* The currency for the price of this product.
|
|
29
|
-
*/
|
|
30
|
-
currency: z.nativeEnum(Currency),
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* How the price is measured (e.g., per ml, per zone).
|
|
34
|
-
*/
|
|
35
|
-
pricingMeasure: z.nativeEnum(PricingMeasure),
|
|
36
|
-
|
|
37
|
-
/**
|
|
38
|
-
* Whether this is the default product for the procedure.
|
|
39
|
-
*/
|
|
40
|
-
isDefault: z.boolean().optional(),
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* Schema for creating a new procedure
|
|
45
|
-
*/
|
|
46
|
-
export const createProcedureSchema = z.object({
|
|
47
|
-
name: z.string().min(1).max(200),
|
|
48
|
-
// Optional: service will derive from name if not provided by client
|
|
49
|
-
nameLower: z.string().min(1).max(200).optional(),
|
|
50
|
-
description: z.string().min(1).max(2000),
|
|
51
|
-
family: z.nativeEnum(ProcedureFamily),
|
|
52
|
-
categoryId: z.string().min(1),
|
|
53
|
-
subcategoryId: z.string().min(1),
|
|
54
|
-
technologyId: z.string().min(1),
|
|
55
|
-
productId: z.string().min(1).optional(),
|
|
56
|
-
price: z.number().min(0),
|
|
57
|
-
currency: z.nativeEnum(Currency),
|
|
58
|
-
pricingMeasure: z.nativeEnum(PricingMeasure),
|
|
59
|
-
productsMetadata: z.array(procedureProductDataSchema).optional(), // No min(1) - allow empty for product-free procedures
|
|
60
|
-
duration: z.number().min(1).max(480), // Max 8 hours
|
|
61
|
-
practitionerId: z.string().min(1),
|
|
62
|
-
clinicBranchId: z.string().min(1),
|
|
63
|
-
photos: z.array(mediaResourceSchema).optional(),
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
/**
|
|
67
|
-
* Schema for updating an existing procedure
|
|
68
|
-
*/
|
|
69
|
-
export const updateProcedureSchema = z.object({
|
|
70
|
-
name: z.string().min(3).max(100).optional(),
|
|
71
|
-
nameLower: z.string().min(1).max(200).optional(),
|
|
72
|
-
description: z.string().min(3).max(1000).optional(),
|
|
73
|
-
price: z.number().min(0).optional(),
|
|
74
|
-
currency: z.nativeEnum(Currency).optional(),
|
|
75
|
-
pricingMeasure: z.nativeEnum(PricingMeasure).optional(),
|
|
76
|
-
productsMetadata: z.array(procedureProductDataSchema).optional(), // No min(1) - allow empty for product-free procedures
|
|
77
|
-
duration: z.number().min(0).optional(),
|
|
78
|
-
isActive: z.boolean().optional(),
|
|
79
|
-
practitionerId: z.string().optional(),
|
|
80
|
-
categoryId: z.string().optional(),
|
|
81
|
-
subcategoryId: z.string().optional(),
|
|
82
|
-
technologyId: z.string().optional(),
|
|
83
|
-
productId: z.string().optional(),
|
|
84
|
-
clinicBranchId: z.string().optional(),
|
|
85
|
-
photos: z.array(mediaResourceSchema).optional(),
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Schema for validating a complete procedure object (as stored in Firestore)
|
|
90
|
-
*/
|
|
91
|
-
export const procedureSchema = z.object({
|
|
92
|
-
id: z.string().min(1),
|
|
93
|
-
name: z.string().min(1).max(200),
|
|
94
|
-
nameLower: z.string().min(1).max(200),
|
|
95
|
-
description: z.string().min(1).max(2000),
|
|
96
|
-
family: z.nativeEnum(ProcedureFamily),
|
|
97
|
-
category: z.any(), // We'll validate the full category object separately
|
|
98
|
-
subcategory: z.any(), // We'll validate the full subcategory object separately
|
|
99
|
-
technology: z.any(), // We'll validate the full technology object separately
|
|
100
|
-
product: z.any().optional(), // We'll validate the full product object separately (optional for consultations)
|
|
101
|
-
productsMetadata: z.array(storedProcedureProductSchema).optional(), // Use stored format schema (optional for consultations)
|
|
102
|
-
price: z.number().min(0),
|
|
103
|
-
currency: z.nativeEnum(Currency),
|
|
104
|
-
pricingMeasure: z.nativeEnum(PricingMeasure),
|
|
105
|
-
duration: z.number().min(1).max(480),
|
|
106
|
-
practitionerId: z.string().min(1),
|
|
107
|
-
clinicBranchId: z.string().min(1),
|
|
108
|
-
photos: z.array(z.string()).optional(), // Stored as URL strings
|
|
109
|
-
blockingConditions: z.array(z.any()), // We'll validate blocking conditions separately
|
|
110
|
-
contraindications: z.array(z.any()), // We'll validate contraindications separately
|
|
111
|
-
contraindicationIds: z.array(z.string()), // Array of IDs for efficient querying
|
|
112
|
-
treatmentBenefits: z.array(z.any()), // We'll validate treatment benefits separately
|
|
113
|
-
treatmentBenefitIds: z.array(z.string()), // Array of IDs for efficient querying
|
|
114
|
-
preRequirements: z.array(z.any()), // We'll validate requirements separately
|
|
115
|
-
postRequirements: z.array(z.any()), // We'll validate requirements separately
|
|
116
|
-
certificationRequirement: z.any(), // We'll validate certification requirement separately
|
|
117
|
-
documentationTemplates: z.array(z.any()), // We'll validate documentation templates separately
|
|
118
|
-
clinicInfo: clinicInfoSchema, // Clinic info validation
|
|
119
|
-
doctorInfo: doctorInfoSchema, // Doctor info validation
|
|
120
|
-
reviewInfo: procedureReviewInfoSchema, // Procedure review info validation
|
|
121
|
-
isActive: z.boolean(),
|
|
122
|
-
createdAt: z.date(),
|
|
123
|
-
updatedAt: z.date(),
|
|
124
|
-
});
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { ProcedureFamily } from "../backoffice/types/static/procedure-family.types";
|
|
3
|
+
import {
|
|
4
|
+
Currency,
|
|
5
|
+
PricingMeasure,
|
|
6
|
+
} from "../backoffice/types/static/pricing.types";
|
|
7
|
+
import { clinicInfoSchema, doctorInfoSchema } from "./shared.schema";
|
|
8
|
+
import { procedureReviewInfoSchema } from "./reviews.schema";
|
|
9
|
+
import { mediaResourceSchema } from "./media.schema";
|
|
10
|
+
import { procedureProductDataSchema } from "./procedure-product.schema";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Schema for validating stored procedure product data (with full product objects).
|
|
14
|
+
* This is used when validating complete procedure documents from Firestore.
|
|
15
|
+
*/
|
|
16
|
+
export const storedProcedureProductSchema = z.object({
|
|
17
|
+
/**
|
|
18
|
+
* The full product object used in the procedure.
|
|
19
|
+
*/
|
|
20
|
+
product: z.any(), // We'll validate the full product object separately
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* The price of the procedure when using this specific product.
|
|
24
|
+
*/
|
|
25
|
+
price: z.number().min(0, "Price must be a non-negative number"),
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* The currency for the price of this product.
|
|
29
|
+
*/
|
|
30
|
+
currency: z.nativeEnum(Currency),
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* How the price is measured (e.g., per ml, per zone).
|
|
34
|
+
*/
|
|
35
|
+
pricingMeasure: z.nativeEnum(PricingMeasure),
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Whether this is the default product for the procedure.
|
|
39
|
+
*/
|
|
40
|
+
isDefault: z.boolean().optional(),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Schema for creating a new procedure
|
|
45
|
+
*/
|
|
46
|
+
export const createProcedureSchema = z.object({
|
|
47
|
+
name: z.string().min(1).max(200),
|
|
48
|
+
// Optional: service will derive from name if not provided by client
|
|
49
|
+
nameLower: z.string().min(1).max(200).optional(),
|
|
50
|
+
description: z.string().min(1).max(2000),
|
|
51
|
+
family: z.nativeEnum(ProcedureFamily),
|
|
52
|
+
categoryId: z.string().min(1),
|
|
53
|
+
subcategoryId: z.string().min(1),
|
|
54
|
+
technologyId: z.string().min(1),
|
|
55
|
+
productId: z.string().min(1).optional(),
|
|
56
|
+
price: z.number().min(0),
|
|
57
|
+
currency: z.nativeEnum(Currency),
|
|
58
|
+
pricingMeasure: z.nativeEnum(PricingMeasure),
|
|
59
|
+
productsMetadata: z.array(procedureProductDataSchema).optional(), // No min(1) - allow empty for product-free procedures
|
|
60
|
+
duration: z.number().min(1).max(480), // Max 8 hours
|
|
61
|
+
practitionerId: z.string().min(1),
|
|
62
|
+
clinicBranchId: z.string().min(1),
|
|
63
|
+
photos: z.array(mediaResourceSchema).optional(),
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Schema for updating an existing procedure
|
|
68
|
+
*/
|
|
69
|
+
export const updateProcedureSchema = z.object({
|
|
70
|
+
name: z.string().min(3).max(100).optional(),
|
|
71
|
+
nameLower: z.string().min(1).max(200).optional(),
|
|
72
|
+
description: z.string().min(3).max(1000).optional(),
|
|
73
|
+
price: z.number().min(0).optional(),
|
|
74
|
+
currency: z.nativeEnum(Currency).optional(),
|
|
75
|
+
pricingMeasure: z.nativeEnum(PricingMeasure).optional(),
|
|
76
|
+
productsMetadata: z.array(procedureProductDataSchema).optional(), // No min(1) - allow empty for product-free procedures
|
|
77
|
+
duration: z.number().min(0).optional(),
|
|
78
|
+
isActive: z.boolean().optional(),
|
|
79
|
+
practitionerId: z.string().optional(),
|
|
80
|
+
categoryId: z.string().optional(),
|
|
81
|
+
subcategoryId: z.string().optional(),
|
|
82
|
+
technologyId: z.string().optional(),
|
|
83
|
+
productId: z.string().optional(),
|
|
84
|
+
clinicBranchId: z.string().optional(),
|
|
85
|
+
photos: z.array(mediaResourceSchema).optional(),
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Schema for validating a complete procedure object (as stored in Firestore)
|
|
90
|
+
*/
|
|
91
|
+
export const procedureSchema = z.object({
|
|
92
|
+
id: z.string().min(1),
|
|
93
|
+
name: z.string().min(1).max(200),
|
|
94
|
+
nameLower: z.string().min(1).max(200),
|
|
95
|
+
description: z.string().min(1).max(2000),
|
|
96
|
+
family: z.nativeEnum(ProcedureFamily),
|
|
97
|
+
category: z.any(), // We'll validate the full category object separately
|
|
98
|
+
subcategory: z.any(), // We'll validate the full subcategory object separately
|
|
99
|
+
technology: z.any(), // We'll validate the full technology object separately
|
|
100
|
+
product: z.any().optional(), // We'll validate the full product object separately (optional for consultations)
|
|
101
|
+
productsMetadata: z.array(storedProcedureProductSchema).optional(), // Use stored format schema (optional for consultations)
|
|
102
|
+
price: z.number().min(0),
|
|
103
|
+
currency: z.nativeEnum(Currency),
|
|
104
|
+
pricingMeasure: z.nativeEnum(PricingMeasure),
|
|
105
|
+
duration: z.number().min(1).max(480),
|
|
106
|
+
practitionerId: z.string().min(1),
|
|
107
|
+
clinicBranchId: z.string().min(1),
|
|
108
|
+
photos: z.array(z.string()).optional(), // Stored as URL strings
|
|
109
|
+
blockingConditions: z.array(z.any()), // We'll validate blocking conditions separately
|
|
110
|
+
contraindications: z.array(z.any()), // We'll validate contraindications separately
|
|
111
|
+
contraindicationIds: z.array(z.string()), // Array of IDs for efficient querying
|
|
112
|
+
treatmentBenefits: z.array(z.any()), // We'll validate treatment benefits separately
|
|
113
|
+
treatmentBenefitIds: z.array(z.string()), // Array of IDs for efficient querying
|
|
114
|
+
preRequirements: z.array(z.any()), // We'll validate requirements separately
|
|
115
|
+
postRequirements: z.array(z.any()), // We'll validate requirements separately
|
|
116
|
+
certificationRequirement: z.any(), // We'll validate certification requirement separately
|
|
117
|
+
documentationTemplates: z.array(z.any()), // We'll validate documentation templates separately
|
|
118
|
+
clinicInfo: clinicInfoSchema, // Clinic info validation
|
|
119
|
+
doctorInfo: doctorInfoSchema, // Doctor info validation
|
|
120
|
+
reviewInfo: procedureReviewInfoSchema, // Procedure review info validation
|
|
121
|
+
isActive: z.boolean(),
|
|
122
|
+
createdAt: z.date(),
|
|
123
|
+
updatedAt: z.date(),
|
|
124
|
+
});
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
import { z } from "zod";
|
|
2
|
-
import { Timestamp } from "firebase/firestore";
|
|
3
|
-
import { clinicLocationSchema, clinicContactInfoSchema } from "./clinic.schema";
|
|
4
|
-
import { practitionerCertificationSchema } from "./practitioner.schema";
|
|
5
|
-
import { Gender } from "../types/patient";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Validation schema for clinic info
|
|
9
|
-
*/
|
|
10
|
-
export const clinicBranchInfoSchema = z.object({
|
|
11
|
-
id: z.string(),
|
|
12
|
-
featuredPhoto: z.string(),
|
|
13
|
-
name: z.string(),
|
|
14
|
-
description: z.string(),
|
|
15
|
-
location: clinicLocationSchema,
|
|
16
|
-
contactInfo: clinicContactInfoSchema,
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Validation schema for practitioner profile info
|
|
21
|
-
*/
|
|
22
|
-
export const practitionerProfileInfoSchema = z.object({
|
|
23
|
-
id: z.string(),
|
|
24
|
-
practitionerPhoto: z.string().nullable(),
|
|
25
|
-
name: z.string(),
|
|
26
|
-
email: z.string().email(),
|
|
27
|
-
phone: z.string().nullable(),
|
|
28
|
-
certification: practitionerCertificationSchema,
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Validation schema for patient profile info
|
|
33
|
-
*/
|
|
34
|
-
export const patientProfileInfoSchema = z.object({
|
|
35
|
-
id: z.string(),
|
|
36
|
-
fullName: z.string(),
|
|
37
|
-
email: z.string().email(),
|
|
38
|
-
phone: z.string().nullable(),
|
|
39
|
-
dateOfBirth: z.instanceof(Timestamp),
|
|
40
|
-
gender: z.nativeEnum(Gender),
|
|
41
|
-
});
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { Timestamp } from "firebase/firestore";
|
|
3
|
+
import { clinicLocationSchema, clinicContactInfoSchema } from "./clinic.schema";
|
|
4
|
+
import { practitionerCertificationSchema } from "./practitioner.schema";
|
|
5
|
+
import { Gender } from "../types/patient";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Validation schema for clinic info
|
|
9
|
+
*/
|
|
10
|
+
export const clinicBranchInfoSchema = z.object({
|
|
11
|
+
id: z.string(),
|
|
12
|
+
featuredPhoto: z.string(),
|
|
13
|
+
name: z.string(),
|
|
14
|
+
description: z.string(),
|
|
15
|
+
location: clinicLocationSchema,
|
|
16
|
+
contactInfo: clinicContactInfoSchema,
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Validation schema for practitioner profile info
|
|
21
|
+
*/
|
|
22
|
+
export const practitionerProfileInfoSchema = z.object({
|
|
23
|
+
id: z.string(),
|
|
24
|
+
practitionerPhoto: z.string().nullable(),
|
|
25
|
+
name: z.string(),
|
|
26
|
+
email: z.string().email(),
|
|
27
|
+
phone: z.string().nullable(),
|
|
28
|
+
certification: practitionerCertificationSchema,
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Validation schema for patient profile info
|
|
33
|
+
*/
|
|
34
|
+
export const patientProfileInfoSchema = z.object({
|
|
35
|
+
id: z.string(),
|
|
36
|
+
fullName: z.string(),
|
|
37
|
+
email: z.string().email(),
|
|
38
|
+
phone: z.string().nullable(),
|
|
39
|
+
dateOfBirth: z.instanceof(Timestamp),
|
|
40
|
+
gender: z.nativeEnum(Gender),
|
|
41
|
+
});
|