@ketvietlab/ketsuite 0.1.22 → 0.1.24

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 (233) hide show
  1. package/dist/cli.js +9 -3
  2. package/dist/cli.js.map +1 -1
  3. package/dist/demo/crm.d.ts +3 -0
  4. package/dist/demo/crm.d.ts.map +1 -0
  5. package/dist/demo/crm.js +418 -0
  6. package/dist/demo/crm.js.map +1 -0
  7. package/dist/demo/partner.d.ts +8 -0
  8. package/dist/demo/partner.d.ts.map +1 -0
  9. package/dist/demo/partner.js +179 -0
  10. package/dist/demo/partner.js.map +1 -0
  11. package/dist/demo/product.d.ts +25 -0
  12. package/dist/demo/product.d.ts.map +1 -0
  13. package/dist/demo/product.js +579 -0
  14. package/dist/demo/product.js.map +1 -0
  15. package/dist/demo/purchase.d.ts +4 -0
  16. package/dist/demo/purchase.d.ts.map +1 -0
  17. package/dist/demo/purchase.js +58 -0
  18. package/dist/demo/purchase.js.map +1 -0
  19. package/dist/demo/sale.d.ts +4 -0
  20. package/dist/demo/sale.d.ts.map +1 -0
  21. package/dist/demo/sale.js +52 -0
  22. package/dist/demo/sale.js.map +1 -0
  23. package/dist/demo/seed.d.ts +14 -0
  24. package/dist/demo/seed.d.ts.map +1 -0
  25. package/dist/demo/seed.js +88 -0
  26. package/dist/demo/seed.js.map +1 -0
  27. package/dist/demo/stock.d.ts +7 -0
  28. package/dist/demo/stock.d.ts.map +1 -0
  29. package/dist/demo/stock.js +26 -0
  30. package/dist/demo/stock.js.map +1 -0
  31. package/dist/demo/user.d.ts +4 -0
  32. package/dist/demo/user.d.ts.map +1 -0
  33. package/dist/demo/user.js +41 -0
  34. package/dist/demo/user.js.map +1 -0
  35. package/dist/demo/util.d.ts +7 -0
  36. package/dist/demo/util.d.ts.map +1 -0
  37. package/dist/demo/util.js +19 -0
  38. package/dist/demo/util.js.map +1 -0
  39. package/dist/modules/backend/design/client/backend-shell.d.mts +2 -2
  40. package/dist/modules/backend/design/client/backend-shell.d.mts.map +1 -1
  41. package/dist/modules/backend/design/client/backend-shell.mjs +1 -1
  42. package/dist/modules/backend/design/client/backend-shell.mjs.map +3 -3
  43. package/dist/modules/backend/design/forms.css +7 -0
  44. package/dist/modules/backend/screen.d.ts.map +1 -1
  45. package/dist/modules/backend/screen.js +11 -2
  46. package/dist/modules/backend/screen.js.map +1 -1
  47. package/dist/modules/crm/functions/access.d.ts +3 -0
  48. package/dist/modules/crm/functions/access.d.ts.map +1 -0
  49. package/dist/modules/crm/functions/access.js +89 -0
  50. package/dist/modules/crm/functions/access.js.map +1 -0
  51. package/dist/modules/crm/functions/activities.d.ts +3 -0
  52. package/dist/modules/crm/functions/activities.d.ts.map +1 -0
  53. package/dist/modules/crm/functions/activities.js +174 -0
  54. package/dist/modules/crm/functions/activities.js.map +1 -0
  55. package/dist/modules/crm/functions/cases.d.ts +3 -0
  56. package/dist/modules/crm/functions/cases.d.ts.map +1 -0
  57. package/dist/modules/crm/functions/cases.js +585 -0
  58. package/dist/modules/crm/functions/cases.js.map +1 -0
  59. package/dist/modules/crm/functions/configuration.d.ts +3 -0
  60. package/dist/modules/crm/functions/configuration.d.ts.map +1 -0
  61. package/dist/modules/crm/functions/configuration.js +331 -0
  62. package/dist/modules/crm/functions/configuration.js.map +1 -0
  63. package/dist/modules/crm/functions/gamification.d.ts +3 -0
  64. package/dist/modules/crm/functions/gamification.d.ts.map +1 -0
  65. package/dist/modules/crm/functions/gamification.js +58 -0
  66. package/dist/modules/crm/functions/gamification.js.map +1 -0
  67. package/dist/modules/crm/functions/index.d.ts +4 -0
  68. package/dist/modules/crm/functions/index.d.ts.map +1 -0
  69. package/dist/modules/crm/functions/index.js +33 -0
  70. package/dist/modules/crm/functions/index.js.map +1 -0
  71. package/dist/modules/crm/functions/modal-context.d.ts +3 -0
  72. package/dist/modules/crm/functions/modal-context.d.ts.map +1 -0
  73. package/dist/modules/crm/functions/modal-context.js +248 -0
  74. package/dist/modules/crm/functions/modal-context.js.map +1 -0
  75. package/dist/modules/crm/functions/previews.d.ts +3 -0
  76. package/dist/modules/crm/functions/previews.d.ts.map +1 -0
  77. package/dist/modules/crm/functions/previews.js +20 -0
  78. package/dist/modules/crm/functions/previews.js.map +1 -0
  79. package/dist/modules/crm/functions/shared.d.ts +31 -0
  80. package/dist/modules/crm/functions/shared.d.ts.map +1 -0
  81. package/dist/modules/crm/functions/shared.js +194 -0
  82. package/dist/modules/crm/functions/shared.js.map +1 -0
  83. package/dist/modules/crm/index.d.ts +1 -1
  84. package/dist/modules/crm/index.d.ts.map +1 -1
  85. package/dist/modules/crm/index.js +2 -2
  86. package/dist/modules/crm/index.js.map +1 -1
  87. package/dist/modules/crm/messages.d.ts +4 -1
  88. package/dist/modules/crm/messages.d.ts.map +1 -1
  89. package/dist/modules/crm/messages.js +6 -0
  90. package/dist/modules/crm/messages.js.map +1 -1
  91. package/dist/modules/crm/record-modal-labels.d.ts +9 -0
  92. package/dist/modules/crm/record-modal-labels.d.ts.map +1 -0
  93. package/dist/modules/crm/record-modal-labels.js +36 -0
  94. package/dist/modules/crm/record-modal-labels.js.map +1 -0
  95. package/dist/modules/crm/types.d.ts +5 -0
  96. package/dist/modules/crm/types.d.ts.map +1 -1
  97. package/dist/modules/crm/types.js +9 -0
  98. package/dist/modules/crm/types.js.map +1 -1
  99. package/dist/modules/crm_backend/client/crm-configuration-modal.d.mts +352 -0
  100. package/dist/modules/crm_backend/client/crm-configuration-modal.d.mts.map +1 -0
  101. package/dist/modules/crm_backend/client/crm-configuration-modal.mjs +2 -0
  102. package/dist/modules/crm_backend/client/crm-configuration-modal.mjs.map +7 -0
  103. package/dist/modules/crm_backend/index.d.ts.map +1 -1
  104. package/dist/modules/crm_backend/index.js +5 -1
  105. package/dist/modules/crm_backend/index.js.map +1 -1
  106. package/dist/modules/crm_backend/islands.d.ts +27 -0
  107. package/dist/modules/crm_backend/islands.d.ts.map +1 -1
  108. package/dist/modules/crm_backend/islands.js +22 -0
  109. package/dist/modules/crm_backend/islands.js.map +1 -1
  110. package/dist/modules/crm_backend/messages.d.ts +30 -0
  111. package/dist/modules/crm_backend/messages.d.ts.map +1 -1
  112. package/dist/modules/crm_backend/messages.js +30 -0
  113. package/dist/modules/crm_backend/messages.js.map +1 -1
  114. package/dist/modules/crm_backend/modal/configuration-modal-view.d.ts +55 -0
  115. package/dist/modules/crm_backend/modal/configuration-modal-view.d.ts.map +1 -0
  116. package/dist/modules/crm_backend/modal/configuration-modal-view.js +601 -0
  117. package/dist/modules/crm_backend/modal/configuration-modal-view.js.map +1 -0
  118. package/dist/modules/crm_backend/routes.d.ts.map +1 -1
  119. package/dist/modules/crm_backend/routes.js +69 -359
  120. package/dist/modules/crm_backend/routes.js.map +1 -1
  121. package/dist/modules/crm_backend/screens/configuration.d.ts +24 -32
  122. package/dist/modules/crm_backend/screens/configuration.d.ts.map +1 -1
  123. package/dist/modules/crm_backend/screens/configuration.js +183 -274
  124. package/dist/modules/crm_backend/screens/configuration.js.map +1 -1
  125. package/dist/modules/crm_backend/screens/index.d.ts +2 -2
  126. package/dist/modules/crm_backend/screens/index.d.ts.map +1 -1
  127. package/dist/modules/crm_backend/screens/index.js +1 -1
  128. package/dist/modules/crm_backend/screens/index.js.map +1 -1
  129. package/dist/modules/product/functions.d.ts +14 -1
  130. package/dist/modules/product/functions.d.ts.map +1 -1
  131. package/dist/modules/product/functions.js +36 -31
  132. package/dist/modules/product/functions.js.map +1 -1
  133. package/dist/modules/product/product-modal-context.d.ts +3 -0
  134. package/dist/modules/product/product-modal-context.d.ts.map +1 -0
  135. package/dist/modules/product/product-modal-context.js +171 -0
  136. package/dist/modules/product/product-modal-context.js.map +1 -0
  137. package/dist/modules/product_backend/client/product-modal.d.mts +143 -0
  138. package/dist/modules/product_backend/client/product-modal.d.mts.map +1 -0
  139. package/dist/modules/product_backend/client/product-modal.mjs +2 -0
  140. package/dist/modules/product_backend/client/product-modal.mjs.map +7 -0
  141. package/dist/modules/product_backend/index.d.ts.map +1 -1
  142. package/dist/modules/product_backend/index.js +16 -0
  143. package/dist/modules/product_backend/index.js.map +1 -1
  144. package/dist/modules/product_backend/islands.d.ts +1 -0
  145. package/dist/modules/product_backend/islands.d.ts.map +1 -1
  146. package/dist/modules/product_backend/islands.js +9 -0
  147. package/dist/modules/product_backend/islands.js.map +1 -1
  148. package/dist/modules/product_backend/modal/product-modal-view.d.ts +43 -0
  149. package/dist/modules/product_backend/modal/product-modal-view.d.ts.map +1 -0
  150. package/dist/modules/product_backend/modal/product-modal-view.js +602 -0
  151. package/dist/modules/product_backend/modal/product-modal-view.js.map +1 -0
  152. package/dist/modules/product_backend/routes.d.ts.map +1 -1
  153. package/dist/modules/product_backend/routes.js +44 -330
  154. package/dist/modules/product_backend/routes.js.map +1 -1
  155. package/dist/modules/product_backend/screens/detail.d.ts.map +1 -1
  156. package/dist/modules/product_backend/screens/detail.js +6 -108
  157. package/dist/modules/product_backend/screens/detail.js.map +1 -1
  158. package/dist/modules/product_backend/screens/index.d.ts +0 -1
  159. package/dist/modules/product_backend/screens/index.d.ts.map +1 -1
  160. package/dist/modules/product_backend/screens/index.js +0 -1
  161. package/dist/modules/product_backend/screens/index.js.map +1 -1
  162. package/dist/modules/product_backend/screens/list.d.ts +3 -1
  163. package/dist/modules/product_backend/screens/list.d.ts.map +1 -1
  164. package/dist/modules/product_backend/screens/list.js +6 -5
  165. package/dist/modules/product_backend/screens/list.js.map +1 -1
  166. package/dist/modules/user/authorization.d.ts.map +1 -1
  167. package/dist/modules/user/authorization.js +114 -0
  168. package/dist/modules/user/authorization.js.map +1 -1
  169. package/dist/modules/user/functions.d.ts.map +1 -1
  170. package/dist/modules/user/functions.js +2 -0
  171. package/dist/modules/user/functions.js.map +1 -1
  172. package/dist/modules/user/user-modal-context.d.ts +3 -0
  173. package/dist/modules/user/user-modal-context.d.ts.map +1 -0
  174. package/dist/modules/user/user-modal-context.js +151 -0
  175. package/dist/modules/user/user-modal-context.js.map +1 -0
  176. package/dist/modules/user_backend/client/user-modal.d.mts +72 -0
  177. package/dist/modules/user_backend/client/user-modal.d.mts.map +1 -0
  178. package/dist/modules/user_backend/client/user-modal.mjs +2 -0
  179. package/dist/modules/user_backend/client/user-modal.mjs.map +7 -0
  180. package/dist/modules/user_backend/index.d.ts.map +1 -1
  181. package/dist/modules/user_backend/index.js +9 -0
  182. package/dist/modules/user_backend/index.js.map +1 -1
  183. package/dist/modules/user_backend/islands.d.ts +15 -0
  184. package/dist/modules/user_backend/islands.d.ts.map +1 -0
  185. package/dist/modules/user_backend/islands.js +14 -0
  186. package/dist/modules/user_backend/islands.js.map +1 -0
  187. package/dist/modules/user_backend/messages.d.ts +30 -0
  188. package/dist/modules/user_backend/messages.d.ts.map +1 -1
  189. package/dist/modules/user_backend/messages.js +30 -0
  190. package/dist/modules/user_backend/messages.js.map +1 -1
  191. package/dist/modules/user_backend/modal/user-modal-view.d.ts +26 -0
  192. package/dist/modules/user_backend/modal/user-modal-view.d.ts.map +1 -0
  193. package/dist/modules/user_backend/modal/user-modal-view.js +320 -0
  194. package/dist/modules/user_backend/modal/user-modal-view.js.map +1 -0
  195. package/dist/modules/user_backend/routes.d.ts.map +1 -1
  196. package/dist/modules/user_backend/routes.js +15 -3
  197. package/dist/modules/user_backend/routes.js.map +1 -1
  198. package/dist/permission-catalogue.d.ts.map +1 -1
  199. package/dist/permission-catalogue.js +8 -0
  200. package/dist/permission-catalogue.js.map +1 -1
  201. package/dist/scaffold/index.js +1 -1
  202. package/dist/ui/client/record-modal-form.d.ts +67 -0
  203. package/dist/ui/client/record-modal-form.d.ts.map +1 -0
  204. package/dist/ui/client/record-modal-form.js +45 -0
  205. package/dist/ui/client/record-modal-form.js.map +1 -0
  206. package/dist/ui/client/record-modal.d.ts +97 -6
  207. package/dist/ui/client/record-modal.d.ts.map +1 -1
  208. package/dist/ui/client/record-modal.js +330 -64
  209. package/dist/ui/client/record-modal.js.map +1 -1
  210. package/dist/ui/index.d.ts +2 -1
  211. package/dist/ui/index.d.ts.map +1 -1
  212. package/dist/ui/index.js +2 -1
  213. package/dist/ui/index.js.map +1 -1
  214. package/dist/ui/nav.d.ts +7 -0
  215. package/dist/ui/nav.d.ts.map +1 -1
  216. package/dist/ui/nav.js +1 -1
  217. package/dist/ui/nav.js.map +1 -1
  218. package/dist/ui/record-modal.d.ts +15 -0
  219. package/dist/ui/record-modal.d.ts.map +1 -1
  220. package/dist/ui/record-modal.js +12 -0
  221. package/dist/ui/record-modal.js.map +1 -1
  222. package/dist/ui/table.d.ts.map +1 -1
  223. package/dist/ui/table.js +1 -1
  224. package/dist/ui/table.js.map +1 -1
  225. package/package.json +4 -4
  226. package/dist/modules/crm/functions.d.ts +0 -10
  227. package/dist/modules/crm/functions.d.ts.map +0 -1
  228. package/dist/modules/crm/functions.js +0 -1394
  229. package/dist/modules/crm/functions.js.map +0 -1
  230. package/dist/modules/product_backend/screens/create.d.ts +0 -16
  231. package/dist/modules/product_backend/screens/create.d.ts.map +0 -1
  232. package/dist/modules/product_backend/screens/create.js +0 -86
  233. package/dist/modules/product_backend/screens/create.js.map +0 -1
@@ -0,0 +1,331 @@
1
+ import { defineFn, deleteFrom, eq } from '@ketvietlab/ketjs';
2
+ import { invalid, issue, n, normalized, stageKinds } from '../operations.js';
3
+ import { ASSIGNMENT_MODES, CASE_KINDS, SCORE_RULE_OPERATORS, TERMINAL_STATES } from '../types.js';
4
+ import { command, optionRows, saveConfiguration } from './shared.js';
5
+ export const configurationFunctions = {
6
+ /**
7
+ * The lists the relational pickers page through.
8
+ *
9
+ * Each one takes the `search` and `limit` the picker sends on every keystroke
10
+ * and returns a plain array, which is the shape `backend:relation.select`
11
+ * reads. They exist so a user filling in a case never has to leave the form to
12
+ * find a team, a stage or a tag.
13
+ */
14
+ 'team.list': defineFn({
15
+ input: { search: 'text?', limit: 'int?', includeArchived: 'bool?' },
16
+ output: { id: 'id', code: 'text', name: 'text', assignmentMode: 'text', active: 'bool' },
17
+ effects: ['read:crm.Team'],
18
+ agent: true,
19
+ handler: (ctx, args) => optionRows(ctx, 'crm.Team', args),
20
+ }),
21
+ 'stage.list': defineFn({
22
+ input: { search: 'text?', limit: 'int?', kind: 'text?', includeArchived: 'bool?' },
23
+ output: {
24
+ id: 'id',
25
+ code: 'text',
26
+ name: 'text',
27
+ sequence: 'int',
28
+ terminalState: 'text',
29
+ allowedKinds: 'json',
30
+ active: 'bool',
31
+ },
32
+ effects: ['read:crm.Stage'],
33
+ agent: true,
34
+ handler: async (ctx, args) => {
35
+ const rows = await optionRows(ctx, 'crm.Stage', args, (a, b) => n(a.sequence) - n(b.sequence));
36
+ return args.kind ? rows.filter((row) => stageKinds(row).includes(String(args.kind))) : rows;
37
+ },
38
+ }),
39
+ 'tag.list': defineFn({
40
+ input: { search: 'text?', limit: 'int?', includeArchived: 'bool?' },
41
+ output: { id: 'id', name: 'text', color: 'text?', active: 'bool' },
42
+ effects: ['read:crm.Tag'],
43
+ agent: true,
44
+ handler: (ctx, args) => optionRows(ctx, 'crm.Tag', args),
45
+ }),
46
+ /**
47
+ * Tags were reachable from the data model and from `case.save`, but nothing
48
+ * could create one — so the field could never hold a value. This is the
49
+ * missing half, shaped for the picker's inline editor: an id and a name, no
50
+ * idempotency key, because the picker mints the id itself.
51
+ */
52
+ 'tag.save': defineFn({
53
+ input: { id: 'id', name: 'text', color: 'text?', active: 'bool?' },
54
+ output: { ok: 'bool', id: 'id?', errors: 'json?' },
55
+ effects: ['read:crm.Tag', 'write:crm.Tag'],
56
+ idempotent: true,
57
+ agent: true,
58
+ handler: async (ctx, args) => {
59
+ const name = String(args.name ?? '').trim();
60
+ if (!name)
61
+ return invalid(issue('name', 'crm.error.required'));
62
+ const existing = (await ctx.db.select('crm.Tag', { id: args.id }))[0];
63
+ const clash = (await ctx.db.select('crm.Tag', { name })).find((row) => row.id !== args.id);
64
+ if (clash)
65
+ return invalid(issue('name', 'crm.error.duplicateName'));
66
+ const values = {
67
+ name,
68
+ color: args.color ? String(args.color) : (existing?.color ?? null),
69
+ active: args.active ?? existing?.active ?? true,
70
+ };
71
+ if (existing)
72
+ await ctx.db.update('crm.Tag', { id: args.id }, values);
73
+ else
74
+ await ctx.db.insert('crm.Tag', { id: args.id, ...values });
75
+ return { ok: true, id: args.id };
76
+ },
77
+ }),
78
+ 'tag.archive': defineFn({
79
+ input: { id: 'id' },
80
+ output: { ok: 'bool', id: 'id?', errors: 'json?' },
81
+ effects: ['read:crm.Tag', 'write:crm.Tag', 'read:crm.CaseTag', 'write:crm.CaseTag'],
82
+ idempotent: true,
83
+ agent: true,
84
+ handler: async (ctx, args) => {
85
+ const existing = (await ctx.db.select('crm.Tag', { id: args.id }))[0];
86
+ if (!existing)
87
+ return invalid(issue('id', 'crm.error.notFound'));
88
+ await ctx.db.update('crm.Tag', { id: args.id }, { active: false });
89
+ const CT = ctx.table('crm.CaseTag');
90
+ await ctx.db.del(deleteFrom(CT).where(eq(CT.tagId, args.id)));
91
+ return { ok: true, id: args.id };
92
+ },
93
+ }),
94
+ 'team.member.list': defineFn({
95
+ input: { teamId: 'id?', search: 'text?', limit: 'int?' },
96
+ output: {
97
+ id: 'id',
98
+ teamId: 'id',
99
+ userId: 'id',
100
+ userName: 'text?',
101
+ capacity: 'int',
102
+ sequence: 'int',
103
+ assignedCount: 'int',
104
+ active: 'bool',
105
+ },
106
+ effects: ['read:crm.TeamMember', 'read:user.User'],
107
+ agent: true,
108
+ handler: async (ctx, args) => {
109
+ const rows = args.teamId
110
+ ? await ctx.db.select('crm.TeamMember', { teamId: args.teamId })
111
+ : await ctx.db.select('crm.TeamMember');
112
+ const users = new Map((await ctx.db.select('user.User')).map((user) => [String(user.id), user]));
113
+ const needle = normalized(args.search);
114
+ const named = rows.map((row) => ({
115
+ ...row,
116
+ userName: users.get(String(row.userId))?.name ?? String(row.userId),
117
+ }));
118
+ return named
119
+ .filter((row) => !needle || normalized(row.userName).includes(needle))
120
+ .sort((a, b) => n(a.sequence) - n(b.sequence) || String(a.id).localeCompare(String(b.id)))
121
+ .slice(0, Math.max(1, Math.min(200, n(args.limit ?? 100))));
122
+ },
123
+ }),
124
+ 'team.member.remove': defineFn({
125
+ input: { id: 'id' },
126
+ output: { ok: 'bool', id: 'id?', errors: 'json?' },
127
+ effects: ['read:crm.TeamMember', 'write:crm.TeamMember'],
128
+ idempotent: true,
129
+ agent: true,
130
+ handler: async (ctx, args) => {
131
+ const existing = (await ctx.db.select('crm.TeamMember', { id: args.id }))[0];
132
+ if (!existing)
133
+ return invalid(issue('id', 'crm.error.notFound'));
134
+ await ctx.db.update('crm.TeamMember', { id: args.id }, { active: false });
135
+ return { ok: true, id: args.id };
136
+ },
137
+ }),
138
+ 'configuration.get': defineFn({
139
+ input: {},
140
+ output: {
141
+ teams: 'json',
142
+ stages: 'json',
143
+ assignmentRules: 'json',
144
+ scoreRules: 'json',
145
+ },
146
+ effects: [
147
+ 'read:crm.Team',
148
+ 'read:crm.TeamMember',
149
+ 'read:crm.Stage',
150
+ 'read:crm.AssignmentRule',
151
+ 'read:crm.ScoreRule',
152
+ ],
153
+ handler: async (ctx) => {
154
+ const [teams, members, stages, assignmentRules, scoreRules] = await Promise.all([
155
+ ctx.db.select('crm.Team'),
156
+ ctx.db.select('crm.TeamMember'),
157
+ ctx.db.select('crm.Stage'),
158
+ ctx.db.select('crm.AssignmentRule'),
159
+ ctx.db.select('crm.ScoreRule'),
160
+ ]);
161
+ const membersByTeam = new Map();
162
+ for (const member of members) {
163
+ const key = String(member.teamId);
164
+ const rows = membersByTeam.get(key) ?? [];
165
+ rows.push(member);
166
+ membersByTeam.set(key, rows);
167
+ }
168
+ return {
169
+ teams: teams.map((team) => ({ ...team, members: membersByTeam.get(String(team.id)) ?? [] })),
170
+ stages,
171
+ assignmentRules,
172
+ scoreRules,
173
+ };
174
+ },
175
+ }),
176
+ 'team.save': saveConfiguration('crm.Team', (args, existing) => ({
177
+ code: String(args.code ?? existing?.code ?? args.id).trim(),
178
+ name: String(args.name ?? '').trim(),
179
+ active: args.active ?? existing?.active ?? true,
180
+ leaderUserId: args.leaderUserId ?? existing?.leaderUserId ?? null,
181
+ assignmentMode: ASSIGNMENT_MODES.includes(args.assignmentMode)
182
+ ? args.assignmentMode
183
+ : (existing?.assignmentMode ?? 'manual'),
184
+ assignmentCursor: existing?.assignmentCursor ?? 0,
185
+ version: n(existing?.version) + 1,
186
+ }),
187
+ // A team used to save with an empty name, and a repeated code reached the
188
+ // unique index as a database error instead of a refusal on the field.
189
+ async (ctx, args, existing) => {
190
+ if (!String(args.name ?? '').trim())
191
+ return invalid(issue('name', 'crm.error.required'));
192
+ const code = String(args.code ?? existing?.code ?? '').trim();
193
+ if (!code)
194
+ return invalid(issue('code', 'crm.error.required'));
195
+ if ((await ctx.db.select('crm.Team', { code })).some((row) => row.id !== args.id))
196
+ return invalid(issue('code', 'crm.error.duplicateCode'));
197
+ return null;
198
+ }),
199
+ 'team.member.save': defineFn({
200
+ input: {
201
+ id: 'id',
202
+ teamId: 'id',
203
+ userId: 'id',
204
+ capacity: 'int?',
205
+ sequence: 'int?',
206
+ active: 'bool?',
207
+ idempotencyKey: 'text',
208
+ },
209
+ output: { ok: 'bool', id: 'id?', errors: 'json?' },
210
+ effects: ['read:crm.Team', 'read:crm.TeamMember', 'write:crm.TeamMember', 'read:user.User'],
211
+ idempotent: true,
212
+ agent: true,
213
+ handler: async (ctx, args) => {
214
+ const error = command(ctx, args.idempotencyKey);
215
+ if (error)
216
+ return error;
217
+ const [team, user] = await Promise.all([
218
+ ctx.db.select('crm.Team', { id: args.teamId, active: true }),
219
+ ctx.db.select('user.User', { id: args.userId, active: true }),
220
+ ]);
221
+ if (!team[0])
222
+ return invalid(issue('teamId', 'crm.error.notFound'));
223
+ if (!user[0])
224
+ return invalid(issue('userId', 'crm.error.notFound'));
225
+ const existing = (await ctx.db.select('crm.TeamMember', { id: args.id }))[0];
226
+ // One membership per person per team: a second row for the same user used
227
+ // to reach the unique index as a database error.
228
+ const same = await ctx.db.select('crm.TeamMember', { teamId: args.teamId, userId: args.userId });
229
+ if (same.some((row) => row.id !== args.id))
230
+ return invalid(issue('userId', 'crm.error.duplicateMember'));
231
+ const values = {
232
+ teamId: args.teamId,
233
+ userId: args.userId,
234
+ capacity: Math.max(1, n(args.capacity ?? existing?.capacity ?? 1)),
235
+ sequence: n(args.sequence ?? existing?.sequence ?? 10),
236
+ active: args.active ?? existing?.active ?? true,
237
+ assignedCount: n(existing?.assignedCount),
238
+ lastAssignedAt: existing?.lastAssignedAt ?? null,
239
+ };
240
+ if (existing)
241
+ await ctx.db.update('crm.TeamMember', { id: args.id }, values);
242
+ else
243
+ await ctx.db.insert('crm.TeamMember', { id: args.id, ...values });
244
+ return { ok: true, id: args.id };
245
+ },
246
+ }),
247
+ 'stage.save': saveConfiguration('crm.Stage', (args, existing) => ({
248
+ code: String(args.code ?? existing?.code ?? args.id).trim(),
249
+ name: String(args.name ?? '').trim(),
250
+ sequence: n(args.sequence ?? existing?.sequence ?? 10),
251
+ allowedKinds: Array.isArray(args.allowedKinds)
252
+ ? args.allowedKinds.map(String).filter((kind) => CASE_KINDS.includes(kind))
253
+ : (existing?.allowedKinds ?? ['lead', 'opportunity']),
254
+ terminalState: TERMINAL_STATES.includes(args.terminalState)
255
+ ? args.terminalState
256
+ : (existing?.terminalState ?? 'open'),
257
+ teamId: args.teamId ?? existing?.teamId ?? null,
258
+ fold: args.fold ?? existing?.fold ?? false,
259
+ active: args.active ?? existing?.active ?? true,
260
+ }), async (ctx, args) => {
261
+ if (!String(args.name ?? '').trim())
262
+ return invalid(issue('name', 'crm.error.required'));
263
+ const code = String(args.code ?? '').trim();
264
+ if (!code)
265
+ return invalid(issue('code', 'crm.error.required'));
266
+ if ((await ctx.db.select('crm.Stage', { code })).some((row) => row.id !== args.id))
267
+ return invalid(issue('code', 'crm.error.duplicateCode'));
268
+ if (!Array.isArray(args.allowedKinds) || args.allowedKinds.length === 0)
269
+ return invalid(issue('allowedKinds', 'crm.error.required'));
270
+ if (args.teamId && !(await ctx.db.select('crm.Team', { id: args.teamId, active: true }))[0])
271
+ return invalid(issue('teamId', 'crm.error.notFound'));
272
+ return null;
273
+ }, ['read:crm.Team']),
274
+ 'assignmentRule.save': saveConfiguration('crm.AssignmentRule', (args, existing) => ({
275
+ name: String(args.name ?? '').trim(),
276
+ priority: n(args.priority ?? existing?.priority ?? 10),
277
+ allowedKinds: Array.isArray(args.allowedKinds)
278
+ ? args.allowedKinds.map(String)
279
+ : (existing?.allowedKinds ?? []),
280
+ teamId: args.teamId ?? existing?.teamId,
281
+ assigneeUserId: args.assigneeUserId ?? existing?.assigneeUserId ?? null,
282
+ utmSource: args.utmSource ?? existing?.utmSource ?? null,
283
+ minimumScore: args.minimumScore ?? existing?.minimumScore ?? null,
284
+ active: args.active ?? existing?.active ?? true,
285
+ }), async (ctx, args) => {
286
+ if (!String(args.name ?? '').trim())
287
+ return invalid(issue('name', 'crm.error.required'));
288
+ if (!Array.isArray(args.allowedKinds) || !args.allowedKinds.length)
289
+ return invalid(issue('allowedKinds', 'crm.error.required'));
290
+ const team = args.teamId
291
+ ? (await ctx.db.select('crm.Team', { id: args.teamId, active: true }))[0]
292
+ : null;
293
+ if (!team)
294
+ return invalid(issue('teamId', 'crm.error.notFound'));
295
+ if (args.assigneeUserId) {
296
+ const member = (await ctx.db.select('crm.TeamMember', {
297
+ teamId: args.teamId,
298
+ userId: args.assigneeUserId,
299
+ active: true,
300
+ }))[0];
301
+ if (!member && team.leaderUserId !== args.assigneeUserId)
302
+ return invalid(issue('assigneeUserId', 'crm.error.notTeamMember'));
303
+ }
304
+ return null;
305
+ }, ['read:crm.Team', 'read:crm.TeamMember']),
306
+ 'scoreRule.save': saveConfiguration('crm.ScoreRule', (args, existing) => ({
307
+ name: String(args.name ?? '').trim(),
308
+ field: String(args.field ?? '').trim(),
309
+ operator: String(args.operator ?? 'eq'),
310
+ value: String(args.value ?? ''),
311
+ points: String(args.points ?? '0'),
312
+ active: args.active ?? existing?.active ?? true,
313
+ sequence: n(args.sequence ?? existing?.sequence ?? 10),
314
+ }), (_ctx, args) => {
315
+ const field = String(args.field ?? '');
316
+ const operator = String(args.operator ?? '');
317
+ const allowed = SCORE_RULE_OPERATORS[field] ?? [];
318
+ if (!String(args.name ?? '').trim())
319
+ return invalid(issue('name', 'crm.error.required'));
320
+ if (!allowed.length)
321
+ return invalid(issue('field', 'crm.error.required'));
322
+ if (!allowed.includes(operator))
323
+ return invalid(issue('operator', 'crm.error.invalidOperator'));
324
+ if (operator !== 'present' && !String(args.value ?? '').trim())
325
+ return invalid(issue('value', 'crm.error.required'));
326
+ if (field === 'expectedRevenue' && !Number.isFinite(Number(args.value)))
327
+ return invalid(issue('value', 'crm.error.invalidKind'));
328
+ return null;
329
+ }),
330
+ };
331
+ //# sourceMappingURL=configuration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"configuration.js","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/crm/functions/configuration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { FnSpec } from '@ketvietlab/ketjs';
2
+ export declare const gamificationFunctions: Record<string, FnSpec>;
3
+ //# sourceMappingURL=gamification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamification.d.ts","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/crm/functions/gamification.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAO,MAAM,mBAAmB,CAAA;AAIpD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAyDxD,CAAA"}
@@ -0,0 +1,58 @@
1
+ import { defineFn } from '@ketvietlab/ketjs';
2
+ import { gamificationProfile, n } from '../operations.js';
3
+ import { command } from './shared.js';
4
+ export const gamificationFunctions = {
5
+ 'gamification.refresh': defineFn({
6
+ input: { userId: 'id?', limit: 'int?', idempotencyKey: 'text' },
7
+ output: { ok: 'bool', profiles: 'json?', errors: 'json?' },
8
+ effects: [
9
+ 'read:user.User',
10
+ 'read:crm.Case',
11
+ 'read:activity.Activity',
12
+ 'read:crm.GamificationProfile',
13
+ 'write:crm.GamificationProfile',
14
+ ],
15
+ idempotent: true,
16
+ agent: true,
17
+ handler: async (ctx, args) => {
18
+ const error = command(ctx, args.idempotencyKey);
19
+ if (error)
20
+ return error;
21
+ const users = args.userId
22
+ ? await ctx.db.select('user.User', { id: args.userId, active: true })
23
+ : (await ctx.db.select('user.User', { active: true })).slice(0, Math.max(1, Math.min(500, n(args.limit ?? 200))));
24
+ /**
25
+ * Counted per user rather than by loading the pipeline into memory.
26
+ *
27
+ * The previous shape read every case, every activity and every link on
28
+ * every refresh, so the leaderboard grew a full-table scan per company as
29
+ * the pipeline grew. Each figure is now a counting query the
30
+ * `(companyId, assigneeUserId, …)` indexes already serve.
31
+ */
32
+ const profiles = [];
33
+ for (const user of users)
34
+ profiles.push(await gamificationProfile(ctx, user));
35
+ return {
36
+ ok: true,
37
+ profiles: profiles.sort((a, b) => n(b.points) - n(a.points) || String(a.id).localeCompare(String(b.id))),
38
+ };
39
+ },
40
+ }),
41
+ 'gamification.list': defineFn({
42
+ input: { limit: 'int?' },
43
+ output: { profiles: 'json' },
44
+ effects: ['read:crm.GamificationProfile', 'read:user.User'],
45
+ handler: async (ctx, args) => {
46
+ const users = new Map((await ctx.db.select('user.User')).map((user) => [String(user.id), user]));
47
+ const profiles = (await ctx.db.select('crm.GamificationProfile'))
48
+ .sort((a, b) => n(b.points) - n(a.points) || String(a.id).localeCompare(String(b.id)))
49
+ .slice(0, Math.max(1, Math.min(200, n(args.limit ?? 50))))
50
+ .map((profile) => ({
51
+ ...profile,
52
+ userName: users.get(String(profile.userId))?.name ?? profile.userId,
53
+ }));
54
+ return { profiles };
55
+ },
56
+ }),
57
+ };
58
+ //# sourceMappingURL=gamification.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamification.js","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/crm/functions/gamification.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE5C,OAAO,EAAE,mBAAmB,EAAE,CAAC,EAAE,MAAM,kBAAkB,CAAA;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAA;AAErC,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,sBAAsB,EAAE,QAAQ,CAAC;QAC/B,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE;QAC/D,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;QAC1D,OAAO,EAAE;YACP,gBAAgB;YAChB,eAAe;YACf,wBAAwB;YACxB,8BAA8B;YAC9B,+BAA+B;SAChC;QACD,UAAU,EAAE,IAAI;QAChB,KAAK,EAAE,IAAI;QACX,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,cAAc,CAAC,CAAA;YAC/C,IAAI,KAAK;gBAAE,OAAO,KAAK,CAAA;YACvB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM;gBACvB,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;gBACrE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,CACxD,CAAC,EACD,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,CACjD,CAAA;YACL;;;;;;;eAOG;YACH,MAAM,QAAQ,GAAU,EAAE,CAAA;YAC1B,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,QAAQ,CAAC,IAAI,CAAC,MAAM,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAA;YAC7E,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,QAAQ,EAAE,QAAQ,CAAC,IAAI,CACrB,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAChF;aACF,CAAA;QACH,CAAC;KACF,CAAC;IAEF,mBAAmB,EAAE,QAAQ,CAAC;QAC5B,KAAK,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QACxB,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE;QAC5B,OAAO,EAAE,CAAC,8BAA8B,EAAE,gBAAgB,CAAC;QAC3D,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;YAChG,MAAM,QAAQ,GAAG,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC;iBAC9D,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;iBACrF,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;iBACzD,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;gBACjB,GAAG,OAAO;gBACV,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,IAAI,OAAO,CAAC,MAAM;aACpE,CAAC,CAAC,CAAA;YACL,OAAO,EAAE,QAAQ,EAAE,CAAA;QACrB,CAAC;KACF,CAAC;CACH,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { FnSpec } from '@ketvietlab/ketjs';
2
+ export declare const functions: Record<string, FnSpec>;
3
+ export { caseFormSchema, caseWriteEffects, createCaseId } from './shared.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/crm/functions/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAA;AAiC/C,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAoB,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,33 @@
1
+ import { accessFunctions } from './access.js';
2
+ import { caseFunctions } from './cases.js';
3
+ import { activityFunctions } from './activities.js';
4
+ import { gamificationFunctions } from './gamification.js';
5
+ import { configurationFunctions } from './configuration.js';
6
+ import { modalContextFunctions } from './modal-context.js';
7
+ import { previewFunctions } from './previews.js';
8
+ const groups = {
9
+ accessFunctions,
10
+ caseFunctions,
11
+ activityFunctions,
12
+ gamificationFunctions,
13
+ configurationFunctions,
14
+ modalContextFunctions,
15
+ previewFunctions,
16
+ };
17
+ /** Merge the groups, refusing a key two groups both define. */
18
+ const assemble = (sources) => {
19
+ const merged = {};
20
+ const owner = new Map();
21
+ for (const [group, specs] of Object.entries(sources))
22
+ for (const [key, spec] of Object.entries(specs)) {
23
+ const previous = owner.get(key);
24
+ if (previous)
25
+ throw new Error(`crm function "${key}" is defined by both ${previous} and ${group}`);
26
+ owner.set(key, group);
27
+ merged[key] = spec;
28
+ }
29
+ return merged;
30
+ };
31
+ export const functions = assemble(groups);
32
+ export { caseFormSchema, caseWriteEffects, createCaseId } from './shared.js';
33
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../../../packages/ketsuite/src/modules/crm/functions/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAA;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAA;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAA;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAEhD,MAAM,MAAM,GAA2C;IACrD,eAAe;IACf,aAAa;IACb,iBAAiB;IACjB,qBAAqB;IACrB,sBAAsB;IACtB,qBAAqB;IACrB,gBAAgB;CACjB,CAAA;AAED,+DAA+D;AAC/D,MAAM,QAAQ,GAAG,CAAC,OAA+C,EAA0B,EAAE;IAC3F,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;QAClD,KAAK,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAChD,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;YAC/B,IAAI,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,GAAG,wBAAwB,QAAQ,QAAQ,KAAK,EAAE,CAAC,CAAA;YAClG,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAA;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,IAAI,CAAA;QACpB,CAAC;IACH,OAAO,MAAM,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,SAAS,GAA2B,QAAQ,CAAC,MAAM,CAAC,CAAA;AAEjE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { FnSpec } from '@ketvietlab/ketjs';
2
+ export declare const modalContextFunctions: Record<string, FnSpec>;
3
+ //# sourceMappingURL=modal-context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"modal-context.d.ts","sourceRoot":"","sources":["../../../../../../../packages/ketsuite/src/modules/crm/functions/modal-context.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAO,MAAM,EAAO,MAAM,mBAAmB,CAAA;AA6EzD,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAoLxD,CAAA"}