@primocaredentgroup/elettromedicali 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 (197) hide show
  1. package/dist/client/index.d.ts +72 -0
  2. package/dist/client/index.d.ts.map +1 -0
  3. package/dist/client/index.js +233 -0
  4. package/dist/client/index.js.map +1 -0
  5. package/dist/component/_generated/api.d.ts +94 -0
  6. package/dist/component/_generated/api.d.ts.map +1 -0
  7. package/dist/component/_generated/api.js +31 -0
  8. package/dist/component/_generated/api.js.map +1 -0
  9. package/dist/component/_generated/component.d.ts +1444 -0
  10. package/dist/component/_generated/component.d.ts.map +1 -0
  11. package/dist/component/_generated/component.js +11 -0
  12. package/dist/component/_generated/component.js.map +1 -0
  13. package/dist/component/_generated/dataModel.d.ts +46 -0
  14. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  15. package/dist/component/_generated/dataModel.js +11 -0
  16. package/dist/component/_generated/dataModel.js.map +1 -0
  17. package/dist/component/_generated/server.d.ts +121 -0
  18. package/dist/component/_generated/server.d.ts.map +1 -0
  19. package/dist/component/_generated/server.js +78 -0
  20. package/dist/component/_generated/server.js.map +1 -0
  21. package/dist/component/apiKeys.d.ts +69 -0
  22. package/dist/component/apiKeys.d.ts.map +1 -0
  23. package/dist/component/apiKeys.js +207 -0
  24. package/dist/component/apiKeys.js.map +1 -0
  25. package/dist/component/clinics.d.ts +103 -0
  26. package/dist/component/clinics.d.ts.map +1 -0
  27. package/dist/component/clinics.js +126 -0
  28. package/dist/component/clinics.js.map +1 -0
  29. package/dist/component/contracts.d.ts +85 -0
  30. package/dist/component/contracts.d.ts.map +1 -0
  31. package/dist/component/contracts.js +115 -0
  32. package/dist/component/contracts.js.map +1 -0
  33. package/dist/component/convex.config.d.ts +3 -0
  34. package/dist/component/convex.config.d.ts.map +1 -0
  35. package/dist/component/convex.config.js +3 -0
  36. package/dist/component/convex.config.js.map +1 -0
  37. package/dist/component/crons.d.ts +3 -0
  38. package/dist/component/crons.d.ts.map +1 -0
  39. package/dist/component/crons.js +7 -0
  40. package/dist/component/crons.js.map +1 -0
  41. package/dist/component/dashboardStats.d.ts +14 -0
  42. package/dist/component/dashboardStats.d.ts.map +1 -0
  43. package/dist/component/dashboardStats.js +136 -0
  44. package/dist/component/dashboardStats.js.map +1 -0
  45. package/dist/component/dashboardStatsCache.d.ts +32 -0
  46. package/dist/component/dashboardStatsCache.d.ts.map +1 -0
  47. package/dist/component/dashboardStatsCache.js +129 -0
  48. package/dist/component/dashboardStatsCache.js.map +1 -0
  49. package/dist/component/deviceCategories.d.ts +108 -0
  50. package/dist/component/deviceCategories.d.ts.map +1 -0
  51. package/dist/component/deviceCategories.js +254 -0
  52. package/dist/component/deviceCategories.js.map +1 -0
  53. package/dist/component/deviceQuestions.d.ts +129 -0
  54. package/dist/component/deviceQuestions.d.ts.map +1 -0
  55. package/dist/component/deviceQuestions.js +175 -0
  56. package/dist/component/deviceQuestions.js.map +1 -0
  57. package/dist/component/deviceRepairHistory.d.ts +30 -0
  58. package/dist/component/deviceRepairHistory.d.ts.map +1 -0
  59. package/dist/component/deviceRepairHistory.js +84 -0
  60. package/dist/component/deviceRepairHistory.js.map +1 -0
  61. package/dist/component/deviceStatus.d.ts +63 -0
  62. package/dist/component/deviceStatus.d.ts.map +1 -0
  63. package/dist/component/deviceStatus.js +58 -0
  64. package/dist/component/deviceStatus.js.map +1 -0
  65. package/dist/component/devices.d.ts +299 -0
  66. package/dist/component/devices.d.ts.map +1 -0
  67. package/dist/component/devices.js +587 -0
  68. package/dist/component/devices.js.map +1 -0
  69. package/dist/component/emailHelpers.d.ts +17 -0
  70. package/dist/component/emailHelpers.d.ts.map +1 -0
  71. package/dist/component/emailHelpers.js +39 -0
  72. package/dist/component/emailHelpers.js.map +1 -0
  73. package/dist/component/emails.d.ts +56 -0
  74. package/dist/component/emails.d.ts.map +1 -0
  75. package/dist/component/emails.js +58 -0
  76. package/dist/component/emails.js.map +1 -0
  77. package/dist/component/http.d.ts +3 -0
  78. package/dist/component/http.d.ts.map +1 -0
  79. package/dist/component/http.js +229 -0
  80. package/dist/component/http.js.map +1 -0
  81. package/dist/component/maintenanceTasks.d.ts +733 -0
  82. package/dist/component/maintenanceTasks.d.ts.map +1 -0
  83. package/dist/component/maintenanceTasks.js +937 -0
  84. package/dist/component/maintenanceTasks.js.map +1 -0
  85. package/dist/component/roles.d.ts +75 -0
  86. package/dist/component/roles.d.ts.map +1 -0
  87. package/dist/component/roles.js +98 -0
  88. package/dist/component/roles.js.map +1 -0
  89. package/dist/component/schema.d.ts +1295 -0
  90. package/dist/component/schema.d.ts.map +1 -0
  91. package/dist/component/schema.js +724 -0
  92. package/dist/component/schema.js.map +1 -0
  93. package/dist/component/slaMonitoring.d.ts +32 -0
  94. package/dist/component/slaMonitoring.d.ts.map +1 -0
  95. package/dist/component/slaMonitoring.js +111 -0
  96. package/dist/component/slaMonitoring.js.map +1 -0
  97. package/dist/component/slaRules.d.ts +72 -0
  98. package/dist/component/slaRules.d.ts.map +1 -0
  99. package/dist/component/slaRules.js +193 -0
  100. package/dist/component/slaRules.js.map +1 -0
  101. package/dist/component/sparePartOrders.d.ts +177 -0
  102. package/dist/component/sparePartOrders.d.ts.map +1 -0
  103. package/dist/component/sparePartOrders.js +243 -0
  104. package/dist/component/sparePartOrders.js.map +1 -0
  105. package/dist/component/spareParts.d.ts +472 -0
  106. package/dist/component/spareParts.d.ts.map +1 -0
  107. package/dist/component/spareParts.js +319 -0
  108. package/dist/component/spareParts.js.map +1 -0
  109. package/dist/component/supplierCategories.d.ts +22 -0
  110. package/dist/component/supplierCategories.d.ts.map +1 -0
  111. package/dist/component/supplierCategories.js +64 -0
  112. package/dist/component/supplierCategories.js.map +1 -0
  113. package/dist/component/suppliers.d.ts +94 -0
  114. package/dist/component/suppliers.d.ts.map +1 -0
  115. package/dist/component/suppliers.js +195 -0
  116. package/dist/component/suppliers.js.map +1 -0
  117. package/dist/component/ticketComments.d.ts +89 -0
  118. package/dist/component/ticketComments.d.ts.map +1 -0
  119. package/dist/component/ticketComments.js +246 -0
  120. package/dist/component/ticketComments.js.map +1 -0
  121. package/dist/component/ticketCustomFields.d.ts +149 -0
  122. package/dist/component/ticketCustomFields.d.ts.map +1 -0
  123. package/dist/component/ticketCustomFields.js +215 -0
  124. package/dist/component/ticketCustomFields.js.map +1 -0
  125. package/dist/component/ticketExport.d.ts +83 -0
  126. package/dist/component/ticketExport.d.ts.map +1 -0
  127. package/dist/component/ticketExport.js +182 -0
  128. package/dist/component/ticketExport.js.map +1 -0
  129. package/dist/component/ticketHistory.d.ts +57 -0
  130. package/dist/component/ticketHistory.d.ts.map +1 -0
  131. package/dist/component/ticketHistory.js +81 -0
  132. package/dist/component/ticketHistory.js.map +1 -0
  133. package/dist/component/ticketMacros.d.ts +141 -0
  134. package/dist/component/ticketMacros.d.ts.map +1 -0
  135. package/dist/component/ticketMacros.js +255 -0
  136. package/dist/component/ticketMacros.js.map +1 -0
  137. package/dist/component/ticketStatuses.d.ts +60 -0
  138. package/dist/component/ticketStatuses.d.ts.map +1 -0
  139. package/dist/component/ticketStatuses.js +110 -0
  140. package/dist/component/ticketStatuses.js.map +1 -0
  141. package/dist/component/ticketTriggers.d.ts +408 -0
  142. package/dist/component/ticketTriggers.d.ts.map +1 -0
  143. package/dist/component/ticketTriggers.js +941 -0
  144. package/dist/component/ticketTriggers.js.map +1 -0
  145. package/dist/component/userProfiles.d.ts +259 -0
  146. package/dist/component/userProfiles.d.ts.map +1 -0
  147. package/dist/component/userProfiles.js +634 -0
  148. package/dist/component/userProfiles.js.map +1 -0
  149. package/dist/component/vendorArticles.d.ts +64 -0
  150. package/dist/component/vendorArticles.d.ts.map +1 -0
  151. package/dist/component/vendorArticles.js +116 -0
  152. package/dist/component/vendorArticles.js.map +1 -0
  153. package/dist/test.d.ts +1302 -0
  154. package/dist/test.d.ts.map +1 -0
  155. package/dist/test.js +7 -0
  156. package/dist/test.js.map +1 -0
  157. package/package.json +71 -0
  158. package/src/client/index.ts +344 -0
  159. package/src/component/_generated/api.ts +110 -0
  160. package/src/component/_generated/component.ts +2460 -0
  161. package/src/component/_generated/dataModel.ts +60 -0
  162. package/src/component/_generated/server.ts +156 -0
  163. package/src/component/apiKeys.ts +229 -0
  164. package/src/component/clinics.ts +136 -0
  165. package/src/component/contracts.ts +136 -0
  166. package/src/component/convex.config.js +2 -0
  167. package/src/component/convex.config.ts +3 -0
  168. package/src/component/crons.ts +18 -0
  169. package/src/component/dashboardStats.ts +141 -0
  170. package/src/component/dashboardStatsCache.ts +145 -0
  171. package/src/component/deviceCategories.ts +280 -0
  172. package/src/component/deviceQuestions.ts +225 -0
  173. package/src/component/deviceRepairHistory.ts +94 -0
  174. package/src/component/deviceStatus.ts +79 -0
  175. package/src/component/devices.ts +645 -0
  176. package/src/component/emailHelpers.ts +38 -0
  177. package/src/component/emails.ts +61 -0
  178. package/src/component/http.ts +231 -0
  179. package/src/component/maintenanceTasks.ts +1003 -0
  180. package/src/component/roles.ts +99 -0
  181. package/src/component/schema.ts +842 -0
  182. package/src/component/slaMonitoring.ts +125 -0
  183. package/src/component/slaRules.ts +231 -0
  184. package/src/component/sparePartOrders.ts +290 -0
  185. package/src/component/spareParts.ts +362 -0
  186. package/src/component/supplierCategories.ts +65 -0
  187. package/src/component/suppliers.ts +234 -0
  188. package/src/component/ticketComments.ts +288 -0
  189. package/src/component/ticketCustomFields.ts +260 -0
  190. package/src/component/ticketExport.ts +220 -0
  191. package/src/component/ticketHistory.ts +106 -0
  192. package/src/component/ticketMacros.ts +291 -0
  193. package/src/component/ticketStatuses.ts +109 -0
  194. package/src/component/ticketTriggers.ts +1152 -0
  195. package/src/component/userProfiles.ts +745 -0
  196. package/src/component/vendorArticles.ts +139 -0
  197. package/src/test.ts +15 -0
@@ -0,0 +1,149 @@
1
+ export declare const listActiveCustomFieldsForDevice: import("convex/server").RegisteredQuery<"public", {
2
+ deviceId: import("convex/values").GenericId<"devices">;
3
+ }, Promise<{
4
+ _id: import("convex/values").GenericId<"ticket_custom_fields">;
5
+ _creationTime: number;
6
+ categories?: string[] | undefined;
7
+ options?: string[] | undefined;
8
+ placeholder?: string | undefined;
9
+ helpText?: string | undefined;
10
+ deviceIds?: import("convex/values").GenericId<"devices">[] | undefined;
11
+ parentFieldId?: import("convex/values").GenericId<"ticket_custom_fields"> | undefined;
12
+ parentFieldValue?: string | undefined;
13
+ childFields?: {
14
+ parentValue: string;
15
+ childFieldIds: import("convex/values").GenericId<"ticket_custom_fields">[];
16
+ }[] | undefined;
17
+ name: string;
18
+ createdAt: number;
19
+ isActive: boolean;
20
+ updatedAt: number;
21
+ order: number;
22
+ fieldType: "number" | "text" | "textarea" | "select" | "multiselect" | "date" | "checkbox" | "radio";
23
+ isRequired: boolean;
24
+ applyToAll: boolean;
25
+ }[]>>;
26
+ export declare const listActiveCustomFields: import("convex/server").RegisteredQuery<"public", {}, Promise<{
27
+ _id: import("convex/values").GenericId<"ticket_custom_fields">;
28
+ _creationTime: number;
29
+ categories?: string[] | undefined;
30
+ options?: string[] | undefined;
31
+ placeholder?: string | undefined;
32
+ helpText?: string | undefined;
33
+ deviceIds?: import("convex/values").GenericId<"devices">[] | undefined;
34
+ parentFieldId?: import("convex/values").GenericId<"ticket_custom_fields"> | undefined;
35
+ parentFieldValue?: string | undefined;
36
+ childFields?: {
37
+ parentValue: string;
38
+ childFieldIds: import("convex/values").GenericId<"ticket_custom_fields">[];
39
+ }[] | undefined;
40
+ name: string;
41
+ createdAt: number;
42
+ isActive: boolean;
43
+ updatedAt: number;
44
+ order: number;
45
+ fieldType: "number" | "text" | "textarea" | "select" | "multiselect" | "date" | "checkbox" | "radio";
46
+ isRequired: boolean;
47
+ applyToAll: boolean;
48
+ }[]>>;
49
+ export declare const listAllCustomFields: import("convex/server").RegisteredQuery<"public", {}, Promise<{
50
+ _id: import("convex/values").GenericId<"ticket_custom_fields">;
51
+ _creationTime: number;
52
+ categories?: string[] | undefined;
53
+ options?: string[] | undefined;
54
+ placeholder?: string | undefined;
55
+ helpText?: string | undefined;
56
+ deviceIds?: import("convex/values").GenericId<"devices">[] | undefined;
57
+ parentFieldId?: import("convex/values").GenericId<"ticket_custom_fields"> | undefined;
58
+ parentFieldValue?: string | undefined;
59
+ childFields?: {
60
+ parentValue: string;
61
+ childFieldIds: import("convex/values").GenericId<"ticket_custom_fields">[];
62
+ }[] | undefined;
63
+ name: string;
64
+ createdAt: number;
65
+ isActive: boolean;
66
+ updatedAt: number;
67
+ order: number;
68
+ fieldType: "number" | "text" | "textarea" | "select" | "multiselect" | "date" | "checkbox" | "radio";
69
+ isRequired: boolean;
70
+ applyToAll: boolean;
71
+ }[]>>;
72
+ export declare const createCustomField: import("convex/server").RegisteredMutation<"public", {
73
+ categories?: string[] | undefined;
74
+ order?: number | undefined;
75
+ options?: string[] | undefined;
76
+ placeholder?: string | undefined;
77
+ helpText?: string | undefined;
78
+ deviceIds?: import("convex/values").GenericId<"devices">[] | undefined;
79
+ parentFieldId?: import("convex/values").GenericId<"ticket_custom_fields"> | undefined;
80
+ parentFieldValue?: string | undefined;
81
+ name: string;
82
+ fieldType: "number" | "text" | "textarea" | "select" | "multiselect" | "date" | "checkbox" | "radio";
83
+ isRequired: boolean;
84
+ applyToAll: boolean;
85
+ }, Promise<import("convex/values").GenericId<"ticket_custom_fields">>>;
86
+ export declare const updateCustomField: import("convex/server").RegisteredMutation<"public", {
87
+ name?: string | undefined;
88
+ isActive?: boolean | undefined;
89
+ categories?: string[] | undefined;
90
+ order?: number | undefined;
91
+ fieldType?: "number" | "text" | "textarea" | "select" | "multiselect" | "date" | "checkbox" | "radio" | undefined;
92
+ options?: string[] | undefined;
93
+ isRequired?: boolean | undefined;
94
+ placeholder?: string | undefined;
95
+ helpText?: string | undefined;
96
+ applyToAll?: boolean | undefined;
97
+ deviceIds?: import("convex/values").GenericId<"devices">[] | undefined;
98
+ parentFieldId?: import("convex/values").GenericId<"ticket_custom_fields"> | undefined;
99
+ parentFieldValue?: string | undefined;
100
+ childFields?: {
101
+ parentValue: string;
102
+ childFieldIds: import("convex/values").GenericId<"ticket_custom_fields">[];
103
+ }[] | undefined;
104
+ fieldId: import("convex/values").GenericId<"ticket_custom_fields">;
105
+ }, Promise<import("convex/values").GenericId<"ticket_custom_fields">>>;
106
+ export declare const deleteCustomField: import("convex/server").RegisteredMutation<"public", {
107
+ fieldId: import("convex/values").GenericId<"ticket_custom_fields">;
108
+ }, Promise<{
109
+ success: boolean;
110
+ }>>;
111
+ export declare const reorderCustomFields: import("convex/server").RegisteredMutation<"public", {
112
+ fieldOrders: {
113
+ order: number;
114
+ fieldId: import("convex/values").GenericId<"ticket_custom_fields">;
115
+ }[];
116
+ }, Promise<{
117
+ success: boolean;
118
+ }>>;
119
+ export declare const getDeviceCategories: import("convex/server").RegisteredQuery<"public", {}, Promise<string[]>>;
120
+ export declare const getChildFields: import("convex/server").RegisteredQuery<"public", {
121
+ parentFieldId: import("convex/values").GenericId<"ticket_custom_fields">;
122
+ parentValue: string;
123
+ }, Promise<{
124
+ _id: import("convex/values").GenericId<"ticket_custom_fields">;
125
+ _creationTime: number;
126
+ categories?: string[] | undefined;
127
+ options?: string[] | undefined;
128
+ placeholder?: string | undefined;
129
+ helpText?: string | undefined;
130
+ deviceIds?: import("convex/values").GenericId<"devices">[] | undefined;
131
+ parentFieldId?: import("convex/values").GenericId<"ticket_custom_fields"> | undefined;
132
+ parentFieldValue?: string | undefined;
133
+ childFields?: {
134
+ parentValue: string;
135
+ childFieldIds: import("convex/values").GenericId<"ticket_custom_fields">[];
136
+ }[] | undefined;
137
+ name: string;
138
+ createdAt: number;
139
+ isActive: boolean;
140
+ updatedAt: number;
141
+ order: number;
142
+ fieldType: "number" | "text" | "textarea" | "select" | "multiselect" | "date" | "checkbox" | "radio";
143
+ isRequired: boolean;
144
+ applyToAll: boolean;
145
+ }[]>>;
146
+ export declare const getAllChildFieldsForParent: import("convex/server").RegisteredQuery<"public", {
147
+ parentFieldId: import("convex/values").GenericId<"ticket_custom_fields">;
148
+ }, Promise<Record<string, any[]>>>;
149
+ //# sourceMappingURL=ticketCustomFields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketCustomFields.d.ts","sourceRoot":"","sources":["../../src/component/ticketCustomFields.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,+BAA+B;;;;;;;;;;;;;;;;;;;;;;;;KAuC1C,CAAC;AAGH,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;KAWjC,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;KAS9B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;sEAoD5B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;sEAwC5B,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;;GAQ5B,CAAC;AAGH,eAAO,MAAM,mBAAmB;;;;;;;GAiB9B,CAAC;AAGH,eAAO,MAAM,mBAAmB,0EAQ9B,CAAC;AAGH,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;KAezB,CAAC;AAGH,eAAO,MAAM,0BAA0B;;kCA6BrC,CAAC"}
@@ -0,0 +1,215 @@
1
+ import { v } from 'convex/values';
2
+ import { query, mutation } from './_generated/server';
3
+ // Lista tutti i campi custom attivi per un device specifico
4
+ export const listActiveCustomFieldsForDevice = query({
5
+ args: {
6
+ deviceId: v.id('devices'),
7
+ },
8
+ handler: async (ctx, args) => {
9
+ // Get device to check category
10
+ const device = await ctx.db.get(args.deviceId);
11
+ if (!device) {
12
+ return [];
13
+ }
14
+ const allFields = await ctx.db
15
+ .query('ticket_custom_fields')
16
+ .withIndex('by_isActive', (q) => q.eq('isActive', true))
17
+ .collect();
18
+ // Filter fields based on applicability
19
+ const applicableFields = allFields.filter((field) => {
20
+ // If applies to all, include it
21
+ if (field.applyToAll) {
22
+ return true;
23
+ }
24
+ // Check if specific device is included
25
+ if (field.deviceIds && field.deviceIds.includes(args.deviceId)) {
26
+ return true;
27
+ }
28
+ // Check if device category is included
29
+ if (field.categories && field.categories.includes(device.category)) {
30
+ return true;
31
+ }
32
+ return false;
33
+ });
34
+ // Ordina per order
35
+ return applicableFields.sort((a, b) => a.order - b.order);
36
+ },
37
+ });
38
+ // Lista tutti i campi custom attivi (per retrocompatibilità)
39
+ export const listActiveCustomFields = query({
40
+ args: {},
41
+ handler: async (ctx) => {
42
+ const fields = await ctx.db
43
+ .query('ticket_custom_fields')
44
+ .withIndex('by_isActive', (q) => q.eq('isActive', true))
45
+ .collect();
46
+ // Ordina per order
47
+ return fields.sort((a, b) => a.order - b.order);
48
+ },
49
+ });
50
+ // Lista tutti i campi custom (admin only)
51
+ export const listAllCustomFields = query({
52
+ args: {},
53
+ handler: async (ctx) => {
54
+ const fields = await ctx.db
55
+ .query('ticket_custom_fields')
56
+ .collect();
57
+ return fields.sort((a, b) => a.order - b.order);
58
+ },
59
+ });
60
+ // Crea un nuovo campo custom (admin only)
61
+ export const createCustomField = mutation({
62
+ args: {
63
+ name: v.string(),
64
+ fieldType: v.union(v.literal('text'), v.literal('textarea'), v.literal('number'), v.literal('select'), v.literal('multiselect'), v.literal('date'), v.literal('checkbox'), v.literal('radio')),
65
+ options: v.optional(v.array(v.string())),
66
+ isRequired: v.boolean(),
67
+ placeholder: v.optional(v.string()),
68
+ helpText: v.optional(v.string()),
69
+ order: v.optional(v.number()),
70
+ applyToAll: v.boolean(),
71
+ categories: v.optional(v.array(v.string())),
72
+ deviceIds: v.optional(v.array(v.id('devices'))),
73
+ parentFieldId: v.optional(v.id('ticket_custom_fields')),
74
+ parentFieldValue: v.optional(v.string()),
75
+ },
76
+ handler: async (ctx, args) => {
77
+ // Se order non è specificato, mettilo alla fine
78
+ let order = args.order;
79
+ if (order === undefined) {
80
+ const allFields = await ctx.db.query('ticket_custom_fields').collect();
81
+ order = allFields.length > 0 ? Math.max(...allFields.map(f => f.order)) + 1 : 0;
82
+ }
83
+ const fieldId = await ctx.db.insert('ticket_custom_fields', {
84
+ name: args.name,
85
+ fieldType: args.fieldType,
86
+ options: args.options,
87
+ isRequired: args.isRequired,
88
+ placeholder: args.placeholder,
89
+ helpText: args.helpText,
90
+ order,
91
+ isActive: true,
92
+ applyToAll: args.applyToAll,
93
+ categories: args.categories,
94
+ deviceIds: args.deviceIds,
95
+ parentFieldId: args.parentFieldId,
96
+ parentFieldValue: args.parentFieldValue,
97
+ createdAt: Date.now(),
98
+ updatedAt: Date.now(),
99
+ });
100
+ return fieldId;
101
+ },
102
+ });
103
+ // Aggiorna un campo custom (admin only)
104
+ export const updateCustomField = mutation({
105
+ args: {
106
+ fieldId: v.id('ticket_custom_fields'),
107
+ name: v.optional(v.string()),
108
+ fieldType: v.optional(v.union(v.literal('text'), v.literal('textarea'), v.literal('number'), v.literal('select'), v.literal('multiselect'), v.literal('date'), v.literal('checkbox'), v.literal('radio'))),
109
+ options: v.optional(v.array(v.string())),
110
+ isRequired: v.optional(v.boolean()),
111
+ placeholder: v.optional(v.string()),
112
+ helpText: v.optional(v.string()),
113
+ order: v.optional(v.number()),
114
+ isActive: v.optional(v.boolean()),
115
+ applyToAll: v.optional(v.boolean()),
116
+ categories: v.optional(v.array(v.string())),
117
+ deviceIds: v.optional(v.array(v.id('devices'))),
118
+ parentFieldId: v.optional(v.id('ticket_custom_fields')),
119
+ parentFieldValue: v.optional(v.string()),
120
+ childFields: v.optional(v.array(v.object({
121
+ parentValue: v.string(),
122
+ childFieldIds: v.array(v.id('ticket_custom_fields')),
123
+ }))),
124
+ },
125
+ handler: async (ctx, args) => {
126
+ const { fieldId, ...updates } = args;
127
+ await ctx.db.patch(fieldId, {
128
+ ...updates,
129
+ updatedAt: Date.now(),
130
+ });
131
+ return fieldId;
132
+ },
133
+ });
134
+ // Elimina un campo custom (admin only)
135
+ export const deleteCustomField = mutation({
136
+ args: {
137
+ fieldId: v.id('ticket_custom_fields'),
138
+ },
139
+ handler: async (ctx, args) => {
140
+ await ctx.db.delete(args.fieldId);
141
+ return { success: true };
142
+ },
143
+ });
144
+ // Riordina i campi custom (admin only)
145
+ export const reorderCustomFields = mutation({
146
+ args: {
147
+ fieldOrders: v.array(v.object({
148
+ fieldId: v.id('ticket_custom_fields'),
149
+ order: v.number(),
150
+ })),
151
+ },
152
+ handler: async (ctx, args) => {
153
+ for (const { fieldId, order } of args.fieldOrders) {
154
+ await ctx.db.patch(fieldId, {
155
+ order,
156
+ updatedAt: Date.now(),
157
+ });
158
+ }
159
+ return { success: true };
160
+ },
161
+ });
162
+ // Get all unique device categories (admin only)
163
+ export const getDeviceCategories = query({
164
+ args: {},
165
+ handler: async (ctx) => {
166
+ const devices = await ctx.db.query('devices').take(3000);
167
+ const categories = new Set(devices.map(d => d.category));
168
+ return Array.from(categories).sort();
169
+ },
170
+ });
171
+ // Get child fields for a specific parent field and value
172
+ export const getChildFields = query({
173
+ args: {
174
+ parentFieldId: v.id('ticket_custom_fields'),
175
+ parentValue: v.string(),
176
+ },
177
+ handler: async (ctx, args) => {
178
+ const childFields = await ctx.db
179
+ .query('ticket_custom_fields')
180
+ .withIndex('by_parentFieldId', (q) => q.eq('parentFieldId', args.parentFieldId))
181
+ .filter((q) => q.eq(q.field('parentFieldValue'), args.parentValue))
182
+ .filter((q) => q.eq(q.field('isActive'), true))
183
+ .collect();
184
+ return childFields.sort((a, b) => a.order - b.order);
185
+ },
186
+ });
187
+ // Get all child fields for a parent (grouped by parent value)
188
+ export const getAllChildFieldsForParent = query({
189
+ args: {
190
+ parentFieldId: v.id('ticket_custom_fields'),
191
+ },
192
+ handler: async (ctx, args) => {
193
+ const childFields = await ctx.db
194
+ .query('ticket_custom_fields')
195
+ .withIndex('by_parentFieldId', (q) => q.eq('parentFieldId', args.parentFieldId))
196
+ .filter((q) => q.eq(q.field('isActive'), true))
197
+ .collect();
198
+ // Group by parent value
199
+ const grouped = {};
200
+ for (const field of childFields) {
201
+ if (field.parentFieldValue) {
202
+ if (!grouped[field.parentFieldValue]) {
203
+ grouped[field.parentFieldValue] = [];
204
+ }
205
+ grouped[field.parentFieldValue].push(field);
206
+ }
207
+ }
208
+ // Sort each group
209
+ for (const key in grouped) {
210
+ grouped[key].sort((a, b) => a.order - b.order);
211
+ }
212
+ return grouped;
213
+ },
214
+ });
215
+ //# sourceMappingURL=ticketCustomFields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketCustomFields.js","sourceRoot":"","sources":["../../src/component/ticketCustomFields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ export declare const exportTickets: import("convex/server").RegisteredQuery<"public", {
2
+ deviceCategory?: string | undefined;
3
+ clinicIds?: import("convex/values").GenericId<"clinics">[] | undefined;
4
+ ticketNumber?: string | undefined;
5
+ createdByEmail?: string | undefined;
6
+ slaBreached?: boolean | undefined;
7
+ isExternal?: boolean | undefined;
8
+ needsAssignment?: boolean | undefined;
9
+ statuses?: string[] | undefined;
10
+ supplierIds?: import("convex/values").GenericId<"suppliers">[] | undefined;
11
+ dateFrom?: number | undefined;
12
+ dateTo?: number | undefined;
13
+ deviceBrand?: string | undefined;
14
+ hasDevice?: boolean | undefined;
15
+ priorities?: string[] | undefined;
16
+ }, Promise<{
17
+ tickets: {
18
+ _id: import("convex/values").GenericId<"maintenance_tasks">;
19
+ ticketNumber: string;
20
+ title: string;
21
+ description: string;
22
+ status: string;
23
+ statusLabel: string;
24
+ priority: string;
25
+ createdByEmail: string;
26
+ created_by: string;
27
+ created_at: number;
28
+ createdAtFormatted: string;
29
+ updated_at: number;
30
+ updatedAtFormatted: string;
31
+ clinicId: import("convex/values").GenericId<"clinics">;
32
+ clinicName: any;
33
+ clinicAddress: any;
34
+ clinicRegion: any;
35
+ supplierId: import("convex/values").GenericId<"suppliers"> | null;
36
+ supplierName: any;
37
+ supplierEmail: any;
38
+ deviceId: import("convex/values").GenericId<"devices"> | null;
39
+ deviceName: any;
40
+ deviceCategory: any;
41
+ deviceBrand: any;
42
+ deviceModel: any;
43
+ deviceSerialNumber: any;
44
+ slaDeadline: number | null;
45
+ slaDeadlineFormatted: string;
46
+ slaBreached: boolean;
47
+ isExternal: boolean;
48
+ needsAssignment: boolean;
49
+ notes: string;
50
+ customFields: any;
51
+ externalTicketId: string;
52
+ externalTicketNumber: string | number;
53
+ importSource: string;
54
+ photosCount: number;
55
+ deviceQuestionAnswers: {
56
+ questionId: import("convex/values").GenericId<"device_questions">;
57
+ question: string;
58
+ answer: any;
59
+ }[];
60
+ }[];
61
+ totalCount: number;
62
+ }>>;
63
+ export declare const getFilterOptions: import("convex/server").RegisteredQuery<"public", {}, Promise<{
64
+ statuses: {
65
+ value: string;
66
+ label: string;
67
+ }[];
68
+ priorities: {
69
+ value: string;
70
+ label: string;
71
+ }[];
72
+ clinics: {
73
+ value: import("convex/values").GenericId<"clinics">;
74
+ label: string;
75
+ }[];
76
+ suppliers: {
77
+ value: import("convex/values").GenericId<"suppliers">;
78
+ label: string;
79
+ }[];
80
+ deviceCategories: string[];
81
+ deviceBrands: string[];
82
+ }>>;
83
+ //# sourceMappingURL=ticketExport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketExport.d.ts","sourceRoot":"","sources":["../../src/component/ticketExport.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyLxB,CAAC;AAEH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;GA6B3B,CAAC"}
@@ -0,0 +1,182 @@
1
+ import { v } from 'convex/values';
2
+ import { query } from './_generated/server';
3
+ export const exportTickets = query({
4
+ args: {
5
+ statuses: v.optional(v.array(v.string())),
6
+ priorities: v.optional(v.array(v.string())),
7
+ clinicIds: v.optional(v.array(v.id('clinics'))),
8
+ supplierIds: v.optional(v.array(v.id('suppliers'))),
9
+ createdByEmail: v.optional(v.string()),
10
+ ticketNumber: v.optional(v.string()),
11
+ dateFrom: v.optional(v.number()),
12
+ dateTo: v.optional(v.number()),
13
+ slaBreached: v.optional(v.boolean()),
14
+ isExternal: v.optional(v.boolean()),
15
+ needsAssignment: v.optional(v.boolean()),
16
+ hasDevice: v.optional(v.boolean()),
17
+ deviceCategory: v.optional(v.string()),
18
+ deviceBrand: v.optional(v.string()),
19
+ },
20
+ handler: async (ctx, args) => {
21
+ let tickets = await ctx.db.query('maintenance_tasks').order('desc').take(1500);
22
+ if (args.statuses && args.statuses.length > 0) {
23
+ tickets = tickets.filter(t => args.statuses.includes(t.status));
24
+ }
25
+ if (args.priorities && args.priorities.length > 0) {
26
+ tickets = tickets.filter(t => t.priority && args.priorities.includes(t.priority));
27
+ }
28
+ if (args.clinicIds && args.clinicIds.length > 0) {
29
+ tickets = tickets.filter(t => args.clinicIds.includes(t.clinicId));
30
+ }
31
+ if (args.supplierIds && args.supplierIds.length > 0) {
32
+ tickets = tickets.filter(t => t.supplierId && args.supplierIds.includes(t.supplierId));
33
+ }
34
+ if (args.createdByEmail) {
35
+ const emailLower = args.createdByEmail.toLowerCase();
36
+ tickets = tickets.filter(t => t.createdByEmail?.toLowerCase().includes(emailLower));
37
+ }
38
+ if (args.ticketNumber) {
39
+ const numLower = args.ticketNumber.toLowerCase();
40
+ tickets = tickets.filter(t => t.ticketNumber?.toLowerCase().includes(numLower));
41
+ }
42
+ if (args.dateFrom) {
43
+ tickets = tickets.filter(t => t.created_at >= args.dateFrom);
44
+ }
45
+ if (args.dateTo) {
46
+ tickets = tickets.filter(t => t.created_at <= args.dateTo);
47
+ }
48
+ if (args.slaBreached !== undefined) {
49
+ tickets = tickets.filter(t => t.slaBreached === args.slaBreached);
50
+ }
51
+ if (args.isExternal !== undefined) {
52
+ tickets = tickets.filter(t => t.isExternal === args.isExternal);
53
+ }
54
+ if (args.needsAssignment !== undefined) {
55
+ tickets = tickets.filter(t => t.needsAssignment === args.needsAssignment);
56
+ }
57
+ if (args.hasDevice !== undefined) {
58
+ if (args.hasDevice) {
59
+ tickets = tickets.filter(t => t.deviceId);
60
+ }
61
+ else {
62
+ tickets = tickets.filter(t => !t.deviceId);
63
+ }
64
+ }
65
+ const clinicIds = [...new Set(tickets.map(t => t.clinicId))].slice(0, 300);
66
+ const supplierIds = [...new Set(tickets.filter(t => t.supplierId).map(t => t.supplierId))].slice(0, 300);
67
+ const deviceIds = [...new Set(tickets.filter(t => t.deviceId).map(t => t.deviceId))].slice(0, 500);
68
+ const clinicsMap = new Map();
69
+ for (const id of clinicIds) {
70
+ const clinic = await ctx.db.get(id);
71
+ if (clinic)
72
+ clinicsMap.set(id, clinic);
73
+ }
74
+ const suppliersMap = new Map();
75
+ for (const id of supplierIds) {
76
+ const supplier = await ctx.db.get(id);
77
+ if (supplier)
78
+ suppliersMap.set(id, supplier);
79
+ }
80
+ const devicesMap = new Map();
81
+ for (const id of deviceIds) {
82
+ const device = await ctx.db.get(id);
83
+ if (device)
84
+ devicesMap.set(id, device);
85
+ }
86
+ if (args.deviceCategory || args.deviceBrand) {
87
+ tickets = tickets.filter(t => {
88
+ if (!t.deviceId)
89
+ return false;
90
+ const device = devicesMap.get(t.deviceId);
91
+ if (!device)
92
+ return false;
93
+ if (args.deviceCategory && device.category !== args.deviceCategory) {
94
+ return false;
95
+ }
96
+ if (args.deviceBrand && device.brand !== args.deviceBrand) {
97
+ return false;
98
+ }
99
+ return true;
100
+ });
101
+ }
102
+ const statuses = await ctx.db.query('ticket_statuses').collect();
103
+ const statusMap = new Map(statuses.map(s => [s.name, s.label]));
104
+ const enrichedTickets = tickets.map(t => {
105
+ const clinic = clinicsMap.get(t.clinicId);
106
+ const supplier = t.supplierId ? suppliersMap.get(t.supplierId) : null;
107
+ const device = t.deviceId ? devicesMap.get(t.deviceId) : null;
108
+ return {
109
+ _id: t._id,
110
+ ticketNumber: t.ticketNumber || '-',
111
+ title: t.title || '-',
112
+ description: t.description,
113
+ status: t.status,
114
+ statusLabel: statusMap.get(t.status) || t.status,
115
+ priority: t.priority || '-',
116
+ createdByEmail: t.createdByEmail || '-',
117
+ created_by: t.created_by,
118
+ created_at: t.created_at,
119
+ createdAtFormatted: new Date(t.created_at).toLocaleString('it-IT'),
120
+ updated_at: t.updated_at,
121
+ updatedAtFormatted: new Date(t.updated_at).toLocaleString('it-IT'),
122
+ clinicId: t.clinicId,
123
+ clinicName: clinic?.name || '-',
124
+ clinicAddress: clinic?.address || '-',
125
+ clinicRegion: clinic?.region || '-',
126
+ supplierId: t.supplierId || null,
127
+ supplierName: supplier?.name || '-',
128
+ supplierEmail: supplier?.contact_email || '-',
129
+ deviceId: t.deviceId || null,
130
+ deviceName: device?.name || '-',
131
+ deviceCategory: device?.category || '-',
132
+ deviceBrand: device?.brand || '-',
133
+ deviceModel: device?.model || '-',
134
+ deviceSerialNumber: device?.serial_number || '-',
135
+ slaDeadline: t.slaDeadline || null,
136
+ slaDeadlineFormatted: t.slaDeadline ? new Date(t.slaDeadline).toLocaleString('it-IT') : '-',
137
+ slaBreached: t.slaBreached || false,
138
+ isExternal: t.isExternal || false,
139
+ needsAssignment: t.needsAssignment || false,
140
+ notes: t.notes || '-',
141
+ customFields: t.customFields || {},
142
+ externalTicketId: t.externalTicketId || '-',
143
+ externalTicketNumber: t.externalTicketNumber || '-',
144
+ importSource: t.importSource || '-',
145
+ photosCount: t.photos?.length || 0,
146
+ deviceQuestionAnswers: t.deviceQuestionAnswers || [],
147
+ };
148
+ });
149
+ enrichedTickets.sort((a, b) => b.created_at - a.created_at);
150
+ return {
151
+ tickets: enrichedTickets,
152
+ totalCount: enrichedTickets.length,
153
+ };
154
+ },
155
+ });
156
+ export const getFilterOptions = query({
157
+ args: {},
158
+ handler: async (ctx) => {
159
+ const statuses = await ctx.db.query('ticket_statuses').collect();
160
+ const statusOptions = statuses.map(s => ({ value: s.name, label: s.label }));
161
+ const clinics = await ctx.db.query('clinics').collect();
162
+ const clinicOptions = clinics.map(c => ({ value: c._id, label: c.name }));
163
+ const suppliers = await ctx.db.query('suppliers').collect();
164
+ const supplierOptions = suppliers.map(s => ({ value: s._id, label: s.name }));
165
+ const deviceSample = await ctx.db.query('devices').take(2000);
166
+ const categories = [...new Set(deviceSample.map(d => d.category).filter(Boolean))];
167
+ const brands = [...new Set(deviceSample.map(d => d.brand).filter(Boolean))];
168
+ return {
169
+ statuses: statusOptions,
170
+ priorities: [
171
+ { value: 'low', label: 'Bassa' },
172
+ { value: 'medium', label: 'Media' },
173
+ { value: 'high', label: 'Alta' },
174
+ ],
175
+ clinics: clinicOptions.sort((a, b) => a.label.localeCompare(b.label)),
176
+ suppliers: supplierOptions.sort((a, b) => a.label.localeCompare(b.label)),
177
+ deviceCategories: categories.sort(),
178
+ deviceBrands: brands.sort(),
179
+ };
180
+ },
181
+ });
182
+ //# sourceMappingURL=ticketExport.js.map