@primocaredentgroup/prescriptions-component 0.1.0

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.
Files changed (120) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/_internal/client/PrescriptionsComponentClient.d.ts +25 -0
  4. package/dist/_internal/client/PrescriptionsComponentClient.d.ts.map +1 -0
  5. package/dist/_internal/client/PrescriptionsComponentClient.js +61 -0
  6. package/dist/_internal/client/PrescriptionsComponentClient.js.map +1 -0
  7. package/dist/_internal/client/index.d.ts +3 -0
  8. package/dist/_internal/client/index.d.ts.map +1 -0
  9. package/dist/_internal/client/index.js +2 -0
  10. package/dist/_internal/client/index.js.map +1 -0
  11. package/dist/_internal/client/types.d.ts +47 -0
  12. package/dist/_internal/client/types.d.ts.map +1 -0
  13. package/dist/_internal/client/types.js +2 -0
  14. package/dist/_internal/client/types.js.map +1 -0
  15. package/dist/_internal/component/convex.config.d.ts +7 -0
  16. package/dist/_internal/component/convex.config.d.ts.map +1 -0
  17. package/dist/_internal/component/convex.config.js +8 -0
  18. package/dist/_internal/component/convex.config.js.map +1 -0
  19. package/dist/_internal/component/functions.d.ts +9 -0
  20. package/dist/_internal/component/functions.d.ts.map +1 -0
  21. package/dist/_internal/component/functions.js +11 -0
  22. package/dist/_internal/component/functions.js.map +1 -0
  23. package/dist/_internal/component/index.d.ts +18 -0
  24. package/dist/_internal/component/index.d.ts.map +1 -0
  25. package/dist/_internal/component/index.js +20 -0
  26. package/dist/_internal/component/index.js.map +1 -0
  27. package/dist/_internal/component/schema.d.ts +2 -0
  28. package/dist/_internal/component/schema.d.ts.map +1 -0
  29. package/dist/_internal/component/schema.js +2 -0
  30. package/dist/_internal/component/schema.js.map +1 -0
  31. package/dist/_internal/react/PrescriptionsWidget.d.ts +18 -0
  32. package/dist/_internal/react/PrescriptionsWidget.d.ts.map +1 -0
  33. package/dist/_internal/react/PrescriptionsWidget.js +137 -0
  34. package/dist/_internal/react/PrescriptionsWidget.js.map +1 -0
  35. package/dist/_internal/react/index.d.ts +3 -0
  36. package/dist/_internal/react/index.d.ts.map +1 -0
  37. package/dist/_internal/react/index.js +2 -0
  38. package/dist/_internal/react/index.js.map +1 -0
  39. package/dist/client/index.d.ts +1 -0
  40. package/dist/client/index.js +1 -0
  41. package/dist/component/convex.config.d.ts +2 -0
  42. package/dist/component/convex.config.js +2 -0
  43. package/dist/component/index.d.ts +1 -0
  44. package/dist/component/index.js +1 -0
  45. package/dist/convex/lib/auth.d.ts +7 -0
  46. package/dist/convex/lib/auth.d.ts.map +1 -0
  47. package/dist/convex/lib/auth.js +38 -0
  48. package/dist/convex/lib/auth.js.map +1 -0
  49. package/dist/convex/lib/clinicalNormalize.d.ts +13 -0
  50. package/dist/convex/lib/clinicalNormalize.d.ts.map +1 -0
  51. package/dist/convex/lib/clinicalNormalize.js +82 -0
  52. package/dist/convex/lib/clinicalNormalize.js.map +1 -0
  53. package/dist/convex/lib/dental.d.ts +13 -0
  54. package/dist/convex/lib/dental.d.ts.map +1 -0
  55. package/dist/convex/lib/dental.js +79 -0
  56. package/dist/convex/lib/dental.js.map +1 -0
  57. package/dist/convex/lib/dynamicFieldsStrict.d.ts +9 -0
  58. package/dist/convex/lib/dynamicFieldsStrict.d.ts.map +1 -0
  59. package/dist/convex/lib/dynamicFieldsStrict.js +65 -0
  60. package/dist/convex/lib/dynamicFieldsStrict.js.map +1 -0
  61. package/dist/convex/lib/dynamicRules.d.ts +61 -0
  62. package/dist/convex/lib/dynamicRules.d.ts.map +1 -0
  63. package/dist/convex/lib/dynamicRules.js +221 -0
  64. package/dist/convex/lib/dynamicRules.js.map +1 -0
  65. package/dist/convex/lib/storage.d.ts +59 -0
  66. package/dist/convex/lib/storage.d.ts.map +1 -0
  67. package/dist/convex/lib/storage.js +120 -0
  68. package/dist/convex/lib/storage.js.map +1 -0
  69. package/dist/convex/lib/utils.d.ts +61 -0
  70. package/dist/convex/lib/utils.d.ts.map +1 -0
  71. package/dist/convex/lib/utils.js +135 -0
  72. package/dist/convex/lib/utils.js.map +1 -0
  73. package/dist/convex/lib/validation.d.ts +24 -0
  74. package/dist/convex/lib/validation.d.ts.map +1 -0
  75. package/dist/convex/lib/validation.js +333 -0
  76. package/dist/convex/lib/validation.js.map +1 -0
  77. package/dist/convex/mutations/digitalAssets.d.ts +54 -0
  78. package/dist/convex/mutations/digitalAssets.d.ts.map +1 -0
  79. package/dist/convex/mutations/digitalAssets.js +297 -0
  80. package/dist/convex/mutations/digitalAssets.js.map +1 -0
  81. package/dist/convex/mutations/operational.d.ts +38 -0
  82. package/dist/convex/mutations/operational.d.ts.map +1 -0
  83. package/dist/convex/mutations/operational.js +226 -0
  84. package/dist/convex/mutations/operational.js.map +1 -0
  85. package/dist/convex/mutations/phases.d.ts +45 -0
  86. package/dist/convex/mutations/phases.d.ts.map +1 -0
  87. package/dist/convex/mutations/phases.js +334 -0
  88. package/dist/convex/mutations/phases.js.map +1 -0
  89. package/dist/convex/mutations/prescriptions.d.ts +191 -0
  90. package/dist/convex/mutations/prescriptions.d.ts.map +1 -0
  91. package/dist/convex/mutations/prescriptions.js +1263 -0
  92. package/dist/convex/mutations/prescriptions.js.map +1 -0
  93. package/dist/convex/mutations/syncJobs.d.ts +37 -0
  94. package/dist/convex/mutations/syncJobs.d.ts.map +1 -0
  95. package/dist/convex/mutations/syncJobs.js +238 -0
  96. package/dist/convex/mutations/syncJobs.js.map +1 -0
  97. package/dist/convex/prescriptions/fields.d.ts +50 -0
  98. package/dist/convex/prescriptions/fields.d.ts.map +1 -0
  99. package/dist/convex/prescriptions/fields.js +242 -0
  100. package/dist/convex/prescriptions/fields.js.map +1 -0
  101. package/dist/convex/queries/dynamicFields.d.ts +27 -0
  102. package/dist/convex/queries/dynamicFields.d.ts.map +1 -0
  103. package/dist/convex/queries/dynamicFields.js +119 -0
  104. package/dist/convex/queries/dynamicFields.js.map +1 -0
  105. package/dist/convex/queries/prescriptions.d.ts +583 -0
  106. package/dist/convex/queries/prescriptions.d.ts.map +1 -0
  107. package/dist/convex/queries/prescriptions.js +208 -0
  108. package/dist/convex/queries/prescriptions.js.map +1 -0
  109. package/dist/convex/schema.d.ts +962 -0
  110. package/dist/convex/schema.d.ts.map +1 -0
  111. package/dist/convex/schema.js +434 -0
  112. package/dist/convex/schema.js.map +1 -0
  113. package/dist/convex/types.d.ts +267 -0
  114. package/dist/convex/types.d.ts.map +1 -0
  115. package/dist/convex/types.js +2 -0
  116. package/dist/convex/types.js.map +1 -0
  117. package/dist/react/index.d.ts +1 -0
  118. package/dist/react/index.js +1 -0
  119. package/dist/react/styles.css +54 -0
  120. package/package.json +82 -0
@@ -0,0 +1,333 @@
1
+ import { evaluateCondition, getNestedValue, exists } from "./utils";
2
+ import { isValidToothNumber, canFormBridge, sortTeethByArchPosition } from "./dental";
3
+ // ============================================
4
+ // DOMAIN VALIDATION
5
+ // ============================================
6
+ /**
7
+ * Valida i dati clinici secondo le regole del flow.
8
+ */
9
+ export function validateClinicalData(clinicalData, flowDefinition, forSignature = false) {
10
+ const errors = [];
11
+ // Applica le condizioni per determinare i campi required dinamici
12
+ const dynamicRequiredFields = new Set();
13
+ for (const condition of flowDefinition.conditions) {
14
+ if (evaluateCondition(clinicalData, condition.when)) {
15
+ if (condition.then.setFieldRequired?.required) {
16
+ dynamicRequiredFields.add(condition.then.setFieldRequired.fieldPath);
17
+ }
18
+ }
19
+ }
20
+ // Validazioni base
21
+ for (const validation of flowDefinition.validations) {
22
+ if (validation.type === "requiredFields" && validation.fieldPaths) {
23
+ for (const fieldPath of validation.fieldPaths) {
24
+ const value = getNestedValue(clinicalData, fieldPath);
25
+ if (!exists(value)) {
26
+ errors.push({
27
+ field: fieldPath,
28
+ message: validation.message || `Il campo ${fieldPath} è obbligatorio`,
29
+ });
30
+ }
31
+ }
32
+ }
33
+ if (validation.type === "customRule" && validation.rule) {
34
+ const customError = evaluateCustomRule(clinicalData, validation.rule);
35
+ if (customError) {
36
+ errors.push({
37
+ field: validation.rule,
38
+ message: validation.message,
39
+ });
40
+ }
41
+ }
42
+ }
43
+ // Validazioni dinamiche
44
+ for (const fieldPath of dynamicRequiredFields) {
45
+ const value = getNestedValue(clinicalData, fieldPath);
46
+ if (!exists(value)) {
47
+ errors.push({
48
+ field: fieldPath,
49
+ message: `Il campo ${fieldPath} è obbligatorio in base alla configurazione`,
50
+ });
51
+ }
52
+ }
53
+ // Validazioni specifiche per firma
54
+ if (forSignature) {
55
+ // Il paziente è sempre richiesto
56
+ if (!clinicalData.patient?.corePatientId) {
57
+ errors.push({
58
+ field: "patient.corePatientId",
59
+ message: "Il paziente è obbligatorio per la firma",
60
+ });
61
+ }
62
+ // Il medico è sempre richiesto
63
+ if (!clinicalData.doctor?.coreDoctorId) {
64
+ errors.push({
65
+ field: "doctor.coreDoctorId",
66
+ message: "Il medico è obbligatorio per la firma",
67
+ });
68
+ }
69
+ // Il servizio protesico è sempre richiesto
70
+ if (!clinicalData.prostheticService?.serviceCode) {
71
+ errors.push({
72
+ field: "prostheticService.serviceCode",
73
+ message: "Il servizio protesico è obbligatorio per la firma",
74
+ });
75
+ }
76
+ // Validazione application in base al tipo di servizio
77
+ if (requiresApplication(clinicalData.prostheticService?.serviceCode)) {
78
+ if (!clinicalData.application) {
79
+ errors.push({
80
+ field: "application",
81
+ message: "L'applicazione (dente/quadrante/arcata) è obbligatoria per questo servizio",
82
+ });
83
+ }
84
+ else {
85
+ const appError = validateApplication(clinicalData.application);
86
+ if (appError) {
87
+ errors.push(appError);
88
+ }
89
+ }
90
+ }
91
+ }
92
+ return errors;
93
+ }
94
+ /**
95
+ * Verifica se un servizio richiede l'applicazione.
96
+ */
97
+ function requiresApplication(serviceCode) {
98
+ if (!serviceCode)
99
+ return false;
100
+ // Servizi che richiedono sempre un'applicazione specifica
101
+ const requiresApp = [
102
+ "CORONA",
103
+ "PONTE",
104
+ "FACCETTA",
105
+ "INTARSIO",
106
+ "IMPIANTO",
107
+ ];
108
+ return requiresApp.some((s) => serviceCode.toUpperCase().includes(s));
109
+ }
110
+ /**
111
+ * Valida l'application in base al tipo.
112
+ * Ritorna un array di errori (può essere multiplo per BRIDGE).
113
+ */
114
+ function validateApplication(application) {
115
+ if (!application)
116
+ return null;
117
+ switch (application.type) {
118
+ case "TOOTH":
119
+ if (!isValidToothNumber(application.toothNumber)) {
120
+ return {
121
+ field: "application.toothNumber",
122
+ message: "Numero dente non valido (deve essere tra 11 e 48)",
123
+ };
124
+ }
125
+ break;
126
+ case "MULTI_TOOTH": {
127
+ if (!application.teeth || application.teeth.length === 0) {
128
+ return {
129
+ field: "application.teeth",
130
+ message: "Selezionare almeno un dente",
131
+ };
132
+ }
133
+ // Tutti validi
134
+ const invalidTooth = application.teeth.find((t) => !isValidToothNumber(t));
135
+ if (invalidTooth !== undefined) {
136
+ return {
137
+ field: "application.teeth",
138
+ message: `Numero dente non valido: ${invalidTooth}`,
139
+ };
140
+ }
141
+ // Nessun duplicato
142
+ const uniqueTeeth = new Set(application.teeth);
143
+ if (uniqueTeeth.size !== application.teeth.length) {
144
+ return {
145
+ field: "application.teeth",
146
+ message: "Sono presenti denti duplicati",
147
+ };
148
+ }
149
+ break;
150
+ }
151
+ case "BRIDGE": {
152
+ if (!application.teeth || application.teeth.length < 2) {
153
+ return {
154
+ field: "application.teeth",
155
+ message: "Un ponte richiede almeno 2 denti",
156
+ };
157
+ }
158
+ // Tutti i numeri validi
159
+ const invalidBridgeTooth = application.teeth.find((t) => !isValidToothNumber(t.toothNumber));
160
+ if (invalidBridgeTooth) {
161
+ return {
162
+ field: "application.teeth",
163
+ message: `Numero dente non valido nel ponte: ${invalidBridgeTooth.toothNumber}`,
164
+ };
165
+ }
166
+ // Nessun duplicato
167
+ const bridgeNumbers = application.teeth.map((t) => t.toothNumber);
168
+ const uniqueBridge = new Set(bridgeNumbers);
169
+ if (uniqueBridge.size !== bridgeNumbers.length) {
170
+ return {
171
+ field: "application.teeth",
172
+ message: "Sono presenti denti duplicati nel ponte",
173
+ };
174
+ }
175
+ // Tutti contigui nella stessa arcata
176
+ if (!canFormBridge(bridgeNumbers)) {
177
+ return {
178
+ field: "application.teeth",
179
+ message: "I denti del ponte devono essere tutti adiacenti nella stessa arcata",
180
+ };
181
+ }
182
+ // Primo e ultimo nell'ordine devono essere pilastri
183
+ const sorted = sortTeethByArchPosition(bridgeNumbers);
184
+ const first = application.teeth.find((t) => t.toothNumber === sorted[0]);
185
+ const last = application.teeth.find((t) => t.toothNumber === sorted[sorted.length - 1]);
186
+ if (first?.role !== "abutment" || last?.role !== "abutment") {
187
+ return {
188
+ field: "application.teeth",
189
+ message: "Il primo e l'ultimo dente del ponte devono essere pilastri (abutment)",
190
+ };
191
+ }
192
+ // Almeno 2 pilastri
193
+ const abutmentCount = application.teeth.filter((t) => t.role === "abutment").length;
194
+ if (abutmentCount < 2) {
195
+ return {
196
+ field: "application.teeth",
197
+ message: "Il ponte richiede almeno 2 denti pilastro (abutment)",
198
+ };
199
+ }
200
+ break;
201
+ }
202
+ case "QUADRANT":
203
+ if (application.quadrant < 1 || application.quadrant > 4) {
204
+ return {
205
+ field: "application.quadrant",
206
+ message: "Quadrante non valido (deve essere 1-4)",
207
+ };
208
+ }
209
+ break;
210
+ case "SEXTANT":
211
+ if (application.sextant < 1 || application.sextant > 6) {
212
+ return {
213
+ field: "application.sextant",
214
+ message: "Sestante non valido (deve essere 1-6)",
215
+ };
216
+ }
217
+ break;
218
+ case "ARCH":
219
+ if (!["UPPER", "LOWER"].includes(application.arch)) {
220
+ return {
221
+ field: "application.arch",
222
+ message: "Arcata non valida (deve essere UPPER o LOWER)",
223
+ };
224
+ }
225
+ break;
226
+ case "FULL_MOUTH":
227
+ break;
228
+ }
229
+ return null;
230
+ }
231
+ /**
232
+ * Valuta regole custom (placeholder per estensioni future).
233
+ */
234
+ function evaluateCustomRule(clinicalData, rule) {
235
+ // Esempio: "corona-requires-tooth"
236
+ if (rule === "corona-requires-tooth") {
237
+ const serviceCode = clinicalData.prostheticService?.serviceCode;
238
+ if (serviceCode?.toUpperCase().includes("CORONA")) {
239
+ return clinicalData.application?.type !== "TOOTH";
240
+ }
241
+ }
242
+ return false;
243
+ }
244
+ /**
245
+ * Valida che le fasi richieste siano completate.
246
+ */
247
+ export function validatePhaseCompletion(phases, phaseStatuses, clinicalData, conditions) {
248
+ const errors = [];
249
+ // Determina quali fasi sono required in base alle condizioni
250
+ const requiredPhases = new Set();
251
+ for (const phase of phases) {
252
+ if (phase.required) {
253
+ requiredPhases.add(phase.phaseTypeKey);
254
+ }
255
+ }
256
+ // Applica condizioni
257
+ for (const condition of conditions) {
258
+ if (evaluateCondition(clinicalData, condition.when)) {
259
+ if (condition.then.setPhaseRequired) {
260
+ if (condition.then.setPhaseRequired.required) {
261
+ requiredPhases.add(condition.then.setPhaseRequired.phaseTypeKey);
262
+ }
263
+ else {
264
+ requiredPhases.delete(condition.then.setPhaseRequired.phaseTypeKey);
265
+ }
266
+ }
267
+ }
268
+ }
269
+ // Verifica completamento
270
+ for (const phaseKey of requiredPhases) {
271
+ const status = phaseStatuses.get(phaseKey);
272
+ if (!status || !["DONE_OK", "SKIPPED"].includes(status)) {
273
+ const phase = phases.find((p) => p.phaseTypeKey === phaseKey);
274
+ errors.push({
275
+ field: `phase.${phaseKey}`,
276
+ message: `La fase "${phase?.label || phaseKey}" è obbligatoria`,
277
+ });
278
+ }
279
+ }
280
+ return errors;
281
+ }
282
+ /**
283
+ * Valida i requisiti per una prescrizione digitale.
284
+ * Se il tipo è DIGITAL, deve avere almeno 1 file STL.
285
+ */
286
+ export function validateDigitalRequirements(prescriptionType, digitalAssets) {
287
+ const errors = [];
288
+ // Default a ANALOG se non specificato
289
+ const type = prescriptionType || "ANALOG";
290
+ if (type === "DIGITAL") {
291
+ const assets = digitalAssets || [];
292
+ if (assets.length === 0) {
293
+ errors.push({
294
+ field: "digitalAssets",
295
+ message: "Le prescrizioni digitali richiedono almeno un file STL",
296
+ });
297
+ }
298
+ }
299
+ return errors;
300
+ }
301
+ /**
302
+ * Verifica che un utente possa eseguire un'azione.
303
+ */
304
+ export function canUserPerformAction(userRole, action, prescriptionStatus) {
305
+ const rules = {
306
+ SECRETARY: {
307
+ create: ["*"], // Può sempre creare
308
+ updateDraft: ["DRAFT"],
309
+ submit: ["DRAFT"],
310
+ cancel: ["DRAFT", "PENDING_DOCTOR"],
311
+ },
312
+ DOCTOR: {
313
+ updateDraft: ["DRAFT", "PENDING_DOCTOR"],
314
+ sign: ["PENDING_DOCTOR"],
315
+ revise: ["SIGNED", "ERROR"],
316
+ },
317
+ };
318
+ const allowedStatuses = rules[userRole]?.[action];
319
+ if (!allowedStatuses) {
320
+ return {
321
+ allowed: false,
322
+ reason: `L'azione "${action}" non è permessa per il ruolo ${userRole}`,
323
+ };
324
+ }
325
+ if (allowedStatuses.includes("*") || allowedStatuses.includes(prescriptionStatus)) {
326
+ return { allowed: true };
327
+ }
328
+ return {
329
+ allowed: false,
330
+ reason: `L'azione "${action}" non è permessa nello stato ${prescriptionStatus}`,
331
+ };
332
+ }
333
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../convex/lib/validation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Genera un URL per l'upload di un file STL.
3
+ * Il client usa questo URL per caricare direttamente il file.
4
+ */
5
+ export declare const generateStlUploadUrl: import("convex/server").RegisteredMutation<"public", {
6
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
7
+ }, Promise<{
8
+ uploadUrl: string;
9
+ }>>;
10
+ /**
11
+ * Conferma l'upload di un file STL.
12
+ * Chiamato dopo che il client ha caricato il file sull'URL generato.
13
+ */
14
+ export declare const confirmStlUpload: import("convex/server").RegisteredMutation<"public", {
15
+ description?: string | undefined;
16
+ fileName: string;
17
+ fileSize: number;
18
+ mimeType: string;
19
+ storageId: string;
20
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
21
+ }, Promise<{
22
+ success: boolean;
23
+ asset: import("../lib/storage").DigitalAsset;
24
+ }>>;
25
+ /**
26
+ * Elimina un file STL da una prescrizione.
27
+ */
28
+ export declare const deleteStlFile: import("convex/server").RegisteredMutation<"public", {
29
+ assetId: string;
30
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
31
+ }, Promise<{
32
+ success: boolean;
33
+ }>>;
34
+ /**
35
+ * Cambia il tipo di prescrizione (ANALOG <-> DIGITAL).
36
+ * Solo in stato DRAFT.
37
+ */
38
+ export declare const setPrescriptionType: import("convex/server").RegisteredMutation<"public", {
39
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
40
+ prescriptionType: "ANALOG" | "DIGITAL";
41
+ }, Promise<{
42
+ success: boolean;
43
+ }>>;
44
+ /**
45
+ * Aggiorna la descrizione di un file STL.
46
+ */
47
+ export declare const updateStlDescription: import("convex/server").RegisteredMutation<"public", {
48
+ assetId: string;
49
+ description: string;
50
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
51
+ }, Promise<{
52
+ success: boolean;
53
+ }>>;
54
+ //# sourceMappingURL=digitalAssets.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"digitalAssets.d.ts","sourceRoot":"","sources":["../../../convex/mutations/digitalAssets.ts"],"names":[],"mappings":"AAiBA;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;GAmC/B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;GA8E3B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,aAAa;;;;;GAqExB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;GA2D9B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;;;;GAyD/B,CAAC"}