@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,195 @@
1
+ import { v } from 'convex/values';
2
+ import { query, mutation } from './_generated/server';
3
+ export const listSuppliers = query({
4
+ args: {},
5
+ handler: async (ctx) => {
6
+ const suppliers = await ctx.db.query('suppliers').collect();
7
+ return suppliers;
8
+ },
9
+ });
10
+ export const listSuppliersForReassignment = query({
11
+ args: {},
12
+ handler: async (ctx) => {
13
+ const suppliers = await ctx.db.query('suppliers').collect();
14
+ return suppliers;
15
+ },
16
+ });
17
+ export const listSuppliersForOrders = query({
18
+ args: {},
19
+ handler: async (ctx) => {
20
+ const suppliers = await ctx.db.query('suppliers').collect();
21
+ return suppliers.map(s => ({
22
+ _id: s._id,
23
+ name: s.name,
24
+ contact_email: s.contact_email,
25
+ categories: s.categories,
26
+ primoupId: s.primoupId,
27
+ }));
28
+ },
29
+ });
30
+ export const getSupplier = query({
31
+ args: { supplierId: v.id('suppliers') },
32
+ handler: async (ctx, args) => {
33
+ const supplier = await ctx.db.get(args.supplierId);
34
+ return supplier;
35
+ },
36
+ });
37
+ export const createSupplier = mutation({
38
+ args: {
39
+ name: v.string(),
40
+ contact_email: v.string(),
41
+ contact_phone: v.string(),
42
+ categories: v.array(v.string()),
43
+ sla_days: v.number(),
44
+ notes: v.optional(v.string()),
45
+ },
46
+ handler: async (ctx, args) => {
47
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
48
+ if (!emailRegex.test(args.contact_email)) {
49
+ throw new Error('Invalid email format');
50
+ }
51
+ if (args.sla_days < 1 || args.sla_days > 365) {
52
+ throw new Error('SLA days must be between 1 and 365');
53
+ }
54
+ if (args.categories.length === 0) {
55
+ throw new Error('At least one category is required');
56
+ }
57
+ const supplierId = await ctx.db.insert('suppliers', {
58
+ name: args.name.trim(),
59
+ contact_email: args.contact_email.trim().toLowerCase(),
60
+ contact_phone: args.contact_phone.trim(),
61
+ categories: args.categories.map((cat) => cat.trim()),
62
+ sla_days: args.sla_days,
63
+ notes: args.notes?.trim(),
64
+ });
65
+ return supplierId;
66
+ },
67
+ });
68
+ export const updateSupplier = mutation({
69
+ args: {
70
+ supplierId: v.id('suppliers'),
71
+ name: v.string(),
72
+ contact_email: v.string(),
73
+ contact_phone: v.string(),
74
+ categories: v.array(v.string()),
75
+ sla_days: v.number(),
76
+ notes: v.optional(v.string()),
77
+ },
78
+ handler: async (ctx, args) => {
79
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
80
+ if (!emailRegex.test(args.contact_email)) {
81
+ throw new Error('Invalid email format');
82
+ }
83
+ if (args.sla_days < 1 || args.sla_days > 365) {
84
+ throw new Error('SLA days must be between 1 and 365');
85
+ }
86
+ if (args.categories.length === 0) {
87
+ throw new Error('At least one category is required');
88
+ }
89
+ const { supplierId, ...updates } = args;
90
+ await ctx.db.patch(supplierId, {
91
+ name: updates.name.trim(),
92
+ contact_email: updates.contact_email.trim().toLowerCase(),
93
+ contact_phone: updates.contact_phone.trim(),
94
+ categories: updates.categories.map((cat) => cat.trim()),
95
+ sla_days: updates.sla_days,
96
+ notes: updates.notes?.trim(),
97
+ });
98
+ return supplierId;
99
+ },
100
+ });
101
+ export const deleteSupplier = mutation({
102
+ args: { supplierId: v.id('suppliers') },
103
+ handler: async (ctx, args) => {
104
+ const contracts = await ctx.db
105
+ .query('contracts')
106
+ .withIndex('by_supplierId', (q) => q.eq('supplierId', args.supplierId))
107
+ .collect();
108
+ if (contracts.length > 0) {
109
+ throw new Error(`Impossibile eliminare il fornitore: ha ${contracts.length} contratto/i attivo/i. ` +
110
+ `Elimina prima i contratti associati.`);
111
+ }
112
+ const tasks = await ctx.db
113
+ .query('maintenance_tasks')
114
+ .withIndex('by_supplierId', (q) => q.eq('supplierId', args.supplierId))
115
+ .collect();
116
+ if (tasks.length > 0) {
117
+ throw new Error(`Impossibile eliminare il fornitore: ha ${tasks.length} ticket di manutenzione associato/i. ` +
118
+ `Riassegna o elimina prima i ticket.`);
119
+ }
120
+ await ctx.db.delete(args.supplierId);
121
+ return { success: true };
122
+ },
123
+ });
124
+ export const getSuppliersByCategory = query({
125
+ args: { category: v.string() },
126
+ handler: async (ctx, args) => {
127
+ const suppliers = await ctx.db
128
+ .query('suppliers')
129
+ .filter((q) => q.field('categories').includes(args.category))
130
+ .collect();
131
+ return suppliers;
132
+ },
133
+ });
134
+ export const listSupplierUsers = query({
135
+ args: {},
136
+ handler: async (ctx) => {
137
+ const supplierRole = await ctx.db
138
+ .query('roles')
139
+ .withIndex('by_name', (q) => q.eq('name', 'supplier'))
140
+ .first();
141
+ if (!supplierRole) {
142
+ return [];
143
+ }
144
+ const supplierUsers = await ctx.db
145
+ .query('user_profiles')
146
+ .withIndex('by_roleId', (q) => q.eq('roleId', supplierRole._id))
147
+ .collect();
148
+ const result = await Promise.all(supplierUsers.map(async (user) => {
149
+ const linkedSupplier = user.supplierId
150
+ ? await ctx.db.get(user.supplierId)
151
+ : null;
152
+ return {
153
+ _id: user._id,
154
+ userId: user._id,
155
+ email: user.email,
156
+ name: user.name || user.email,
157
+ supplierId: user.supplierId || null,
158
+ supplierName: linkedSupplier?.name || null,
159
+ supplierEmail: linkedSupplier?.contact_email || null,
160
+ };
161
+ }));
162
+ return result;
163
+ },
164
+ });
165
+ export const getOrCreateSupplierForUser = mutation({
166
+ args: {
167
+ userId: v.id('user_profiles'),
168
+ },
169
+ handler: async (ctx, args) => {
170
+ const user = await ctx.db.get(args.userId);
171
+ if (!user) {
172
+ throw new Error('User not found');
173
+ }
174
+ const role = user.roleId ? await ctx.db.get(user.roleId) : null;
175
+ if (role?.name !== 'supplier') {
176
+ throw new Error('User is not a supplier');
177
+ }
178
+ if (user.supplierId) {
179
+ return user.supplierId;
180
+ }
181
+ const supplierId = await ctx.db.insert('suppliers', {
182
+ name: user.name || user.email,
183
+ contact_email: user.email,
184
+ contact_phone: '',
185
+ categories: [],
186
+ sla_days: 7,
187
+ notes: `Creato automaticamente dall'utente ${user.email}`,
188
+ });
189
+ await ctx.db.patch(args.userId, {
190
+ supplierId: supplierId,
191
+ });
192
+ return supplierId;
193
+ },
194
+ });
195
+ //# sourceMappingURL=suppliers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suppliers.js","sourceRoot":"","sources":["../../src/component/suppliers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,89 @@
1
+ export declare const listComments: import("convex/server").RegisteredQuery<"public", {
2
+ userRole?: string | undefined;
3
+ taskId: import("convex/values").GenericId<"maintenance_tasks">;
4
+ }, Promise<{
5
+ attachmentUrls: string[];
6
+ _id: import("convex/values").GenericId<"ticket_comments">;
7
+ _creationTime: number;
8
+ updatedAt?: number | undefined;
9
+ authorName?: string | undefined;
10
+ authorEmail?: string | undefined;
11
+ authorRole?: string | undefined;
12
+ isInternal?: boolean | undefined;
13
+ isFromApi?: boolean | undefined;
14
+ attachments?: import("convex/values").GenericId<"_storage">[] | undefined;
15
+ mentions?: {
16
+ name: string;
17
+ email: string;
18
+ userId: import("convex/values").GenericId<"user_profiles">;
19
+ }[] | undefined;
20
+ createdAt: number;
21
+ taskId: import("convex/values").GenericId<"maintenance_tasks">;
22
+ authorId: string;
23
+ content: string;
24
+ }[]>>;
25
+ export declare const addComment: import("convex/server").RegisteredMutation<"public", {
26
+ authorName?: string | undefined;
27
+ authorEmail?: string | undefined;
28
+ authorRole?: string | undefined;
29
+ isInternal?: boolean | undefined;
30
+ attachments?: import("convex/values").GenericId<"_storage">[] | undefined;
31
+ mentions?: {
32
+ name: string;
33
+ email: string;
34
+ userId: import("convex/values").GenericId<"user_profiles">;
35
+ }[] | undefined;
36
+ taskId: import("convex/values").GenericId<"maintenance_tasks">;
37
+ authorId: string;
38
+ content: string;
39
+ }, Promise<import("convex/values").GenericId<"ticket_comments">>>;
40
+ export declare const generateUploadUrl: import("convex/server").RegisteredMutation<"public", {}, Promise<string>>;
41
+ export declare const addCommentFromApi: import("convex/server").RegisteredMutation<"public", {
42
+ authorName?: string | undefined;
43
+ authorEmail?: string | undefined;
44
+ isInternal?: boolean | undefined;
45
+ taskId: import("convex/values").GenericId<"maintenance_tasks">;
46
+ content: string;
47
+ }, Promise<import("convex/values").GenericId<"ticket_comments">>>;
48
+ export declare const deleteComment: import("convex/server").RegisteredMutation<"public", {
49
+ userRole?: string | undefined;
50
+ userAuth0Id?: string | undefined;
51
+ commentId: import("convex/values").GenericId<"ticket_comments">;
52
+ }, Promise<{
53
+ success: boolean;
54
+ }>>;
55
+ export declare const updateComment: import("convex/server").RegisteredMutation<"public", {
56
+ userRole?: string | undefined;
57
+ userAuth0Id?: string | undefined;
58
+ content: string;
59
+ commentId: import("convex/values").GenericId<"ticket_comments">;
60
+ }, Promise<{
61
+ success: boolean;
62
+ }>>;
63
+ export declare const getCommentCount: import("convex/server").RegisteredQuery<"public", {
64
+ taskId: import("convex/values").GenericId<"maintenance_tasks">;
65
+ }, Promise<number>>;
66
+ export declare const getUsersForMention: import("convex/server").RegisteredQuery<"public", {
67
+ searchQuery?: string | undefined;
68
+ excludeUserId?: import("convex/values").GenericId<"user_profiles"> | undefined;
69
+ taskId: import("convex/values").GenericId<"maintenance_tasks">;
70
+ }, Promise<{
71
+ _id: import("convex/values").GenericId<"user_profiles">;
72
+ name: string;
73
+ email: string;
74
+ role: any;
75
+ }[]>>;
76
+ export declare const listCommentsInternal: import("convex/server").RegisteredQuery<"internal", {
77
+ taskId: string;
78
+ }, Promise<{
79
+ _id: import("convex/values").GenericId<"ticket_comments">;
80
+ authorName: string | undefined;
81
+ authorEmail: string | undefined;
82
+ authorRole: string | undefined;
83
+ content: string;
84
+ isInternal: boolean | undefined;
85
+ isFromApi: boolean | undefined;
86
+ createdAt: number;
87
+ updatedAt: number | undefined;
88
+ }[]>>;
89
+ //# sourceMappingURL=ticketComments.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketComments.d.ts","sourceRoot":"","sources":["../../src/component/ticketComments.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;KA4CvB,CAAC;AAEH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;iEAoDrB,CAAC;AAEH,eAAO,MAAM,iBAAiB,2EAK5B,CAAC;AAEH,eAAO,MAAM,iBAAiB;;;;;;iEAgC5B,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;GAmBxB,CAAC;AAEH,eAAO,MAAM,aAAa;;;;;;;GAwBxB,CAAC;AAEH,eAAO,MAAM,eAAe;;mBAU1B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;KAqD7B,CAAC;AAEH,eAAO,MAAM,oBAAoB;;;;;;;;;;;;KA6B/B,CAAC"}
@@ -0,0 +1,246 @@
1
+ import { v } from 'convex/values';
2
+ import { query, mutation, internalQuery } from './_generated/server';
3
+ export const listComments = query({
4
+ args: {
5
+ taskId: v.id('maintenance_tasks'),
6
+ userRole: v.optional(v.string()),
7
+ },
8
+ handler: async (ctx, args) => {
9
+ const task = await ctx.db.get(args.taskId);
10
+ if (!task) {
11
+ throw new Error('Ticket not found');
12
+ }
13
+ const comments = await ctx.db
14
+ .query('ticket_comments')
15
+ .withIndex('by_taskId', (q) => q.eq('taskId', args.taskId))
16
+ .collect();
17
+ const filteredComments = comments.filter((comment) => {
18
+ if (comment.isInternal) {
19
+ return args.userRole === 'admin' || args.userRole === 'supplier';
20
+ }
21
+ return true;
22
+ });
23
+ const commentsWithUrls = await Promise.all(filteredComments.map(async (comment) => {
24
+ let attachmentUrls = [];
25
+ if (comment.attachments && comment.attachments.length > 0) {
26
+ attachmentUrls = await Promise.all(comment.attachments.map(async (storageId) => {
27
+ const url = await ctx.storage.getUrl(storageId);
28
+ return url || '';
29
+ }));
30
+ attachmentUrls = attachmentUrls.filter(url => url !== '');
31
+ }
32
+ return {
33
+ ...comment,
34
+ attachmentUrls,
35
+ };
36
+ }));
37
+ return commentsWithUrls.sort((a, b) => a.createdAt - b.createdAt);
38
+ },
39
+ });
40
+ export const addComment = mutation({
41
+ args: {
42
+ taskId: v.id('maintenance_tasks'),
43
+ content: v.string(),
44
+ isInternal: v.optional(v.boolean()),
45
+ attachments: v.optional(v.array(v.id('_storage'))),
46
+ mentions: v.optional(v.array(v.object({
47
+ userId: v.id('user_profiles'),
48
+ name: v.string(),
49
+ email: v.string(),
50
+ }))),
51
+ authorId: v.string(),
52
+ authorName: v.optional(v.string()),
53
+ authorEmail: v.optional(v.string()),
54
+ authorRole: v.optional(v.string()),
55
+ },
56
+ handler: async (ctx, args) => {
57
+ const task = await ctx.db.get(args.taskId);
58
+ if (!task) {
59
+ throw new Error('Ticket not found');
60
+ }
61
+ if (args.attachments && args.attachments.length > 5) {
62
+ throw new Error('Maximum 5 attachments allowed');
63
+ }
64
+ const hasContent = args.content.trim().length > 0;
65
+ const hasAttachments = args.attachments && args.attachments.length > 0;
66
+ if (!hasContent && !hasAttachments) {
67
+ throw new Error('Comment must have either text or attachments');
68
+ }
69
+ const commentId = await ctx.db.insert('ticket_comments', {
70
+ taskId: args.taskId,
71
+ authorId: args.authorId,
72
+ authorName: args.authorName || args.authorEmail || 'Unknown',
73
+ authorEmail: args.authorEmail || '',
74
+ authorRole: args.authorRole || 'user',
75
+ content: args.content.trim(),
76
+ isInternal: args.isInternal || false,
77
+ isFromApi: false,
78
+ attachments: args.attachments || undefined,
79
+ mentions: args.mentions || undefined,
80
+ createdAt: Date.now(),
81
+ });
82
+ await ctx.db.patch(args.taskId, {
83
+ updated_at: Date.now(),
84
+ });
85
+ return commentId;
86
+ },
87
+ });
88
+ export const generateUploadUrl = mutation({
89
+ args: {},
90
+ handler: async (ctx) => {
91
+ return await ctx.storage.generateUploadUrl();
92
+ },
93
+ });
94
+ export const addCommentFromApi = mutation({
95
+ args: {
96
+ taskId: v.id('maintenance_tasks'),
97
+ content: v.string(),
98
+ authorEmail: v.optional(v.string()),
99
+ authorName: v.optional(v.string()),
100
+ isInternal: v.optional(v.boolean()),
101
+ },
102
+ handler: async (ctx, args) => {
103
+ const task = await ctx.db.get(args.taskId);
104
+ if (!task) {
105
+ throw new Error('Ticket not found');
106
+ }
107
+ const commentId = await ctx.db.insert('ticket_comments', {
108
+ taskId: args.taskId,
109
+ authorId: 'api',
110
+ authorName: args.authorName || 'Sistema Esterno',
111
+ authorEmail: args.authorEmail || 'api@external',
112
+ authorRole: 'api',
113
+ content: args.content.trim(),
114
+ isInternal: args.isInternal || false,
115
+ isFromApi: true,
116
+ createdAt: Date.now(),
117
+ });
118
+ await ctx.db.patch(args.taskId, {
119
+ updated_at: Date.now(),
120
+ });
121
+ return commentId;
122
+ },
123
+ });
124
+ export const deleteComment = mutation({
125
+ args: {
126
+ commentId: v.id('ticket_comments'),
127
+ userAuth0Id: v.optional(v.string()),
128
+ userRole: v.optional(v.string()),
129
+ },
130
+ handler: async (ctx, args) => {
131
+ const comment = await ctx.db.get(args.commentId);
132
+ if (!comment) {
133
+ throw new Error('Comment not found');
134
+ }
135
+ if (args.userRole !== 'admin' && comment.authorId !== args.userAuth0Id) {
136
+ throw new Error('Not authorized to delete this comment');
137
+ }
138
+ await ctx.db.delete(args.commentId);
139
+ return { success: true };
140
+ },
141
+ });
142
+ export const updateComment = mutation({
143
+ args: {
144
+ commentId: v.id('ticket_comments'),
145
+ content: v.string(),
146
+ userAuth0Id: v.optional(v.string()),
147
+ userRole: v.optional(v.string()),
148
+ },
149
+ handler: async (ctx, args) => {
150
+ const comment = await ctx.db.get(args.commentId);
151
+ if (!comment) {
152
+ throw new Error('Comment not found');
153
+ }
154
+ if (args.userRole !== 'admin' && comment.authorId !== args.userAuth0Id) {
155
+ throw new Error('Not authorized to edit this comment');
156
+ }
157
+ await ctx.db.patch(args.commentId, {
158
+ content: args.content.trim(),
159
+ updatedAt: Date.now(),
160
+ });
161
+ return { success: true };
162
+ },
163
+ });
164
+ export const getCommentCount = query({
165
+ args: { taskId: v.id('maintenance_tasks') },
166
+ handler: async (ctx, args) => {
167
+ const comments = await ctx.db
168
+ .query('ticket_comments')
169
+ .withIndex('by_taskId', (q) => q.eq('taskId', args.taskId))
170
+ .collect();
171
+ return comments.length;
172
+ },
173
+ });
174
+ export const getUsersForMention = query({
175
+ args: {
176
+ taskId: v.id('maintenance_tasks'),
177
+ searchQuery: v.optional(v.string()),
178
+ excludeUserId: v.optional(v.id('user_profiles')),
179
+ },
180
+ handler: async (ctx, args) => {
181
+ const task = await ctx.db.get(args.taskId);
182
+ if (!task) {
183
+ throw new Error('Ticket not found');
184
+ }
185
+ let users = await ctx.db
186
+ .query('user_profiles')
187
+ .take(500);
188
+ users = users.filter(u => u.isActive !== false);
189
+ if (args.excludeUserId) {
190
+ users = users.filter(u => u._id !== args.excludeUserId);
191
+ }
192
+ if (args.searchQuery && args.searchQuery.trim()) {
193
+ const search = args.searchQuery.toLowerCase().trim();
194
+ users = users.filter(u => u.name?.toLowerCase().includes(search) ||
195
+ u.email?.toLowerCase().includes(search));
196
+ }
197
+ const usersWithRoles = await Promise.all(users.map(async (u) => {
198
+ const role = u.roleId ? await ctx.db.get(u.roleId) : null;
199
+ const roleName = role?.name || u.role || 'user';
200
+ return {
201
+ _id: u._id,
202
+ name: u.name || u.email,
203
+ email: u.email,
204
+ role: roleName,
205
+ };
206
+ }));
207
+ const sortedUsers = usersWithRoles.sort((a, b) => {
208
+ if (a.role === 'admin' && b.role !== 'admin')
209
+ return -1;
210
+ if (b.role === 'admin' && a.role !== 'admin')
211
+ return 1;
212
+ return (a.name || '').localeCompare(b.name || '');
213
+ });
214
+ return sortedUsers.slice(0, 20);
215
+ },
216
+ });
217
+ export const listCommentsInternal = internalQuery({
218
+ args: { taskId: v.string() },
219
+ handler: async (ctx, args) => {
220
+ let taskIdTyped;
221
+ try {
222
+ taskIdTyped = args.taskId;
223
+ }
224
+ catch {
225
+ throw new Error('Invalid taskId format');
226
+ }
227
+ const comments = await ctx.db
228
+ .query('ticket_comments')
229
+ .withIndex('by_taskId', (q) => q.eq('taskId', taskIdTyped))
230
+ .collect();
231
+ return comments
232
+ .sort((a, b) => a.createdAt - b.createdAt)
233
+ .map((c) => ({
234
+ _id: c._id,
235
+ authorName: c.authorName,
236
+ authorEmail: c.authorEmail,
237
+ authorRole: c.authorRole,
238
+ content: c.content,
239
+ isInternal: c.isInternal,
240
+ isFromApi: c.isFromApi,
241
+ createdAt: c.createdAt,
242
+ updatedAt: c.updatedAt,
243
+ }));
244
+ },
245
+ });
246
+ //# sourceMappingURL=ticketComments.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticketComments.js","sourceRoot":"","sources":["../../src/component/ticketComments.ts"],"names":[],"mappings":"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"}