@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,334 @@
1
+ import { mutation } from "../_generated/server";
2
+ import { ConvexError, v } from "convex/values";
3
+ import { generateIdempotencyKey } from "../lib/utils";
4
+ import { requireIdentityUser, assertPrescriptionAccess } from "../lib/auth";
5
+ // ============================================
6
+ // PHASE MUTATIONS
7
+ // ============================================
8
+ // Helper per ottenere prescriptionRef (supporta sia vecchio che nuovo nome)
9
+ function getPrescriptionRef(doc) {
10
+ const ref = doc.prescriptionRef ?? doc.prescriptionId;
11
+ if (!ref)
12
+ throw new Error("Riferimento alla prescrizione non trovato");
13
+ return ref;
14
+ }
15
+ /**
16
+ * Aggiorna il feedback di una fase.
17
+ * Enforcement forward-only (non si può tornare indietro).
18
+ */
19
+ export const updateFeedback = mutation({
20
+ args: {
21
+ phaseInstanceId: v.id("phaseInstances"),
22
+ outcome: v.union(v.literal("OK"), v.literal("KO"), v.null()),
23
+ comment: v.optional(v.string()),
24
+ },
25
+ handler: async (ctx, args) => {
26
+ const now = Date.now();
27
+ let user;
28
+ try {
29
+ user = await requireIdentityUser(ctx);
30
+ }
31
+ catch (error) {
32
+ if (error instanceof ConvexError)
33
+ throw error;
34
+ throw new ConvexError({ code: "UNAUTHORIZED", message: "Accesso non autorizzato" });
35
+ }
36
+ // 1. Carica fase
37
+ const phase = await ctx.db.get(args.phaseInstanceId);
38
+ if (!phase) {
39
+ throw new Error("Fase non trovata");
40
+ }
41
+ // 2. Carica prescrizione per verifiche
42
+ const prescriptionRef = getPrescriptionRef(phase);
43
+ const prescription = await ctx.db.get(prescriptionRef);
44
+ if (!prescription) {
45
+ throw new Error("Prescrizione non trovata");
46
+ }
47
+ assertPrescriptionAccess(user, prescription);
48
+ // 3. Verifica stato prescrizione
49
+ if (!["SIGNED", "SYNCED"].includes(prescription.status)) {
50
+ throw new Error(`Non è possibile aggiornare le fasi di una prescrizione in stato ${prescription.status}`);
51
+ }
52
+ // 4. Enforcement forward-only
53
+ // Se la fase è già DONE_OK o DONE_KO, non si può cambiare outcome
54
+ if (["DONE_OK", "DONE_KO"].includes(phase.status) && args.outcome !== null) {
55
+ // Può solo aggiungere commenti, non cambiare outcome
56
+ if (phase.feedback?.outcome !== args.outcome) {
57
+ throw new Error("Non è possibile modificare l'esito di una fase già completata");
58
+ }
59
+ }
60
+ // 6. Calcola nuovo status
61
+ let newStatus = phase.status;
62
+ if (args.outcome === "OK") {
63
+ newStatus = "DONE_OK";
64
+ }
65
+ else if (args.outcome === "KO") {
66
+ newStatus = "DONE_KO";
67
+ }
68
+ // 7. Aggiorna fase
69
+ await ctx.db.patch(args.phaseInstanceId, {
70
+ status: newStatus,
71
+ feedback: {
72
+ outcome: args.outcome,
73
+ comment: args.comment,
74
+ updatedBy: user._id,
75
+ updatedAt: now,
76
+ },
77
+ updatedAt: now,
78
+ });
79
+ // 8. Audit
80
+ await ctx.db.insert("auditEvents", {
81
+ auditEventId: 0, // Will be backfilled
82
+ prescriptionRef: prescriptionRef,
83
+ at: now,
84
+ actorUserId: user._id,
85
+ actorRole: user.role,
86
+ type: "PHASE_FEEDBACK_UPDATED",
87
+ payload: {
88
+ phaseTypeKey: phase.phaseTypeKey,
89
+ ordinal: phase.ordinal,
90
+ outcome: args.outcome,
91
+ comment: args.comment,
92
+ newStatus,
93
+ },
94
+ });
95
+ return { success: true, newStatus };
96
+ },
97
+ });
98
+ /**
99
+ * Schedula un appuntamento per una fase.
100
+ * Crea un sync job per PrimoCore.
101
+ */
102
+ export const scheduleAppointment = mutation({
103
+ args: {
104
+ phaseInstanceId: v.id("phaseInstances"),
105
+ startAt: v.number(),
106
+ endAt: v.number(),
107
+ doctorId: v.string(),
108
+ },
109
+ handler: async (ctx, args) => {
110
+ const now = Date.now();
111
+ let user;
112
+ try {
113
+ user = await requireIdentityUser(ctx);
114
+ }
115
+ catch (error) {
116
+ if (error instanceof ConvexError)
117
+ throw error;
118
+ throw new ConvexError({ code: "UNAUTHORIZED", message: "Accesso non autorizzato" });
119
+ }
120
+ // 1. Carica fase
121
+ const phase = await ctx.db.get(args.phaseInstanceId);
122
+ if (!phase) {
123
+ throw new Error("Fase non trovata");
124
+ }
125
+ // 2. Carica prescrizione
126
+ const prescriptionRef = getPrescriptionRef(phase);
127
+ const prescription = await ctx.db.get(prescriptionRef);
128
+ if (!prescription) {
129
+ throw new Error("Prescrizione non trovata");
130
+ }
131
+ assertPrescriptionAccess(user, prescription);
132
+ // 3. Aggiorna fase con appuntamento
133
+ await ctx.db.patch(args.phaseInstanceId, {
134
+ status: "SCHEDULED",
135
+ appointment: {
136
+ startAt: args.startAt,
137
+ endAt: args.endAt,
138
+ doctorId: args.doctorId,
139
+ },
140
+ updatedAt: now,
141
+ });
142
+ // 4. Crea sync job per PrimoCore
143
+ const idempotencyKey = generateIdempotencyKey(prescription._id, args.phaseInstanceId, String(phase.iteration), "UPSERT_APPOINTMENT");
144
+ const syncJobId = await ctx.db.insert("syncJobs", {
145
+ syncJobId: 0, // Will be backfilled
146
+ prescriptionRef: prescription._id,
147
+ target: "PRIMOCORE",
148
+ kind: "UPSERT_APPOINTMENT",
149
+ idempotencyKey,
150
+ requestPayload: {
151
+ phaseInstanceId: args.phaseInstanceId,
152
+ phaseTypeKey: phase.phaseTypeKey,
153
+ startAt: args.startAt,
154
+ endAt: args.endAt,
155
+ doctorId: args.doctorId,
156
+ patientId: prescription.patientId,
157
+ clinicId: prescription.clinicId,
158
+ },
159
+ status: "PENDING",
160
+ attempts: 0,
161
+ nextRetryAt: now,
162
+ createdAt: now,
163
+ updatedAt: now,
164
+ });
165
+ // 5. Audit
166
+ await ctx.db.insert("auditEvents", {
167
+ auditEventId: 0, // Will be backfilled
168
+ prescriptionRef: prescription._id,
169
+ at: now,
170
+ actorUserId: user._id,
171
+ actorRole: user.role,
172
+ type: "PHASE_APPOINTMENT_SCHEDULED",
173
+ payload: {
174
+ phaseTypeKey: phase.phaseTypeKey,
175
+ ordinal: phase.ordinal,
176
+ startAt: args.startAt,
177
+ endAt: args.endAt,
178
+ doctorId: args.doctorId,
179
+ syncJobId,
180
+ },
181
+ });
182
+ return { success: true, syncJobId };
183
+ },
184
+ });
185
+ /**
186
+ * Ripete una fase (se repeatable).
187
+ */
188
+ export const repeatPhase = mutation({
189
+ args: {
190
+ phaseInstanceId: v.id("phaseInstances"),
191
+ reason: v.string(),
192
+ },
193
+ handler: async (ctx, args) => {
194
+ const now = Date.now();
195
+ let user;
196
+ try {
197
+ user = await requireIdentityUser(ctx);
198
+ }
199
+ catch (error) {
200
+ if (error instanceof ConvexError)
201
+ throw error;
202
+ throw new ConvexError({ code: "UNAUTHORIZED", message: "Accesso non autorizzato" });
203
+ }
204
+ // 1. Carica fase
205
+ const phase = await ctx.db.get(args.phaseInstanceId);
206
+ if (!phase) {
207
+ throw new Error("Fase non trovata");
208
+ }
209
+ // 2. Carica prescrizione e flow
210
+ const prescriptionRef = getPrescriptionRef(phase);
211
+ const prescription = await ctx.db.get(prescriptionRef);
212
+ if (!prescription) {
213
+ throw new Error("Prescrizione non trovata");
214
+ }
215
+ assertPrescriptionAccess(user, prescription);
216
+ const flow = await ctx.db
217
+ .query("flows")
218
+ .withIndex("by_flowKey_version", (q) => q.eq("flowKey", prescription.flowKey).eq("version", prescription.flowVersion))
219
+ .first();
220
+ if (!flow) {
221
+ throw new Error("Flow non trovato");
222
+ }
223
+ // 3. Verifica che la fase sia repeatable
224
+ const phaseDefinition = flow.definition.phases.find((p) => p.phaseTypeKey === phase.phaseTypeKey);
225
+ if (!phaseDefinition?.repeatable) {
226
+ throw new Error("Questa fase non può essere ripetuta");
227
+ }
228
+ // 4. Marca fase corrente come REPEAT
229
+ await ctx.db.patch(args.phaseInstanceId, {
230
+ status: "REPEAT",
231
+ updatedAt: now,
232
+ });
233
+ // 5. Crea nuova istanza della fase
234
+ const newPhaseId = await ctx.db.insert("phaseInstances", {
235
+ phaseInstanceId: 0, // Will be backfilled
236
+ prescriptionRef: prescription._id,
237
+ phaseTypeKey: phase.phaseTypeKey,
238
+ ordinal: phase.ordinal,
239
+ iteration: phase.iteration + 1,
240
+ status: "NOT_STARTED",
241
+ createdAt: now,
242
+ updatedAt: now,
243
+ });
244
+ // 6. Audit
245
+ await ctx.db.insert("auditEvents", {
246
+ auditEventId: 0, // Will be backfilled
247
+ prescriptionRef: prescription._id,
248
+ at: now,
249
+ actorUserId: user._id,
250
+ actorRole: user.role,
251
+ type: "PHASE_REPEATED",
252
+ payload: {
253
+ phaseTypeKey: phase.phaseTypeKey,
254
+ previousIteration: phase.iteration,
255
+ newIteration: phase.iteration + 1,
256
+ reason: args.reason,
257
+ newPhaseId,
258
+ },
259
+ });
260
+ return { success: true, newPhaseId };
261
+ },
262
+ });
263
+ /**
264
+ * Salta una fase (se non required).
265
+ */
266
+ export const skipPhase = mutation({
267
+ args: {
268
+ phaseInstanceId: v.id("phaseInstances"),
269
+ reason: v.string(),
270
+ },
271
+ handler: async (ctx, args) => {
272
+ const now = Date.now();
273
+ let user;
274
+ try {
275
+ user = await requireIdentityUser(ctx);
276
+ }
277
+ catch (error) {
278
+ if (error instanceof ConvexError)
279
+ throw error;
280
+ throw new ConvexError({ code: "UNAUTHORIZED", message: "Accesso non autorizzato" });
281
+ }
282
+ // 1. Carica fase
283
+ const phase = await ctx.db.get(args.phaseInstanceId);
284
+ if (!phase) {
285
+ throw new Error("Fase non trovata");
286
+ }
287
+ // 2. Carica prescrizione e flow
288
+ const prescriptionRef = getPrescriptionRef(phase);
289
+ const prescription = await ctx.db.get(prescriptionRef);
290
+ if (!prescription) {
291
+ throw new Error("Prescrizione non trovata");
292
+ }
293
+ assertPrescriptionAccess(user, prescription);
294
+ const flow = await ctx.db
295
+ .query("flows")
296
+ .withIndex("by_flowKey_version", (q) => q.eq("flowKey", prescription.flowKey).eq("version", prescription.flowVersion))
297
+ .first();
298
+ if (!flow) {
299
+ throw new Error("Flow non trovato");
300
+ }
301
+ // 3. Verifica che la fase non sia required
302
+ const phaseDefinition = flow.definition.phases.find((p) => p.phaseTypeKey === phase.phaseTypeKey);
303
+ if (phaseDefinition?.required) {
304
+ throw new Error("Non è possibile saltare una fase obbligatoria");
305
+ }
306
+ // 4. Aggiorna stato fase
307
+ await ctx.db.patch(args.phaseInstanceId, {
308
+ status: "SKIPPED",
309
+ feedback: {
310
+ outcome: null,
311
+ comment: args.reason,
312
+ updatedBy: user._id,
313
+ updatedAt: now,
314
+ },
315
+ updatedAt: now,
316
+ });
317
+ // 5. Audit
318
+ await ctx.db.insert("auditEvents", {
319
+ auditEventId: 0, // Will be backfilled
320
+ prescriptionRef: prescription._id,
321
+ at: now,
322
+ actorUserId: user._id,
323
+ actorRole: user.role,
324
+ type: "PHASE_SKIPPED",
325
+ payload: {
326
+ phaseTypeKey: phase.phaseTypeKey,
327
+ ordinal: phase.ordinal,
328
+ reason: args.reason,
329
+ },
330
+ });
331
+ return { success: true };
332
+ },
333
+ });
334
+ //# sourceMappingURL=phases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phases.js","sourceRoot":"","sources":["../../../convex/mutations/phases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ import { Id } from "../_generated/dataModel";
2
+ /**
3
+ * Crea una nuova bozza di prescrizione.
4
+ *
5
+ * VINCOLO CRITICO: Una sola prescrizione attiva per pdcItemId
6
+ */
7
+ export declare const createDraft: import("convex/server").RegisteredMutation<"public", {
8
+ pdcItemId: string;
9
+ listinoId: string;
10
+ doctorId: string;
11
+ flowKey: string;
12
+ clinicId: string;
13
+ patientId: string;
14
+ }, Promise<{
15
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
16
+ revisionId: import("convex/values").GenericId<"clinicalRevisions">;
17
+ }>>;
18
+ /**
19
+ * Aggiorna i dati clinici (bozza).
20
+ * Solo se la revisione non è frozen.
21
+ */
22
+ export declare const updateClinicalDraft: import("convex/server").RegisteredMutation<"public", {
23
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
24
+ clinicalDataPatch: {
25
+ prostheticService?: {
26
+ serviceCode?: string | undefined;
27
+ serviceLabel?: string | undefined;
28
+ } | undefined;
29
+ application?: {
30
+ type: "TOOTH";
31
+ toothNumber: number;
32
+ } | {
33
+ type: "MULTI_TOOTH";
34
+ teeth: number[];
35
+ } | {
36
+ type: "BRIDGE";
37
+ teeth: {
38
+ toothNumber: number;
39
+ role: "abutment" | "pontic";
40
+ }[];
41
+ } | {
42
+ type: "QUADRANT";
43
+ quadrant: number;
44
+ } | {
45
+ type: "SEXTANT";
46
+ sextant: number;
47
+ } | {
48
+ type: "ARCH";
49
+ arch: "UPPER" | "LOWER";
50
+ } | {
51
+ type: "FULL_MOUTH";
52
+ } | null | undefined;
53
+ shade?: string | null | undefined;
54
+ notePreparazione?: string | null | undefined;
55
+ lineaMargine?: string | null | undefined;
56
+ };
57
+ }, Promise<{
58
+ ok: boolean;
59
+ success: boolean;
60
+ clinicalHash: string;
61
+ clinicalValidationErrors: import("../types").ValidationError[];
62
+ }>>;
63
+ /**
64
+ * Invia prescrizione al medico.
65
+ * Cambia status da DRAFT a PENDING_DOCTOR.
66
+ */
67
+ export declare const submitToDoctor: import("convex/server").RegisteredMutation<"public", {
68
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
69
+ }, Promise<{
70
+ success: boolean;
71
+ }>>;
72
+ /**
73
+ * Firma la prescrizione.
74
+ * Solo medico, solo in stato PENDING_DOCTOR.
75
+ */
76
+ export declare const signPrescription: import("convex/server").RegisteredMutation<"public", {
77
+ signaturePayload: string;
78
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
79
+ }, Promise<{
80
+ success: boolean;
81
+ clinicalHash: string;
82
+ syncJobIds: Id<"syncJobs">[];
83
+ }>>;
84
+ /**
85
+ * Invia la prescrizione al laboratorio.
86
+ * Questa mutation semplifica il flusso: passa direttamente da DRAFT a SIGNED
87
+ * senza richiedere la firma del medico (auto-firma simulata).
88
+ */
89
+ export declare const sendToLab: import("convex/server").RegisteredMutation<"public", {
90
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
91
+ }, Promise<{
92
+ success: boolean;
93
+ clinicalHash: string;
94
+ syncJobIds: Id<"syncJobs">[];
95
+ }>>;
96
+ /**
97
+ * Crea una nuova revisione dopo la firma.
98
+ * Permette di modificare una prescrizione già firmata.
99
+ */
100
+ export declare const reviseAfterSignature: import("convex/server").RegisteredMutation<"public", {
101
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
102
+ reason: string;
103
+ }, Promise<{
104
+ success: boolean;
105
+ newRevisionId: import("convex/values").GenericId<"clinicalRevisions">;
106
+ newRevisionNumber: number;
107
+ }>>;
108
+ /**
109
+ * Annulla una prescrizione.
110
+ */
111
+ export declare const cancelPrescription: import("convex/server").RegisteredMutation<"public", {
112
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
113
+ reason: string;
114
+ }, Promise<{
115
+ success: boolean;
116
+ }>>;
117
+ /**
118
+ * Marca una prescrizione come spedita al laboratorio.
119
+ * Per prescrizioni analogiche: traccia quando l'impronta fisica viene spedita.
120
+ */
121
+ export declare const markAsShipped: import("convex/server").RegisteredMutation<"public", {
122
+ trackingNumber?: string | undefined;
123
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
124
+ }, Promise<{
125
+ success: boolean;
126
+ shippedAt: number;
127
+ }>>;
128
+ /**
129
+ * Rimuove il flag di spedizione (annulla spedizione).
130
+ */
131
+ export declare const unmarkAsShipped: import("convex/server").RegisteredMutation<"public", {
132
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
133
+ }, Promise<{
134
+ success: boolean;
135
+ }>>;
136
+ /**
137
+ * Crea una prescrizione automaticamente quando il Calendario crea un appuntamento.
138
+ *
139
+ * CARATTERISTICHE:
140
+ * - Usa idempotencyKey per evitare duplicati (se la chiamata viene ritentata)
141
+ * - Salva uno snapshot dei dati dal Calendario (calendarData)
142
+ * - Pre-compila i dati clinici con le info disponibili
143
+ * - Ritorna la prescrizione esistente se idempotencyKey già usata
144
+ *
145
+ * @param idempotencyKey - Chiave univoca (es: "cal-{appointmentId}")
146
+ * @param calendarData - Snapshot dei dati dal Calendario
147
+ * @param clinicId, patientId, etc. - ID per i riferimenti
148
+ */
149
+ export declare const createFromCalendar: import("convex/server").RegisteredMutation<"public", {
150
+ flowKey?: string | undefined;
151
+ pdcItemId: string;
152
+ listinoId: string;
153
+ doctorId: string;
154
+ clinicId: string;
155
+ patientId: string;
156
+ idempotencyKey: string;
157
+ calendarData: {
158
+ toothNumber?: string | undefined;
159
+ treatmentPlanName?: string | undefined;
160
+ nextAppointmentId?: string | undefined;
161
+ nextAppointmentDate?: number | undefined;
162
+ nextAppointmentPhaseId?: string | undefined;
163
+ nextAppointmentPhaseName?: string | undefined;
164
+ application: string;
165
+ patientFirstName: string;
166
+ patientLastName: string;
167
+ clinicName: string;
168
+ treatmentPlanId: string;
169
+ treatmentId: string;
170
+ treatmentName: string;
171
+ phaseId: string;
172
+ phaseName: string;
173
+ appointmentId: string;
174
+ appointmentDate: number;
175
+ operatorId: string;
176
+ operatorName: string;
177
+ };
178
+ }, Promise<{
179
+ success: boolean;
180
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
181
+ alreadyExisted: boolean;
182
+ message: string;
183
+ revisionId?: undefined;
184
+ } | {
185
+ success: boolean;
186
+ prescriptionId: import("convex/values").GenericId<"prescriptions">;
187
+ revisionId: import("convex/values").GenericId<"clinicalRevisions">;
188
+ alreadyExisted: boolean;
189
+ message: string;
190
+ }>>;
191
+ //# sourceMappingURL=prescriptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prescriptions.d.ts","sourceRoot":"","sources":["../../../convex/mutations/prescriptions.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,yBAAyB,CAAC;AAkE7C;;;;GAIG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;GA4JtB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+L9B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,cAAc;;;;GAqDzB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,gBAAgB;;;;;;;GAoK3B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,SAAS;;;;;;GAyMpB,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,oBAAoB;;;;;;;GAkF/B,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;GAiD7B,CAAC;AAEH;;;GAGG;AACH,eAAO,MAAM,aAAa;;;;;;GAgExB,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,eAAe;;;;GAsD1B,CAAC;AAMH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsV7B,CAAC"}