@contractspec/example.crm-pipeline 1.57.0 → 1.59.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 (259) hide show
  1. package/.turbo/turbo-build.log +148 -164
  2. package/.turbo/turbo-prebuild.log +1 -0
  3. package/CHANGELOG.md +39 -0
  4. package/dist/browser/crm-pipeline.feature.js +75 -0
  5. package/dist/browser/deal/deal.enum.js +18 -0
  6. package/dist/browser/deal/deal.operation.js +396 -0
  7. package/dist/browser/deal/deal.schema.js +141 -0
  8. package/dist/browser/deal/deal.test-spec.js +58 -0
  9. package/dist/browser/deal/index.js +408 -0
  10. package/dist/browser/docs/crm-pipeline.docblock.js +113 -0
  11. package/dist/browser/docs/index.js +113 -0
  12. package/dist/browser/entities/company.entity.js +52 -0
  13. package/dist/browser/entities/contact.entity.js +66 -0
  14. package/dist/browser/entities/deal.entity.js +107 -0
  15. package/dist/browser/entities/index.js +343 -0
  16. package/dist/browser/entities/task.entity.js +99 -0
  17. package/dist/browser/events/contact.event.js +31 -0
  18. package/dist/browser/events/deal.event.js +101 -0
  19. package/dist/browser/events/index.js +158 -0
  20. package/dist/browser/events/task.event.js +28 -0
  21. package/dist/browser/example.js +39 -0
  22. package/dist/browser/handlers/crm.handlers.js +160 -0
  23. package/dist/browser/handlers/deal.handlers.js +293 -0
  24. package/dist/browser/handlers/index.js +456 -0
  25. package/dist/browser/handlers/mock-data.js +165 -0
  26. package/dist/browser/index.js +3279 -0
  27. package/dist/browser/operations/index.js +407 -0
  28. package/dist/browser/presentations/dashboard.presentation.js +52 -0
  29. package/dist/browser/presentations/index.js +284 -0
  30. package/dist/browser/presentations/pipeline.presentation.js +233 -0
  31. package/dist/browser/seeders/index.js +22 -0
  32. package/dist/browser/shared/overlay-types.js +0 -0
  33. package/dist/browser/ui/CrmDashboard.js +1325 -0
  34. package/dist/browser/ui/CrmDealCard.js +50 -0
  35. package/dist/browser/ui/CrmPipelineBoard.js +160 -0
  36. package/dist/browser/ui/hooks/index.js +186 -0
  37. package/dist/browser/ui/hooks/useDealList.js +84 -0
  38. package/dist/browser/ui/hooks/useDealMutations.js +100 -0
  39. package/dist/browser/ui/index.js +1972 -0
  40. package/dist/browser/ui/modals/CreateDealModal.js +211 -0
  41. package/dist/browser/ui/modals/DealActionsModal.js +428 -0
  42. package/dist/browser/ui/modals/index.js +638 -0
  43. package/dist/browser/ui/overlays/demo-overlays.js +55 -0
  44. package/dist/browser/ui/overlays/index.js +55 -0
  45. package/dist/browser/ui/renderers/index.js +827 -0
  46. package/dist/browser/ui/renderers/pipeline.markdown.js +564 -0
  47. package/dist/browser/ui/renderers/pipeline.renderer.js +264 -0
  48. package/dist/crm-pipeline.feature.d.ts +1 -6
  49. package/dist/crm-pipeline.feature.d.ts.map +1 -1
  50. package/dist/crm-pipeline.feature.js +74 -164
  51. package/dist/deal/deal.enum.d.ts +2 -7
  52. package/dist/deal/deal.enum.d.ts.map +1 -1
  53. package/dist/deal/deal.enum.js +16 -22
  54. package/dist/deal/deal.operation.d.ts +444 -450
  55. package/dist/deal/deal.operation.d.ts.map +1 -1
  56. package/dist/deal/deal.operation.js +390 -263
  57. package/dist/deal/deal.schema.d.ts +251 -256
  58. package/dist/deal/deal.schema.d.ts.map +1 -1
  59. package/dist/deal/deal.schema.js +131 -275
  60. package/dist/deal/deal.test-spec.d.ts +2 -7
  61. package/dist/deal/deal.test-spec.d.ts.map +1 -1
  62. package/dist/deal/deal.test-spec.js +56 -62
  63. package/dist/deal/index.d.ts +7 -4
  64. package/dist/deal/index.d.ts.map +1 -0
  65. package/dist/deal/index.js +408 -4
  66. package/dist/docs/crm-pipeline.docblock.d.ts +2 -1
  67. package/dist/docs/crm-pipeline.docblock.d.ts.map +1 -0
  68. package/dist/docs/crm-pipeline.docblock.js +45 -51
  69. package/dist/docs/index.d.ts +2 -1
  70. package/dist/docs/index.d.ts.map +1 -0
  71. package/dist/docs/index.js +114 -1
  72. package/dist/entities/company.entity.d.ts +27 -32
  73. package/dist/entities/company.entity.d.ts.map +1 -1
  74. package/dist/entities/company.entity.js +51 -61
  75. package/dist/entities/contact.entity.d.ts +31 -36
  76. package/dist/entities/contact.entity.d.ts.map +1 -1
  77. package/dist/entities/contact.entity.js +65 -76
  78. package/dist/entities/deal.entity.d.ts +52 -57
  79. package/dist/entities/deal.entity.d.ts.map +1 -1
  80. package/dist/entities/deal.entity.js +104 -116
  81. package/dist/entities/index.d.ts +6 -10
  82. package/dist/entities/index.d.ts.map +1 -1
  83. package/dist/entities/index.js +342 -31
  84. package/dist/entities/task.entity.d.ts +42 -47
  85. package/dist/entities/task.entity.d.ts.map +1 -1
  86. package/dist/entities/task.entity.js +95 -124
  87. package/dist/events/contact.event.d.ts +21 -27
  88. package/dist/events/contact.event.d.ts.map +1 -1
  89. package/dist/events/contact.event.js +29 -42
  90. package/dist/events/deal.event.d.ts +100 -106
  91. package/dist/events/deal.event.d.ts.map +1 -1
  92. package/dist/events/deal.event.js +93 -163
  93. package/dist/events/index.d.ts +4 -4
  94. package/dist/events/index.d.ts.map +1 -0
  95. package/dist/events/index.js +158 -4
  96. package/dist/events/task.event.d.ts +21 -27
  97. package/dist/events/task.event.d.ts.map +1 -1
  98. package/dist/events/task.event.js +26 -42
  99. package/dist/example.d.ts +2 -6
  100. package/dist/example.d.ts.map +1 -1
  101. package/dist/example.js +38 -50
  102. package/dist/handlers/crm.handlers.d.ts +80 -78
  103. package/dist/handlers/crm.handlers.d.ts.map +1 -1
  104. package/dist/handlers/crm.handlers.js +155 -166
  105. package/dist/handlers/deal.handlers.d.ts +58 -63
  106. package/dist/handlers/deal.handlers.d.ts.map +1 -1
  107. package/dist/handlers/deal.handlers.js +279 -105
  108. package/dist/handlers/index.d.ts +10 -4
  109. package/dist/handlers/index.d.ts.map +1 -0
  110. package/dist/handlers/index.js +456 -4
  111. package/dist/handlers/mock-data.d.ts +38 -41
  112. package/dist/handlers/mock-data.d.ts.map +1 -1
  113. package/dist/handlers/mock-data.js +162 -184
  114. package/dist/index.d.ts +13 -42
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js +3277 -53
  117. package/dist/node/crm-pipeline.feature.js +75 -0
  118. package/dist/node/deal/deal.enum.js +18 -0
  119. package/dist/node/deal/deal.operation.js +396 -0
  120. package/dist/node/deal/deal.schema.js +141 -0
  121. package/dist/node/deal/deal.test-spec.js +58 -0
  122. package/dist/node/deal/index.js +408 -0
  123. package/dist/node/docs/crm-pipeline.docblock.js +113 -0
  124. package/dist/node/docs/index.js +113 -0
  125. package/dist/node/entities/company.entity.js +52 -0
  126. package/dist/node/entities/contact.entity.js +66 -0
  127. package/dist/node/entities/deal.entity.js +107 -0
  128. package/dist/node/entities/index.js +343 -0
  129. package/dist/node/entities/task.entity.js +99 -0
  130. package/dist/node/events/contact.event.js +31 -0
  131. package/dist/node/events/deal.event.js +101 -0
  132. package/dist/node/events/index.js +158 -0
  133. package/dist/node/events/task.event.js +28 -0
  134. package/dist/node/example.js +39 -0
  135. package/dist/node/handlers/crm.handlers.js +160 -0
  136. package/dist/node/handlers/deal.handlers.js +293 -0
  137. package/dist/node/handlers/index.js +456 -0
  138. package/dist/node/handlers/mock-data.js +165 -0
  139. package/dist/node/index.js +3279 -0
  140. package/dist/node/operations/index.js +407 -0
  141. package/dist/node/presentations/dashboard.presentation.js +52 -0
  142. package/dist/node/presentations/index.js +284 -0
  143. package/dist/node/presentations/pipeline.presentation.js +233 -0
  144. package/dist/node/seeders/index.js +22 -0
  145. package/dist/node/shared/overlay-types.js +0 -0
  146. package/dist/node/ui/CrmDashboard.js +1325 -0
  147. package/dist/node/ui/CrmDealCard.js +50 -0
  148. package/dist/node/ui/CrmPipelineBoard.js +160 -0
  149. package/dist/node/ui/hooks/index.js +186 -0
  150. package/dist/node/ui/hooks/useDealList.js +84 -0
  151. package/dist/node/ui/hooks/useDealMutations.js +100 -0
  152. package/dist/node/ui/index.js +1972 -0
  153. package/dist/node/ui/modals/CreateDealModal.js +211 -0
  154. package/dist/node/ui/modals/DealActionsModal.js +428 -0
  155. package/dist/node/ui/modals/index.js +638 -0
  156. package/dist/node/ui/overlays/demo-overlays.js +55 -0
  157. package/dist/node/ui/overlays/index.js +55 -0
  158. package/dist/node/ui/renderers/index.js +827 -0
  159. package/dist/node/ui/renderers/pipeline.markdown.js +564 -0
  160. package/dist/node/ui/renderers/pipeline.renderer.js +264 -0
  161. package/dist/operations/index.d.ts +2 -5
  162. package/dist/operations/index.d.ts.map +1 -0
  163. package/dist/operations/index.js +407 -5
  164. package/dist/presentations/dashboard.presentation.d.ts +2 -7
  165. package/dist/presentations/dashboard.presentation.d.ts.map +1 -1
  166. package/dist/presentations/dashboard.presentation.js +51 -60
  167. package/dist/presentations/index.d.ts +3 -3
  168. package/dist/presentations/index.d.ts.map +1 -0
  169. package/dist/presentations/index.js +284 -3
  170. package/dist/presentations/pipeline.presentation.d.ts +4 -9
  171. package/dist/presentations/pipeline.presentation.d.ts.map +1 -1
  172. package/dist/presentations/pipeline.presentation.js +228 -116
  173. package/dist/seeders/index.d.ts +4 -8
  174. package/dist/seeders/index.d.ts.map +1 -1
  175. package/dist/seeders/index.js +21 -45
  176. package/dist/shared/overlay-types.d.ts +25 -28
  177. package/dist/shared/overlay-types.d.ts.map +1 -1
  178. package/dist/shared/overlay-types.js +1 -0
  179. package/dist/ui/CrmDashboard.d.ts +1 -6
  180. package/dist/ui/CrmDashboard.d.ts.map +1 -1
  181. package/dist/ui/CrmDashboard.js +1318 -296
  182. package/dist/ui/CrmDealCard.d.ts +8 -12
  183. package/dist/ui/CrmDealCard.d.ts.map +1 -1
  184. package/dist/ui/CrmDealCard.js +47 -45
  185. package/dist/ui/CrmPipelineBoard.d.ts +11 -20
  186. package/dist/ui/CrmPipelineBoard.d.ts.map +1 -1
  187. package/dist/ui/CrmPipelineBoard.js +157 -94
  188. package/dist/ui/hooks/index.d.ts +3 -3
  189. package/dist/ui/hooks/index.d.ts.map +1 -0
  190. package/dist/ui/hooks/index.js +185 -4
  191. package/dist/ui/hooks/useDealList.d.ts +28 -32
  192. package/dist/ui/hooks/useDealList.d.ts.map +1 -1
  193. package/dist/ui/hooks/useDealList.js +81 -90
  194. package/dist/ui/hooks/useDealMutations.d.ts +18 -22
  195. package/dist/ui/hooks/useDealMutations.d.ts.map +1 -1
  196. package/dist/ui/hooks/useDealMutations.js +97 -155
  197. package/dist/ui/index.d.ts +8 -14
  198. package/dist/ui/index.d.ts.map +1 -0
  199. package/dist/ui/index.js +1973 -15
  200. package/dist/ui/modals/CreateDealModal.d.ts +19 -29
  201. package/dist/ui/modals/CreateDealModal.d.ts.map +1 -1
  202. package/dist/ui/modals/CreateDealModal.js +209 -180
  203. package/dist/ui/modals/DealActionsModal.d.ts +31 -44
  204. package/dist/ui/modals/DealActionsModal.d.ts.map +1 -1
  205. package/dist/ui/modals/DealActionsModal.js +424 -367
  206. package/dist/ui/modals/index.d.ts +3 -3
  207. package/dist/ui/modals/index.d.ts.map +1 -0
  208. package/dist/ui/modals/index.js +638 -3
  209. package/dist/ui/overlays/demo-overlays.d.ts +10 -8
  210. package/dist/ui/overlays/demo-overlays.d.ts.map +1 -1
  211. package/dist/ui/overlays/demo-overlays.js +54 -66
  212. package/dist/ui/overlays/index.d.ts +2 -2
  213. package/dist/ui/overlays/index.d.ts.map +1 -0
  214. package/dist/ui/overlays/index.js +56 -3
  215. package/dist/ui/renderers/index.d.ts +3 -3
  216. package/dist/ui/renderers/index.d.ts.map +1 -0
  217. package/dist/ui/renderers/index.js +827 -3
  218. package/dist/ui/renderers/pipeline.markdown.d.ts +12 -11
  219. package/dist/ui/renderers/pipeline.markdown.d.ts.map +1 -1
  220. package/dist/ui/renderers/pipeline.markdown.js +560 -114
  221. package/dist/ui/renderers/pipeline.renderer.d.ts +9 -7
  222. package/dist/ui/renderers/pipeline.renderer.d.ts.map +1 -1
  223. package/dist/ui/renderers/pipeline.renderer.js +261 -24
  224. package/package.json +476 -90
  225. package/tsdown.config.js +1 -2
  226. package/.turbo/turbo-build$colon$bundle.log +0 -164
  227. package/dist/crm-pipeline.feature.js.map +0 -1
  228. package/dist/deal/deal.enum.js.map +0 -1
  229. package/dist/deal/deal.operation.js.map +0 -1
  230. package/dist/deal/deal.schema.js.map +0 -1
  231. package/dist/deal/deal.test-spec.js.map +0 -1
  232. package/dist/docs/crm-pipeline.docblock.js.map +0 -1
  233. package/dist/entities/company.entity.js.map +0 -1
  234. package/dist/entities/contact.entity.js.map +0 -1
  235. package/dist/entities/deal.entity.js.map +0 -1
  236. package/dist/entities/index.js.map +0 -1
  237. package/dist/entities/task.entity.js.map +0 -1
  238. package/dist/events/contact.event.js.map +0 -1
  239. package/dist/events/deal.event.js.map +0 -1
  240. package/dist/events/task.event.js.map +0 -1
  241. package/dist/example.js.map +0 -1
  242. package/dist/handlers/crm.handlers.js.map +0 -1
  243. package/dist/handlers/deal.handlers.js.map +0 -1
  244. package/dist/handlers/mock-data.js.map +0 -1
  245. package/dist/index.js.map +0 -1
  246. package/dist/presentations/dashboard.presentation.js.map +0 -1
  247. package/dist/presentations/pipeline.presentation.js.map +0 -1
  248. package/dist/seeders/index.js.map +0 -1
  249. package/dist/ui/CrmDashboard.js.map +0 -1
  250. package/dist/ui/CrmDealCard.js.map +0 -1
  251. package/dist/ui/CrmPipelineBoard.js.map +0 -1
  252. package/dist/ui/hooks/useDealList.js.map +0 -1
  253. package/dist/ui/hooks/useDealMutations.js.map +0 -1
  254. package/dist/ui/modals/CreateDealModal.js.map +0 -1
  255. package/dist/ui/modals/DealActionsModal.js.map +0 -1
  256. package/dist/ui/overlays/demo-overlays.js.map +0 -1
  257. package/dist/ui/renderers/pipeline.markdown.js.map +0 -1
  258. package/dist/ui/renderers/pipeline.renderer.js.map +0 -1
  259. package/tsconfig.tsbuildinfo +0 -1
@@ -1,172 +1,161 @@
1
+ // @bun
2
+ // src/handlers/crm.handlers.ts
1
3
  import { web } from "@contractspec/lib.runtime-sandbox";
2
-
3
- //#region src/handlers/crm.handlers.ts
4
- const { generateId } = web;
4
+ var { generateId } = web;
5
5
  function rowToDeal(row) {
6
- return {
7
- id: row.id,
8
- projectId: row.projectId,
9
- name: row.name,
10
- value: row.value,
11
- currency: row.currency,
12
- pipelineId: row.pipelineId,
13
- stageId: row.stageId,
14
- status: row.status,
15
- contactId: row.contactId ?? void 0,
16
- companyId: row.companyId ?? void 0,
17
- ownerId: row.ownerId,
18
- expectedCloseDate: row.expectedCloseDate ? new Date(row.expectedCloseDate) : void 0,
19
- wonSource: row.wonSource ?? void 0,
20
- lostReason: row.lostReason ?? void 0,
21
- notes: row.notes ?? void 0,
22
- createdAt: new Date(row.createdAt),
23
- updatedAt: new Date(row.updatedAt)
24
- };
6
+ return {
7
+ id: row.id,
8
+ projectId: row.projectId,
9
+ name: row.name,
10
+ value: row.value,
11
+ currency: row.currency,
12
+ pipelineId: row.pipelineId,
13
+ stageId: row.stageId,
14
+ status: row.status,
15
+ contactId: row.contactId ?? undefined,
16
+ companyId: row.companyId ?? undefined,
17
+ ownerId: row.ownerId,
18
+ expectedCloseDate: row.expectedCloseDate ? new Date(row.expectedCloseDate) : undefined,
19
+ wonSource: row.wonSource ?? undefined,
20
+ lostReason: row.lostReason ?? undefined,
21
+ notes: row.notes ?? undefined,
22
+ createdAt: new Date(row.createdAt),
23
+ updatedAt: new Date(row.updatedAt)
24
+ };
25
25
  }
26
26
  function createCrmHandlers(db) {
27
- /**
28
- * List deals with filtering
29
- */
30
- async function listDeals(input) {
31
- const { projectId, pipelineId, stageId, status, ownerId, search, limit = 20, offset = 0 } = input;
32
- let whereClause = "WHERE projectId = ?";
33
- const params = [projectId];
34
- if (pipelineId) {
35
- whereClause += " AND pipelineId = ?";
36
- params.push(pipelineId);
37
- }
38
- if (stageId) {
39
- whereClause += " AND stageId = ?";
40
- params.push(stageId);
41
- }
42
- if (status && status !== "all") {
43
- whereClause += " AND status = ?";
44
- params.push(status);
45
- }
46
- if (ownerId) {
47
- whereClause += " AND ownerId = ?";
48
- params.push(ownerId);
49
- }
50
- if (search) {
51
- whereClause += " AND name LIKE ?";
52
- params.push(`%${search}%`);
53
- }
54
- const total = (await db.query(`SELECT COUNT(*) as count FROM crm_deal ${whereClause}`, params)).rows[0]?.count ?? 0;
55
- const totalValue = (await db.query(`SELECT COALESCE(SUM(value), 0) as total FROM crm_deal ${whereClause}`, params)).rows[0]?.total ?? 0;
56
- return {
57
- deals: (await db.query(`SELECT * FROM crm_deal ${whereClause} ORDER BY value DESC LIMIT ? OFFSET ?`, [
58
- ...params,
59
- limit,
60
- offset
61
- ])).rows.map(rowToDeal),
62
- total,
63
- totalValue
64
- };
65
- }
66
- /**
67
- * Create a new deal
68
- */
69
- async function createDeal(input, context) {
70
- const id = generateId("deal");
71
- const now = (/* @__PURE__ */ new Date()).toISOString();
72
- await db.execute(`INSERT INTO crm_deal (id, projectId, pipelineId, stageId, name, value, currency, status, contactId, companyId, ownerId, expectedCloseDate, createdAt, updatedAt)
27
+ async function listDeals(input) {
28
+ const {
29
+ projectId,
30
+ pipelineId,
31
+ stageId,
32
+ status,
33
+ ownerId,
34
+ search,
35
+ limit = 20,
36
+ offset = 0
37
+ } = input;
38
+ let whereClause = "WHERE projectId = ?";
39
+ const params = [projectId];
40
+ if (pipelineId) {
41
+ whereClause += " AND pipelineId = ?";
42
+ params.push(pipelineId);
43
+ }
44
+ if (stageId) {
45
+ whereClause += " AND stageId = ?";
46
+ params.push(stageId);
47
+ }
48
+ if (status && status !== "all") {
49
+ whereClause += " AND status = ?";
50
+ params.push(status);
51
+ }
52
+ if (ownerId) {
53
+ whereClause += " AND ownerId = ?";
54
+ params.push(ownerId);
55
+ }
56
+ if (search) {
57
+ whereClause += " AND name LIKE ?";
58
+ params.push(`%${search}%`);
59
+ }
60
+ const countResult = (await db.query(`SELECT COUNT(*) as count FROM crm_deal ${whereClause}`, params)).rows;
61
+ const total = countResult[0]?.count ?? 0;
62
+ const valueResult = (await db.query(`SELECT COALESCE(SUM(value), 0) as total FROM crm_deal ${whereClause}`, params)).rows;
63
+ const totalValue = valueResult[0]?.total ?? 0;
64
+ const dealRows = (await db.query(`SELECT * FROM crm_deal ${whereClause} ORDER BY value DESC LIMIT ? OFFSET ?`, [...params, limit, offset])).rows;
65
+ return {
66
+ deals: dealRows.map(rowToDeal),
67
+ total,
68
+ totalValue
69
+ };
70
+ }
71
+ async function createDeal(input, context) {
72
+ const id = generateId("deal");
73
+ const now = new Date().toISOString();
74
+ await db.execute(`INSERT INTO crm_deal (id, projectId, pipelineId, stageId, name, value, currency, status, contactId, companyId, ownerId, expectedCloseDate, createdAt, updatedAt)
73
75
  VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, [
74
- id,
75
- context.projectId,
76
- input.pipelineId,
77
- input.stageId,
78
- input.name,
79
- input.value,
80
- input.currency ?? "USD",
81
- "OPEN",
82
- input.contactId ?? null,
83
- input.companyId ?? null,
84
- context.ownerId,
85
- input.expectedCloseDate?.toISOString() ?? null,
86
- now,
87
- now
88
- ]);
89
- const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [id])).rows;
90
- if (!rows[0]) throw new Error("Failed to create deal");
91
- return rowToDeal(rows[0]);
92
- }
93
- /**
94
- * Move a deal to a different stage
95
- */
96
- async function moveDeal(input) {
97
- const now = (/* @__PURE__ */ new Date()).toISOString();
98
- if (!(await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows[0]) throw new Error("NOT_FOUND");
99
- if (!(await db.query(`SELECT * FROM crm_stage WHERE id = ?`, [input.stageId])).rows[0]) throw new Error("INVALID_STAGE");
100
- await db.execute(`UPDATE crm_deal SET stageId = ?, updatedAt = ? WHERE id = ?`, [
101
- input.stageId,
102
- now,
103
- input.dealId
104
- ]);
105
- const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
106
- return rowToDeal(rows[0]);
107
- }
108
- /**
109
- * Mark a deal as won
110
- */
111
- async function winDeal(input) {
112
- const now = (/* @__PURE__ */ new Date()).toISOString();
113
- if (!(await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows[0]) throw new Error("NOT_FOUND");
114
- await db.execute(`UPDATE crm_deal SET status = 'WON', wonSource = ?, notes = ?, updatedAt = ? WHERE id = ?`, [
115
- input.wonSource ?? null,
116
- input.notes ?? null,
117
- now,
118
- input.dealId
119
- ]);
120
- const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
121
- return rowToDeal(rows[0]);
122
- }
123
- /**
124
- * Mark a deal as lost
125
- */
126
- async function loseDeal(input) {
127
- const now = (/* @__PURE__ */ new Date()).toISOString();
128
- if (!(await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows[0]) throw new Error("NOT_FOUND");
129
- await db.execute(`UPDATE crm_deal SET status = 'LOST', lostReason = ?, notes = ?, updatedAt = ? WHERE id = ?`, [
130
- input.lostReason,
131
- input.notes ?? null,
132
- now,
133
- input.dealId
134
- ]);
135
- const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
136
- return rowToDeal(rows[0]);
137
- }
138
- /**
139
- * Get deals grouped by stage
140
- */
141
- async function getDealsByStage(input) {
142
- const deals = (await db.query(`SELECT * FROM crm_deal WHERE projectId = ? AND pipelineId = ? AND status = 'OPEN' ORDER BY value DESC`, [input.projectId, input.pipelineId])).rows;
143
- const stages = (await db.query(`SELECT * FROM crm_stage WHERE pipelineId = ? ORDER BY position`, [input.pipelineId])).rows;
144
- const grouped = {};
145
- for (const stage of stages) grouped[stage.id] = deals.filter((d) => d.stageId === stage.id).map(rowToDeal);
146
- return grouped;
147
- }
148
- /**
149
- * Get pipeline stages
150
- */
151
- async function getPipelineStages(input) {
152
- return (await db.query(`SELECT * FROM crm_stage WHERE pipelineId = ? ORDER BY position`, [input.pipelineId])).rows.map((row) => ({
153
- id: row.id,
154
- pipelineId: row.pipelineId,
155
- name: row.name,
156
- position: row.position
157
- }));
158
- }
159
- return {
160
- listDeals,
161
- createDeal,
162
- moveDeal,
163
- winDeal,
164
- loseDeal,
165
- getDealsByStage,
166
- getPipelineStages
167
- };
76
+ id,
77
+ context.projectId,
78
+ input.pipelineId,
79
+ input.stageId,
80
+ input.name,
81
+ input.value,
82
+ input.currency ?? "USD",
83
+ "OPEN",
84
+ input.contactId ?? null,
85
+ input.companyId ?? null,
86
+ context.ownerId,
87
+ input.expectedCloseDate?.toISOString() ?? null,
88
+ now,
89
+ now
90
+ ]);
91
+ const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [id])).rows;
92
+ if (!rows[0]) {
93
+ throw new Error("Failed to create deal");
94
+ }
95
+ return rowToDeal(rows[0]);
96
+ }
97
+ async function moveDeal(input) {
98
+ const now = new Date().toISOString();
99
+ const existing = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
100
+ if (!existing[0]) {
101
+ throw new Error("NOT_FOUND");
102
+ }
103
+ const stage = (await db.query(`SELECT * FROM crm_stage WHERE id = ?`, [input.stageId])).rows;
104
+ if (!stage[0]) {
105
+ throw new Error("INVALID_STAGE");
106
+ }
107
+ await db.execute(`UPDATE crm_deal SET stageId = ?, updatedAt = ? WHERE id = ?`, [input.stageId, now, input.dealId]);
108
+ const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
109
+ return rowToDeal(rows[0]);
110
+ }
111
+ async function winDeal(input) {
112
+ const now = new Date().toISOString();
113
+ const existing = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
114
+ if (!existing[0]) {
115
+ throw new Error("NOT_FOUND");
116
+ }
117
+ await db.execute(`UPDATE crm_deal SET status = 'WON', wonSource = ?, notes = ?, updatedAt = ? WHERE id = ?`, [input.wonSource ?? null, input.notes ?? null, now, input.dealId]);
118
+ const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
119
+ return rowToDeal(rows[0]);
120
+ }
121
+ async function loseDeal(input) {
122
+ const now = new Date().toISOString();
123
+ const existing = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
124
+ if (!existing[0]) {
125
+ throw new Error("NOT_FOUND");
126
+ }
127
+ await db.execute(`UPDATE crm_deal SET status = 'LOST', lostReason = ?, notes = ?, updatedAt = ? WHERE id = ?`, [input.lostReason, input.notes ?? null, now, input.dealId]);
128
+ const rows = (await db.query(`SELECT * FROM crm_deal WHERE id = ?`, [input.dealId])).rows;
129
+ return rowToDeal(rows[0]);
130
+ }
131
+ async function getDealsByStage(input) {
132
+ const deals = (await db.query(`SELECT * FROM crm_deal WHERE projectId = ? AND pipelineId = ? AND status = 'OPEN' ORDER BY value DESC`, [input.projectId, input.pipelineId])).rows;
133
+ const stages = (await db.query(`SELECT * FROM crm_stage WHERE pipelineId = ? ORDER BY position`, [input.pipelineId])).rows;
134
+ const grouped = {};
135
+ for (const stage of stages) {
136
+ grouped[stage.id] = deals.filter((d) => d.stageId === stage.id).map(rowToDeal);
137
+ }
138
+ return grouped;
139
+ }
140
+ async function getPipelineStages(input) {
141
+ const rows = (await db.query(`SELECT * FROM crm_stage WHERE pipelineId = ? ORDER BY position`, [input.pipelineId])).rows;
142
+ return rows.map((row) => ({
143
+ id: row.id,
144
+ pipelineId: row.pipelineId,
145
+ name: row.name,
146
+ position: row.position
147
+ }));
148
+ }
149
+ return {
150
+ listDeals,
151
+ createDeal,
152
+ moveDeal,
153
+ winDeal,
154
+ loseDeal,
155
+ getDealsByStage,
156
+ getPipelineStages
157
+ };
168
158
  }
169
-
170
- //#endregion
171
- export { createCrmHandlers };
172
- //# sourceMappingURL=crm.handlers.js.map
159
+ export {
160
+ createCrmHandlers
161
+ };
@@ -1,94 +1,89 @@
1
- import { MockStage } from "./mock-data.js";
2
-
3
- //#region src/handlers/deal.handlers.d.ts
4
- interface Deal {
5
- id: string;
6
- name: string;
7
- value: number;
8
- currency: string;
9
- pipelineId: string;
10
- stageId: string;
11
- status: 'OPEN' | 'WON' | 'LOST' | 'STALE';
12
- contactId?: string;
13
- companyId?: string;
14
- ownerId: string;
15
- expectedCloseDate?: Date;
16
- createdAt: Date;
17
- updatedAt: Date;
1
+ export interface Deal {
2
+ id: string;
3
+ name: string;
4
+ value: number;
5
+ currency: string;
6
+ pipelineId: string;
7
+ stageId: string;
8
+ status: 'OPEN' | 'WON' | 'LOST' | 'STALE';
9
+ contactId?: string;
10
+ companyId?: string;
11
+ ownerId: string;
12
+ expectedCloseDate?: Date;
13
+ createdAt: Date;
14
+ updatedAt: Date;
18
15
  }
19
- interface CreateDealInput {
20
- name: string;
21
- value: number;
22
- currency?: string;
23
- pipelineId: string;
24
- stageId: string;
25
- contactId?: string;
26
- companyId?: string;
27
- expectedCloseDate?: Date;
16
+ export interface CreateDealInput {
17
+ name: string;
18
+ value: number;
19
+ currency?: string;
20
+ pipelineId: string;
21
+ stageId: string;
22
+ contactId?: string;
23
+ companyId?: string;
24
+ expectedCloseDate?: Date;
28
25
  }
29
- interface MoveDealInput {
30
- dealId: string;
31
- stageId: string;
32
- position?: number;
26
+ export interface MoveDealInput {
27
+ dealId: string;
28
+ stageId: string;
29
+ position?: number;
33
30
  }
34
- interface WinDealInput {
35
- dealId: string;
36
- wonSource?: string;
37
- notes?: string;
31
+ export interface WinDealInput {
32
+ dealId: string;
33
+ wonSource?: string;
34
+ notes?: string;
38
35
  }
39
- interface LoseDealInput {
40
- dealId: string;
41
- lostReason: string;
42
- notes?: string;
36
+ export interface LoseDealInput {
37
+ dealId: string;
38
+ lostReason: string;
39
+ notes?: string;
43
40
  }
44
- interface ListDealsInput {
45
- pipelineId?: string;
46
- stageId?: string;
47
- status?: 'OPEN' | 'WON' | 'LOST' | 'all';
48
- ownerId?: string;
49
- search?: string;
50
- limit?: number;
51
- offset?: number;
41
+ export interface ListDealsInput {
42
+ pipelineId?: string;
43
+ stageId?: string;
44
+ status?: 'OPEN' | 'WON' | 'LOST' | 'all';
45
+ ownerId?: string;
46
+ search?: string;
47
+ limit?: number;
48
+ offset?: number;
52
49
  }
53
- interface ListDealsOutput {
54
- deals: Deal[];
55
- total: number;
56
- totalValue: number;
50
+ export interface ListDealsOutput {
51
+ deals: Deal[];
52
+ total: number;
53
+ totalValue: number;
57
54
  }
58
55
  /**
59
56
  * Mock handler for ListDealsContract
60
57
  */
61
- declare function mockListDealsHandler(input: ListDealsInput): Promise<ListDealsOutput>;
58
+ export declare function mockListDealsHandler(input: ListDealsInput): Promise<ListDealsOutput>;
62
59
  /**
63
60
  * Mock handler for CreateDealContract
64
61
  */
65
- declare function mockCreateDealHandler(input: CreateDealInput, context: {
66
- ownerId: string;
62
+ export declare function mockCreateDealHandler(input: CreateDealInput, context: {
63
+ ownerId: string;
67
64
  }): Promise<Deal>;
68
65
  /**
69
66
  * Mock handler for MoveDealContract
70
67
  */
71
- declare function mockMoveDealHandler(input: MoveDealInput): Promise<Deal>;
68
+ export declare function mockMoveDealHandler(input: MoveDealInput): Promise<Deal>;
72
69
  /**
73
70
  * Mock handler for WinDealContract
74
71
  */
75
- declare function mockWinDealHandler(input: WinDealInput): Promise<Deal>;
72
+ export declare function mockWinDealHandler(input: WinDealInput): Promise<Deal>;
76
73
  /**
77
74
  * Mock handler for LoseDealContract
78
75
  */
79
- declare function mockLoseDealHandler(input: LoseDealInput): Promise<Deal>;
76
+ export declare function mockLoseDealHandler(input: LoseDealInput): Promise<Deal>;
80
77
  /**
81
78
  * Get deals grouped by stage for Kanban view
82
79
  */
83
- declare function mockGetDealsByStageHandler(input: {
84
- pipelineId: string;
80
+ export declare function mockGetDealsByStageHandler(input: {
81
+ pipelineId: string;
85
82
  }): Promise<Record<string, Deal[]>>;
86
83
  /**
87
84
  * Get pipeline stages
88
85
  */
89
- declare function mockGetPipelineStagesHandler(input: {
90
- pipelineId: string;
91
- }): Promise<MockStage[]>;
92
- //#endregion
93
- export { CreateDealInput, Deal, ListDealsInput, ListDealsOutput, LoseDealInput, MoveDealInput, WinDealInput, mockCreateDealHandler, mockGetDealsByStageHandler, mockGetPipelineStagesHandler, mockListDealsHandler, mockLoseDealHandler, mockMoveDealHandler, mockWinDealHandler };
86
+ export declare function mockGetPipelineStagesHandler(input: {
87
+ pipelineId: string;
88
+ }): Promise<import("./mock-data").MockStage[]>;
94
89
  //# sourceMappingURL=deal.handlers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"deal.handlers.d.ts","names":[],"sources":["../../src/handlers/deal.handlers.ts"],"mappings":";;;UAMiB,IAAA;EACf,EAAA;EACA,IAAA;EACA,KAAA;EACA,QAAA;EACA,UAAA;EACA,OAAA;EACA,MAAA;EACA,SAAA;EACA,SAAA;EACA,OAAA;EACA,iBAAA,GAAoB,IAAA;EACpB,SAAA,EAAW,IAAA;EACX,SAAA,EAAW,IAAA;AAAA;AAAA,UAGI,eAAA;EACf,IAAA;EACA,KAAA;EACA,QAAA;EACA,UAAA;EACA,OAAA;EACA,SAAA;EACA,SAAA;EACA,iBAAA,GAAoB,IAAA;AAAA;AAAA,UAGL,aAAA;EACf,MAAA;EACA,OAAA;EACA,QAAA;AAAA;AAAA,UAGe,YAAA;EACf,MAAA;EACA,SAAA;EACA,KAAA;AAAA;AAAA,UAGe,aAAA;EACf,MAAA;EACA,UAAA;EACA,KAAA;AAAA;AAAA,UAGe,cAAA;EACf,UAAA;EACA,OAAA;EACA,MAAA;EACA,OAAA;EACA,MAAA;EACA,KAAA;EACA,MAAA;AAAA;AAAA,UAGe,eAAA;EACf,KAAA,EAAO,IAAA;EACP,KAAA;EACA,UAAA;AAAA;;;;iBAMoB,oBAAA,CACpB,KAAA,EAAO,cAAA,GACN,OAAA,CAAQ,eAAA;;;;iBAmDW,qBAAA,CACpB,KAAA,EAAO,eAAA,EACP,OAAA;EAAW,OAAA;AAAA,IACV,OAAA,CAAQ,IAAA;;;;iBA2BW,mBAAA,CAAoB,KAAA,EAAO,aAAA,GAAgB,OAAA,CAAQ,IAAA;;;;iBA6BnD,kBAAA,CAAmB,KAAA,EAAO,YAAA,GAAe,OAAA,CAAQ,IAAA;;;;iBAwBjD,mBAAA,CAAoB,KAAA,EAAO,aAAA,GAAgB,OAAA,CAAQ,IAAA;;;;iBAwBnD,0BAAA,CAA2B,KAAA;EAC/C,UAAA;AAAA,IACE,OAAA,CAAQ,MAAA,SAAe,IAAA;;;AA3K3B;iBA2LsB,4BAAA,CAA6B,KAAA;EACjD,UAAA;AAAA,IACD,OAAA,CAFiD,SAAA"}
1
+ {"version":3,"file":"deal.handlers.d.ts","sourceRoot":"","sources":["../../src/handlers/deal.handlers.ts"],"names":[],"mappings":"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"}