@open-mercato/core 0.7.1-develop.7178.1.ab93fbaf4e → 0.7.1-develop.7180.1.9717fbbb43

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 (808) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/staff_time_entry/index.js +14 -0
  3. package/dist/generated/entities/staff_time_entry/index.js.map +2 -2
  4. package/dist/generated/entities/staff_time_entry_tag/index.js +15 -0
  5. package/dist/generated/entities/staff_time_entry_tag/index.js.map +7 -0
  6. package/dist/generated/entities/staff_time_project/index.js +16 -0
  7. package/dist/generated/entities/staff_time_project/index.js.map +2 -2
  8. package/dist/generated/entities/staff_time_report/index.js +57 -0
  9. package/dist/generated/entities/staff_time_report/index.js.map +7 -0
  10. package/dist/generated/entities/staff_time_report_entry/index.js +27 -0
  11. package/dist/generated/entities/staff_time_report_entry/index.js.map +7 -0
  12. package/dist/generated/entities/staff_time_report_event/index.js +21 -0
  13. package/dist/generated/entities/staff_time_report_event/index.js.map +7 -0
  14. package/dist/generated/entities/staff_time_report_project/index.js +15 -0
  15. package/dist/generated/entities/staff_time_report_project/index.js.map +7 -0
  16. package/dist/generated/entities/staff_time_tag/index.js +21 -0
  17. package/dist/generated/entities/staff_time_tag/index.js.map +7 -0
  18. package/dist/generated/entities/staff_time_task/index.js +37 -0
  19. package/dist/generated/entities/staff_time_task/index.js.map +7 -0
  20. package/dist/generated/entities/staff_time_task_comment/index.js +21 -0
  21. package/dist/generated/entities/staff_time_task_comment/index.js.map +7 -0
  22. package/dist/generated/entities/staff_time_task_status/index.js +29 -0
  23. package/dist/generated/entities/staff_time_task_status/index.js.map +7 -0
  24. package/dist/generated/entities/staff_time_task_tag/index.js +15 -0
  25. package/dist/generated/entities/staff_time_task_tag/index.js.map +7 -0
  26. package/dist/generated/entities.ids.generated.js +11 -1
  27. package/dist/generated/entities.ids.generated.js.map +2 -2
  28. package/dist/generated/entity-fields-registry.js +149 -0
  29. package/dist/generated/entity-fields-registry.js.map +2 -2
  30. package/dist/helpers/integration/timesheetFixtures.js +7 -0
  31. package/dist/helpers/integration/timesheetFixtures.js.map +2 -2
  32. package/dist/modules/auth/cli.js +16 -0
  33. package/dist/modules/auth/cli.js.map +2 -2
  34. package/dist/modules/auth/lib/backendChrome.js +1 -0
  35. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  36. package/dist/modules/customer_accounts/lib/customerRoleAcls.js +44 -0
  37. package/dist/modules/customer_accounts/lib/customerRoleAcls.js.map +7 -0
  38. package/dist/modules/customer_accounts/setup.js +1 -28
  39. package/dist/modules/customer_accounts/setup.js.map +2 -2
  40. package/dist/modules/data_sync/api/options.js +2 -0
  41. package/dist/modules/data_sync/api/options.js.map +2 -2
  42. package/dist/modules/data_sync/backend/data-sync/page.js +39 -17
  43. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  44. package/dist/modules/data_sync/lib/start-controls.js +42 -0
  45. package/dist/modules/data_sync/lib/start-controls.js.map +7 -0
  46. package/dist/modules/staff/acl.js +9 -1
  47. package/dist/modules/staff/acl.js.map +2 -2
  48. package/dist/modules/staff/ai-agents.js +142 -0
  49. package/dist/modules/staff/ai-agents.js.map +7 -0
  50. package/dist/modules/staff/ai-tools/time-tracking-pack.js +348 -0
  51. package/dist/modules/staff/ai-tools/time-tracking-pack.js.map +7 -0
  52. package/dist/modules/staff/ai-tools/types.js +54 -0
  53. package/dist/modules/staff/ai-tools/types.js.map +7 -0
  54. package/dist/modules/staff/ai-tools.js +8 -0
  55. package/dist/modules/staff/ai-tools.js.map +7 -0
  56. package/dist/modules/staff/analytics.js +84 -1
  57. package/dist/modules/staff/analytics.js.map +2 -2
  58. package/dist/modules/staff/api/guards.js +37 -3
  59. package/dist/modules/staff/api/guards.js.map +2 -2
  60. package/dist/modules/staff/api/leave-requests/accept/route.js +1 -3
  61. package/dist/modules/staff/api/leave-requests/accept/route.js.map +2 -2
  62. package/dist/modules/staff/api/leave-requests/reject/route.js +1 -3
  63. package/dist/modules/staff/api/leave-requests/reject/route.js.map +2 -2
  64. package/dist/modules/staff/api/portal/time-reports/[id]/route.js +131 -0
  65. package/dist/modules/staff/api/portal/time-reports/[id]/route.js.map +7 -0
  66. package/dist/modules/staff/api/portal/time-reports/route.js +179 -0
  67. package/dist/modules/staff/api/portal/time-reports/route.js.map +7 -0
  68. package/dist/modules/staff/api/team-members/self/route.js +1 -3
  69. package/dist/modules/staff/api/team-members/self/route.js.map +2 -2
  70. package/dist/modules/staff/api/team-members/tags/assign/route.js +1 -3
  71. package/dist/modules/staff/api/team-members/tags/assign/route.js.map +2 -2
  72. package/dist/modules/staff/api/team-members/tags/unassign/route.js +1 -3
  73. package/dist/modules/staff/api/team-members/tags/unassign/route.js.map +2 -2
  74. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js +174 -0
  75. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js.map +7 -0
  76. package/dist/modules/staff/api/timesheets/access-requests/route.js +226 -0
  77. package/dist/modules/staff/api/timesheets/access-requests/route.js.map +7 -0
  78. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +15 -8
  79. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +2 -2
  80. package/dist/modules/staff/api/timesheets/my-projects/route.js +13 -1
  81. package/dist/modules/staff/api/timesheets/my-projects/route.js.map +2 -2
  82. package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js +42 -0
  83. package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js.map +7 -0
  84. package/dist/modules/staff/api/timesheets/my-work/route.js +383 -0
  85. package/dist/modules/staff/api/timesheets/my-work/route.js.map +7 -0
  86. package/dist/modules/staff/api/timesheets/projects/kpis/route.js +14 -2
  87. package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +2 -2
  88. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js +168 -0
  89. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js.map +7 -0
  90. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js +246 -0
  91. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js.map +7 -0
  92. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js +183 -0
  93. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js.map +7 -0
  94. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js +164 -0
  95. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js.map +7 -0
  96. package/dist/modules/staff/api/timesheets/reports/preview/route.js +360 -0
  97. package/dist/modules/staff/api/timesheets/reports/preview/route.js.map +7 -0
  98. package/dist/modules/staff/api/timesheets/reports/route.js +316 -0
  99. package/dist/modules/staff/api/timesheets/reports/route.js.map +7 -0
  100. package/dist/modules/staff/api/timesheets/reports/shared.js +63 -0
  101. package/dist/modules/staff/api/timesheets/reports/shared.js.map +7 -0
  102. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js +164 -0
  103. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js.map +7 -0
  104. package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js +168 -0
  105. package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js.map +7 -0
  106. package/dist/modules/staff/api/timesheets/settings/route.js +199 -0
  107. package/dist/modules/staff/api/timesheets/settings/route.js.map +7 -0
  108. package/dist/modules/staff/api/timesheets/tags/access.js +76 -0
  109. package/dist/modules/staff/api/timesheets/tags/access.js.map +7 -0
  110. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js +235 -0
  111. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js.map +7 -0
  112. package/dist/modules/staff/api/timesheets/tags/route.js +160 -0
  113. package/dist/modules/staff/api/timesheets/tags/route.js.map +7 -0
  114. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js +233 -0
  115. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js.map +7 -0
  116. package/dist/modules/staff/api/timesheets/task-statuses/route.js +188 -0
  117. package/dist/modules/staff/api/timesheets/task-statuses/route.js.map +7 -0
  118. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js +399 -0
  119. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js.map +7 -0
  120. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js +210 -0
  121. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js.map +7 -0
  122. package/dist/modules/staff/api/timesheets/tasks/route.js +333 -0
  123. package/dist/modules/staff/api/timesheets/tasks/route.js.map +7 -0
  124. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js +228 -0
  125. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js.map +7 -0
  126. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js +29 -10
  127. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js.map +2 -2
  128. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +31 -18
  129. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +2 -2
  130. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +21 -7
  131. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +2 -2
  132. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +27 -7
  133. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +2 -2
  134. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +215 -32
  135. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +2 -2
  136. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js +378 -0
  137. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js.map +7 -0
  138. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js +340 -0
  139. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js.map +7 -0
  140. package/dist/modules/staff/api/timesheets/time-entries/route.js +238 -26
  141. package/dist/modules/staff/api/timesheets/time-entries/route.js.map +2 -2
  142. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js +23 -8
  143. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js.map +2 -2
  144. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js +209 -0
  145. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js.map +7 -0
  146. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +59 -2
  147. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +2 -2
  148. package/dist/modules/staff/api/timesheets/time-projects/route.js +264 -22
  149. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +2 -2
  150. package/dist/modules/staff/backend/staff/time-tracking/board/page.js +110 -0
  151. package/dist/modules/staff/backend/staff/time-tracking/board/page.js.map +7 -0
  152. package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js +18 -0
  153. package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js.map +7 -0
  154. package/dist/modules/staff/backend/staff/time-tracking/entries/page.js +981 -0
  155. package/dist/modules/staff/backend/staff/time-tracking/entries/page.js.map +7 -0
  156. package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js +18 -0
  157. package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js.map +7 -0
  158. package/dist/modules/staff/backend/staff/time-tracking/page.js +583 -0
  159. package/dist/modules/staff/backend/staff/time-tracking/page.js.map +7 -0
  160. package/dist/modules/staff/backend/staff/time-tracking/page.meta.js +15 -0
  161. package/dist/modules/staff/backend/staff/time-tracking/page.meta.js.map +7 -0
  162. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js +65 -0
  163. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js.map +7 -0
  164. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js +16 -0
  165. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js.map +7 -0
  166. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js +229 -0
  167. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js.map +7 -0
  168. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js +16 -0
  169. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js.map +7 -0
  170. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js +1014 -0
  171. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js.map +7 -0
  172. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js +16 -0
  173. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js.map +7 -0
  174. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js +97 -0
  175. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js.map +7 -0
  176. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js +16 -0
  177. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js.map +7 -0
  178. package/dist/modules/staff/backend/staff/time-tracking/projects/page.js +1040 -0
  179. package/dist/modules/staff/backend/staff/time-tracking/projects/page.js.map +7 -0
  180. package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js +19 -0
  181. package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js.map +7 -0
  182. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js +353 -0
  183. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js.map +7 -0
  184. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js +457 -0
  185. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js.map +7 -0
  186. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js +16 -0
  187. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js.map +7 -0
  188. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js +697 -0
  189. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js.map +7 -0
  190. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js +16 -0
  191. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js.map +7 -0
  192. package/dist/modules/staff/backend/staff/time-tracking/reports/page.js +174 -0
  193. package/dist/modules/staff/backend/staff/time-tracking/reports/page.js.map +7 -0
  194. package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js +18 -0
  195. package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js.map +7 -0
  196. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js +546 -0
  197. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js.map +7 -0
  198. package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js +18 -0
  199. package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js.map +7 -0
  200. package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js +710 -0
  201. package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js.map +7 -0
  202. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js +646 -0
  203. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js.map +7 -0
  204. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js +18 -0
  205. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js.map +7 -0
  206. package/dist/modules/staff/backend/staff/timesheets/page.js +4 -793
  207. package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
  208. package/dist/modules/staff/backend/staff/timesheets/page.meta.js +2 -7
  209. package/dist/modules/staff/backend/staff/timesheets/page.meta.js.map +2 -2
  210. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js +5 -136
  211. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +2 -2
  212. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js +1 -7
  213. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js.map +2 -2
  214. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +5 -445
  215. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +3 -3
  216. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js +1 -7
  217. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js.map +2 -2
  218. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js +4 -76
  219. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js.map +2 -2
  220. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js +1 -7
  221. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js.map +2 -2
  222. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +4 -613
  223. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
  224. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js +2 -17
  225. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js.map +2 -2
  226. package/dist/modules/staff/ce.js +40 -0
  227. package/dist/modules/staff/ce.js.map +2 -2
  228. package/dist/modules/staff/cli.js +166 -1
  229. package/dist/modules/staff/cli.js.map +2 -2
  230. package/dist/modules/staff/commands/index.js +5 -0
  231. package/dist/modules/staff/commands/index.js.map +2 -2
  232. package/dist/modules/staff/commands/timesheets-entries.js +569 -21
  233. package/dist/modules/staff/commands/timesheets-entries.js.map +3 -3
  234. package/dist/modules/staff/commands/timesheets-projects.js +450 -7
  235. package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
  236. package/dist/modules/staff/commands/timesheets-reports.js +1036 -0
  237. package/dist/modules/staff/commands/timesheets-reports.js.map +7 -0
  238. package/dist/modules/staff/commands/timesheets-tags.js +1015 -0
  239. package/dist/modules/staff/commands/timesheets-tags.js.map +7 -0
  240. package/dist/modules/staff/commands/timesheets-task-comments.js +438 -0
  241. package/dist/modules/staff/commands/timesheets-task-comments.js.map +7 -0
  242. package/dist/modules/staff/commands/timesheets-task-statuses.js +723 -0
  243. package/dist/modules/staff/commands/timesheets-task-statuses.js.map +7 -0
  244. package/dist/modules/staff/commands/timesheets-tasks.js +834 -0
  245. package/dist/modules/staff/commands/timesheets-tasks.js.map +7 -0
  246. package/dist/modules/staff/data/enrichers.js +426 -12
  247. package/dist/modules/staff/data/enrichers.js.map +2 -2
  248. package/dist/modules/staff/data/entities.js +552 -3
  249. package/dist/modules/staff/data/entities.js.map +2 -2
  250. package/dist/modules/staff/data/extensions.js +41 -0
  251. package/dist/modules/staff/data/extensions.js.map +7 -0
  252. package/dist/modules/staff/data/validators.js +254 -9
  253. package/dist/modules/staff/data/validators.js.map +2 -2
  254. package/dist/modules/staff/di.js +42 -1
  255. package/dist/modules/staff/di.js.map +2 -2
  256. package/dist/modules/staff/events.js +84 -6
  257. package/dist/modules/staff/events.js.map +2 -2
  258. package/dist/modules/staff/events.payloads.js +158 -0
  259. package/dist/modules/staff/events.payloads.js.map +7 -0
  260. package/dist/modules/staff/extension-points.js +261 -0
  261. package/dist/modules/staff/extension-points.js.map +7 -0
  262. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js +138 -0
  263. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js.map +7 -0
  264. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js +12 -0
  265. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js.map +7 -0
  266. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js +133 -0
  267. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js.map +7 -0
  268. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js +19 -0
  269. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js.map +7 -0
  270. package/dist/modules/staff/lib/crud.js +11 -1
  271. package/dist/modules/staff/lib/crud.js.map +2 -2
  272. package/dist/modules/staff/lib/time-tracking/access.js +92 -0
  273. package/dist/modules/staff/lib/time-tracking/access.js.map +7 -0
  274. package/dist/modules/staff/lib/time-tracking/billability.js +39 -0
  275. package/dist/modules/staff/lib/time-tracking/billability.js.map +7 -0
  276. package/dist/modules/staff/lib/time-tracking/capacity.js +68 -0
  277. package/dist/modules/staff/lib/time-tracking/capacity.js.map +7 -0
  278. package/dist/modules/staff/lib/time-tracking/componentContracts.js +15 -0
  279. package/dist/modules/staff/lib/time-tracking/componentContracts.js.map +7 -0
  280. package/dist/modules/staff/lib/time-tracking/cost.js +82 -0
  281. package/dist/modules/staff/lib/time-tracking/cost.js.map +7 -0
  282. package/dist/modules/staff/lib/time-tracking/duration.js +55 -0
  283. package/dist/modules/staff/lib/time-tracking/duration.js.map +7 -0
  284. package/dist/modules/staff/lib/time-tracking/featureAccess.js +41 -0
  285. package/dist/modules/staff/lib/time-tracking/featureAccess.js.map +7 -0
  286. package/dist/modules/staff/lib/time-tracking/interval.js +72 -0
  287. package/dist/modules/staff/lib/time-tracking/interval.js.map +7 -0
  288. package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js +88 -0
  289. package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js.map +7 -0
  290. package/dist/modules/staff/lib/time-tracking/moneyVisibility.js +10 -0
  291. package/dist/modules/staff/lib/time-tracking/moneyVisibility.js.map +7 -0
  292. package/dist/modules/staff/lib/time-tracking/overlap.js +87 -0
  293. package/dist/modules/staff/lib/time-tracking/overlap.js.map +7 -0
  294. package/dist/modules/staff/lib/time-tracking/portalRecipients.js +27 -0
  295. package/dist/modules/staff/lib/time-tracking/portalRecipients.js.map +7 -0
  296. package/dist/modules/staff/lib/time-tracking/portalReports.js +16 -0
  297. package/dist/modules/staff/lib/time-tracking/portalReports.js.map +7 -0
  298. package/dist/modules/staff/lib/time-tracking/projectCode.js +135 -0
  299. package/dist/modules/staff/lib/time-tracking/projectCode.js.map +7 -0
  300. package/dist/modules/staff/lib/time-tracking/reapplyRounding.js +187 -0
  301. package/dist/modules/staff/lib/time-tracking/reapplyRounding.js.map +7 -0
  302. package/dist/modules/staff/lib/time-tracking/recalculationRunner.js +80 -0
  303. package/dist/modules/staff/lib/time-tracking/recalculationRunner.js.map +7 -0
  304. package/dist/modules/staff/lib/time-tracking/recalculations.js +56 -0
  305. package/dist/modules/staff/lib/time-tracking/recalculations.js.map +7 -0
  306. package/dist/modules/staff/lib/time-tracking/registries/invoke.js +63 -0
  307. package/dist/modules/staff/lib/time-tracking/registries/invoke.js.map +7 -0
  308. package/dist/modules/staff/lib/time-tracking/registries/registry.js +62 -0
  309. package/dist/modules/staff/lib/time-tracking/registries/registry.js.map +7 -0
  310. package/dist/modules/staff/lib/time-tracking/registries/scope.js +21 -0
  311. package/dist/modules/staff/lib/time-tracking/registries/scope.js.map +7 -0
  312. package/dist/modules/staff/lib/time-tracking/rollup.js +34 -0
  313. package/dist/modules/staff/lib/time-tracking/rollup.js.map +7 -0
  314. package/dist/modules/staff/lib/time-tracking/rounding.js +66 -0
  315. package/dist/modules/staff/lib/time-tracking/rounding.js.map +7 -0
  316. package/dist/modules/staff/lib/time-tracking/roundingImpact.js +39 -0
  317. package/dist/modules/staff/lib/time-tracking/roundingImpact.js.map +7 -0
  318. package/dist/modules/staff/lib/time-tracking/settingKeys.js +214 -0
  319. package/dist/modules/staff/lib/time-tracking/settingKeys.js.map +7 -0
  320. package/dist/modules/staff/lib/time-tracking/settings.js +87 -0
  321. package/dist/modules/staff/lib/time-tracking/settings.js.map +7 -0
  322. package/dist/modules/staff/lib/time-tracking/sqlInClause.js +9 -0
  323. package/dist/modules/staff/lib/time-tracking/sqlInClause.js.map +7 -0
  324. package/dist/modules/staff/lib/time-tracking/timeEntrySources.js +48 -0
  325. package/dist/modules/staff/lib/time-tracking/timeEntrySources.js.map +7 -0
  326. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js +283 -0
  327. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js.map +7 -0
  328. package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js +324 -0
  329. package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js.map +7 -0
  330. package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js +121 -0
  331. package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js.map +7 -0
  332. package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js +188 -0
  333. package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js.map +7 -0
  334. package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js +89 -0
  335. package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js.map +7 -0
  336. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js +855 -0
  337. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js.map +7 -0
  338. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js +360 -0
  339. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js.map +7 -0
  340. package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js +259 -0
  341. package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js.map +7 -0
  342. package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js +238 -0
  343. package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js.map +7 -0
  344. package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js +130 -0
  345. package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js.map +7 -0
  346. package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js +98 -0
  347. package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js.map +7 -0
  348. package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js +27 -0
  349. package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js.map +7 -0
  350. package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js +166 -0
  351. package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js.map +7 -0
  352. package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js +295 -0
  353. package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js.map +7 -0
  354. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js +212 -0
  355. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js.map +7 -0
  356. package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js +729 -0
  357. package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js.map +7 -0
  358. package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js +217 -0
  359. package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js.map +7 -0
  360. package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js +158 -0
  361. package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js.map +7 -0
  362. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js +224 -0
  363. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js.map +7 -0
  364. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js +93 -0
  365. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js.map +7 -0
  366. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js +1196 -0
  367. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js.map +7 -0
  368. package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js +176 -0
  369. package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js.map +7 -0
  370. package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js +307 -0
  371. package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js.map +7 -0
  372. package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js +284 -0
  373. package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js.map +7 -0
  374. package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js +73 -0
  375. package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js.map +7 -0
  376. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js +1499 -0
  377. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js.map +7 -0
  378. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js +95 -0
  379. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js.map +7 -0
  380. package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js +188 -0
  381. package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js.map +7 -0
  382. package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js +61 -0
  383. package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js.map +7 -0
  384. package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js +45 -0
  385. package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js.map +7 -0
  386. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js +176 -0
  387. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js.map +7 -0
  388. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js +82 -0
  389. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js.map +7 -0
  390. package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js +5 -0
  391. package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js.map +7 -0
  392. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js +152 -0
  393. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js.map +7 -0
  394. package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js +92 -0
  395. package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js.map +7 -0
  396. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js +111 -0
  397. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js.map +7 -0
  398. package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js +243 -0
  399. package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js.map +7 -0
  400. package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js +151 -0
  401. package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js.map +7 -0
  402. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js +105 -0
  403. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js.map +7 -0
  404. package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js +132 -0
  405. package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js.map +7 -0
  406. package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js +205 -0
  407. package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js.map +7 -0
  408. package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js +53 -0
  409. package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js.map +7 -0
  410. package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js +77 -0
  411. package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js.map +7 -0
  412. package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js +151 -0
  413. package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js.map +7 -0
  414. package/dist/modules/staff/lib/timeTrackingSeeds.js +809 -0
  415. package/dist/modules/staff/lib/timeTrackingSeeds.js.map +7 -0
  416. package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js +2 -3
  417. package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js.map +2 -2
  418. package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js +152 -0
  419. package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js.map +7 -0
  420. package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js +36 -0
  421. package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js.map +7 -0
  422. package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js +66 -0
  423. package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js.map +7 -0
  424. package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js +78 -0
  425. package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js.map +7 -0
  426. package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js +81 -0
  427. package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js.map +7 -0
  428. package/dist/modules/staff/lib/timesheets-projects/reportSelection.js +44 -0
  429. package/dist/modules/staff/lib/timesheets-projects/reportSelection.js.map +7 -0
  430. package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js +169 -0
  431. package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js.map +7 -0
  432. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js +22 -0
  433. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js.map +7 -0
  434. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js +51 -1
  435. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js.map +2 -2
  436. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js +70 -0
  437. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js.map +7 -0
  438. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js +63 -0
  439. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js.map +7 -0
  440. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js +170 -0
  441. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js.map +7 -0
  442. package/dist/modules/staff/lib/timesheets-reports/pdf.js +205 -0
  443. package/dist/modules/staff/lib/timesheets-reports/pdf.js.map +7 -0
  444. package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js +68 -0
  445. package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js.map +7 -0
  446. package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js +135 -0
  447. package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js.map +7 -0
  448. package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js +48 -0
  449. package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js.map +7 -0
  450. package/dist/modules/staff/lib/timesheets-reports/reportExport.js +262 -0
  451. package/dist/modules/staff/lib/timesheets-reports/reportExport.js.map +7 -0
  452. package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js +34 -0
  453. package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js.map +7 -0
  454. package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js +79 -0
  455. package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js.map +7 -0
  456. package/dist/modules/staff/lib/timesheets-reports/reportLabels.js +11 -0
  457. package/dist/modules/staff/lib/timesheets-reports/reportLabels.js.map +7 -0
  458. package/dist/modules/staff/lib/timesheets-reports/reportReference.js +83 -0
  459. package/dist/modules/staff/lib/timesheets-reports/reportReference.js.map +7 -0
  460. package/dist/modules/staff/lib/timesheets-reports/reportRows.js +42 -0
  461. package/dist/modules/staff/lib/timesheets-reports/reportRows.js.map +7 -0
  462. package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js +107 -0
  463. package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js.map +7 -0
  464. package/dist/modules/staff/lib/timesheets-reports/reportTotals.js +289 -0
  465. package/dist/modules/staff/lib/timesheets-reports/reportTotals.js.map +7 -0
  466. package/dist/modules/staff/lib/timesheets-reports/xlsx.js +145 -0
  467. package/dist/modules/staff/lib/timesheets-reports/xlsx.js.map +7 -0
  468. package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js +116 -0
  469. package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js.map +7 -0
  470. package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js +50 -0
  471. package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js.map +7 -0
  472. package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js +27 -0
  473. package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js.map +7 -0
  474. package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js +65 -0
  475. package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js.map +7 -0
  476. package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js +31 -0
  477. package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js.map +7 -0
  478. package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js +31 -0
  479. package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js.map +7 -0
  480. package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js +17 -0
  481. package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js.map +7 -0
  482. package/dist/modules/staff/lib/timesheets-tasks/taskReference.js +51 -0
  483. package/dist/modules/staff/lib/timesheets-tasks/taskReference.js.map +7 -0
  484. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js +11 -4
  485. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js.map +2 -2
  486. package/dist/modules/staff/lib/timesheets-ui/ListView.js +369 -111
  487. package/dist/modules/staff/lib/timesheets-ui/ListView.js.map +2 -2
  488. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js +47 -2
  489. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js.map +2 -2
  490. package/dist/modules/staff/migrations/Migration20260813073131_staff.js +79 -0
  491. package/dist/modules/staff/migrations/Migration20260813073131_staff.js.map +7 -0
  492. package/dist/modules/staff/migrations/Migration20260824143357_staff.js +15 -0
  493. package/dist/modules/staff/migrations/Migration20260824143357_staff.js.map +7 -0
  494. package/dist/modules/staff/notifications.client.js +16 -0
  495. package/dist/modules/staff/notifications.client.js.map +7 -0
  496. package/dist/modules/staff/notifications.handlers.js +80 -0
  497. package/dist/modules/staff/notifications.handlers.js.map +7 -0
  498. package/dist/modules/staff/notifications.js +168 -0
  499. package/dist/modules/staff/notifications.js.map +2 -2
  500. package/dist/modules/staff/search.js +159 -1
  501. package/dist/modules/staff/search.js.map +2 -2
  502. package/dist/modules/staff/setup.js +20 -1
  503. package/dist/modules/staff/setup.js.map +2 -2
  504. package/dist/modules/staff/subscribers/time-project-access-requested-notification.js +68 -0
  505. package/dist/modules/staff/subscribers/time-project-access-requested-notification.js.map +7 -0
  506. package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js +149 -0
  507. package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js.map +7 -0
  508. package/dist/modules/staff/subscribers/time-report-approved-notification.js +78 -0
  509. package/dist/modules/staff/subscribers/time-report-approved-notification.js.map +7 -0
  510. package/dist/modules/staff/subscribers/time-report-portal-broadcast.js +78 -0
  511. package/dist/modules/staff/subscribers/time-report-portal-broadcast.js.map +7 -0
  512. package/dist/modules/staff/translations.js +4 -1
  513. package/dist/modules/staff/translations.js.map +2 -2
  514. package/dist/modules/staff/widgets/components.js +7 -0
  515. package/dist/modules/staff/widgets/components.js.map +7 -0
  516. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js +5 -4
  517. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js.map +2 -2
  518. package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js +135 -0
  519. package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js.map +7 -0
  520. package/dist/modules/staff/widgets/notifications/index.js +5 -0
  521. package/dist/modules/staff/widgets/notifications/index.js.map +7 -0
  522. package/dist/modules/staff/workers/timesheets-reapply-rounding.js +43 -0
  523. package/dist/modules/staff/workers/timesheets-reapply-rounding.js.map +7 -0
  524. package/generated/entities/staff_time_entry/index.ts +7 -0
  525. package/generated/entities/staff_time_entry_tag/index.ts +6 -0
  526. package/generated/entities/staff_time_project/index.ts +8 -0
  527. package/generated/entities/staff_time_report/index.ts +27 -0
  528. package/generated/entities/staff_time_report_entry/index.ts +12 -0
  529. package/generated/entities/staff_time_report_event/index.ts +9 -0
  530. package/generated/entities/staff_time_report_project/index.ts +6 -0
  531. package/generated/entities/staff_time_tag/index.ts +9 -0
  532. package/generated/entities/staff_time_task/index.ts +17 -0
  533. package/generated/entities/staff_time_task_comment/index.ts +9 -0
  534. package/generated/entities/staff_time_task_status/index.ts +13 -0
  535. package/generated/entities/staff_time_task_tag/index.ts +6 -0
  536. package/generated/entities.ids.generated.ts +11 -1
  537. package/generated/entity-fields-registry.ts +149 -0
  538. package/package.json +7 -7
  539. package/src/helpers/integration/timesheetFixtures.ts +31 -1
  540. package/src/modules/auth/README.md +1 -1
  541. package/src/modules/auth/cli.ts +35 -1
  542. package/src/modules/auth/i18n/de.json +7 -0
  543. package/src/modules/auth/i18n/en.json +7 -0
  544. package/src/modules/auth/i18n/es.json +7 -0
  545. package/src/modules/auth/i18n/ko.json +7 -0
  546. package/src/modules/auth/i18n/pl.json +7 -0
  547. package/src/modules/auth/lib/backendChrome.tsx +1 -0
  548. package/src/modules/customer_accounts/lib/customerRoleAcls.ts +79 -0
  549. package/src/modules/customer_accounts/setup.ts +1 -45
  550. package/src/modules/data_sync/AGENTS.md +34 -0
  551. package/src/modules/data_sync/api/options.ts +2 -0
  552. package/src/modules/data_sync/backend/data-sync/page.tsx +82 -33
  553. package/src/modules/data_sync/i18n/de.json +1 -0
  554. package/src/modules/data_sync/i18n/en.json +1 -0
  555. package/src/modules/data_sync/i18n/es.json +1 -0
  556. package/src/modules/data_sync/i18n/ko.json +1 -0
  557. package/src/modules/data_sync/i18n/pl.json +1 -0
  558. package/src/modules/data_sync/lib/adapter.ts +45 -0
  559. package/src/modules/data_sync/lib/start-controls.ts +89 -0
  560. package/src/modules/staff/AGENTS.md +769 -1
  561. package/src/modules/staff/acl.ts +9 -0
  562. package/src/modules/staff/ai-agents.ts +189 -0
  563. package/src/modules/staff/ai-tools/time-tracking-pack.ts +494 -0
  564. package/src/modules/staff/ai-tools/types.ts +82 -0
  565. package/src/modules/staff/ai-tools.ts +13 -0
  566. package/src/modules/staff/analytics.ts +113 -0
  567. package/src/modules/staff/api/guards.ts +85 -3
  568. package/src/modules/staff/api/leave-requests/accept/route.ts +0 -2
  569. package/src/modules/staff/api/leave-requests/reject/route.ts +0 -2
  570. package/src/modules/staff/api/portal/time-reports/[id]/route.ts +182 -0
  571. package/src/modules/staff/api/portal/time-reports/route.ts +270 -0
  572. package/src/modules/staff/api/team-members/self/route.ts +0 -2
  573. package/src/modules/staff/api/team-members/tags/assign/route.ts +0 -2
  574. package/src/modules/staff/api/team-members/tags/unassign/route.ts +0 -2
  575. package/src/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.ts +292 -0
  576. package/src/modules/staff/api/timesheets/access-requests/route.ts +299 -0
  577. package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +15 -7
  578. package/src/modules/staff/api/timesheets/my-projects/route.ts +14 -1
  579. package/src/modules/staff/api/timesheets/my-work/myWorkAggregate.ts +90 -0
  580. package/src/modules/staff/api/timesheets/my-work/route.ts +475 -0
  581. package/src/modules/staff/api/timesheets/projects/kpis/route.ts +15 -2
  582. package/src/modules/staff/api/timesheets/reports/[id]/close/route.ts +203 -0
  583. package/src/modules/staff/api/timesheets/reports/[id]/export/route.ts +315 -0
  584. package/src/modules/staff/api/timesheets/reports/[id]/sheet/route.ts +220 -0
  585. package/src/modules/staff/api/timesheets/reports/[id]/unlock/route.ts +208 -0
  586. package/src/modules/staff/api/timesheets/reports/preview/route.ts +449 -0
  587. package/src/modules/staff/api/timesheets/reports/route.ts +386 -0
  588. package/src/modules/staff/api/timesheets/reports/shared.ts +121 -0
  589. package/src/modules/staff/api/timesheets/settings/reapply-rounding/route.ts +205 -0
  590. package/src/modules/staff/api/timesheets/settings/rounding-impact/route.ts +226 -0
  591. package/src/modules/staff/api/timesheets/settings/route.ts +242 -0
  592. package/src/modules/staff/api/timesheets/tags/access.ts +134 -0
  593. package/src/modules/staff/api/timesheets/tags/entry-assignments/route.ts +290 -0
  594. package/src/modules/staff/api/timesheets/tags/route.ts +177 -0
  595. package/src/modules/staff/api/timesheets/tags/task-assignments/route.ts +294 -0
  596. package/src/modules/staff/api/timesheets/task-statuses/route.ts +232 -0
  597. package/src/modules/staff/api/timesheets/tasks/[id]/comments/route.ts +532 -0
  598. package/src/modules/staff/api/timesheets/tasks/[id]/status/route.ts +271 -0
  599. package/src/modules/staff/api/timesheets/tasks/route.ts +443 -0
  600. package/src/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.ts +306 -0
  601. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.ts +32 -10
  602. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +32 -17
  603. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +27 -6
  604. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +36 -6
  605. package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +331 -34
  606. package/src/modules/staff/api/timesheets/time-entries/copy-day/route.ts +533 -0
  607. package/src/modules/staff/api/timesheets/time-entries/overlaps/route.ts +457 -0
  608. package/src/modules/staff/api/timesheets/time-entries/route.ts +378 -24
  609. package/src/modules/staff/api/timesheets/time-entries/start-timer/route.ts +31 -9
  610. package/src/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.ts +246 -0
  611. package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +62 -2
  612. package/src/modules/staff/api/timesheets/time-projects/route.ts +397 -22
  613. package/src/modules/staff/backend/staff/time-tracking/board/page.meta.ts +14 -0
  614. package/src/modules/staff/backend/staff/time-tracking/board/page.tsx +151 -0
  615. package/src/modules/staff/backend/staff/time-tracking/entries/page.meta.ts +14 -0
  616. package/src/modules/staff/backend/staff/time-tracking/entries/page.tsx +1229 -0
  617. package/src/modules/staff/backend/staff/time-tracking/page.meta.ts +11 -0
  618. package/src/modules/staff/backend/staff/time-tracking/page.tsx +823 -0
  619. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.ts +12 -0
  620. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.tsx +81 -0
  621. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.ts +12 -0
  622. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.tsx +275 -0
  623. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.ts +12 -0
  624. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.tsx +1420 -0
  625. package/src/modules/staff/backend/staff/time-tracking/projects/create/page.meta.ts +12 -0
  626. package/src/modules/staff/backend/staff/time-tracking/projects/create/page.tsx +109 -0
  627. package/src/modules/staff/backend/staff/time-tracking/projects/page.meta.ts +15 -0
  628. package/src/modules/staff/backend/staff/time-tracking/projects/page.tsx +1254 -0
  629. package/src/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.ts +466 -0
  630. package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.ts +12 -0
  631. package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.tsx +632 -0
  632. package/src/modules/staff/backend/staff/time-tracking/reports/create/page.meta.ts +12 -0
  633. package/src/modules/staff/backend/staff/time-tracking/reports/create/page.tsx +867 -0
  634. package/src/modules/staff/backend/staff/time-tracking/reports/page.meta.ts +14 -0
  635. package/src/modules/staff/backend/staff/time-tracking/reports/page.tsx +246 -0
  636. package/src/modules/staff/backend/staff/time-tracking/settings/page.meta.ts +14 -0
  637. package/src/modules/staff/backend/staff/time-tracking/settings/page.tsx +701 -0
  638. package/src/modules/staff/backend/staff/time-tracking/timesheet/GridView.tsx +953 -0
  639. package/src/modules/staff/backend/staff/time-tracking/timesheet/page.meta.ts +14 -0
  640. package/src/modules/staff/backend/staff/time-tracking/timesheet/page.tsx +800 -0
  641. package/src/modules/staff/backend/staff/timesheets/page.meta.ts +6 -6
  642. package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1010
  643. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.ts +0 -6
  644. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +4 -158
  645. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.ts +0 -6
  646. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +4 -609
  647. package/src/modules/staff/backend/staff/timesheets/projects/create/page.meta.ts +0 -6
  648. package/src/modules/staff/backend/staff/timesheets/projects/create/page.tsx +3 -89
  649. package/src/modules/staff/backend/staff/timesheets/projects/page.meta.ts +2 -19
  650. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +3 -778
  651. package/src/modules/staff/ce.ts +63 -0
  652. package/src/modules/staff/cli.ts +207 -1
  653. package/src/modules/staff/commands/index.ts +5 -0
  654. package/src/modules/staff/commands/timesheets-entries.ts +1006 -28
  655. package/src/modules/staff/commands/timesheets-projects.ts +593 -7
  656. package/src/modules/staff/commands/timesheets-reports.ts +1329 -0
  657. package/src/modules/staff/commands/timesheets-tags.ts +1315 -0
  658. package/src/modules/staff/commands/timesheets-task-comments.ts +583 -0
  659. package/src/modules/staff/commands/timesheets-task-statuses.ts +889 -0
  660. package/src/modules/staff/commands/timesheets-tasks.ts +1121 -0
  661. package/src/modules/staff/data/enrichers.ts +675 -10
  662. package/src/modules/staff/data/entities.ts +494 -2
  663. package/src/modules/staff/data/extensions.ts +68 -0
  664. package/src/modules/staff/data/validators.ts +348 -3
  665. package/src/modules/staff/di.ts +96 -0
  666. package/src/modules/staff/events.payloads.ts +268 -0
  667. package/src/modules/staff/events.ts +87 -5
  668. package/src/modules/staff/extension-points.ts +308 -0
  669. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.ts +10 -0
  670. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.tsx +225 -0
  671. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.ts +17 -0
  672. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.tsx +182 -0
  673. package/src/modules/staff/i18n/de.json +899 -0
  674. package/src/modules/staff/i18n/en.json +899 -0
  675. package/src/modules/staff/i18n/es.json +899 -0
  676. package/src/modules/staff/i18n/ko.json +899 -0
  677. package/src/modules/staff/i18n/pl.json +899 -0
  678. package/src/modules/staff/lib/crud.ts +14 -3
  679. package/src/modules/staff/lib/time-tracking/access.ts +155 -0
  680. package/src/modules/staff/lib/time-tracking/billability.ts +68 -0
  681. package/src/modules/staff/lib/time-tracking/capacity.ts +124 -0
  682. package/src/modules/staff/lib/time-tracking/componentContracts.ts +26 -0
  683. package/src/modules/staff/lib/time-tracking/cost.ts +144 -0
  684. package/src/modules/staff/lib/time-tracking/duration.ts +68 -0
  685. package/src/modules/staff/lib/time-tracking/featureAccess.ts +115 -0
  686. package/src/modules/staff/lib/time-tracking/interval.ts +90 -0
  687. package/src/modules/staff/lib/time-tracking/migrateProjectCodes.ts +161 -0
  688. package/src/modules/staff/lib/time-tracking/moneyVisibility.ts +37 -0
  689. package/src/modules/staff/lib/time-tracking/overlap.ts +159 -0
  690. package/src/modules/staff/lib/time-tracking/portalRecipients.ts +76 -0
  691. package/src/modules/staff/lib/time-tracking/portalReports.ts +31 -0
  692. package/src/modules/staff/lib/time-tracking/projectCode.ts +221 -0
  693. package/src/modules/staff/lib/time-tracking/reapplyRounding.ts +313 -0
  694. package/src/modules/staff/lib/time-tracking/recalculationRunner.ts +118 -0
  695. package/src/modules/staff/lib/time-tracking/recalculations.ts +135 -0
  696. package/src/modules/staff/lib/time-tracking/registries/invoke.ts +122 -0
  697. package/src/modules/staff/lib/time-tracking/registries/registry.ts +124 -0
  698. package/src/modules/staff/lib/time-tracking/registries/scope.ts +56 -0
  699. package/src/modules/staff/lib/time-tracking/rollup.ts +59 -0
  700. package/src/modules/staff/lib/time-tracking/rounding.ts +126 -0
  701. package/src/modules/staff/lib/time-tracking/roundingImpact.ts +75 -0
  702. package/src/modules/staff/lib/time-tracking/settingKeys.ts +274 -0
  703. package/src/modules/staff/lib/time-tracking/settings.ts +168 -0
  704. package/src/modules/staff/lib/time-tracking/sqlInClause.ts +22 -0
  705. package/src/modules/staff/lib/time-tracking/timeEntrySources.ts +85 -0
  706. package/src/modules/staff/lib/time-tracking-ui/BoardFilterChips.tsx +360 -0
  707. package/src/modules/staff/lib/time-tracking-ui/CustomerPicker.tsx +427 -0
  708. package/src/modules/staff/lib/time-tracking-ui/DurationInput.tsx +192 -0
  709. package/src/modules/staff/lib/time-tracking-ui/EntryDetailsFields.tsx +224 -0
  710. package/src/modules/staff/lib/time-tracking-ui/EntryFilterBar.tsx +144 -0
  711. package/src/modules/staff/lib/time-tracking-ui/KanbanBoard.tsx +1065 -0
  712. package/src/modules/staff/lib/time-tracking-ui/KanbanCard.tsx +435 -0
  713. package/src/modules/staff/lib/time-tracking-ui/KanbanColumn.tsx +316 -0
  714. package/src/modules/staff/lib/time-tracking-ui/NewTaskDialog.tsx +291 -0
  715. package/src/modules/staff/lib/time-tracking-ui/NoProjectAccess.tsx +162 -0
  716. package/src/modules/staff/lib/time-tracking-ui/PeriodSelector.tsx +149 -0
  717. package/src/modules/staff/lib/time-tracking-ui/PhasePlaceholder.tsx +31 -0
  718. package/src/modules/staff/lib/time-tracking-ui/ProjectCodeField.tsx +230 -0
  719. package/src/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.tsx +432 -0
  720. package/src/modules/staff/lib/time-tracking-ui/ProjectFormSections.tsx +323 -0
  721. package/src/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.tsx +930 -0
  722. package/src/modules/staff/lib/time-tracking-ui/ReportSheet.tsx +357 -0
  723. package/src/modules/staff/lib/time-tracking-ui/TagPicker.tsx +195 -0
  724. package/src/modules/staff/lib/time-tracking-ui/TaskBoardScreen.tsx +243 -0
  725. package/src/modules/staff/lib/time-tracking-ui/TaskCommentThread.tsx +137 -0
  726. package/src/modules/staff/lib/time-tracking-ui/TaskDrawer.tsx +1405 -0
  727. package/src/modules/staff/lib/time-tracking-ui/TaskListView.tsx +260 -0
  728. package/src/modules/staff/lib/time-tracking-ui/TaskPicker.tsx +435 -0
  729. package/src/modules/staff/lib/time-tracking-ui/TaskQuickLog.tsx +296 -0
  730. package/src/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.tsx +97 -0
  731. package/src/modules/staff/lib/time-tracking-ui/TimeEntryDialog.tsx +1929 -0
  732. package/src/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.tsx +126 -0
  733. package/src/modules/staff/lib/time-tracking-ui/TimesheetCalendar.tsx +265 -0
  734. package/src/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.tsx +78 -0
  735. package/src/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.tsx +70 -0
  736. package/src/modules/staff/lib/time-tracking-ui/boardDirectory.ts +231 -0
  737. package/src/modules/staff/lib/time-tracking-ui/boardFilters.ts +128 -0
  738. package/src/modules/staff/lib/time-tracking-ui/boardSummary.ts +20 -0
  739. package/src/modules/staff/lib/time-tracking-ui/kanbanBoardData.ts +228 -0
  740. package/src/modules/staff/lib/time-tracking-ui/projectTeamAssignment.ts +143 -0
  741. package/src/modules/staff/lib/time-tracking-ui/taskDrawerData.ts +194 -0
  742. package/src/modules/staff/lib/time-tracking-ui/timeEntryDialogState.ts +400 -0
  743. package/src/modules/staff/lib/time-tracking-ui/timeEntryListData.ts +271 -0
  744. package/src/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.ts +168 -0
  745. package/src/modules/staff/lib/time-tracking-ui/timesheetData.ts +225 -0
  746. package/src/modules/staff/lib/time-tracking-ui/timesheetPeriod.ts +278 -0
  747. package/src/modules/staff/lib/time-tracking-ui/timesheetTargets.ts +93 -0
  748. package/src/modules/staff/lib/time-tracking-ui/useBoardFilters.ts +107 -0
  749. package/src/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.ts +245 -0
  750. package/src/modules/staff/lib/timeTrackingSeeds.ts +1037 -0
  751. package/src/modules/staff/lib/timesheets/timeEntryCacheInvalidation.ts +11 -10
  752. package/src/modules/staff/lib/timesheets/timeEntryDecoration.ts +256 -0
  753. package/src/modules/staff/lib/timesheets-projects/budgetBurn.ts +60 -0
  754. package/src/modules/staff/lib/timesheets-projects/budgetThreshold.ts +135 -0
  755. package/src/modules/staff/lib/timesheets-projects/budgetThresholdState.ts +137 -0
  756. package/src/modules/staff/lib/timesheets-projects/computeProjectFinancials.ts +142 -0
  757. package/src/modules/staff/lib/timesheets-projects/reportSelection.ts +82 -0
  758. package/src/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.tsx +237 -0
  759. package/src/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.tsx +33 -0
  760. package/src/modules/staff/lib/timesheets-projects-ui/ProjectCard.tsx +56 -1
  761. package/src/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.tsx +90 -0
  762. package/src/modules/staff/lib/timesheets-reports/buildReportSheet.ts +125 -0
  763. package/src/modules/staff/lib/timesheets-reports/loadReportData.ts +251 -0
  764. package/src/modules/staff/lib/timesheets-reports/pdf.ts +263 -0
  765. package/src/modules/staff/lib/timesheets-reports/reportApprovalPolicies.ts +137 -0
  766. package/src/modules/staff/lib/timesheets-reports/reportConfigData.ts +247 -0
  767. package/src/modules/staff/lib/timesheets-reports/reportConfigState.ts +89 -0
  768. package/src/modules/staff/lib/timesheets-reports/reportExport.ts +373 -0
  769. package/src/modules/staff/lib/timesheets-reports/reportExportFormats.ts +71 -0
  770. package/src/modules/staff/lib/timesheets-reports/reportGroupings.ts +153 -0
  771. package/src/modules/staff/lib/timesheets-reports/reportLabels.ts +23 -0
  772. package/src/modules/staff/lib/timesheets-reports/reportReference.ts +146 -0
  773. package/src/modules/staff/lib/timesheets-reports/reportRows.ts +89 -0
  774. package/src/modules/staff/lib/timesheets-reports/reportSheetData.ts +196 -0
  775. package/src/modules/staff/lib/timesheets-reports/reportTotals.ts +544 -0
  776. package/src/modules/staff/lib/timesheets-reports/xlsx.ts +207 -0
  777. package/src/modules/staff/lib/timesheets-tasks/computeTaskRollups.ts +238 -0
  778. package/src/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.ts +90 -0
  779. package/src/modules/staff/lib/timesheets-tasks/seedProjectStatuses.ts +43 -0
  780. package/src/modules/staff/lib/timesheets-tasks/statusPositions.ts +132 -0
  781. package/src/modules/staff/lib/timesheets-tasks/statusSlug.ts +43 -0
  782. package/src/modules/staff/lib/timesheets-tasks/taskHierarchy.ts +99 -0
  783. package/src/modules/staff/lib/timesheets-tasks/taskHoursTotals.ts +42 -0
  784. package/src/modules/staff/lib/timesheets-tasks/taskReference.ts +108 -0
  785. package/src/modules/staff/lib/timesheets-ui/CreateProjectDialog.tsx +18 -4
  786. package/src/modules/staff/lib/timesheets-ui/ListView.tsx +504 -149
  787. package/src/modules/staff/lib/timesheets-ui/TimerBar.tsx +50 -2
  788. package/src/modules/staff/migrations/.snapshot-open-mercato.json +3244 -228
  789. package/src/modules/staff/migrations/Migration20260813073131_staff.ts +94 -0
  790. package/src/modules/staff/migrations/Migration20260824143357_staff.ts +17 -0
  791. package/src/modules/staff/notifications.client.ts +16 -0
  792. package/src/modules/staff/notifications.handlers.ts +88 -0
  793. package/src/modules/staff/notifications.ts +163 -0
  794. package/src/modules/staff/search.ts +191 -1
  795. package/src/modules/staff/setup.ts +22 -0
  796. package/src/modules/staff/subscribers/time-project-access-requested-notification.ts +95 -0
  797. package/src/modules/staff/subscribers/time-project-budget-threshold-notification.ts +226 -0
  798. package/src/modules/staff/subscribers/time-report-approved-notification.ts +116 -0
  799. package/src/modules/staff/subscribers/time-report-portal-broadcast.ts +120 -0
  800. package/src/modules/staff/translations.ts +17 -0
  801. package/src/modules/staff/widgets/components.ts +34 -0
  802. package/src/modules/staff/widgets/injection/timer-sidebar-indicator/widget.tsx +6 -5
  803. package/src/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.tsx +138 -0
  804. package/src/modules/staff/widgets/notifications/index.ts +1 -0
  805. package/src/modules/staff/workers/timesheets-reapply-rounding.ts +59 -0
  806. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js +0 -123
  807. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js.map +0 -7
  808. package/src/modules/staff/backend/staff/timesheets/projects/projectFormConfig.ts +0 -138
@@ -0,0 +1,214 @@
1
+ import { z } from "zod";
2
+ import { extensionPoints } from "@open-mercato/core/modules/staff/extension-points";
3
+ import { BUILT_IN_STRATEGY_PRIORITY, createStrategyRegistry } from "./registries/registry.js";
4
+ import { DEFAULT_ROUNDING_SETTINGS } from "./rounding.js";
5
+ const TIME_TRACKING_SETTING_KEY_REGISTRY_ID = extensionPoints.hosts.settingKeyRegistry.spotId;
6
+ const TIME_TRACKING_ROUNDING_GROUP = "rounding";
7
+ const TIME_TRACKING_DEFAULTS_GROUP = "defaults";
8
+ const TIME_TRACKING_TARGETS_GROUP = "targets";
9
+ const TIME_TRACKING_WARNINGS_GROUP = "warnings";
10
+ const TIME_TRACKING_ACCESS_GROUP = "access";
11
+ const DEFAULT_ASSIGNMENT_GRACE_DAYS = 14;
12
+ const MAX_ASSIGNMENT_GRACE_DAYS = 365;
13
+ const timeTrackingRoundingUnitMinutesSchema = z.union([
14
+ z.literal(0),
15
+ z.literal(5),
16
+ z.literal(10),
17
+ z.literal(15)
18
+ ]);
19
+ const timeTrackingRoundingDirectionSchema = z.enum(["up", "nearest"]);
20
+ const registry = createStrategyRegistry(
21
+ TIME_TRACKING_SETTING_KEY_REGISTRY_ID
22
+ );
23
+ const builtInIds = /* @__PURE__ */ new Set();
24
+ function timeTrackingSettingStorageName(group, key) {
25
+ return `${group}.${key}`;
26
+ }
27
+ function registerKey(input, builtIn) {
28
+ const group = input.group.trim();
29
+ const key = input.key.trim();
30
+ if (!group || !key) {
31
+ throw new Error("[internal] a time-tracking setting key requires a non-empty group and key");
32
+ }
33
+ const id = timeTrackingSettingStorageName(group, key);
34
+ if (!builtIn && builtInIds.has(id)) {
35
+ throw new Error(`[internal] ${id} is a built-in time-tracking setting key and cannot be replaced`);
36
+ }
37
+ const parsed = input.schema.safeParse(input.default);
38
+ if (!parsed.success) {
39
+ throw new Error(`[internal] the default for the time-tracking setting key ${id} fails its own schema`);
40
+ }
41
+ const definition = { ...input, group, key, id, builtIn };
42
+ if (builtIn) {
43
+ registry.registerBuiltIn(definition);
44
+ return () => {
45
+ };
46
+ }
47
+ return registry.register(definition);
48
+ }
49
+ function registerTimeTrackingSettingKey(input) {
50
+ return registerKey(input, false);
51
+ }
52
+ function listTimeTrackingSettingKeys() {
53
+ return registry.list();
54
+ }
55
+ function getTimeTrackingSettingKey(id) {
56
+ return registry.get(id);
57
+ }
58
+ function timeTrackingSettingKeyIds() {
59
+ return registry.ids();
60
+ }
61
+ function contributedTimeTrackingSettingKeys() {
62
+ return registry.list().filter((entry) => !entry.builtIn);
63
+ }
64
+ function timeTrackingSettingGroups() {
65
+ const groups = [];
66
+ for (const entry of registry.list()) {
67
+ if (!groups.includes(entry.group)) groups.push(entry.group);
68
+ }
69
+ return groups;
70
+ }
71
+ const BUILT_IN_SETTING_KEYS = [
72
+ {
73
+ group: TIME_TRACKING_ROUNDING_GROUP,
74
+ key: "unitMinutes",
75
+ schema: timeTrackingRoundingUnitMinutesSchema,
76
+ default: DEFAULT_ROUNDING_SETTINGS.unitMinutes,
77
+ labelKey: "staff.time_tracking.settings.rounding.unit",
78
+ priority: BUILT_IN_STRATEGY_PRIORITY
79
+ },
80
+ {
81
+ group: TIME_TRACKING_ROUNDING_GROUP,
82
+ key: "direction",
83
+ schema: timeTrackingRoundingDirectionSchema,
84
+ default: DEFAULT_ROUNDING_SETTINGS.direction,
85
+ labelKey: "staff.time_tracking.settings.rounding.direction",
86
+ priority: BUILT_IN_STRATEGY_PRIORITY
87
+ },
88
+ {
89
+ group: TIME_TRACKING_DEFAULTS_GROUP,
90
+ key: "billable",
91
+ schema: z.boolean(),
92
+ default: true,
93
+ labelKey: "staff.time_tracking.settings.defaults.billable",
94
+ priority: BUILT_IN_STRATEGY_PRIORITY
95
+ },
96
+ {
97
+ group: TIME_TRACKING_DEFAULTS_GROUP,
98
+ key: "chainStartFromPreviousEnd",
99
+ schema: z.boolean(),
100
+ default: true,
101
+ labelKey: "staff.time_tracking.settings.defaults.chainStart",
102
+ priority: BUILT_IN_STRATEGY_PRIORITY
103
+ },
104
+ {
105
+ group: TIME_TRACKING_TARGETS_GROUP,
106
+ key: "dailyHours",
107
+ schema: z.number().min(0).max(24).nullable(),
108
+ default: 8,
109
+ labelKey: "staff.time_tracking.settings.targets.dailyHours",
110
+ priority: BUILT_IN_STRATEGY_PRIORITY
111
+ },
112
+ {
113
+ group: TIME_TRACKING_WARNINGS_GROUP,
114
+ key: "overlap",
115
+ schema: z.boolean(),
116
+ default: true,
117
+ labelKey: "staff.time_tracking.settings.warnings.overlap",
118
+ priority: BUILT_IN_STRATEGY_PRIORITY
119
+ },
120
+ {
121
+ group: TIME_TRACKING_WARNINGS_GROUP,
122
+ key: "runningTimer",
123
+ schema: z.boolean(),
124
+ default: true,
125
+ labelKey: "staff.time_tracking.settings.warnings.runningTimer",
126
+ priority: BUILT_IN_STRATEGY_PRIORITY
127
+ },
128
+ {
129
+ group: TIME_TRACKING_ACCESS_GROUP,
130
+ key: "assignmentGraceDays",
131
+ schema: z.number().int().min(0).max(MAX_ASSIGNMENT_GRACE_DAYS),
132
+ default: DEFAULT_ASSIGNMENT_GRACE_DAYS,
133
+ labelKey: "staff.time_tracking.settings.access.graceDays",
134
+ priority: BUILT_IN_STRATEGY_PRIORITY
135
+ }
136
+ ];
137
+ for (const input of BUILT_IN_SETTING_KEYS) {
138
+ registerKey(input, true);
139
+ builtInIds.add(timeTrackingSettingStorageName(input.group, input.key));
140
+ }
141
+ const BUILT_IN_TIME_TRACKING_SETTING_KEY_IDS = Object.freeze(
142
+ BUILT_IN_SETTING_KEYS.map((input) => timeTrackingSettingStorageName(input.group, input.key))
143
+ );
144
+ function isBuiltInTimeTrackingSettingKey(id) {
145
+ return builtInIds.has(id);
146
+ }
147
+ function buildTimeTrackingSettingsSchema() {
148
+ const byGroup = /* @__PURE__ */ new Map();
149
+ const defaultsByGroup = /* @__PURE__ */ new Map();
150
+ for (const entry of registry.list()) {
151
+ const shape2 = byGroup.get(entry.group) ?? {};
152
+ shape2[entry.key] = entry.schema.optional().default(entry.default);
153
+ byGroup.set(entry.group, shape2);
154
+ const defaults = defaultsByGroup.get(entry.group) ?? {};
155
+ defaults[entry.key] = entry.default;
156
+ defaultsByGroup.set(entry.group, defaults);
157
+ }
158
+ const shape = {};
159
+ for (const [group, groupShape] of byGroup) {
160
+ shape[group] = z.object(groupShape).optional().default(defaultsByGroup.get(group) ?? {});
161
+ }
162
+ return z.object(shape);
163
+ }
164
+ function buildDefaultTimeTrackingSettings() {
165
+ const result = {};
166
+ for (const entry of registry.list()) {
167
+ const group = result[entry.group] ?? {};
168
+ group[entry.key] = entry.default;
169
+ result[entry.group] = group;
170
+ }
171
+ return result;
172
+ }
173
+ function readGroup(source, group) {
174
+ if (!source || typeof source !== "object") return null;
175
+ const value = source[group];
176
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
177
+ return value;
178
+ }
179
+ function normalizeTimeTrackingSettingsRecord(input) {
180
+ const result = {};
181
+ for (const entry of registry.list()) {
182
+ const group = result[entry.group] ?? {};
183
+ const raw = readGroup(input, entry.group)?.[entry.key];
184
+ const parsed = entry.schema.safeParse(raw);
185
+ group[entry.key] = parsed.success ? parsed.data : entry.default;
186
+ result[entry.group] = group;
187
+ }
188
+ return result;
189
+ }
190
+ export {
191
+ BUILT_IN_TIME_TRACKING_SETTING_KEY_IDS,
192
+ DEFAULT_ASSIGNMENT_GRACE_DAYS,
193
+ MAX_ASSIGNMENT_GRACE_DAYS,
194
+ TIME_TRACKING_ACCESS_GROUP,
195
+ TIME_TRACKING_DEFAULTS_GROUP,
196
+ TIME_TRACKING_ROUNDING_GROUP,
197
+ TIME_TRACKING_SETTING_KEY_REGISTRY_ID,
198
+ TIME_TRACKING_TARGETS_GROUP,
199
+ TIME_TRACKING_WARNINGS_GROUP,
200
+ buildDefaultTimeTrackingSettings,
201
+ buildTimeTrackingSettingsSchema,
202
+ contributedTimeTrackingSettingKeys,
203
+ getTimeTrackingSettingKey,
204
+ isBuiltInTimeTrackingSettingKey,
205
+ listTimeTrackingSettingKeys,
206
+ normalizeTimeTrackingSettingsRecord,
207
+ registerTimeTrackingSettingKey,
208
+ timeTrackingRoundingDirectionSchema,
209
+ timeTrackingRoundingUnitMinutesSchema,
210
+ timeTrackingSettingGroups,
211
+ timeTrackingSettingKeyIds,
212
+ timeTrackingSettingStorageName
213
+ };
214
+ //# sourceMappingURL=settingKeys.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/time-tracking/settingKeys.ts"],
4
+ "sourcesContent": ["/**\n * EP-42 \u2014 the time-tracking settings key registry.\n *\n * `TIME_TRACKING_SETTING_KEYS` used to be a frozen array, `normalizeTimeTrackingSettings`\n * a hand-written coercion per key, and `staffTimeTrackingSettingsSchema` a literal\n * `z.object`. All three now read this registry, and the eight keys the module shipped\n * are registered here as built-ins \u2014 so with no contribution the read, the write, the\n * validating schema and the defaults are byte-identical to what they were.\n *\n * Storage is `ModuleConfigService` under module id `staff.time_tracking`, one config\n * row per key, named `<group>.<key>` and scoped by **tenant only** (spec \u00A710: time\n * tracking settings are tenant-global; there is no per-organization override and no\n * per-project override). A contributed key inherits exactly that scope \u2014 it is written\n * with `{ tenantId }` and `organization_id` stays null.\n */\n\nimport { z } from 'zod'\nimport { extensionPoints } from '@open-mercato/core/modules/staff/extension-points'\nimport { BUILT_IN_STRATEGY_PRIORITY, createStrategyRegistry } from './registries/registry'\nimport { DEFAULT_ROUNDING_SETTINGS } from './rounding'\n\nexport const TIME_TRACKING_SETTING_KEY_REGISTRY_ID = extensionPoints.hosts.settingKeyRegistry.spotId\n\nexport const TIME_TRACKING_ROUNDING_GROUP = 'rounding'\nexport const TIME_TRACKING_DEFAULTS_GROUP = 'defaults'\nexport const TIME_TRACKING_TARGETS_GROUP = 'targets'\nexport const TIME_TRACKING_WARNINGS_GROUP = 'warnings'\nexport const TIME_TRACKING_ACCESS_GROUP = 'access'\n\n/**\n * Days past `assigned_end_date` that project access survives (spec D-12). The\n * grace window exists so a consultant rolled off at the end of a month can still\n * log and correct that month's time; `0` ends access the day the assignment ends.\n */\nexport const DEFAULT_ASSIGNMENT_GRACE_DAYS = 14\n\nexport const MAX_ASSIGNMENT_GRACE_DAYS = 365\n\nexport const timeTrackingRoundingUnitMinutesSchema = z.union([\n z.literal(0),\n z.literal(5),\n z.literal(10),\n z.literal(15),\n])\n\nexport const timeTrackingRoundingDirectionSchema = z.enum(['up', 'nearest'])\n\nexport type TimeTrackingSettingKeyInput = {\n /** Group the value lives under in the settings object, e.g. `rounding`. */\n group: string\n /** Leaf name inside the group, e.g. `unitMinutes`. */\n key: string\n /** Validates the stored value; an invalid one falls back to `default`. */\n schema: z.ZodTypeAny\n /** Used when the tenant never stored the key and when the stored value no longer validates. */\n default: unknown\n /** i18n key for the label a settings section renders. Never a literal \u2014 the module holds no user-facing strings. */\n labelKey: string\n /** Higher first in `listTimeTrackingSettingKeys()`; built-ins sit below every contribution. */\n priority?: number\n}\n\nexport type TimeTrackingSettingKeyDefinition = TimeTrackingSettingKeyInput & {\n /** `<group>.<key>` \u2014 the `ModuleConfigService` config name. */\n id: string\n builtIn: boolean\n}\n\nconst registry = createStrategyRegistry<TimeTrackingSettingKeyDefinition>(\n TIME_TRACKING_SETTING_KEY_REGISTRY_ID,\n)\n\nconst builtInIds = new Set<string>()\n\nexport function timeTrackingSettingStorageName(group: string, key: string): string {\n return `${group}.${key}`\n}\n\nfunction registerKey(input: TimeTrackingSettingKeyInput, builtIn: boolean): () => void {\n const group = input.group.trim()\n const key = input.key.trim()\n if (!group || !key) {\n throw new Error('[internal] a time-tracking setting key requires a non-empty group and key')\n }\n const id = timeTrackingSettingStorageName(group, key)\n if (!builtIn && builtInIds.has(id)) {\n throw new Error(`[internal] ${id} is a built-in time-tracking setting key and cannot be replaced`)\n }\n const parsed = input.schema.safeParse(input.default)\n if (!parsed.success) {\n throw new Error(`[internal] the default for the time-tracking setting key ${id} fails its own schema`)\n }\n const definition = { ...input, group, key, id, builtIn }\n if (builtIn) {\n registry.registerBuiltIn(definition)\n return () => {}\n }\n return registry.register(definition)\n}\n\n/**\n * Contribute a tenant-scoped time-tracking setting key. Pair it with a widget on the\n * `staff.time_tracking.settings:sections` injection spot (EP-26) to render it: the spot\n * context carries `values` for every contributed key and a `setValue(id, value)` that\n * writes into the page draft, so the page's own Save round-trips the contribution.\n */\nexport function registerTimeTrackingSettingKey(input: TimeTrackingSettingKeyInput): () => void {\n return registerKey(input, false)\n}\n\nexport function listTimeTrackingSettingKeys(): TimeTrackingSettingKeyDefinition[] {\n return registry.list()\n}\n\nexport function getTimeTrackingSettingKey(id: string | null | undefined): TimeTrackingSettingKeyDefinition | null {\n return registry.get(id)\n}\n\nexport function timeTrackingSettingKeyIds(): string[] {\n return registry.ids()\n}\n\n/** The contributed keys only \u2014 the eight built-ins are rendered by the settings page's own form. */\nexport function contributedTimeTrackingSettingKeys(): TimeTrackingSettingKeyDefinition[] {\n return registry.list().filter((entry) => !entry.builtIn)\n}\n\nexport function timeTrackingSettingGroups(): string[] {\n const groups: string[] = []\n for (const entry of registry.list()) {\n if (!groups.includes(entry.group)) groups.push(entry.group)\n }\n return groups\n}\n\nconst BUILT_IN_SETTING_KEYS: readonly TimeTrackingSettingKeyInput[] = [\n {\n group: TIME_TRACKING_ROUNDING_GROUP,\n key: 'unitMinutes',\n schema: timeTrackingRoundingUnitMinutesSchema,\n default: DEFAULT_ROUNDING_SETTINGS.unitMinutes,\n labelKey: 'staff.time_tracking.settings.rounding.unit',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n {\n group: TIME_TRACKING_ROUNDING_GROUP,\n key: 'direction',\n schema: timeTrackingRoundingDirectionSchema,\n default: DEFAULT_ROUNDING_SETTINGS.direction,\n labelKey: 'staff.time_tracking.settings.rounding.direction',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n {\n group: TIME_TRACKING_DEFAULTS_GROUP,\n key: 'billable',\n schema: z.boolean(),\n default: true,\n labelKey: 'staff.time_tracking.settings.defaults.billable',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n {\n group: TIME_TRACKING_DEFAULTS_GROUP,\n key: 'chainStartFromPreviousEnd',\n schema: z.boolean(),\n default: true,\n labelKey: 'staff.time_tracking.settings.defaults.chainStart',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n {\n group: TIME_TRACKING_TARGETS_GROUP,\n key: 'dailyHours',\n schema: z.number().min(0).max(24).nullable(),\n default: 8,\n labelKey: 'staff.time_tracking.settings.targets.dailyHours',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n {\n group: TIME_TRACKING_WARNINGS_GROUP,\n key: 'overlap',\n schema: z.boolean(),\n default: true,\n labelKey: 'staff.time_tracking.settings.warnings.overlap',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n {\n group: TIME_TRACKING_WARNINGS_GROUP,\n key: 'runningTimer',\n schema: z.boolean(),\n default: true,\n labelKey: 'staff.time_tracking.settings.warnings.runningTimer',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n {\n group: TIME_TRACKING_ACCESS_GROUP,\n key: 'assignmentGraceDays',\n schema: z.number().int().min(0).max(MAX_ASSIGNMENT_GRACE_DAYS),\n default: DEFAULT_ASSIGNMENT_GRACE_DAYS,\n labelKey: 'staff.time_tracking.settings.access.graceDays',\n priority: BUILT_IN_STRATEGY_PRIORITY,\n },\n]\n\nfor (const input of BUILT_IN_SETTING_KEYS) {\n registerKey(input, true)\n builtInIds.add(timeTrackingSettingStorageName(input.group, input.key))\n}\n\nexport const BUILT_IN_TIME_TRACKING_SETTING_KEY_IDS: readonly string[] = Object.freeze(\n BUILT_IN_SETTING_KEYS.map((input) => timeTrackingSettingStorageName(input.group, input.key)),\n)\n\nexport function isBuiltInTimeTrackingSettingKey(id: string): boolean {\n return builtInIds.has(id)\n}\n\nexport type TimeTrackingSettingsRecord = Record<string, Record<string, unknown>>\n\n/**\n * The validating schema the settings route parses against, rebuilt per call so a key\n * registered after this module first loaded still validates (the same reason EP-35's\n * export-format enum is an OpenAPI getter).\n */\nexport function buildTimeTrackingSettingsSchema(): z.ZodObject<Record<string, z.ZodTypeAny>> {\n const byGroup = new Map<string, Record<string, z.ZodTypeAny>>()\n const defaultsByGroup = new Map<string, Record<string, unknown>>()\n for (const entry of registry.list()) {\n const shape = byGroup.get(entry.group) ?? {}\n shape[entry.key] = entry.schema.optional().default(entry.default)\n byGroup.set(entry.group, shape)\n const defaults = defaultsByGroup.get(entry.group) ?? {}\n defaults[entry.key] = entry.default\n defaultsByGroup.set(entry.group, defaults)\n }\n const shape: Record<string, z.ZodTypeAny> = {}\n for (const [group, groupShape] of byGroup) {\n shape[group] = z.object(groupShape).optional().default(defaultsByGroup.get(group) ?? {})\n }\n return z.object(shape)\n}\n\n/** The canonical settings object with every registered key at its registered default. */\nexport function buildDefaultTimeTrackingSettings(): TimeTrackingSettingsRecord {\n const result: TimeTrackingSettingsRecord = {}\n for (const entry of registry.list()) {\n const group = result[entry.group] ?? {}\n group[entry.key] = entry.default\n result[entry.group] = group\n }\n return result\n}\n\nfunction readGroup(source: unknown, group: string): Record<string, unknown> | null {\n if (!source || typeof source !== 'object') return null\n const value = (source as Record<string, unknown>)[group]\n if (!value || typeof value !== 'object' || Array.isArray(value)) return null\n return value as Record<string, unknown>\n}\n\n/**\n * Coerce an arbitrary (possibly partial or malformed) settings shape into the canonical\n * one: every registered key present, every absent or invalid value replaced by the\n * registered default.\n */\nexport function normalizeTimeTrackingSettingsRecord(input: unknown): TimeTrackingSettingsRecord {\n const result: TimeTrackingSettingsRecord = {}\n for (const entry of registry.list()) {\n const group = result[entry.group] ?? {}\n const raw = readGroup(input, entry.group)?.[entry.key]\n const parsed = entry.schema.safeParse(raw)\n group[entry.key] = parsed.success ? parsed.data : entry.default\n result[entry.group] = group\n }\n return result\n}\n"],
5
+ "mappings": "AAgBA,SAAS,SAAS;AAClB,SAAS,uBAAuB;AAChC,SAAS,4BAA4B,8BAA8B;AACnE,SAAS,iCAAiC;AAEnC,MAAM,wCAAwC,gBAAgB,MAAM,mBAAmB;AAEvF,MAAM,+BAA+B;AACrC,MAAM,+BAA+B;AACrC,MAAM,8BAA8B;AACpC,MAAM,+BAA+B;AACrC,MAAM,6BAA6B;AAOnC,MAAM,gCAAgC;AAEtC,MAAM,4BAA4B;AAElC,MAAM,wCAAwC,EAAE,MAAM;AAAA,EAC3D,EAAE,QAAQ,CAAC;AAAA,EACX,EAAE,QAAQ,CAAC;AAAA,EACX,EAAE,QAAQ,EAAE;AAAA,EACZ,EAAE,QAAQ,EAAE;AACd,CAAC;AAEM,MAAM,sCAAsC,EAAE,KAAK,CAAC,MAAM,SAAS,CAAC;AAuB3E,MAAM,WAAW;AAAA,EACf;AACF;AAEA,MAAM,aAAa,oBAAI,IAAY;AAE5B,SAAS,+BAA+B,OAAe,KAAqB;AACjF,SAAO,GAAG,KAAK,IAAI,GAAG;AACxB;AAEA,SAAS,YAAY,OAAoC,SAA8B;AACrF,QAAM,QAAQ,MAAM,MAAM,KAAK;AAC/B,QAAM,MAAM,MAAM,IAAI,KAAK;AAC3B,MAAI,CAAC,SAAS,CAAC,KAAK;AAClB,UAAM,IAAI,MAAM,2EAA2E;AAAA,EAC7F;AACA,QAAM,KAAK,+BAA+B,OAAO,GAAG;AACpD,MAAI,CAAC,WAAW,WAAW,IAAI,EAAE,GAAG;AAClC,UAAM,IAAI,MAAM,cAAc,EAAE,iEAAiE;AAAA,EACnG;AACA,QAAM,SAAS,MAAM,OAAO,UAAU,MAAM,OAAO;AACnD,MAAI,CAAC,OAAO,SAAS;AACnB,UAAM,IAAI,MAAM,4DAA4D,EAAE,uBAAuB;AAAA,EACvG;AACA,QAAM,aAAa,EAAE,GAAG,OAAO,OAAO,KAAK,IAAI,QAAQ;AACvD,MAAI,SAAS;AACX,aAAS,gBAAgB,UAAU;AACnC,WAAO,MAAM;AAAA,IAAC;AAAA,EAChB;AACA,SAAO,SAAS,SAAS,UAAU;AACrC;AAQO,SAAS,+BAA+B,OAAgD;AAC7F,SAAO,YAAY,OAAO,KAAK;AACjC;AAEO,SAAS,8BAAkE;AAChF,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,0BAA0B,IAAwE;AAChH,SAAO,SAAS,IAAI,EAAE;AACxB;AAEO,SAAS,4BAAsC;AACpD,SAAO,SAAS,IAAI;AACtB;AAGO,SAAS,qCAAyE;AACvF,SAAO,SAAS,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,MAAM,OAAO;AACzD;AAEO,SAAS,4BAAsC;AACpD,QAAM,SAAmB,CAAC;AAC1B,aAAW,SAAS,SAAS,KAAK,GAAG;AACnC,QAAI,CAAC,OAAO,SAAS,MAAM,KAAK,EAAG,QAAO,KAAK,MAAM,KAAK;AAAA,EAC5D;AACA,SAAO;AACT;AAEA,MAAM,wBAAgE;AAAA,EACpE;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,0BAA0B;AAAA,IACnC,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ;AAAA,IACR,SAAS,0BAA0B;AAAA,IACnC,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ,EAAE,QAAQ;AAAA,IAClB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ,EAAE,QAAQ;AAAA,IAClB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS;AAAA,IAC3C,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ,EAAE,QAAQ;AAAA,IAClB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ,EAAE,QAAQ;AAAA,IAClB,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AAAA,EACA;AAAA,IACE,OAAO;AAAA,IACP,KAAK;AAAA,IACL,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,yBAAyB;AAAA,IAC7D,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACZ;AACF;AAEA,WAAW,SAAS,uBAAuB;AACzC,cAAY,OAAO,IAAI;AACvB,aAAW,IAAI,+BAA+B,MAAM,OAAO,MAAM,GAAG,CAAC;AACvE;AAEO,MAAM,yCAA4D,OAAO;AAAA,EAC9E,sBAAsB,IAAI,CAAC,UAAU,+BAA+B,MAAM,OAAO,MAAM,GAAG,CAAC;AAC7F;AAEO,SAAS,gCAAgC,IAAqB;AACnE,SAAO,WAAW,IAAI,EAAE;AAC1B;AASO,SAAS,kCAA6E;AAC3F,QAAM,UAAU,oBAAI,IAA0C;AAC9D,QAAM,kBAAkB,oBAAI,IAAqC;AACjE,aAAW,SAAS,SAAS,KAAK,GAAG;AACnC,UAAMA,SAAQ,QAAQ,IAAI,MAAM,KAAK,KAAK,CAAC;AAC3C,IAAAA,OAAM,MAAM,GAAG,IAAI,MAAM,OAAO,SAAS,EAAE,QAAQ,MAAM,OAAO;AAChE,YAAQ,IAAI,MAAM,OAAOA,MAAK;AAC9B,UAAM,WAAW,gBAAgB,IAAI,MAAM,KAAK,KAAK,CAAC;AACtD,aAAS,MAAM,GAAG,IAAI,MAAM;AAC5B,oBAAgB,IAAI,MAAM,OAAO,QAAQ;AAAA,EAC3C;AACA,QAAM,QAAsC,CAAC;AAC7C,aAAW,CAAC,OAAO,UAAU,KAAK,SAAS;AACzC,UAAM,KAAK,IAAI,EAAE,OAAO,UAAU,EAAE,SAAS,EAAE,QAAQ,gBAAgB,IAAI,KAAK,KAAK,CAAC,CAAC;AAAA,EACzF;AACA,SAAO,EAAE,OAAO,KAAK;AACvB;AAGO,SAAS,mCAA+D;AAC7E,QAAM,SAAqC,CAAC;AAC5C,aAAW,SAAS,SAAS,KAAK,GAAG;AACnC,UAAM,QAAQ,OAAO,MAAM,KAAK,KAAK,CAAC;AACtC,UAAM,MAAM,GAAG,IAAI,MAAM;AACzB,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACA,SAAO;AACT;AAEA,SAAS,UAAU,QAAiB,OAA+C;AACjF,MAAI,CAAC,UAAU,OAAO,WAAW,SAAU,QAAO;AAClD,QAAM,QAAS,OAAmC,KAAK;AACvD,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,SAAO;AACT;AAOO,SAAS,oCAAoC,OAA4C;AAC9F,QAAM,SAAqC,CAAC;AAC5C,aAAW,SAAS,SAAS,KAAK,GAAG;AACnC,UAAM,QAAQ,OAAO,MAAM,KAAK,KAAK,CAAC;AACtC,UAAM,MAAM,UAAU,OAAO,MAAM,KAAK,IAAI,MAAM,GAAG;AACrD,UAAM,SAAS,MAAM,OAAO,UAAU,GAAG;AACzC,UAAM,MAAM,GAAG,IAAI,OAAO,UAAU,OAAO,OAAO,MAAM;AACxD,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACA,SAAO;AACT;",
6
+ "names": ["shape"]
7
+ }
@@ -0,0 +1,87 @@
1
+ import {
2
+ DEFAULT_ASSIGNMENT_GRACE_DAYS,
3
+ MAX_ASSIGNMENT_GRACE_DAYS,
4
+ buildDefaultTimeTrackingSettings,
5
+ listTimeTrackingSettingKeys,
6
+ normalizeTimeTrackingSettingsRecord,
7
+ registerTimeTrackingSettingKey,
8
+ timeTrackingSettingKeyIds
9
+ } from "./settingKeys.js";
10
+ const STAFF_TIME_TRACKING_MODULE_ID = "staff.time_tracking";
11
+ const TIME_TRACKING_ROUNDING_UNIT_MINUTES_KEY = "rounding.unitMinutes";
12
+ const TIME_TRACKING_ROUNDING_DIRECTION_KEY = "rounding.direction";
13
+ const TIME_TRACKING_DEFAULTS_BILLABLE_KEY = "defaults.billable";
14
+ const TIME_TRACKING_DEFAULTS_CHAIN_START_KEY = "defaults.chainStartFromPreviousEnd";
15
+ const TIME_TRACKING_TARGETS_DAILY_HOURS_KEY = "targets.dailyHours";
16
+ const TIME_TRACKING_WARNINGS_OVERLAP_KEY = "warnings.overlap";
17
+ const TIME_TRACKING_WARNINGS_RUNNING_TIMER_KEY = "warnings.runningTimer";
18
+ const TIME_TRACKING_ACCESS_ASSIGNMENT_GRACE_DAYS_KEY = "access.assignmentGraceDays";
19
+ const TIME_TRACKING_SETTING_KEYS = [
20
+ TIME_TRACKING_ROUNDING_UNIT_MINUTES_KEY,
21
+ TIME_TRACKING_ROUNDING_DIRECTION_KEY,
22
+ TIME_TRACKING_DEFAULTS_BILLABLE_KEY,
23
+ TIME_TRACKING_DEFAULTS_CHAIN_START_KEY,
24
+ TIME_TRACKING_TARGETS_DAILY_HOURS_KEY,
25
+ TIME_TRACKING_WARNINGS_OVERLAP_KEY,
26
+ TIME_TRACKING_WARNINGS_RUNNING_TIMER_KEY,
27
+ TIME_TRACKING_ACCESS_ASSIGNMENT_GRACE_DAYS_KEY
28
+ ];
29
+ const DEFAULT_TIME_TRACKING_SETTINGS = buildDefaultTimeTrackingSettings();
30
+ function normalizeTimeTrackingSettings(input) {
31
+ return normalizeTimeTrackingSettingsRecord(input);
32
+ }
33
+ function readTimeTrackingSettingValue(settings, id) {
34
+ const separator = id.indexOf(".");
35
+ if (separator <= 0) return void 0;
36
+ const group = settings[id.slice(0, separator)];
37
+ if (!group || typeof group !== "object") return void 0;
38
+ return group[id.slice(separator + 1)];
39
+ }
40
+ async function readTimeTrackingSettings(configService, scope) {
41
+ const configScope = { tenantId: scope.tenantId };
42
+ const stored = {};
43
+ for (const entry of listTimeTrackingSettingKeys()) {
44
+ const record = await configService.getRecord(STAFF_TIME_TRACKING_MODULE_ID, entry.id, configScope);
45
+ if (!record) continue;
46
+ const group = stored[entry.group] ?? {};
47
+ group[entry.key] = record.value;
48
+ stored[entry.group] = group;
49
+ }
50
+ return normalizeTimeTrackingSettings(stored);
51
+ }
52
+ async function writeTimeTrackingSettings(configService, scope, input) {
53
+ const settings = normalizeTimeTrackingSettings(input);
54
+ const configScope = { tenantId: scope.tenantId };
55
+ for (const entry of listTimeTrackingSettingKeys()) {
56
+ await configService.setValue(
57
+ STAFF_TIME_TRACKING_MODULE_ID,
58
+ entry.id,
59
+ readTimeTrackingSettingValue(settings, entry.id),
60
+ configScope
61
+ );
62
+ }
63
+ return settings;
64
+ }
65
+ export {
66
+ DEFAULT_ASSIGNMENT_GRACE_DAYS,
67
+ DEFAULT_TIME_TRACKING_SETTINGS,
68
+ MAX_ASSIGNMENT_GRACE_DAYS,
69
+ STAFF_TIME_TRACKING_MODULE_ID,
70
+ TIME_TRACKING_ACCESS_ASSIGNMENT_GRACE_DAYS_KEY,
71
+ TIME_TRACKING_DEFAULTS_BILLABLE_KEY,
72
+ TIME_TRACKING_DEFAULTS_CHAIN_START_KEY,
73
+ TIME_TRACKING_ROUNDING_DIRECTION_KEY,
74
+ TIME_TRACKING_ROUNDING_UNIT_MINUTES_KEY,
75
+ TIME_TRACKING_SETTING_KEYS,
76
+ TIME_TRACKING_TARGETS_DAILY_HOURS_KEY,
77
+ TIME_TRACKING_WARNINGS_OVERLAP_KEY,
78
+ TIME_TRACKING_WARNINGS_RUNNING_TIMER_KEY,
79
+ listTimeTrackingSettingKeys,
80
+ normalizeTimeTrackingSettings,
81
+ readTimeTrackingSettingValue,
82
+ readTimeTrackingSettings,
83
+ registerTimeTrackingSettingKey,
84
+ timeTrackingSettingKeyIds,
85
+ writeTimeTrackingSettings
86
+ };
87
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/time-tracking/settings.ts"],
4
+ "sourcesContent": ["import type { ModuleConfigService } from '@open-mercato/core/modules/configs/lib/module-config-service'\nimport type { StaffTimeTrackingSettingsInput } from '../../data/validators'\nimport {\n type RoundingDirection,\n type RoundingSettings,\n type RoundingUnitMinutes,\n} from './rounding'\nimport {\n DEFAULT_ASSIGNMENT_GRACE_DAYS,\n MAX_ASSIGNMENT_GRACE_DAYS,\n buildDefaultTimeTrackingSettings,\n listTimeTrackingSettingKeys,\n normalizeTimeTrackingSettingsRecord,\n registerTimeTrackingSettingKey,\n timeTrackingSettingKeyIds,\n type TimeTrackingSettingKeyDefinition,\n type TimeTrackingSettingKeyInput,\n type TimeTrackingSettingsRecord,\n} from './settingKeys'\n\nexport type { RoundingDirection, RoundingSettings, RoundingUnitMinutes }\nexport type { TimeTrackingSettingKeyDefinition, TimeTrackingSettingKeyInput, TimeTrackingSettingsRecord }\nexport { DEFAULT_ASSIGNMENT_GRACE_DAYS, MAX_ASSIGNMENT_GRACE_DAYS, registerTimeTrackingSettingKey }\n\nexport const STAFF_TIME_TRACKING_MODULE_ID = 'staff.time_tracking'\n\nexport const TIME_TRACKING_ROUNDING_UNIT_MINUTES_KEY = 'rounding.unitMinutes'\nexport const TIME_TRACKING_ROUNDING_DIRECTION_KEY = 'rounding.direction'\nexport const TIME_TRACKING_DEFAULTS_BILLABLE_KEY = 'defaults.billable'\nexport const TIME_TRACKING_DEFAULTS_CHAIN_START_KEY = 'defaults.chainStartFromPreviousEnd'\nexport const TIME_TRACKING_TARGETS_DAILY_HOURS_KEY = 'targets.dailyHours'\nexport const TIME_TRACKING_WARNINGS_OVERLAP_KEY = 'warnings.overlap'\nexport const TIME_TRACKING_WARNINGS_RUNNING_TIMER_KEY = 'warnings.runningTimer'\nexport const TIME_TRACKING_ACCESS_ASSIGNMENT_GRACE_DAYS_KEY = 'access.assignmentGraceDays'\n\n/**\n * The eight keys the module shipped. FROZEN \u2014 a stored config row is named after one\n * of these, so none may be renamed or removed. The list is no longer the whole truth:\n * `timeTrackingSettingKeyIds()` returns these plus every contributed key (EP-42).\n */\nexport const TIME_TRACKING_SETTING_KEYS = [\n TIME_TRACKING_ROUNDING_UNIT_MINUTES_KEY,\n TIME_TRACKING_ROUNDING_DIRECTION_KEY,\n TIME_TRACKING_DEFAULTS_BILLABLE_KEY,\n TIME_TRACKING_DEFAULTS_CHAIN_START_KEY,\n TIME_TRACKING_TARGETS_DAILY_HOURS_KEY,\n TIME_TRACKING_WARNINGS_OVERLAP_KEY,\n TIME_TRACKING_WARNINGS_RUNNING_TIMER_KEY,\n TIME_TRACKING_ACCESS_ASSIGNMENT_GRACE_DAYS_KEY,\n] as const\n\nexport type TimeTrackingSettingKey = (typeof TIME_TRACKING_SETTING_KEYS)[number]\n\nexport type TimeTrackingEntryDefaults = {\n billable: boolean\n chainStartFromPreviousEnd: boolean\n}\n\nexport type TimeTrackingTargets = {\n dailyHours: number | null\n}\n\nexport type TimeTrackingWarnings = {\n overlap: boolean\n runningTimer: boolean\n}\n\nexport type TimeTrackingAccess = {\n assignmentGraceDays: number\n}\n\nexport type TimeTrackingBuiltInSettings = {\n rounding: RoundingSettings\n defaults: TimeTrackingEntryDefaults\n targets: TimeTrackingTargets\n warnings: TimeTrackingWarnings\n access: TimeTrackingAccess\n}\n\n/**\n * The five built-in groups stay statically typed; a contributed group or key reaches\n * a caller through the index signature and is read with `readTimeTrackingSettingValue`.\n */\nexport type TimeTrackingSettings = TimeTrackingBuiltInSettings & TimeTrackingSettingsRecord\n\n/**\n * Settings are global per tenant (spec \u00A710 fixes them there \u2014 no per-project or\n * per-customer override), so the scope carries the tenant only and MUST be\n * derived from the authenticated context, never from request input. A contributed\n * key inherits exactly that scope.\n */\nexport type TimeTrackingSettingsScope = {\n tenantId: string\n}\n\nexport const DEFAULT_TIME_TRACKING_SETTINGS: TimeTrackingSettings =\n buildDefaultTimeTrackingSettings() as TimeTrackingSettings\n\n/**\n * Coerce an arbitrary (possibly partial or malformed) settings shape into the\n * canonical one, filling every absent or invalid value from the registered defaults.\n */\nexport function normalizeTimeTrackingSettings(\n input: Partial<TimeTrackingBuiltInSettings> | TimeTrackingSettingsRecord | StaffTimeTrackingSettingsInput | null | undefined,\n): TimeTrackingSettings {\n return normalizeTimeTrackingSettingsRecord(input) as TimeTrackingSettings\n}\n\n/** Reads one registered key out of a normalized settings object by its `<group>.<key>` id. */\nexport function readTimeTrackingSettingValue(\n settings: TimeTrackingSettings,\n id: string,\n): unknown {\n const separator = id.indexOf('.')\n if (separator <= 0) return undefined\n const group = settings[id.slice(0, separator)]\n if (!group || typeof group !== 'object') return undefined\n return (group as Record<string, unknown>)[id.slice(separator + 1)]\n}\n\nexport { listTimeTrackingSettingKeys, timeTrackingSettingKeyIds }\n\n/**\n * Resolve the tenant's time tracking settings. Absent keys (and keys holding a\n * value the schema no longer accepts) fall back to the registered default, so a\n * tenant that never opened the settings screen still reads a complete record.\n */\nexport async function readTimeTrackingSettings(\n configService: ModuleConfigService,\n scope: TimeTrackingSettingsScope,\n): Promise<TimeTrackingSettings> {\n const configScope = { tenantId: scope.tenantId }\n // `getRecord` rather than `getValue` so an explicitly stored `null`\n // (`targets.dailyHours` = \"no daily target\") stays distinguishable from an\n // absent row, which must fall back to the default.\n const stored: TimeTrackingSettingsRecord = {}\n for (const entry of listTimeTrackingSettingKeys()) {\n const record = await configService.getRecord(STAFF_TIME_TRACKING_MODULE_ID, entry.id, configScope)\n if (!record) continue\n const group = stored[entry.group] ?? {}\n group[entry.key] = record.value\n stored[entry.group] = group\n }\n return normalizeTimeTrackingSettings(stored)\n}\n\n/**\n * Persist the tenant's time tracking settings and return the stored shape.\n */\nexport async function writeTimeTrackingSettings(\n configService: ModuleConfigService,\n scope: TimeTrackingSettingsScope,\n input: Partial<TimeTrackingBuiltInSettings> | TimeTrackingSettingsRecord | StaffTimeTrackingSettingsInput,\n): Promise<TimeTrackingSettings> {\n const settings = normalizeTimeTrackingSettings(input)\n const configScope = { tenantId: scope.tenantId }\n\n for (const entry of listTimeTrackingSettingKeys()) {\n await configService.setValue(\n STAFF_TIME_TRACKING_MODULE_ID,\n entry.id,\n readTimeTrackingSettingValue(settings, entry.id),\n configScope,\n )\n }\n\n return settings\n}\n"],
5
+ "mappings": "AAOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAIK;AAMA,MAAM,gCAAgC;AAEtC,MAAM,0CAA0C;AAChD,MAAM,uCAAuC;AAC7C,MAAM,sCAAsC;AAC5C,MAAM,yCAAyC;AAC/C,MAAM,wCAAwC;AAC9C,MAAM,qCAAqC;AAC3C,MAAM,2CAA2C;AACjD,MAAM,iDAAiD;AAOvD,MAAM,6BAA6B;AAAA,EACxC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AA8CO,MAAM,iCACX,iCAAiC;AAM5B,SAAS,8BACd,OACsB;AACtB,SAAO,oCAAoC,KAAK;AAClD;AAGO,SAAS,6BACd,UACA,IACS;AACT,QAAM,YAAY,GAAG,QAAQ,GAAG;AAChC,MAAI,aAAa,EAAG,QAAO;AAC3B,QAAM,QAAQ,SAAS,GAAG,MAAM,GAAG,SAAS,CAAC;AAC7C,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,SAAQ,MAAkC,GAAG,MAAM,YAAY,CAAC,CAAC;AACnE;AASA,eAAsB,yBACpB,eACA,OAC+B;AAC/B,QAAM,cAAc,EAAE,UAAU,MAAM,SAAS;AAI/C,QAAM,SAAqC,CAAC;AAC5C,aAAW,SAAS,4BAA4B,GAAG;AACjD,UAAM,SAAS,MAAM,cAAc,UAAU,+BAA+B,MAAM,IAAI,WAAW;AACjG,QAAI,CAAC,OAAQ;AACb,UAAM,QAAQ,OAAO,MAAM,KAAK,KAAK,CAAC;AACtC,UAAM,MAAM,GAAG,IAAI,OAAO;AAC1B,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AACA,SAAO,8BAA8B,MAAM;AAC7C;AAKA,eAAsB,0BACpB,eACA,OACA,OAC+B;AAC/B,QAAM,WAAW,8BAA8B,KAAK;AACpD,QAAM,cAAc,EAAE,UAAU,MAAM,SAAS;AAE/C,aAAW,SAAS,4BAA4B,GAAG;AACjD,UAAM,cAAc;AAAA,MAClB;AAAA,MACA,MAAM;AAAA,MACN,6BAA6B,UAAU,MAAM,EAAE;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +1,9 @@
1
+ function buildSqlInClause(column, values) {
2
+ if (values.length === 0) return { sql: `${column} IN (NULL)`, params: [] };
3
+ const placeholders = values.map(() => "?").join(", ");
4
+ return { sql: `${column} IN (${placeholders})`, params: [...values] };
5
+ }
6
+ export {
7
+ buildSqlInClause
8
+ };
9
+ //# sourceMappingURL=sqlInClause.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/time-tracking/sqlInClause.ts"],
4
+ "sourcesContent": ["/**\n * Renders an id list into a raw-SQL `IN` clause with one placeholder per member.\n *\n * MikroORM does not bind parameters at the driver level: `AbstractSqlConnection.execute`\n * calls `platform.formatQuery`, which interpolates each value through\n * `BasePostgreSqlPlatform.escape`, and that renders a JavaScript array as a bare\n * comma-separated list. `column = ANY(?)` therefore reaches PostgreSQL as\n * `= ANY('a', 'b')` \u2014 or, for a single-element array, as the bare scalar, which fails\n * with `malformed array literal`. The dashboards aggregation builder hit the same wall\n * (#4669) and settled on one placeholder per member; this is that same fix, shared by\n * the time-tracking raw queries.\n *\n * An empty list yields `IN (NULL)` rather than a dropped clause: a caller that narrowed\n * to nothing must select nothing, never silently widen to every row.\n */\nexport type SqlInClause = { sql: string; params: unknown[] }\n\nexport function buildSqlInClause(column: string, values: readonly string[]): SqlInClause {\n if (values.length === 0) return { sql: `${column} IN (NULL)`, params: [] }\n const placeholders = values.map(() => '?').join(', ')\n return { sql: `${column} IN (${placeholders})`, params: [...values] }\n}\n"],
5
+ "mappings": "AAiBO,SAAS,iBAAiB,QAAgB,QAAwC;AACvF,MAAI,OAAO,WAAW,EAAG,QAAO,EAAE,KAAK,GAAG,MAAM,cAAc,QAAQ,CAAC,EAAE;AACzE,QAAM,eAAe,OAAO,IAAI,MAAM,GAAG,EAAE,KAAK,IAAI;AACpD,SAAO,EAAE,KAAK,GAAG,MAAM,QAAQ,YAAY,KAAK,QAAQ,CAAC,GAAG,MAAM,EAAE;AACtE;",
6
+ "names": []
7
+ }
@@ -0,0 +1,48 @@
1
+ import { extensionPoints } from "@open-mercato/core/modules/staff/extension-points";
2
+ import { createStrategyRegistry, BUILT_IN_STRATEGY_PRIORITY } from "./registries/registry.js";
3
+ const BUILT_IN_TIME_ENTRY_SOURCE_IDS = ["manual", "timer", "kiosk", "mobile"];
4
+ const TIME_ENTRY_SOURCE_REGISTRY_ID = extensionPoints.hosts.timeEntrySourceRegistry.spotId;
5
+ const DEFAULT_TIME_ENTRY_SOURCE = "manual";
6
+ const registry = createStrategyRegistry(TIME_ENTRY_SOURCE_REGISTRY_ID);
7
+ function registerTimeEntrySource(source) {
8
+ return registry.register(source);
9
+ }
10
+ function listTimeEntrySources() {
11
+ return registry.list();
12
+ }
13
+ function getTimeEntrySource(id) {
14
+ return registry.get(id);
15
+ }
16
+ function hasTimeEntrySource(id) {
17
+ return registry.has(id);
18
+ }
19
+ function timeEntrySourceIds() {
20
+ const builtIn = BUILT_IN_TIME_ENTRY_SOURCE_IDS.filter((id) => registry.has(id));
21
+ const contributed = registry.ids().filter((id) => !builtIn.includes(id));
22
+ return [...builtIn, ...contributed];
23
+ }
24
+ function normalizeTimeEntrySource(value) {
25
+ if (typeof value === "string" && registry.has(value)) return value;
26
+ return DEFAULT_TIME_ENTRY_SOURCE;
27
+ }
28
+ const builtInSources = [
29
+ { id: "manual", labelKey: "staff.time_tracking.entries.source.manual", icon: "PenLine", editable: true },
30
+ { id: "timer", labelKey: "staff.time_tracking.entries.source.timer", icon: "Timer", editable: true },
31
+ { id: "kiosk", labelKey: "staff.time_tracking.entries.source.kiosk", icon: "Monitor", editable: false },
32
+ { id: "mobile", labelKey: "staff.time_tracking.entries.source.mobile", icon: "Smartphone", editable: true }
33
+ ];
34
+ for (const source of builtInSources) {
35
+ registry.registerBuiltIn({ ...source, priority: BUILT_IN_STRATEGY_PRIORITY });
36
+ }
37
+ export {
38
+ BUILT_IN_TIME_ENTRY_SOURCE_IDS,
39
+ DEFAULT_TIME_ENTRY_SOURCE,
40
+ TIME_ENTRY_SOURCE_REGISTRY_ID,
41
+ getTimeEntrySource,
42
+ hasTimeEntrySource,
43
+ listTimeEntrySources,
44
+ normalizeTimeEntrySource,
45
+ registerTimeEntrySource,
46
+ timeEntrySourceIds
47
+ };
48
+ //# sourceMappingURL=timeEntrySources.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/time-tracking/timeEntrySources.ts"],
4
+ "sourcesContent": ["/**\n * EP-37 \u2014 the time-entry source registry.\n *\n * `staff_time_entries.source` used to be a four-value database enum, which made\n * every import integration a core patch. It is now a plain text column whose\n * accepted values are this registry, so a `jira`, `toggl` or `badge-terminal`\n * source ships with its contributing module.\n *\n * `editable` is the flag the entry screens read: a source the user may still\n * hand-correct (`manual`) versus one whose numbers belong to the system that\n * produced them. It is advisory metadata, not an authorization decision \u2014 the\n * lock rules stay with `locked_report_id` and the ACL features.\n */\n\nimport { extensionPoints } from '@open-mercato/core/modules/staff/extension-points'\nimport { createStrategyRegistry, BUILT_IN_STRATEGY_PRIORITY } from './registries/registry'\n\nexport const BUILT_IN_TIME_ENTRY_SOURCE_IDS = ['manual', 'timer', 'kiosk', 'mobile'] as const\n\nexport type BuiltInTimeEntrySource = (typeof BUILT_IN_TIME_ENTRY_SOURCE_IDS)[number]\n\n/**\n * Widened from the original four-value union so a contributed id is assignable.\n * The union arm keeps the four built-ins as completions.\n */\nexport type TimeEntrySource = BuiltInTimeEntrySource | (string & {})\n\nexport type TimeEntrySourceDefinition = {\n id: string\n labelKey: string\n /** Lucide icon name the entry screens may render beside the row. */\n icon: string\n editable: boolean\n priority?: number\n}\n\nexport const TIME_ENTRY_SOURCE_REGISTRY_ID = extensionPoints.hosts.timeEntrySourceRegistry.spotId\n\nexport const DEFAULT_TIME_ENTRY_SOURCE: BuiltInTimeEntrySource = 'manual'\n\nconst registry = createStrategyRegistry<TimeEntrySourceDefinition>(TIME_ENTRY_SOURCE_REGISTRY_ID)\n\nexport function registerTimeEntrySource(source: TimeEntrySourceDefinition): () => void {\n return registry.register(source)\n}\n\nexport function listTimeEntrySources(): TimeEntrySourceDefinition[] {\n return registry.list()\n}\n\nexport function getTimeEntrySource(id: string | null | undefined): TimeEntrySourceDefinition | null {\n return registry.get(id)\n}\n\nexport function hasTimeEntrySource(id: string | null | undefined): boolean {\n return registry.has(id)\n}\n\n/** Built-ins first, in the order the module shipped them, then contributions. */\nexport function timeEntrySourceIds(): string[] {\n const builtIn = BUILT_IN_TIME_ENTRY_SOURCE_IDS.filter((id) => registry.has(id))\n const contributed = registry.ids().filter((id) => !builtIn.includes(id as BuiltInTimeEntrySource))\n return [...builtIn, ...contributed]\n}\n\n/**\n * The write-path guard the dropped database check constraint used to provide.\n * An unknown id falls back to `manual` rather than rejecting the write, matching\n * the column default the enum carried.\n */\nexport function normalizeTimeEntrySource(value: unknown): TimeEntrySource {\n if (typeof value === 'string' && registry.has(value)) return value\n return DEFAULT_TIME_ENTRY_SOURCE\n}\n\nconst builtInSources: readonly Omit<TimeEntrySourceDefinition, 'priority'>[] = [\n { id: 'manual', labelKey: 'staff.time_tracking.entries.source.manual', icon: 'PenLine', editable: true },\n { id: 'timer', labelKey: 'staff.time_tracking.entries.source.timer', icon: 'Timer', editable: true },\n { id: 'kiosk', labelKey: 'staff.time_tracking.entries.source.kiosk', icon: 'Monitor', editable: false },\n { id: 'mobile', labelKey: 'staff.time_tracking.entries.source.mobile', icon: 'Smartphone', editable: true },\n]\n\nfor (const source of builtInSources) {\n registry.registerBuiltIn({ ...source, priority: BUILT_IN_STRATEGY_PRIORITY })\n}\n"],
5
+ "mappings": "AAcA,SAAS,uBAAuB;AAChC,SAAS,wBAAwB,kCAAkC;AAE5D,MAAM,iCAAiC,CAAC,UAAU,SAAS,SAAS,QAAQ;AAmB5E,MAAM,gCAAgC,gBAAgB,MAAM,wBAAwB;AAEpF,MAAM,4BAAoD;AAEjE,MAAM,WAAW,uBAAkD,6BAA6B;AAEzF,SAAS,wBAAwB,QAA+C;AACrF,SAAO,SAAS,SAAS,MAAM;AACjC;AAEO,SAAS,uBAAoD;AAClE,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,mBAAmB,IAAiE;AAClG,SAAO,SAAS,IAAI,EAAE;AACxB;AAEO,SAAS,mBAAmB,IAAwC;AACzE,SAAO,SAAS,IAAI,EAAE;AACxB;AAGO,SAAS,qBAA+B;AAC7C,QAAM,UAAU,+BAA+B,OAAO,CAAC,OAAO,SAAS,IAAI,EAAE,CAAC;AAC9E,QAAM,cAAc,SAAS,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,SAAS,EAA4B,CAAC;AACjG,SAAO,CAAC,GAAG,SAAS,GAAG,WAAW;AACpC;AAOO,SAAS,yBAAyB,OAAiC;AACxE,MAAI,OAAO,UAAU,YAAY,SAAS,IAAI,KAAK,EAAG,QAAO;AAC7D,SAAO;AACT;AAEA,MAAM,iBAAyE;AAAA,EAC7E,EAAE,IAAI,UAAU,UAAU,6CAA6C,MAAM,WAAW,UAAU,KAAK;AAAA,EACvG,EAAE,IAAI,SAAS,UAAU,4CAA4C,MAAM,SAAS,UAAU,KAAK;AAAA,EACnG,EAAE,IAAI,SAAS,UAAU,4CAA4C,MAAM,WAAW,UAAU,MAAM;AAAA,EACtG,EAAE,IAAI,UAAU,UAAU,6CAA6C,MAAM,cAAc,UAAU,KAAK;AAC5G;AAEA,WAAW,UAAU,gBAAgB;AACnC,WAAS,gBAAgB,EAAE,GAAG,QAAQ,UAAU,2BAA2B,CAAC;AAC9E;",
6
+ "names": []
7
+ }