@open-mercato/core 0.7.1-develop.7178.1.ab93fbaf4e → 0.7.1-develop.7179.1.e8c03264b6

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 (792) 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/staff/acl.js +9 -1
  41. package/dist/modules/staff/acl.js.map +2 -2
  42. package/dist/modules/staff/ai-agents.js +142 -0
  43. package/dist/modules/staff/ai-agents.js.map +7 -0
  44. package/dist/modules/staff/ai-tools/time-tracking-pack.js +348 -0
  45. package/dist/modules/staff/ai-tools/time-tracking-pack.js.map +7 -0
  46. package/dist/modules/staff/ai-tools/types.js +54 -0
  47. package/dist/modules/staff/ai-tools/types.js.map +7 -0
  48. package/dist/modules/staff/ai-tools.js +8 -0
  49. package/dist/modules/staff/ai-tools.js.map +7 -0
  50. package/dist/modules/staff/analytics.js +84 -1
  51. package/dist/modules/staff/analytics.js.map +2 -2
  52. package/dist/modules/staff/api/guards.js +37 -3
  53. package/dist/modules/staff/api/guards.js.map +2 -2
  54. package/dist/modules/staff/api/leave-requests/accept/route.js +1 -3
  55. package/dist/modules/staff/api/leave-requests/accept/route.js.map +2 -2
  56. package/dist/modules/staff/api/leave-requests/reject/route.js +1 -3
  57. package/dist/modules/staff/api/leave-requests/reject/route.js.map +2 -2
  58. package/dist/modules/staff/api/portal/time-reports/[id]/route.js +131 -0
  59. package/dist/modules/staff/api/portal/time-reports/[id]/route.js.map +7 -0
  60. package/dist/modules/staff/api/portal/time-reports/route.js +179 -0
  61. package/dist/modules/staff/api/portal/time-reports/route.js.map +7 -0
  62. package/dist/modules/staff/api/team-members/self/route.js +1 -3
  63. package/dist/modules/staff/api/team-members/self/route.js.map +2 -2
  64. package/dist/modules/staff/api/team-members/tags/assign/route.js +1 -3
  65. package/dist/modules/staff/api/team-members/tags/assign/route.js.map +2 -2
  66. package/dist/modules/staff/api/team-members/tags/unassign/route.js +1 -3
  67. package/dist/modules/staff/api/team-members/tags/unassign/route.js.map +2 -2
  68. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js +174 -0
  69. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js.map +7 -0
  70. package/dist/modules/staff/api/timesheets/access-requests/route.js +226 -0
  71. package/dist/modules/staff/api/timesheets/access-requests/route.js.map +7 -0
  72. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +15 -8
  73. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +2 -2
  74. package/dist/modules/staff/api/timesheets/my-projects/route.js +13 -1
  75. package/dist/modules/staff/api/timesheets/my-projects/route.js.map +2 -2
  76. package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js +42 -0
  77. package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js.map +7 -0
  78. package/dist/modules/staff/api/timesheets/my-work/route.js +383 -0
  79. package/dist/modules/staff/api/timesheets/my-work/route.js.map +7 -0
  80. package/dist/modules/staff/api/timesheets/projects/kpis/route.js +14 -2
  81. package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +2 -2
  82. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js +168 -0
  83. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js.map +7 -0
  84. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js +246 -0
  85. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js.map +7 -0
  86. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js +183 -0
  87. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js.map +7 -0
  88. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js +164 -0
  89. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js.map +7 -0
  90. package/dist/modules/staff/api/timesheets/reports/preview/route.js +360 -0
  91. package/dist/modules/staff/api/timesheets/reports/preview/route.js.map +7 -0
  92. package/dist/modules/staff/api/timesheets/reports/route.js +316 -0
  93. package/dist/modules/staff/api/timesheets/reports/route.js.map +7 -0
  94. package/dist/modules/staff/api/timesheets/reports/shared.js +63 -0
  95. package/dist/modules/staff/api/timesheets/reports/shared.js.map +7 -0
  96. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js +164 -0
  97. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js.map +7 -0
  98. package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js +168 -0
  99. package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js.map +7 -0
  100. package/dist/modules/staff/api/timesheets/settings/route.js +199 -0
  101. package/dist/modules/staff/api/timesheets/settings/route.js.map +7 -0
  102. package/dist/modules/staff/api/timesheets/tags/access.js +76 -0
  103. package/dist/modules/staff/api/timesheets/tags/access.js.map +7 -0
  104. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js +235 -0
  105. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js.map +7 -0
  106. package/dist/modules/staff/api/timesheets/tags/route.js +160 -0
  107. package/dist/modules/staff/api/timesheets/tags/route.js.map +7 -0
  108. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js +233 -0
  109. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js.map +7 -0
  110. package/dist/modules/staff/api/timesheets/task-statuses/route.js +188 -0
  111. package/dist/modules/staff/api/timesheets/task-statuses/route.js.map +7 -0
  112. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js +399 -0
  113. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js.map +7 -0
  114. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js +210 -0
  115. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js.map +7 -0
  116. package/dist/modules/staff/api/timesheets/tasks/route.js +333 -0
  117. package/dist/modules/staff/api/timesheets/tasks/route.js.map +7 -0
  118. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js +228 -0
  119. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js.map +7 -0
  120. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js +29 -10
  121. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js.map +2 -2
  122. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +31 -18
  123. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +2 -2
  124. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +21 -7
  125. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +2 -2
  126. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +27 -7
  127. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +2 -2
  128. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +215 -32
  129. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +2 -2
  130. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js +378 -0
  131. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js.map +7 -0
  132. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js +340 -0
  133. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js.map +7 -0
  134. package/dist/modules/staff/api/timesheets/time-entries/route.js +238 -26
  135. package/dist/modules/staff/api/timesheets/time-entries/route.js.map +2 -2
  136. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js +23 -8
  137. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js.map +2 -2
  138. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js +209 -0
  139. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js.map +7 -0
  140. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +59 -2
  141. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +2 -2
  142. package/dist/modules/staff/api/timesheets/time-projects/route.js +264 -22
  143. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +2 -2
  144. package/dist/modules/staff/backend/staff/time-tracking/board/page.js +110 -0
  145. package/dist/modules/staff/backend/staff/time-tracking/board/page.js.map +7 -0
  146. package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js +18 -0
  147. package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js.map +7 -0
  148. package/dist/modules/staff/backend/staff/time-tracking/entries/page.js +981 -0
  149. package/dist/modules/staff/backend/staff/time-tracking/entries/page.js.map +7 -0
  150. package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js +18 -0
  151. package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js.map +7 -0
  152. package/dist/modules/staff/backend/staff/time-tracking/page.js +583 -0
  153. package/dist/modules/staff/backend/staff/time-tracking/page.js.map +7 -0
  154. package/dist/modules/staff/backend/staff/time-tracking/page.meta.js +15 -0
  155. package/dist/modules/staff/backend/staff/time-tracking/page.meta.js.map +7 -0
  156. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js +65 -0
  157. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js.map +7 -0
  158. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js +16 -0
  159. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js.map +7 -0
  160. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js +229 -0
  161. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js.map +7 -0
  162. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js +16 -0
  163. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js.map +7 -0
  164. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js +1014 -0
  165. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js.map +7 -0
  166. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js +16 -0
  167. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js.map +7 -0
  168. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js +97 -0
  169. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js.map +7 -0
  170. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js +16 -0
  171. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js.map +7 -0
  172. package/dist/modules/staff/backend/staff/time-tracking/projects/page.js +1040 -0
  173. package/dist/modules/staff/backend/staff/time-tracking/projects/page.js.map +7 -0
  174. package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js +19 -0
  175. package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js.map +7 -0
  176. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js +353 -0
  177. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js.map +7 -0
  178. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js +457 -0
  179. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js.map +7 -0
  180. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js +16 -0
  181. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js.map +7 -0
  182. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js +697 -0
  183. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js.map +7 -0
  184. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js +16 -0
  185. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js.map +7 -0
  186. package/dist/modules/staff/backend/staff/time-tracking/reports/page.js +174 -0
  187. package/dist/modules/staff/backend/staff/time-tracking/reports/page.js.map +7 -0
  188. package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js +18 -0
  189. package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js.map +7 -0
  190. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js +546 -0
  191. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js.map +7 -0
  192. package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js +18 -0
  193. package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js.map +7 -0
  194. package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js +710 -0
  195. package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js.map +7 -0
  196. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js +646 -0
  197. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js.map +7 -0
  198. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js +18 -0
  199. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js.map +7 -0
  200. package/dist/modules/staff/backend/staff/timesheets/page.js +4 -793
  201. package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
  202. package/dist/modules/staff/backend/staff/timesheets/page.meta.js +2 -7
  203. package/dist/modules/staff/backend/staff/timesheets/page.meta.js.map +2 -2
  204. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js +5 -136
  205. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +2 -2
  206. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js +1 -7
  207. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js.map +2 -2
  208. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +5 -445
  209. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +3 -3
  210. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js +1 -7
  211. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js.map +2 -2
  212. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js +4 -76
  213. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js.map +2 -2
  214. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js +1 -7
  215. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js.map +2 -2
  216. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +4 -613
  217. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
  218. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js +2 -17
  219. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js.map +2 -2
  220. package/dist/modules/staff/ce.js +40 -0
  221. package/dist/modules/staff/ce.js.map +2 -2
  222. package/dist/modules/staff/cli.js +166 -1
  223. package/dist/modules/staff/cli.js.map +2 -2
  224. package/dist/modules/staff/commands/index.js +5 -0
  225. package/dist/modules/staff/commands/index.js.map +2 -2
  226. package/dist/modules/staff/commands/timesheets-entries.js +569 -21
  227. package/dist/modules/staff/commands/timesheets-entries.js.map +3 -3
  228. package/dist/modules/staff/commands/timesheets-projects.js +450 -7
  229. package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
  230. package/dist/modules/staff/commands/timesheets-reports.js +1036 -0
  231. package/dist/modules/staff/commands/timesheets-reports.js.map +7 -0
  232. package/dist/modules/staff/commands/timesheets-tags.js +1015 -0
  233. package/dist/modules/staff/commands/timesheets-tags.js.map +7 -0
  234. package/dist/modules/staff/commands/timesheets-task-comments.js +438 -0
  235. package/dist/modules/staff/commands/timesheets-task-comments.js.map +7 -0
  236. package/dist/modules/staff/commands/timesheets-task-statuses.js +723 -0
  237. package/dist/modules/staff/commands/timesheets-task-statuses.js.map +7 -0
  238. package/dist/modules/staff/commands/timesheets-tasks.js +834 -0
  239. package/dist/modules/staff/commands/timesheets-tasks.js.map +7 -0
  240. package/dist/modules/staff/data/enrichers.js +426 -12
  241. package/dist/modules/staff/data/enrichers.js.map +2 -2
  242. package/dist/modules/staff/data/entities.js +552 -3
  243. package/dist/modules/staff/data/entities.js.map +2 -2
  244. package/dist/modules/staff/data/extensions.js +41 -0
  245. package/dist/modules/staff/data/extensions.js.map +7 -0
  246. package/dist/modules/staff/data/validators.js +254 -9
  247. package/dist/modules/staff/data/validators.js.map +2 -2
  248. package/dist/modules/staff/di.js +42 -1
  249. package/dist/modules/staff/di.js.map +2 -2
  250. package/dist/modules/staff/events.js +84 -6
  251. package/dist/modules/staff/events.js.map +2 -2
  252. package/dist/modules/staff/events.payloads.js +158 -0
  253. package/dist/modules/staff/events.payloads.js.map +7 -0
  254. package/dist/modules/staff/extension-points.js +261 -0
  255. package/dist/modules/staff/extension-points.js.map +7 -0
  256. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js +138 -0
  257. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js.map +7 -0
  258. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js +12 -0
  259. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js.map +7 -0
  260. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js +133 -0
  261. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js.map +7 -0
  262. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js +19 -0
  263. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js.map +7 -0
  264. package/dist/modules/staff/lib/crud.js +11 -1
  265. package/dist/modules/staff/lib/crud.js.map +2 -2
  266. package/dist/modules/staff/lib/time-tracking/access.js +92 -0
  267. package/dist/modules/staff/lib/time-tracking/access.js.map +7 -0
  268. package/dist/modules/staff/lib/time-tracking/billability.js +39 -0
  269. package/dist/modules/staff/lib/time-tracking/billability.js.map +7 -0
  270. package/dist/modules/staff/lib/time-tracking/capacity.js +68 -0
  271. package/dist/modules/staff/lib/time-tracking/capacity.js.map +7 -0
  272. package/dist/modules/staff/lib/time-tracking/componentContracts.js +15 -0
  273. package/dist/modules/staff/lib/time-tracking/componentContracts.js.map +7 -0
  274. package/dist/modules/staff/lib/time-tracking/cost.js +82 -0
  275. package/dist/modules/staff/lib/time-tracking/cost.js.map +7 -0
  276. package/dist/modules/staff/lib/time-tracking/duration.js +55 -0
  277. package/dist/modules/staff/lib/time-tracking/duration.js.map +7 -0
  278. package/dist/modules/staff/lib/time-tracking/featureAccess.js +41 -0
  279. package/dist/modules/staff/lib/time-tracking/featureAccess.js.map +7 -0
  280. package/dist/modules/staff/lib/time-tracking/interval.js +72 -0
  281. package/dist/modules/staff/lib/time-tracking/interval.js.map +7 -0
  282. package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js +88 -0
  283. package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js.map +7 -0
  284. package/dist/modules/staff/lib/time-tracking/moneyVisibility.js +10 -0
  285. package/dist/modules/staff/lib/time-tracking/moneyVisibility.js.map +7 -0
  286. package/dist/modules/staff/lib/time-tracking/overlap.js +87 -0
  287. package/dist/modules/staff/lib/time-tracking/overlap.js.map +7 -0
  288. package/dist/modules/staff/lib/time-tracking/portalRecipients.js +27 -0
  289. package/dist/modules/staff/lib/time-tracking/portalRecipients.js.map +7 -0
  290. package/dist/modules/staff/lib/time-tracking/portalReports.js +16 -0
  291. package/dist/modules/staff/lib/time-tracking/portalReports.js.map +7 -0
  292. package/dist/modules/staff/lib/time-tracking/projectCode.js +135 -0
  293. package/dist/modules/staff/lib/time-tracking/projectCode.js.map +7 -0
  294. package/dist/modules/staff/lib/time-tracking/reapplyRounding.js +187 -0
  295. package/dist/modules/staff/lib/time-tracking/reapplyRounding.js.map +7 -0
  296. package/dist/modules/staff/lib/time-tracking/recalculationRunner.js +80 -0
  297. package/dist/modules/staff/lib/time-tracking/recalculationRunner.js.map +7 -0
  298. package/dist/modules/staff/lib/time-tracking/recalculations.js +56 -0
  299. package/dist/modules/staff/lib/time-tracking/recalculations.js.map +7 -0
  300. package/dist/modules/staff/lib/time-tracking/registries/invoke.js +63 -0
  301. package/dist/modules/staff/lib/time-tracking/registries/invoke.js.map +7 -0
  302. package/dist/modules/staff/lib/time-tracking/registries/registry.js +62 -0
  303. package/dist/modules/staff/lib/time-tracking/registries/registry.js.map +7 -0
  304. package/dist/modules/staff/lib/time-tracking/registries/scope.js +21 -0
  305. package/dist/modules/staff/lib/time-tracking/registries/scope.js.map +7 -0
  306. package/dist/modules/staff/lib/time-tracking/rollup.js +34 -0
  307. package/dist/modules/staff/lib/time-tracking/rollup.js.map +7 -0
  308. package/dist/modules/staff/lib/time-tracking/rounding.js +66 -0
  309. package/dist/modules/staff/lib/time-tracking/rounding.js.map +7 -0
  310. package/dist/modules/staff/lib/time-tracking/roundingImpact.js +39 -0
  311. package/dist/modules/staff/lib/time-tracking/roundingImpact.js.map +7 -0
  312. package/dist/modules/staff/lib/time-tracking/settingKeys.js +214 -0
  313. package/dist/modules/staff/lib/time-tracking/settingKeys.js.map +7 -0
  314. package/dist/modules/staff/lib/time-tracking/settings.js +87 -0
  315. package/dist/modules/staff/lib/time-tracking/settings.js.map +7 -0
  316. package/dist/modules/staff/lib/time-tracking/sqlInClause.js +9 -0
  317. package/dist/modules/staff/lib/time-tracking/sqlInClause.js.map +7 -0
  318. package/dist/modules/staff/lib/time-tracking/timeEntrySources.js +48 -0
  319. package/dist/modules/staff/lib/time-tracking/timeEntrySources.js.map +7 -0
  320. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js +283 -0
  321. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js.map +7 -0
  322. package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js +324 -0
  323. package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js.map +7 -0
  324. package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js +121 -0
  325. package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js.map +7 -0
  326. package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js +188 -0
  327. package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js.map +7 -0
  328. package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js +89 -0
  329. package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js.map +7 -0
  330. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js +855 -0
  331. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js.map +7 -0
  332. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js +360 -0
  333. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js.map +7 -0
  334. package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js +259 -0
  335. package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js.map +7 -0
  336. package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js +238 -0
  337. package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js.map +7 -0
  338. package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js +130 -0
  339. package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js.map +7 -0
  340. package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js +98 -0
  341. package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js.map +7 -0
  342. package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js +27 -0
  343. package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js.map +7 -0
  344. package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js +166 -0
  345. package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js.map +7 -0
  346. package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js +295 -0
  347. package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js.map +7 -0
  348. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js +212 -0
  349. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js.map +7 -0
  350. package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js +729 -0
  351. package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js.map +7 -0
  352. package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js +217 -0
  353. package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js.map +7 -0
  354. package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js +158 -0
  355. package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js.map +7 -0
  356. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js +224 -0
  357. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js.map +7 -0
  358. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js +93 -0
  359. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js.map +7 -0
  360. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js +1196 -0
  361. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js.map +7 -0
  362. package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js +176 -0
  363. package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js.map +7 -0
  364. package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js +307 -0
  365. package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js.map +7 -0
  366. package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js +284 -0
  367. package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js.map +7 -0
  368. package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js +73 -0
  369. package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js.map +7 -0
  370. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js +1499 -0
  371. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js.map +7 -0
  372. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js +95 -0
  373. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js.map +7 -0
  374. package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js +188 -0
  375. package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js.map +7 -0
  376. package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js +61 -0
  377. package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js.map +7 -0
  378. package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js +45 -0
  379. package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js.map +7 -0
  380. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js +176 -0
  381. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js.map +7 -0
  382. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js +82 -0
  383. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js.map +7 -0
  384. package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js +5 -0
  385. package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js.map +7 -0
  386. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js +152 -0
  387. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js.map +7 -0
  388. package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js +92 -0
  389. package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js.map +7 -0
  390. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js +111 -0
  391. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js.map +7 -0
  392. package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js +243 -0
  393. package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js.map +7 -0
  394. package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js +151 -0
  395. package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js.map +7 -0
  396. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js +105 -0
  397. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js.map +7 -0
  398. package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js +132 -0
  399. package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js.map +7 -0
  400. package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js +205 -0
  401. package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js.map +7 -0
  402. package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js +53 -0
  403. package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js.map +7 -0
  404. package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js +77 -0
  405. package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js.map +7 -0
  406. package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js +151 -0
  407. package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js.map +7 -0
  408. package/dist/modules/staff/lib/timeTrackingSeeds.js +809 -0
  409. package/dist/modules/staff/lib/timeTrackingSeeds.js.map +7 -0
  410. package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js +2 -3
  411. package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js.map +2 -2
  412. package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js +152 -0
  413. package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js.map +7 -0
  414. package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js +36 -0
  415. package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js.map +7 -0
  416. package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js +66 -0
  417. package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js.map +7 -0
  418. package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js +78 -0
  419. package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js.map +7 -0
  420. package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js +81 -0
  421. package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js.map +7 -0
  422. package/dist/modules/staff/lib/timesheets-projects/reportSelection.js +44 -0
  423. package/dist/modules/staff/lib/timesheets-projects/reportSelection.js.map +7 -0
  424. package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js +169 -0
  425. package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js.map +7 -0
  426. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js +22 -0
  427. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js.map +7 -0
  428. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js +51 -1
  429. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js.map +2 -2
  430. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js +70 -0
  431. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js.map +7 -0
  432. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js +63 -0
  433. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js.map +7 -0
  434. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js +170 -0
  435. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js.map +7 -0
  436. package/dist/modules/staff/lib/timesheets-reports/pdf.js +205 -0
  437. package/dist/modules/staff/lib/timesheets-reports/pdf.js.map +7 -0
  438. package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js +68 -0
  439. package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js.map +7 -0
  440. package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js +135 -0
  441. package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js.map +7 -0
  442. package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js +48 -0
  443. package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js.map +7 -0
  444. package/dist/modules/staff/lib/timesheets-reports/reportExport.js +262 -0
  445. package/dist/modules/staff/lib/timesheets-reports/reportExport.js.map +7 -0
  446. package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js +34 -0
  447. package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js.map +7 -0
  448. package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js +79 -0
  449. package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js.map +7 -0
  450. package/dist/modules/staff/lib/timesheets-reports/reportLabels.js +11 -0
  451. package/dist/modules/staff/lib/timesheets-reports/reportLabels.js.map +7 -0
  452. package/dist/modules/staff/lib/timesheets-reports/reportReference.js +83 -0
  453. package/dist/modules/staff/lib/timesheets-reports/reportReference.js.map +7 -0
  454. package/dist/modules/staff/lib/timesheets-reports/reportRows.js +42 -0
  455. package/dist/modules/staff/lib/timesheets-reports/reportRows.js.map +7 -0
  456. package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js +107 -0
  457. package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js.map +7 -0
  458. package/dist/modules/staff/lib/timesheets-reports/reportTotals.js +289 -0
  459. package/dist/modules/staff/lib/timesheets-reports/reportTotals.js.map +7 -0
  460. package/dist/modules/staff/lib/timesheets-reports/xlsx.js +145 -0
  461. package/dist/modules/staff/lib/timesheets-reports/xlsx.js.map +7 -0
  462. package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js +116 -0
  463. package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js.map +7 -0
  464. package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js +50 -0
  465. package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js.map +7 -0
  466. package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js +27 -0
  467. package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js.map +7 -0
  468. package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js +65 -0
  469. package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js.map +7 -0
  470. package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js +31 -0
  471. package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js.map +7 -0
  472. package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js +31 -0
  473. package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js.map +7 -0
  474. package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js +17 -0
  475. package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js.map +7 -0
  476. package/dist/modules/staff/lib/timesheets-tasks/taskReference.js +51 -0
  477. package/dist/modules/staff/lib/timesheets-tasks/taskReference.js.map +7 -0
  478. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js +11 -4
  479. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js.map +2 -2
  480. package/dist/modules/staff/lib/timesheets-ui/ListView.js +369 -111
  481. package/dist/modules/staff/lib/timesheets-ui/ListView.js.map +2 -2
  482. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js +47 -2
  483. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js.map +2 -2
  484. package/dist/modules/staff/migrations/Migration20260813073131_staff.js +79 -0
  485. package/dist/modules/staff/migrations/Migration20260813073131_staff.js.map +7 -0
  486. package/dist/modules/staff/migrations/Migration20260824143357_staff.js +15 -0
  487. package/dist/modules/staff/migrations/Migration20260824143357_staff.js.map +7 -0
  488. package/dist/modules/staff/notifications.client.js +16 -0
  489. package/dist/modules/staff/notifications.client.js.map +7 -0
  490. package/dist/modules/staff/notifications.handlers.js +80 -0
  491. package/dist/modules/staff/notifications.handlers.js.map +7 -0
  492. package/dist/modules/staff/notifications.js +168 -0
  493. package/dist/modules/staff/notifications.js.map +2 -2
  494. package/dist/modules/staff/search.js +159 -1
  495. package/dist/modules/staff/search.js.map +2 -2
  496. package/dist/modules/staff/setup.js +20 -1
  497. package/dist/modules/staff/setup.js.map +2 -2
  498. package/dist/modules/staff/subscribers/time-project-access-requested-notification.js +68 -0
  499. package/dist/modules/staff/subscribers/time-project-access-requested-notification.js.map +7 -0
  500. package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js +149 -0
  501. package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js.map +7 -0
  502. package/dist/modules/staff/subscribers/time-report-approved-notification.js +78 -0
  503. package/dist/modules/staff/subscribers/time-report-approved-notification.js.map +7 -0
  504. package/dist/modules/staff/subscribers/time-report-portal-broadcast.js +78 -0
  505. package/dist/modules/staff/subscribers/time-report-portal-broadcast.js.map +7 -0
  506. package/dist/modules/staff/translations.js +4 -1
  507. package/dist/modules/staff/translations.js.map +2 -2
  508. package/dist/modules/staff/widgets/components.js +7 -0
  509. package/dist/modules/staff/widgets/components.js.map +7 -0
  510. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js +5 -4
  511. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js.map +2 -2
  512. package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js +135 -0
  513. package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js.map +7 -0
  514. package/dist/modules/staff/widgets/notifications/index.js +5 -0
  515. package/dist/modules/staff/widgets/notifications/index.js.map +7 -0
  516. package/dist/modules/staff/workers/timesheets-reapply-rounding.js +43 -0
  517. package/dist/modules/staff/workers/timesheets-reapply-rounding.js.map +7 -0
  518. package/generated/entities/staff_time_entry/index.ts +7 -0
  519. package/generated/entities/staff_time_entry_tag/index.ts +6 -0
  520. package/generated/entities/staff_time_project/index.ts +8 -0
  521. package/generated/entities/staff_time_report/index.ts +27 -0
  522. package/generated/entities/staff_time_report_entry/index.ts +12 -0
  523. package/generated/entities/staff_time_report_event/index.ts +9 -0
  524. package/generated/entities/staff_time_report_project/index.ts +6 -0
  525. package/generated/entities/staff_time_tag/index.ts +9 -0
  526. package/generated/entities/staff_time_task/index.ts +17 -0
  527. package/generated/entities/staff_time_task_comment/index.ts +9 -0
  528. package/generated/entities/staff_time_task_status/index.ts +13 -0
  529. package/generated/entities/staff_time_task_tag/index.ts +6 -0
  530. package/generated/entities.ids.generated.ts +11 -1
  531. package/generated/entity-fields-registry.ts +149 -0
  532. package/package.json +7 -7
  533. package/src/helpers/integration/timesheetFixtures.ts +31 -1
  534. package/src/modules/auth/README.md +1 -1
  535. package/src/modules/auth/cli.ts +35 -1
  536. package/src/modules/auth/i18n/de.json +7 -0
  537. package/src/modules/auth/i18n/en.json +7 -0
  538. package/src/modules/auth/i18n/es.json +7 -0
  539. package/src/modules/auth/i18n/ko.json +7 -0
  540. package/src/modules/auth/i18n/pl.json +7 -0
  541. package/src/modules/auth/lib/backendChrome.tsx +1 -0
  542. package/src/modules/customer_accounts/lib/customerRoleAcls.ts +79 -0
  543. package/src/modules/customer_accounts/setup.ts +1 -45
  544. package/src/modules/staff/AGENTS.md +769 -1
  545. package/src/modules/staff/acl.ts +9 -0
  546. package/src/modules/staff/ai-agents.ts +189 -0
  547. package/src/modules/staff/ai-tools/time-tracking-pack.ts +494 -0
  548. package/src/modules/staff/ai-tools/types.ts +82 -0
  549. package/src/modules/staff/ai-tools.ts +13 -0
  550. package/src/modules/staff/analytics.ts +113 -0
  551. package/src/modules/staff/api/guards.ts +85 -3
  552. package/src/modules/staff/api/leave-requests/accept/route.ts +0 -2
  553. package/src/modules/staff/api/leave-requests/reject/route.ts +0 -2
  554. package/src/modules/staff/api/portal/time-reports/[id]/route.ts +182 -0
  555. package/src/modules/staff/api/portal/time-reports/route.ts +270 -0
  556. package/src/modules/staff/api/team-members/self/route.ts +0 -2
  557. package/src/modules/staff/api/team-members/tags/assign/route.ts +0 -2
  558. package/src/modules/staff/api/team-members/tags/unassign/route.ts +0 -2
  559. package/src/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.ts +292 -0
  560. package/src/modules/staff/api/timesheets/access-requests/route.ts +299 -0
  561. package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +15 -7
  562. package/src/modules/staff/api/timesheets/my-projects/route.ts +14 -1
  563. package/src/modules/staff/api/timesheets/my-work/myWorkAggregate.ts +90 -0
  564. package/src/modules/staff/api/timesheets/my-work/route.ts +475 -0
  565. package/src/modules/staff/api/timesheets/projects/kpis/route.ts +15 -2
  566. package/src/modules/staff/api/timesheets/reports/[id]/close/route.ts +203 -0
  567. package/src/modules/staff/api/timesheets/reports/[id]/export/route.ts +315 -0
  568. package/src/modules/staff/api/timesheets/reports/[id]/sheet/route.ts +220 -0
  569. package/src/modules/staff/api/timesheets/reports/[id]/unlock/route.ts +208 -0
  570. package/src/modules/staff/api/timesheets/reports/preview/route.ts +449 -0
  571. package/src/modules/staff/api/timesheets/reports/route.ts +386 -0
  572. package/src/modules/staff/api/timesheets/reports/shared.ts +121 -0
  573. package/src/modules/staff/api/timesheets/settings/reapply-rounding/route.ts +205 -0
  574. package/src/modules/staff/api/timesheets/settings/rounding-impact/route.ts +226 -0
  575. package/src/modules/staff/api/timesheets/settings/route.ts +242 -0
  576. package/src/modules/staff/api/timesheets/tags/access.ts +134 -0
  577. package/src/modules/staff/api/timesheets/tags/entry-assignments/route.ts +290 -0
  578. package/src/modules/staff/api/timesheets/tags/route.ts +177 -0
  579. package/src/modules/staff/api/timesheets/tags/task-assignments/route.ts +294 -0
  580. package/src/modules/staff/api/timesheets/task-statuses/route.ts +232 -0
  581. package/src/modules/staff/api/timesheets/tasks/[id]/comments/route.ts +532 -0
  582. package/src/modules/staff/api/timesheets/tasks/[id]/status/route.ts +271 -0
  583. package/src/modules/staff/api/timesheets/tasks/route.ts +443 -0
  584. package/src/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.ts +306 -0
  585. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.ts +32 -10
  586. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +32 -17
  587. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +27 -6
  588. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +36 -6
  589. package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +331 -34
  590. package/src/modules/staff/api/timesheets/time-entries/copy-day/route.ts +533 -0
  591. package/src/modules/staff/api/timesheets/time-entries/overlaps/route.ts +457 -0
  592. package/src/modules/staff/api/timesheets/time-entries/route.ts +378 -24
  593. package/src/modules/staff/api/timesheets/time-entries/start-timer/route.ts +31 -9
  594. package/src/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.ts +246 -0
  595. package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +62 -2
  596. package/src/modules/staff/api/timesheets/time-projects/route.ts +397 -22
  597. package/src/modules/staff/backend/staff/time-tracking/board/page.meta.ts +14 -0
  598. package/src/modules/staff/backend/staff/time-tracking/board/page.tsx +151 -0
  599. package/src/modules/staff/backend/staff/time-tracking/entries/page.meta.ts +14 -0
  600. package/src/modules/staff/backend/staff/time-tracking/entries/page.tsx +1229 -0
  601. package/src/modules/staff/backend/staff/time-tracking/page.meta.ts +11 -0
  602. package/src/modules/staff/backend/staff/time-tracking/page.tsx +823 -0
  603. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.ts +12 -0
  604. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.tsx +81 -0
  605. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.ts +12 -0
  606. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.tsx +275 -0
  607. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.ts +12 -0
  608. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.tsx +1420 -0
  609. package/src/modules/staff/backend/staff/time-tracking/projects/create/page.meta.ts +12 -0
  610. package/src/modules/staff/backend/staff/time-tracking/projects/create/page.tsx +109 -0
  611. package/src/modules/staff/backend/staff/time-tracking/projects/page.meta.ts +15 -0
  612. package/src/modules/staff/backend/staff/time-tracking/projects/page.tsx +1254 -0
  613. package/src/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.ts +466 -0
  614. package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.ts +12 -0
  615. package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.tsx +632 -0
  616. package/src/modules/staff/backend/staff/time-tracking/reports/create/page.meta.ts +12 -0
  617. package/src/modules/staff/backend/staff/time-tracking/reports/create/page.tsx +867 -0
  618. package/src/modules/staff/backend/staff/time-tracking/reports/page.meta.ts +14 -0
  619. package/src/modules/staff/backend/staff/time-tracking/reports/page.tsx +246 -0
  620. package/src/modules/staff/backend/staff/time-tracking/settings/page.meta.ts +14 -0
  621. package/src/modules/staff/backend/staff/time-tracking/settings/page.tsx +701 -0
  622. package/src/modules/staff/backend/staff/time-tracking/timesheet/GridView.tsx +953 -0
  623. package/src/modules/staff/backend/staff/time-tracking/timesheet/page.meta.ts +14 -0
  624. package/src/modules/staff/backend/staff/time-tracking/timesheet/page.tsx +800 -0
  625. package/src/modules/staff/backend/staff/timesheets/page.meta.ts +6 -6
  626. package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1010
  627. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.ts +0 -6
  628. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +4 -158
  629. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.ts +0 -6
  630. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +4 -609
  631. package/src/modules/staff/backend/staff/timesheets/projects/create/page.meta.ts +0 -6
  632. package/src/modules/staff/backend/staff/timesheets/projects/create/page.tsx +3 -89
  633. package/src/modules/staff/backend/staff/timesheets/projects/page.meta.ts +2 -19
  634. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +3 -778
  635. package/src/modules/staff/ce.ts +63 -0
  636. package/src/modules/staff/cli.ts +207 -1
  637. package/src/modules/staff/commands/index.ts +5 -0
  638. package/src/modules/staff/commands/timesheets-entries.ts +1006 -28
  639. package/src/modules/staff/commands/timesheets-projects.ts +593 -7
  640. package/src/modules/staff/commands/timesheets-reports.ts +1329 -0
  641. package/src/modules/staff/commands/timesheets-tags.ts +1315 -0
  642. package/src/modules/staff/commands/timesheets-task-comments.ts +583 -0
  643. package/src/modules/staff/commands/timesheets-task-statuses.ts +889 -0
  644. package/src/modules/staff/commands/timesheets-tasks.ts +1121 -0
  645. package/src/modules/staff/data/enrichers.ts +675 -10
  646. package/src/modules/staff/data/entities.ts +494 -2
  647. package/src/modules/staff/data/extensions.ts +68 -0
  648. package/src/modules/staff/data/validators.ts +348 -3
  649. package/src/modules/staff/di.ts +96 -0
  650. package/src/modules/staff/events.payloads.ts +268 -0
  651. package/src/modules/staff/events.ts +87 -5
  652. package/src/modules/staff/extension-points.ts +308 -0
  653. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.ts +10 -0
  654. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.tsx +225 -0
  655. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.ts +17 -0
  656. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.tsx +182 -0
  657. package/src/modules/staff/i18n/de.json +899 -0
  658. package/src/modules/staff/i18n/en.json +899 -0
  659. package/src/modules/staff/i18n/es.json +899 -0
  660. package/src/modules/staff/i18n/ko.json +899 -0
  661. package/src/modules/staff/i18n/pl.json +899 -0
  662. package/src/modules/staff/lib/crud.ts +14 -3
  663. package/src/modules/staff/lib/time-tracking/access.ts +155 -0
  664. package/src/modules/staff/lib/time-tracking/billability.ts +68 -0
  665. package/src/modules/staff/lib/time-tracking/capacity.ts +124 -0
  666. package/src/modules/staff/lib/time-tracking/componentContracts.ts +26 -0
  667. package/src/modules/staff/lib/time-tracking/cost.ts +144 -0
  668. package/src/modules/staff/lib/time-tracking/duration.ts +68 -0
  669. package/src/modules/staff/lib/time-tracking/featureAccess.ts +115 -0
  670. package/src/modules/staff/lib/time-tracking/interval.ts +90 -0
  671. package/src/modules/staff/lib/time-tracking/migrateProjectCodes.ts +161 -0
  672. package/src/modules/staff/lib/time-tracking/moneyVisibility.ts +37 -0
  673. package/src/modules/staff/lib/time-tracking/overlap.ts +159 -0
  674. package/src/modules/staff/lib/time-tracking/portalRecipients.ts +76 -0
  675. package/src/modules/staff/lib/time-tracking/portalReports.ts +31 -0
  676. package/src/modules/staff/lib/time-tracking/projectCode.ts +221 -0
  677. package/src/modules/staff/lib/time-tracking/reapplyRounding.ts +313 -0
  678. package/src/modules/staff/lib/time-tracking/recalculationRunner.ts +118 -0
  679. package/src/modules/staff/lib/time-tracking/recalculations.ts +135 -0
  680. package/src/modules/staff/lib/time-tracking/registries/invoke.ts +122 -0
  681. package/src/modules/staff/lib/time-tracking/registries/registry.ts +124 -0
  682. package/src/modules/staff/lib/time-tracking/registries/scope.ts +56 -0
  683. package/src/modules/staff/lib/time-tracking/rollup.ts +59 -0
  684. package/src/modules/staff/lib/time-tracking/rounding.ts +126 -0
  685. package/src/modules/staff/lib/time-tracking/roundingImpact.ts +75 -0
  686. package/src/modules/staff/lib/time-tracking/settingKeys.ts +274 -0
  687. package/src/modules/staff/lib/time-tracking/settings.ts +168 -0
  688. package/src/modules/staff/lib/time-tracking/sqlInClause.ts +22 -0
  689. package/src/modules/staff/lib/time-tracking/timeEntrySources.ts +85 -0
  690. package/src/modules/staff/lib/time-tracking-ui/BoardFilterChips.tsx +360 -0
  691. package/src/modules/staff/lib/time-tracking-ui/CustomerPicker.tsx +427 -0
  692. package/src/modules/staff/lib/time-tracking-ui/DurationInput.tsx +192 -0
  693. package/src/modules/staff/lib/time-tracking-ui/EntryDetailsFields.tsx +224 -0
  694. package/src/modules/staff/lib/time-tracking-ui/EntryFilterBar.tsx +144 -0
  695. package/src/modules/staff/lib/time-tracking-ui/KanbanBoard.tsx +1065 -0
  696. package/src/modules/staff/lib/time-tracking-ui/KanbanCard.tsx +435 -0
  697. package/src/modules/staff/lib/time-tracking-ui/KanbanColumn.tsx +316 -0
  698. package/src/modules/staff/lib/time-tracking-ui/NewTaskDialog.tsx +291 -0
  699. package/src/modules/staff/lib/time-tracking-ui/NoProjectAccess.tsx +162 -0
  700. package/src/modules/staff/lib/time-tracking-ui/PeriodSelector.tsx +149 -0
  701. package/src/modules/staff/lib/time-tracking-ui/PhasePlaceholder.tsx +31 -0
  702. package/src/modules/staff/lib/time-tracking-ui/ProjectCodeField.tsx +230 -0
  703. package/src/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.tsx +432 -0
  704. package/src/modules/staff/lib/time-tracking-ui/ProjectFormSections.tsx +323 -0
  705. package/src/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.tsx +930 -0
  706. package/src/modules/staff/lib/time-tracking-ui/ReportSheet.tsx +357 -0
  707. package/src/modules/staff/lib/time-tracking-ui/TagPicker.tsx +195 -0
  708. package/src/modules/staff/lib/time-tracking-ui/TaskBoardScreen.tsx +243 -0
  709. package/src/modules/staff/lib/time-tracking-ui/TaskCommentThread.tsx +137 -0
  710. package/src/modules/staff/lib/time-tracking-ui/TaskDrawer.tsx +1405 -0
  711. package/src/modules/staff/lib/time-tracking-ui/TaskListView.tsx +260 -0
  712. package/src/modules/staff/lib/time-tracking-ui/TaskPicker.tsx +435 -0
  713. package/src/modules/staff/lib/time-tracking-ui/TaskQuickLog.tsx +296 -0
  714. package/src/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.tsx +97 -0
  715. package/src/modules/staff/lib/time-tracking-ui/TimeEntryDialog.tsx +1929 -0
  716. package/src/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.tsx +126 -0
  717. package/src/modules/staff/lib/time-tracking-ui/TimesheetCalendar.tsx +265 -0
  718. package/src/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.tsx +78 -0
  719. package/src/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.tsx +70 -0
  720. package/src/modules/staff/lib/time-tracking-ui/boardDirectory.ts +231 -0
  721. package/src/modules/staff/lib/time-tracking-ui/boardFilters.ts +128 -0
  722. package/src/modules/staff/lib/time-tracking-ui/boardSummary.ts +20 -0
  723. package/src/modules/staff/lib/time-tracking-ui/kanbanBoardData.ts +228 -0
  724. package/src/modules/staff/lib/time-tracking-ui/projectTeamAssignment.ts +143 -0
  725. package/src/modules/staff/lib/time-tracking-ui/taskDrawerData.ts +194 -0
  726. package/src/modules/staff/lib/time-tracking-ui/timeEntryDialogState.ts +400 -0
  727. package/src/modules/staff/lib/time-tracking-ui/timeEntryListData.ts +271 -0
  728. package/src/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.ts +168 -0
  729. package/src/modules/staff/lib/time-tracking-ui/timesheetData.ts +225 -0
  730. package/src/modules/staff/lib/time-tracking-ui/timesheetPeriod.ts +278 -0
  731. package/src/modules/staff/lib/time-tracking-ui/timesheetTargets.ts +93 -0
  732. package/src/modules/staff/lib/time-tracking-ui/useBoardFilters.ts +107 -0
  733. package/src/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.ts +245 -0
  734. package/src/modules/staff/lib/timeTrackingSeeds.ts +1037 -0
  735. package/src/modules/staff/lib/timesheets/timeEntryCacheInvalidation.ts +11 -10
  736. package/src/modules/staff/lib/timesheets/timeEntryDecoration.ts +256 -0
  737. package/src/modules/staff/lib/timesheets-projects/budgetBurn.ts +60 -0
  738. package/src/modules/staff/lib/timesheets-projects/budgetThreshold.ts +135 -0
  739. package/src/modules/staff/lib/timesheets-projects/budgetThresholdState.ts +137 -0
  740. package/src/modules/staff/lib/timesheets-projects/computeProjectFinancials.ts +142 -0
  741. package/src/modules/staff/lib/timesheets-projects/reportSelection.ts +82 -0
  742. package/src/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.tsx +237 -0
  743. package/src/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.tsx +33 -0
  744. package/src/modules/staff/lib/timesheets-projects-ui/ProjectCard.tsx +56 -1
  745. package/src/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.tsx +90 -0
  746. package/src/modules/staff/lib/timesheets-reports/buildReportSheet.ts +125 -0
  747. package/src/modules/staff/lib/timesheets-reports/loadReportData.ts +251 -0
  748. package/src/modules/staff/lib/timesheets-reports/pdf.ts +263 -0
  749. package/src/modules/staff/lib/timesheets-reports/reportApprovalPolicies.ts +137 -0
  750. package/src/modules/staff/lib/timesheets-reports/reportConfigData.ts +247 -0
  751. package/src/modules/staff/lib/timesheets-reports/reportConfigState.ts +89 -0
  752. package/src/modules/staff/lib/timesheets-reports/reportExport.ts +373 -0
  753. package/src/modules/staff/lib/timesheets-reports/reportExportFormats.ts +71 -0
  754. package/src/modules/staff/lib/timesheets-reports/reportGroupings.ts +153 -0
  755. package/src/modules/staff/lib/timesheets-reports/reportLabels.ts +23 -0
  756. package/src/modules/staff/lib/timesheets-reports/reportReference.ts +146 -0
  757. package/src/modules/staff/lib/timesheets-reports/reportRows.ts +89 -0
  758. package/src/modules/staff/lib/timesheets-reports/reportSheetData.ts +196 -0
  759. package/src/modules/staff/lib/timesheets-reports/reportTotals.ts +544 -0
  760. package/src/modules/staff/lib/timesheets-reports/xlsx.ts +207 -0
  761. package/src/modules/staff/lib/timesheets-tasks/computeTaskRollups.ts +238 -0
  762. package/src/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.ts +90 -0
  763. package/src/modules/staff/lib/timesheets-tasks/seedProjectStatuses.ts +43 -0
  764. package/src/modules/staff/lib/timesheets-tasks/statusPositions.ts +132 -0
  765. package/src/modules/staff/lib/timesheets-tasks/statusSlug.ts +43 -0
  766. package/src/modules/staff/lib/timesheets-tasks/taskHierarchy.ts +99 -0
  767. package/src/modules/staff/lib/timesheets-tasks/taskHoursTotals.ts +42 -0
  768. package/src/modules/staff/lib/timesheets-tasks/taskReference.ts +108 -0
  769. package/src/modules/staff/lib/timesheets-ui/CreateProjectDialog.tsx +18 -4
  770. package/src/modules/staff/lib/timesheets-ui/ListView.tsx +504 -149
  771. package/src/modules/staff/lib/timesheets-ui/TimerBar.tsx +50 -2
  772. package/src/modules/staff/migrations/.snapshot-open-mercato.json +3244 -228
  773. package/src/modules/staff/migrations/Migration20260813073131_staff.ts +94 -0
  774. package/src/modules/staff/migrations/Migration20260824143357_staff.ts +17 -0
  775. package/src/modules/staff/notifications.client.ts +16 -0
  776. package/src/modules/staff/notifications.handlers.ts +88 -0
  777. package/src/modules/staff/notifications.ts +163 -0
  778. package/src/modules/staff/search.ts +191 -1
  779. package/src/modules/staff/setup.ts +22 -0
  780. package/src/modules/staff/subscribers/time-project-access-requested-notification.ts +95 -0
  781. package/src/modules/staff/subscribers/time-project-budget-threshold-notification.ts +226 -0
  782. package/src/modules/staff/subscribers/time-report-approved-notification.ts +116 -0
  783. package/src/modules/staff/subscribers/time-report-portal-broadcast.ts +120 -0
  784. package/src/modules/staff/translations.ts +17 -0
  785. package/src/modules/staff/widgets/components.ts +34 -0
  786. package/src/modules/staff/widgets/injection/timer-sidebar-indicator/widget.tsx +6 -5
  787. package/src/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.tsx +138 -0
  788. package/src/modules/staff/widgets/notifications/index.ts +1 -0
  789. package/src/modules/staff/workers/timesheets-reapply-rounding.ts +59 -0
  790. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js +0 -123
  791. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js.map +0 -7
  792. package/src/modules/staff/backend/staff/timesheets/projects/projectFormConfig.ts +0 -138
@@ -0,0 +1,79 @@
1
+ import { extensionPoints } from "@open-mercato/core/modules/staff/extension-points";
2
+ import { createStrategyRegistry, BUILT_IN_STRATEGY_PRIORITY } from "../time-tracking/registries/registry.js";
3
+ const BUILT_IN_REPORT_GROUPING_IDS = ["project_task", "project_person", "project_day"];
4
+ const REPORT_GROUPING_REGISTRY_ID = extensionPoints.hosts.reportGroupingRegistry.spotId;
5
+ const registry = createStrategyRegistry(REPORT_GROUPING_REGISTRY_ID);
6
+ function registerReportGrouping(grouping) {
7
+ return registry.register(grouping);
8
+ }
9
+ function listReportGroupings() {
10
+ return registry.list();
11
+ }
12
+ function getReportGrouping(id) {
13
+ return registry.get(id);
14
+ }
15
+ function hasReportGrouping(id) {
16
+ return registry.has(id);
17
+ }
18
+ function isBuiltInReportGrouping(id) {
19
+ return registry.isBuiltIn(id);
20
+ }
21
+ function reportGroupingIds() {
22
+ const builtIn = BUILT_IN_REPORT_GROUPING_IDS.filter((id) => registry.has(id));
23
+ const contributed = registry.ids().filter((id) => !builtIn.includes(id));
24
+ return [...builtIn, ...contributed];
25
+ }
26
+ const DEFAULT_REPORT_GROUPING = "project_task";
27
+ function normalizeReportGrouping(value) {
28
+ if (typeof value === "string" && registry.has(value)) return value;
29
+ return DEFAULT_REPORT_GROUPING;
30
+ }
31
+ const UNASSIGNED_LINE_KEY = "__unassigned__";
32
+ function sortByMinutesThenLabel(left, right) {
33
+ return right.minutes - left.minutes || left.label.localeCompare(right.label);
34
+ }
35
+ function taskLineKey(entry) {
36
+ const rootId = entry.rootTaskId ?? entry.taskId ?? null;
37
+ const taskId = entry.taskId ?? null;
38
+ if (!rootId) return { key: UNASSIGNED_LINE_KEY, parentKey: null };
39
+ if (taskId && taskId !== rootId) return { key: taskId, parentKey: rootId };
40
+ return { key: rootId, parentKey: null };
41
+ }
42
+ function registerBuiltInReportGrouping(grouping) {
43
+ return registry.registerBuiltIn({ ...grouping, priority: BUILT_IN_STRATEGY_PRIORITY });
44
+ }
45
+ registerBuiltInReportGrouping({
46
+ id: "project_task",
47
+ labelKey: "staff.time_tracking.reports.grouping.project_task",
48
+ groupOf: taskLineKey,
49
+ labelOf: (key, ctx) => key === UNASSIGNED_LINE_KEY ? ctx.fallbacks.unassignedTask : ctx.directory.taskLabelById[key] ?? ctx.fallbacks.unassignedTask,
50
+ sort: sortByMinutesThenLabel
51
+ });
52
+ registerBuiltInReportGrouping({
53
+ id: "project_person",
54
+ labelKey: "staff.time_tracking.reports.grouping.project_person",
55
+ groupOf: (entry) => ({ key: entry.staffMemberId ?? UNASSIGNED_LINE_KEY, parentKey: null }),
56
+ labelOf: (key, ctx) => key === UNASSIGNED_LINE_KEY ? ctx.fallbacks.unassignedPerson : ctx.directory.personLabelById[key] ?? ctx.fallbacks.unassignedPerson,
57
+ sort: sortByMinutesThenLabel
58
+ });
59
+ registerBuiltInReportGrouping({
60
+ id: "project_day",
61
+ labelKey: "staff.time_tracking.reports.grouping.project_day",
62
+ groupOf: (entry) => ({ key: entry.date || UNASSIGNED_LINE_KEY, parentKey: null }),
63
+ labelOf: (key, ctx) => key === UNASSIGNED_LINE_KEY ? ctx.fallbacks.unassignedTask : key,
64
+ sort: sortByMinutesThenLabel
65
+ });
66
+ export {
67
+ BUILT_IN_REPORT_GROUPING_IDS,
68
+ DEFAULT_REPORT_GROUPING,
69
+ REPORT_GROUPING_REGISTRY_ID,
70
+ UNASSIGNED_LINE_KEY,
71
+ getReportGrouping,
72
+ hasReportGrouping,
73
+ isBuiltInReportGrouping,
74
+ listReportGroupings,
75
+ normalizeReportGrouping,
76
+ registerReportGrouping,
77
+ reportGroupingIds
78
+ };
79
+ //# sourceMappingURL=reportGroupings.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/timesheets-reports/reportGroupings.ts"],
4
+ "sourcesContent": ["/**\n * EP-36 \u2014 the report grouping strategy registry.\n *\n * A grouping decides two things and nothing else: which line an entry lands on\n * (`groupOf`, which may name a parent line so D-2's inclusive task rollup keeps\n * working) and how the finished lines are ordered (`sort`). Labelling is a third\n * concern the strategy owns because only it knows which directory to look the\n * key up in.\n *\n * The three built-ins reproduce `reportTotals.ts`'s original `lineKeyFor` /\n * `labelFor` / line sort exactly. The registry lives in its own file so\n * `reportTotals.ts` can register into it at module load without an import cycle.\n */\n\nimport { extensionPoints } from '@open-mercato/core/modules/staff/extension-points'\nimport { createStrategyRegistry, BUILT_IN_STRATEGY_PRIORITY } from '../time-tracking/registries/registry'\nimport type { ReportDirectory, ReportInputEntry, ReportLine } from './reportTotals'\n\nexport const BUILT_IN_REPORT_GROUPING_IDS = ['project_task', 'project_person', 'project_day'] as const\n\nexport type BuiltInReportGrouping = (typeof BUILT_IN_REPORT_GROUPING_IDS)[number]\n\n/**\n * Widened from the original three-way union so a contributed grouping id is\n * assignable. The union arm keeps the built-ins as completions.\n */\nexport type ReportGrouping = BuiltInReportGrouping | (string & {})\n\nexport type ReportGroupingFallbackLabels = {\n unassignedTask: string\n unassignedPerson: string\n nonbillableGroup: string\n}\n\nexport type ReportGroupingLabelContext = {\n directory: ReportDirectory\n fallbacks: ReportGroupingFallbackLabels\n}\n\nexport type ReportGroupingKey = {\n key: string\n parentKey: string | null\n}\n\nexport type ReportGroupingStrategy = {\n id: string\n labelKey: string\n priority?: number\n groupOf(entry: ReportInputEntry): ReportGroupingKey\n labelOf(key: string, ctx: ReportGroupingLabelContext): string\n sort(left: ReportLine, right: ReportLine): number\n}\n\nexport const REPORT_GROUPING_REGISTRY_ID = extensionPoints.hosts.reportGroupingRegistry.spotId\n\nconst registry = createStrategyRegistry<ReportGroupingStrategy>(REPORT_GROUPING_REGISTRY_ID)\n\nexport function registerReportGrouping(grouping: ReportGroupingStrategy): () => void {\n return registry.register(grouping)\n}\n\nexport function listReportGroupings(): ReportGroupingStrategy[] {\n return registry.list()\n}\n\nexport function getReportGrouping(id: string | null | undefined): ReportGroupingStrategy | null {\n return registry.get(id)\n}\n\nexport function hasReportGrouping(id: string | null | undefined): boolean {\n return registry.has(id)\n}\n\n/** Identity, not membership of `BUILT_IN_REPORT_GROUPING_IDS` \u2014 a contribution cannot claim one. */\nexport function isBuiltInReportGrouping(id: string | null | undefined): boolean {\n return registry.isBuiltIn(id)\n}\n\n/** Built-ins first, in the order the module shipped them, then contributions. */\nexport function reportGroupingIds(): string[] {\n const builtIn = BUILT_IN_REPORT_GROUPING_IDS.filter((id) => registry.has(id))\n const contributed = registry.ids().filter((id) => !builtIn.includes(id as BuiltInReportGrouping))\n return [...builtIn, ...contributed]\n}\n\nexport const DEFAULT_REPORT_GROUPING: BuiltInReportGrouping = 'project_task'\n\n/**\n * The grouping a report was stored with, coerced back to something the registry\n * can serve. An id whose contributing module has since been removed falls back\n * to the module default rather than producing an ungrouped sheet.\n */\nexport function normalizeReportGrouping(value: unknown): ReportGrouping {\n if (typeof value === 'string' && registry.has(value)) return value\n return DEFAULT_REPORT_GROUPING\n}\n\n/**\n * The line key an entry with nothing to group by lands on. It is part of the\n * grouping contract rather than a `reportTotals` private, because a contributed\n * grouping has to be able to produce the same \"unassigned\" bucket.\n */\nexport const UNASSIGNED_LINE_KEY = '__unassigned__'\n\n/** The line ordering every built-in grouping shares: longest first, then by label. */\nfunction sortByMinutesThenLabel(left: ReportLine, right: ReportLine): number {\n return right.minutes - left.minutes || left.label.localeCompare(right.label)\n}\n\nfunction taskLineKey(entry: ReportInputEntry): ReportGroupingKey {\n const rootId = entry.rootTaskId ?? entry.taskId ?? null\n const taskId = entry.taskId ?? null\n if (!rootId) return { key: UNASSIGNED_LINE_KEY, parentKey: null }\n // D-2: a child's time lands on the parent's line and is expandable underneath.\n if (taskId && taskId !== rootId) return { key: taskId, parentKey: rootId }\n return { key: rootId, parentKey: null }\n}\n\nfunction registerBuiltInReportGrouping(\n grouping: Omit<ReportGroupingStrategy, 'priority'>,\n): ReportGroupingStrategy {\n return registry.registerBuiltIn({ ...grouping, priority: BUILT_IN_STRATEGY_PRIORITY })\n}\n\nregisterBuiltInReportGrouping({\n id: 'project_task',\n labelKey: 'staff.time_tracking.reports.grouping.project_task',\n groupOf: taskLineKey,\n labelOf: (key, ctx) =>\n key === UNASSIGNED_LINE_KEY\n ? ctx.fallbacks.unassignedTask\n : ctx.directory.taskLabelById[key] ?? ctx.fallbacks.unassignedTask,\n sort: sortByMinutesThenLabel,\n})\n\nregisterBuiltInReportGrouping({\n id: 'project_person',\n labelKey: 'staff.time_tracking.reports.grouping.project_person',\n groupOf: (entry) => ({ key: entry.staffMemberId ?? UNASSIGNED_LINE_KEY, parentKey: null }),\n labelOf: (key, ctx) =>\n key === UNASSIGNED_LINE_KEY\n ? ctx.fallbacks.unassignedPerson\n : ctx.directory.personLabelById[key] ?? ctx.fallbacks.unassignedPerson,\n sort: sortByMinutesThenLabel,\n})\n\nregisterBuiltInReportGrouping({\n id: 'project_day',\n labelKey: 'staff.time_tracking.reports.grouping.project_day',\n groupOf: (entry) => ({ key: entry.date || UNASSIGNED_LINE_KEY, parentKey: null }),\n labelOf: (key, ctx) => (key === UNASSIGNED_LINE_KEY ? ctx.fallbacks.unassignedTask : key),\n sort: sortByMinutesThenLabel,\n})\n"],
5
+ "mappings": "AAcA,SAAS,uBAAuB;AAChC,SAAS,wBAAwB,kCAAkC;AAG5D,MAAM,+BAA+B,CAAC,gBAAgB,kBAAkB,aAAa;AAmCrF,MAAM,8BAA8B,gBAAgB,MAAM,uBAAuB;AAExF,MAAM,WAAW,uBAA+C,2BAA2B;AAEpF,SAAS,uBAAuB,UAA8C;AACnF,SAAO,SAAS,SAAS,QAAQ;AACnC;AAEO,SAAS,sBAAgD;AAC9D,SAAO,SAAS,KAAK;AACvB;AAEO,SAAS,kBAAkB,IAA8D;AAC9F,SAAO,SAAS,IAAI,EAAE;AACxB;AAEO,SAAS,kBAAkB,IAAwC;AACxE,SAAO,SAAS,IAAI,EAAE;AACxB;AAGO,SAAS,wBAAwB,IAAwC;AAC9E,SAAO,SAAS,UAAU,EAAE;AAC9B;AAGO,SAAS,oBAA8B;AAC5C,QAAM,UAAU,6BAA6B,OAAO,CAAC,OAAO,SAAS,IAAI,EAAE,CAAC;AAC5E,QAAM,cAAc,SAAS,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,SAAS,EAA2B,CAAC;AAChG,SAAO,CAAC,GAAG,SAAS,GAAG,WAAW;AACpC;AAEO,MAAM,0BAAiD;AAOvD,SAAS,wBAAwB,OAAgC;AACtE,MAAI,OAAO,UAAU,YAAY,SAAS,IAAI,KAAK,EAAG,QAAO;AAC7D,SAAO;AACT;AAOO,MAAM,sBAAsB;AAGnC,SAAS,uBAAuB,MAAkB,OAA2B;AAC3E,SAAO,MAAM,UAAU,KAAK,WAAW,KAAK,MAAM,cAAc,MAAM,KAAK;AAC7E;AAEA,SAAS,YAAY,OAA4C;AAC/D,QAAM,SAAS,MAAM,cAAc,MAAM,UAAU;AACnD,QAAM,SAAS,MAAM,UAAU;AAC/B,MAAI,CAAC,OAAQ,QAAO,EAAE,KAAK,qBAAqB,WAAW,KAAK;AAEhE,MAAI,UAAU,WAAW,OAAQ,QAAO,EAAE,KAAK,QAAQ,WAAW,OAAO;AACzE,SAAO,EAAE,KAAK,QAAQ,WAAW,KAAK;AACxC;AAEA,SAAS,8BACP,UACwB;AACxB,SAAO,SAAS,gBAAgB,EAAE,GAAG,UAAU,UAAU,2BAA2B,CAAC;AACvF;AAEA,8BAA8B;AAAA,EAC5B,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS;AAAA,EACT,SAAS,CAAC,KAAK,QACb,QAAQ,sBACJ,IAAI,UAAU,iBACd,IAAI,UAAU,cAAc,GAAG,KAAK,IAAI,UAAU;AAAA,EACxD,MAAM;AACR,CAAC;AAED,8BAA8B;AAAA,EAC5B,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS,CAAC,WAAW,EAAE,KAAK,MAAM,iBAAiB,qBAAqB,WAAW,KAAK;AAAA,EACxF,SAAS,CAAC,KAAK,QACb,QAAQ,sBACJ,IAAI,UAAU,mBACd,IAAI,UAAU,gBAAgB,GAAG,KAAK,IAAI,UAAU;AAAA,EAC1D,MAAM;AACR,CAAC;AAED,8BAA8B;AAAA,EAC5B,IAAI;AAAA,EACJ,UAAU;AAAA,EACV,SAAS,CAAC,WAAW,EAAE,KAAK,MAAM,QAAQ,qBAAqB,WAAW,KAAK;AAAA,EAC/E,SAAS,CAAC,KAAK,QAAS,QAAQ,sBAAsB,IAAI,UAAU,iBAAiB;AAAA,EACrF,MAAM;AACR,CAAC;",
6
+ "names": []
7
+ }
@@ -0,0 +1,11 @@
1
+ function reportSheetLabels(translate) {
2
+ return {
3
+ unassignedTask: translate("staff.time_tracking.reports.sheet.noTask", "No task"),
4
+ unassignedPerson: translate("staff.time_tracking.reports.sheet.noPerson", "Unassigned"),
5
+ nonbillableGroup: translate("staff.time_tracking.reports.sheet.nonbillable", "Non-billable time")
6
+ };
7
+ }
8
+ export {
9
+ reportSheetLabels
10
+ };
11
+ //# sourceMappingURL=reportLabels.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/timesheets-reports/reportLabels.ts"],
4
+ "sourcesContent": ["/**\n * The three fallback labels a report sheet needs when a line has nothing to name\n * itself with. They live here rather than in a route because the close command,\n * the preview, the sheet and the exports must all use the same ones \u2014 a freeze\n * record labelled \"No task\" and a PDF labelled \"Unassigned\" would be the same\n * line reading differently in two places a client can compare.\n */\n\nexport type ReportLabelTranslate = (key: string, fallback: string) => string\n\nexport type ReportSheetLabels = {\n unassignedTask: string\n unassignedPerson: string\n nonbillableGroup: string\n}\n\nexport function reportSheetLabels(translate: ReportLabelTranslate): ReportSheetLabels {\n return {\n unassignedTask: translate('staff.time_tracking.reports.sheet.noTask', 'No task'),\n unassignedPerson: translate('staff.time_tracking.reports.sheet.noPerson', 'Unassigned'),\n nonbillableGroup: translate('staff.time_tracking.reports.sheet.nonbillable', 'Non-billable time'),\n }\n}\n"],
5
+ "mappings": "AAgBO,SAAS,kBAAkB,WAAoD;AACpF,SAAO;AAAA,IACL,gBAAgB,UAAU,4CAA4C,SAAS;AAAA,IAC/E,kBAAkB,UAAU,8CAA8C,YAAY;AAAA,IACtF,kBAAkB,UAAU,iDAAiD,mBAAmB;AAAA,EAClG;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,83 @@
1
+ import { isUniqueViolation } from "@open-mercato/shared/lib/crud/errors";
2
+ const REPORT_REFERENCE_PREFIX = "RAP";
3
+ const FIRST_REPORT_SEQUENCE_NUMBER = 1;
4
+ const REPORT_SEQUENCE_PAD = 4;
5
+ const REPORT_REFERENCE_MAX_ATTEMPTS = 5;
6
+ function reportReferenceYear(issuedAt) {
7
+ if (!(issuedAt instanceof Date) || Number.isNaN(issuedAt.getTime())) {
8
+ return (/* @__PURE__ */ new Date()).getFullYear();
9
+ }
10
+ return issuedAt.getFullYear();
11
+ }
12
+ function reportReferencePrefix(year) {
13
+ return `${REPORT_REFERENCE_PREFIX}-${year}-`;
14
+ }
15
+ function formatReportReference(year, sequenceNumber) {
16
+ const padded = String(Math.max(FIRST_REPORT_SEQUENCE_NUMBER, sequenceNumber)).padStart(
17
+ REPORT_SEQUENCE_PAD,
18
+ "0"
19
+ );
20
+ return `${reportReferencePrefix(year)}${padded}`;
21
+ }
22
+ function parseReportSequenceNumber(reference, year) {
23
+ if (typeof reference !== "string") return null;
24
+ const prefix = reportReferencePrefix(year);
25
+ if (!reference.startsWith(prefix)) return null;
26
+ const tail = reference.slice(prefix.length);
27
+ if (!/^\d+$/.test(tail)) return null;
28
+ const parsed = Number.parseInt(tail, 10);
29
+ if (!Number.isFinite(parsed) || parsed < FIRST_REPORT_SEQUENCE_NUMBER) return null;
30
+ return parsed;
31
+ }
32
+ function highestReportSequenceNumber(references, year) {
33
+ let highest = 0;
34
+ for (const reference of references) {
35
+ const parsed = parseReportSequenceNumber(reference, year);
36
+ if (parsed !== null && parsed > highest) highest = parsed;
37
+ }
38
+ return highest;
39
+ }
40
+ function nextReportSequenceNumber(highestSequenceNumber) {
41
+ if (typeof highestSequenceNumber !== "number" || !Number.isFinite(highestSequenceNumber)) {
42
+ return FIRST_REPORT_SEQUENCE_NUMBER;
43
+ }
44
+ const next = Math.floor(highestSequenceNumber) + 1;
45
+ return next < FIRST_REPORT_SEQUENCE_NUMBER ? FIRST_REPORT_SEQUENCE_NUMBER : next;
46
+ }
47
+ function allocateReportReference(year, highestSequenceNumber) {
48
+ const sequenceNumber = nextReportSequenceNumber(highestSequenceNumber);
49
+ return { sequenceNumber, reference: formatReportReference(year, sequenceNumber) };
50
+ }
51
+ function isReportReferenceConflict(err) {
52
+ return isUniqueViolation(err);
53
+ }
54
+ async function withReportReferenceRetry(runAttempt, options = {}) {
55
+ const maxAttempts = Math.max(1, options.maxAttempts ?? REPORT_REFERENCE_MAX_ATTEMPTS);
56
+ const isConflict = options.isConflict ?? isReportReferenceConflict;
57
+ let lastError = null;
58
+ for (let attempt = 0; attempt < maxAttempts; attempt += 1) {
59
+ try {
60
+ return await runAttempt(attempt);
61
+ } catch (err) {
62
+ if (!isConflict(err)) throw err;
63
+ lastError = err;
64
+ }
65
+ }
66
+ throw lastError;
67
+ }
68
+ export {
69
+ FIRST_REPORT_SEQUENCE_NUMBER,
70
+ REPORT_REFERENCE_MAX_ATTEMPTS,
71
+ REPORT_REFERENCE_PREFIX,
72
+ REPORT_SEQUENCE_PAD,
73
+ allocateReportReference,
74
+ formatReportReference,
75
+ highestReportSequenceNumber,
76
+ isReportReferenceConflict,
77
+ nextReportSequenceNumber,
78
+ parseReportSequenceNumber,
79
+ reportReferencePrefix,
80
+ reportReferenceYear,
81
+ withReportReferenceRetry
82
+ };
83
+ //# sourceMappingURL=reportReference.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/timesheets-reports/reportReference.ts"],
4
+ "sourcesContent": ["/**\n * Report numbering \u2014 the `RAP-2026-0042` printed on the sheet header of screen 14.\n *\n * The number is a billing document identifier: it is quoted on a PDF a client\n * keeps, so it is allocated once, frozen, and **never reused**. Two consequences\n * follow and are both enforced here:\n *\n * 1. **The highest number ever handed out wins, deleted reports included.** The\n * unique index only covers live rows, so a soft-deleted `RAP-2026-0042` would\n * otherwise let the next report take that number \u2014 and the client holding the\n * first PDF would find a different report behind it.\n * 2. **Allocation races are settled by the database, not by a pre-read.** Reading\n * `MAX(sequence)` up front only narrows the window; two people generating a\n * report at the same moment would still both compute `0042`. The partial\n * unique index on `(organization_id, tenant_id, reference) WHERE deleted_at IS\n * NULL` makes the loser's insert fail, and the loser retries the whole\n * transaction against a max that now includes the winner's row. This is the\n * same shape `lib/timesheets-tasks/taskReference.ts` uses for `TT-142`.\n *\n * The year in the reference is the year the report is **issued**, not the year its\n * period covers: a report generated in January for December's work is a January\n * document, and its sequence belongs to the new year's run. The sheet prints the\n * issue date beside the reference, so the two always agree.\n */\n\nimport { isUniqueViolation } from '@open-mercato/shared/lib/crud/errors'\n\nexport const REPORT_REFERENCE_PREFIX = 'RAP'\n\nexport const FIRST_REPORT_SEQUENCE_NUMBER = 1\n\n/** Width of the zero-padded run, matching the mockup's `RAP-2026-0042`. */\nexport const REPORT_SEQUENCE_PAD = 4\n\n/**\n * Attempts before the conflict is surfaced. Each retry costs one aborted\n * transaction; an organization would need this many simultaneous generations\n * landing on the same number for the last one to give up.\n */\nexport const REPORT_REFERENCE_MAX_ATTEMPTS = 5\n\nexport type ReportReferenceAllocation = {\n sequenceNumber: number\n reference: string\n}\n\nexport function reportReferenceYear(issuedAt: Date | null | undefined): number {\n if (!(issuedAt instanceof Date) || Number.isNaN(issuedAt.getTime())) {\n return new Date().getFullYear()\n }\n return issuedAt.getFullYear()\n}\n\nexport function reportReferencePrefix(year: number): string {\n return `${REPORT_REFERENCE_PREFIX}-${year}-`\n}\n\nexport function formatReportReference(year: number, sequenceNumber: number): string {\n const padded = String(Math.max(FIRST_REPORT_SEQUENCE_NUMBER, sequenceNumber)).padStart(\n REPORT_SEQUENCE_PAD,\n '0',\n )\n return `${reportReferencePrefix(year)}${padded}`\n}\n\n/**\n * Reads the run number back out of a stored reference. Returns `null` for\n * anything that is not this year's series, so a hand-edited or legacy reference\n * can never inflate the next allocation.\n */\nexport function parseReportSequenceNumber(reference: unknown, year: number): number | null {\n if (typeof reference !== 'string') return null\n const prefix = reportReferencePrefix(year)\n if (!reference.startsWith(prefix)) return null\n const tail = reference.slice(prefix.length)\n if (!/^\\d+$/.test(tail)) return null\n const parsed = Number.parseInt(tail, 10)\n if (!Number.isFinite(parsed) || parsed < FIRST_REPORT_SEQUENCE_NUMBER) return null\n return parsed\n}\n\nexport function highestReportSequenceNumber(references: readonly unknown[], year: number): number {\n let highest = 0\n for (const reference of references) {\n const parsed = parseReportSequenceNumber(reference, year)\n if (parsed !== null && parsed > highest) highest = parsed\n }\n return highest\n}\n\nexport function nextReportSequenceNumber(highestSequenceNumber: number | null | undefined): number {\n if (typeof highestSequenceNumber !== 'number' || !Number.isFinite(highestSequenceNumber)) {\n return FIRST_REPORT_SEQUENCE_NUMBER\n }\n const next = Math.floor(highestSequenceNumber) + 1\n return next < FIRST_REPORT_SEQUENCE_NUMBER ? FIRST_REPORT_SEQUENCE_NUMBER : next\n}\n\n/**\n * The candidate one attempt writes. A plain function of what that attempt read\n * inside its own transaction, so nothing is carried between attempts.\n */\nexport function allocateReportReference(\n year: number,\n highestSequenceNumber: number | null | undefined,\n): ReportReferenceAllocation {\n const sequenceNumber = nextReportSequenceNumber(highestSequenceNumber)\n return { sequenceNumber, reference: formatReportReference(year, sequenceNumber) }\n}\n\nexport function isReportReferenceConflict(err: unknown): boolean {\n return isUniqueViolation(err)\n}\n\nexport type ReportReferenceRetryOptions = {\n maxAttempts?: number\n isConflict?: (err: unknown) => boolean\n}\n\n/**\n * Runs the create attempt until it wins the number or the budget runs out.\n *\n * `runAttempt` MUST re-read the organization's highest reference inside its own\n * transaction \u2014 that is the whole point of retrying rather than pre-reading. A\n * non-conflict error is rethrown immediately: only a lost race is worth\n * repeating.\n */\nexport async function withReportReferenceRetry<T>(\n runAttempt: (attempt: number) => Promise<T>,\n options: ReportReferenceRetryOptions = {},\n): Promise<T> {\n const maxAttempts = Math.max(1, options.maxAttempts ?? REPORT_REFERENCE_MAX_ATTEMPTS)\n const isConflict = options.isConflict ?? isReportReferenceConflict\n let lastError: unknown = null\n\n for (let attempt = 0; attempt < maxAttempts; attempt += 1) {\n try {\n return await runAttempt(attempt)\n } catch (err) {\n if (!isConflict(err)) throw err\n lastError = err\n }\n }\n\n throw lastError\n}\n"],
5
+ "mappings": "AAyBA,SAAS,yBAAyB;AAE3B,MAAM,0BAA0B;AAEhC,MAAM,+BAA+B;AAGrC,MAAM,sBAAsB;AAO5B,MAAM,gCAAgC;AAOtC,SAAS,oBAAoB,UAA2C;AAC7E,MAAI,EAAE,oBAAoB,SAAS,OAAO,MAAM,SAAS,QAAQ,CAAC,GAAG;AACnE,YAAO,oBAAI,KAAK,GAAE,YAAY;AAAA,EAChC;AACA,SAAO,SAAS,YAAY;AAC9B;AAEO,SAAS,sBAAsB,MAAsB;AAC1D,SAAO,GAAG,uBAAuB,IAAI,IAAI;AAC3C;AAEO,SAAS,sBAAsB,MAAc,gBAAgC;AAClF,QAAM,SAAS,OAAO,KAAK,IAAI,8BAA8B,cAAc,CAAC,EAAE;AAAA,IAC5E;AAAA,IACA;AAAA,EACF;AACA,SAAO,GAAG,sBAAsB,IAAI,CAAC,GAAG,MAAM;AAChD;AAOO,SAAS,0BAA0B,WAAoB,MAA6B;AACzF,MAAI,OAAO,cAAc,SAAU,QAAO;AAC1C,QAAM,SAAS,sBAAsB,IAAI;AACzC,MAAI,CAAC,UAAU,WAAW,MAAM,EAAG,QAAO;AAC1C,QAAM,OAAO,UAAU,MAAM,OAAO,MAAM;AAC1C,MAAI,CAAC,QAAQ,KAAK,IAAI,EAAG,QAAO;AAChC,QAAM,SAAS,OAAO,SAAS,MAAM,EAAE;AACvC,MAAI,CAAC,OAAO,SAAS,MAAM,KAAK,SAAS,6BAA8B,QAAO;AAC9E,SAAO;AACT;AAEO,SAAS,4BAA4B,YAAgC,MAAsB;AAChG,MAAI,UAAU;AACd,aAAW,aAAa,YAAY;AAClC,UAAM,SAAS,0BAA0B,WAAW,IAAI;AACxD,QAAI,WAAW,QAAQ,SAAS,QAAS,WAAU;AAAA,EACrD;AACA,SAAO;AACT;AAEO,SAAS,yBAAyB,uBAA0D;AACjG,MAAI,OAAO,0BAA0B,YAAY,CAAC,OAAO,SAAS,qBAAqB,GAAG;AACxF,WAAO;AAAA,EACT;AACA,QAAM,OAAO,KAAK,MAAM,qBAAqB,IAAI;AACjD,SAAO,OAAO,+BAA+B,+BAA+B;AAC9E;AAMO,SAAS,wBACd,MACA,uBAC2B;AAC3B,QAAM,iBAAiB,yBAAyB,qBAAqB;AACrE,SAAO,EAAE,gBAAgB,WAAW,sBAAsB,MAAM,cAAc,EAAE;AAClF;AAEO,SAAS,0BAA0B,KAAuB;AAC/D,SAAO,kBAAkB,GAAG;AAC9B;AAeA,eAAsB,yBACpB,YACA,UAAuC,CAAC,GAC5B;AACZ,QAAM,cAAc,KAAK,IAAI,GAAG,QAAQ,eAAe,6BAA6B;AACpF,QAAM,aAAa,QAAQ,cAAc;AACzC,MAAI,YAAqB;AAEzB,WAAS,UAAU,GAAG,UAAU,aAAa,WAAW,GAAG;AACzD,QAAI;AACF,aAAO,MAAM,WAAW,OAAO;AAAA,IACjC,SAAS,KAAK;AACZ,UAAI,CAAC,WAAW,GAAG,EAAG,OAAM;AAC5B,kBAAY;AAAA,IACd;AAAA,EACF;AAEA,QAAM;AACR;",
6
+ "names": []
7
+ }
@@ -0,0 +1,42 @@
1
+ import { formatReportMinutes, resolveEntryValues, sumAmounts } from "./reportTotals.js";
2
+ function buildReportRows(input) {
3
+ const projectById = new Map(input.projects.map((project) => [project.id, project]));
4
+ const rows = input.entries.map((entry) => {
5
+ const project = projectById.get(entry.timeProjectId) ?? null;
6
+ const values = resolveEntryValues(entry, project);
7
+ const taskId = entry.taskId ?? null;
8
+ return {
9
+ entryId: entry.id,
10
+ date: entry.date,
11
+ projectId: entry.timeProjectId,
12
+ projectName: project?.name ?? entry.timeProjectId,
13
+ taskLabel: (taskId ? input.directory.taskLabelById[taskId] : null) ?? input.labels.unassignedTask,
14
+ personLabel: (entry.staffMemberId ? input.directory.personLabelById[entry.staffMemberId] : null) ?? input.labels.unassignedPerson,
15
+ description: entry.description ?? "",
16
+ rawMinutes: values.rawMinutes,
17
+ minutes: values.minutes,
18
+ hours: formatReportMinutes(values.minutes),
19
+ isBillable: values.isBillable,
20
+ rate: values.rate,
21
+ amount: values.amount,
22
+ hasOverride: values.hasOverride,
23
+ isFrozen: values.isFrozen
24
+ };
25
+ });
26
+ rows.sort(
27
+ (left, right) => left.date.localeCompare(right.date) || left.projectName.localeCompare(right.projectName) || left.taskLabel.localeCompare(right.taskLabel)
28
+ );
29
+ return rows;
30
+ }
31
+ function sumReportRowAmounts(rows) {
32
+ return sumAmounts(rows.map((row) => row.amount));
33
+ }
34
+ function sumReportRowMinutes(rows, billable) {
35
+ return rows.reduce((total, row) => row.isBillable === billable ? total + row.minutes : total, 0);
36
+ }
37
+ export {
38
+ buildReportRows,
39
+ sumReportRowAmounts,
40
+ sumReportRowMinutes
41
+ };
42
+ //# sourceMappingURL=reportRows.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/timesheets-reports/reportRows.ts"],
4
+ "sourcesContent": ["/**\n * The raw, one-line-per-entry view of a report.\n *\n * Screen 14 note 3: the PDF mirrors the grouped sheet, while CSV and XLSX add\n * the raw columns accounting actually needs \u2014 date, person, description \u2014 which\n * the grouped sheet deliberately does not print for a client. Screen 15's\n * \"locked entries\" table reads the same rows.\n *\n * Amounts come from `resolveEntryValues`, the same function the grouped sheet\n * and the freeze records use, so an accountant reconciling the CSV against the\n * PDF total never finds a discrepancy.\n */\n\nimport { formatReportMinutes, resolveEntryValues, sumAmounts } from './reportTotals'\nimport type { ReportDirectory, ReportInputEntry, ReportInputProject } from './reportTotals'\n\nexport type ReportRow = {\n entryId: string\n date: string\n projectId: string\n projectName: string\n taskLabel: string\n personLabel: string\n description: string\n rawMinutes: number\n minutes: number\n hours: string\n isBillable: boolean\n rate: number | null\n amount: number | null\n hasOverride: boolean\n isFrozen: boolean\n}\n\nexport type BuildReportRowsInput = {\n entries: readonly ReportInputEntry[]\n projects: readonly ReportInputProject[]\n directory: ReportDirectory\n labels: { unassignedTask: string; unassignedPerson: string }\n}\n\nexport function buildReportRows(input: BuildReportRowsInput): ReportRow[] {\n const projectById = new Map(input.projects.map((project) => [project.id, project]))\n const rows = input.entries.map((entry) => {\n const project = projectById.get(entry.timeProjectId) ?? null\n const values = resolveEntryValues(entry, project)\n const taskId = entry.taskId ?? null\n return {\n entryId: entry.id,\n date: entry.date,\n projectId: entry.timeProjectId,\n projectName: project?.name ?? entry.timeProjectId,\n taskLabel: (taskId ? input.directory.taskLabelById[taskId] : null) ?? input.labels.unassignedTask,\n personLabel:\n (entry.staffMemberId ? input.directory.personLabelById[entry.staffMemberId] : null) ??\n input.labels.unassignedPerson,\n description: entry.description ?? '',\n rawMinutes: values.rawMinutes,\n minutes: values.minutes,\n hours: formatReportMinutes(values.minutes),\n isBillable: values.isBillable,\n rate: values.rate,\n amount: values.amount,\n hasOverride: values.hasOverride,\n isFrozen: values.isFrozen,\n } satisfies ReportRow\n })\n\n rows.sort(\n (left, right) =>\n left.date.localeCompare(right.date) ||\n left.projectName.localeCompare(right.projectName) ||\n left.taskLabel.localeCompare(right.taskLabel),\n )\n return rows\n}\n\n/**\n * The rows' amounts add up to the report's grand total by construction \u2014 same\n * per-entry values, summed in integer cents. Exposed so the export and the\n * screen can assert it rather than assume it.\n */\nexport function sumReportRowAmounts(rows: readonly ReportRow[]): number {\n return sumAmounts(rows.map((row) => row.amount))\n}\n\nexport function sumReportRowMinutes(rows: readonly ReportRow[], billable: boolean): number {\n return rows.reduce((total, row) => (row.isBillable === billable ? total + row.minutes : total), 0)\n}\n"],
5
+ "mappings": "AAaA,SAAS,qBAAqB,oBAAoB,kBAAkB;AA4B7D,SAAS,gBAAgB,OAA0C;AACxE,QAAM,cAAc,IAAI,IAAI,MAAM,SAAS,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC,CAAC;AAClF,QAAM,OAAO,MAAM,QAAQ,IAAI,CAAC,UAAU;AACxC,UAAM,UAAU,YAAY,IAAI,MAAM,aAAa,KAAK;AACxD,UAAM,SAAS,mBAAmB,OAAO,OAAO;AAChD,UAAM,SAAS,MAAM,UAAU;AAC/B,WAAO;AAAA,MACL,SAAS,MAAM;AAAA,MACf,MAAM,MAAM;AAAA,MACZ,WAAW,MAAM;AAAA,MACjB,aAAa,SAAS,QAAQ,MAAM;AAAA,MACpC,YAAY,SAAS,MAAM,UAAU,cAAc,MAAM,IAAI,SAAS,MAAM,OAAO;AAAA,MACnF,cACG,MAAM,gBAAgB,MAAM,UAAU,gBAAgB,MAAM,aAAa,IAAI,SAC9E,MAAM,OAAO;AAAA,MACf,aAAa,MAAM,eAAe;AAAA,MAClC,YAAY,OAAO;AAAA,MACnB,SAAS,OAAO;AAAA,MAChB,OAAO,oBAAoB,OAAO,OAAO;AAAA,MACzC,YAAY,OAAO;AAAA,MACnB,MAAM,OAAO;AAAA,MACb,QAAQ,OAAO;AAAA,MACf,aAAa,OAAO;AAAA,MACpB,UAAU,OAAO;AAAA,IACnB;AAAA,EACF,CAAC;AAED,OAAK;AAAA,IACH,CAAC,MAAM,UACL,KAAK,KAAK,cAAc,MAAM,IAAI,KAClC,KAAK,YAAY,cAAc,MAAM,WAAW,KAChD,KAAK,UAAU,cAAc,MAAM,SAAS;AAAA,EAChD;AACA,SAAO;AACT;AAOO,SAAS,oBAAoB,MAAoC;AACtE,SAAO,WAAW,KAAK,IAAI,CAAC,QAAQ,IAAI,MAAM,CAAC;AACjD;AAEO,SAAS,oBAAoB,MAA4B,UAA2B;AACzF,SAAO,KAAK,OAAO,CAAC,OAAO,QAAS,IAAI,eAAe,WAAW,QAAQ,IAAI,UAAU,OAAQ,CAAC;AACnG;",
6
+ "names": []
7
+ }
@@ -0,0 +1,107 @@
1
+ import { parseReportPreview, readNumber } from "./reportConfigData.js";
2
+ function readString(value) {
3
+ return typeof value === "string" && value.trim().length > 0 ? value.trim() : null;
4
+ }
5
+ function readCustomerName(snapshot) {
6
+ if (!snapshot || typeof snapshot !== "object") return null;
7
+ const row = snapshot;
8
+ for (const key of ["name", "displayName", "display_name", "legalName", "legal_name"]) {
9
+ const value = readString(row[key]);
10
+ if (value) return value;
11
+ }
12
+ return null;
13
+ }
14
+ function parseReportSheet(payload) {
15
+ if (!payload || typeof payload !== "object") return null;
16
+ const row = payload;
17
+ const reportRaw = row.report;
18
+ if (!reportRaw || typeof reportRaw !== "object") return null;
19
+ const report = reportRaw;
20
+ const id = readString(report.id);
21
+ if (!id) return null;
22
+ const preview = parseReportPreview({
23
+ currencyCode: report.currencyCode,
24
+ grouping: report.grouping,
25
+ nonbillableMode: report.nonbillableMode,
26
+ includeAlreadyReported: report.includeAlreadyReported,
27
+ showRates: report.showRates,
28
+ projects: [],
29
+ groups: row.groups,
30
+ totals: row.totals,
31
+ alreadyReportedCount: row.alreadyReportedCount,
32
+ alreadyReportedMinutes: row.alreadyReportedMinutes,
33
+ alreadyReportedIn: row.alreadyReportedIn,
34
+ rounding: { unitMinutes: report.roundingUnitMinutes, direction: report.roundingDirection }
35
+ });
36
+ if (!preview) return null;
37
+ return {
38
+ report: {
39
+ id,
40
+ reference: readString(report.reference) ?? "",
41
+ title: readString(report.title) ?? "",
42
+ status: report.status === "closed" ? "closed" : "draft",
43
+ customerId: readString(report.customerId),
44
+ customerName: readCustomerName(report.customerSnapshot),
45
+ periodFrom: readString(report.periodFrom),
46
+ periodTo: readString(report.periodTo),
47
+ currencyCode: preview.currencyCode,
48
+ grouping: preview.grouping,
49
+ nonbillableMode: preview.nonbillableMode,
50
+ includeAlreadyReported: preview.includeAlreadyReported,
51
+ showRates: preview.showRates,
52
+ roundingUnitMinutes: preview.rounding.unitMinutes,
53
+ roundingDirection: preview.rounding.direction,
54
+ closedAt: readString(report.closedAt),
55
+ closedByUserId: readString(report.closedByUserId),
56
+ timeProjectIds: Array.isArray(report.timeProjectIds) ? report.timeProjectIds.filter((value) => typeof value === "string") : []
57
+ },
58
+ groups: preview.groups,
59
+ totals: preview.totals,
60
+ alreadyReportedCount: preview.alreadyReportedCount,
61
+ alreadyReportedMinutes: preview.alreadyReportedMinutes,
62
+ rows: Array.isArray(row.rows) ? row.rows.map((entry) => {
63
+ if (!entry || typeof entry !== "object") return null;
64
+ const source = entry;
65
+ const entryId = readString(source.entryId);
66
+ if (!entryId) return null;
67
+ return {
68
+ entryId,
69
+ date: readString(source.date) ?? "",
70
+ projectName: readString(source.projectName) ?? "",
71
+ taskLabel: readString(source.taskLabel) ?? "",
72
+ personLabel: readString(source.personLabel) ?? "",
73
+ description: readString(source.description) ?? "",
74
+ minutes: readNumber(source.minutes) ?? 0,
75
+ rawMinutes: readNumber(source.rawMinutes) ?? 0,
76
+ hours: readString(source.hours) ?? "",
77
+ isBillable: source.isBillable !== false,
78
+ rate: readNumber(source.rate),
79
+ amount: readNumber(source.amount),
80
+ hasOverride: source.hasOverride === true
81
+ };
82
+ }).filter((entry) => entry !== null) : [],
83
+ rowCount: readNumber(row.rowCount) ?? 0,
84
+ rowsTruncated: row.rowsTruncated === true,
85
+ events: Array.isArray(row.events) ? row.events.map((entry) => {
86
+ if (!entry || typeof entry !== "object") return null;
87
+ const source = entry;
88
+ const eventId = readString(source.id);
89
+ const eventType = source.eventType;
90
+ if (!eventId) return null;
91
+ if (eventType !== "closed" && eventType !== "unlocked" && eventType !== "exported") return null;
92
+ return {
93
+ id: eventId,
94
+ eventType,
95
+ reason: readString(source.reason),
96
+ actorUserId: readString(source.actorUserId),
97
+ metadata: source.metadata && typeof source.metadata === "object" ? source.metadata : null,
98
+ createdAt: readString(source.createdAt)
99
+ };
100
+ }).filter((entry) => entry !== null) : []
101
+ };
102
+ }
103
+ export {
104
+ parseReportSheet,
105
+ readCustomerName
106
+ };
107
+ //# sourceMappingURL=reportSheetData.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/modules/staff/lib/timesheets-reports/reportSheetData.ts"],
4
+ "sourcesContent": ["/**\n * Client-side parsing for `GET .../reports/[id]/sheet`.\n *\n * Defensive for the same reason `reportConfigData` is: these numbers are printed\n * on a document a client can dispute, so a shape surprise must yield a visibly\n * empty sheet rather than a plausible wrong figure.\n */\n\nimport { parseReportPreview, readNumber, type PreviewGroup } from './reportConfigData'\n\nexport type ReportEventType = 'closed' | 'unlocked' | 'exported'\n\nexport type ReportHistoryEvent = {\n id: string\n eventType: ReportEventType\n reason: string | null\n actorUserId: string | null\n metadata: Record<string, unknown> | null\n createdAt: string | null\n}\n\nexport type ReportSheetRow = {\n entryId: string\n date: string\n projectName: string\n taskLabel: string\n personLabel: string\n description: string\n minutes: number\n rawMinutes: number\n hours: string\n isBillable: boolean\n rate: number | null\n amount: number | null\n hasOverride: boolean\n}\n\nexport type ReportSheetHeader = {\n id: string\n reference: string\n title: string\n status: 'draft' | 'closed'\n customerId: string | null\n customerName: string | null\n periodFrom: string | null\n periodTo: string | null\n currencyCode: string | null\n grouping: 'project_task' | 'project_person' | 'project_day'\n nonbillableMode: 'separate' | 'exclude'\n includeAlreadyReported: boolean\n showRates: boolean\n roundingUnitMinutes: number\n roundingDirection: string\n closedAt: string | null\n closedByUserId: string | null\n timeProjectIds: string[]\n}\n\nexport type ReportSheetPayload = {\n report: ReportSheetHeader\n groups: PreviewGroup[]\n totals: {\n entryCount: number\n billableMinutes: number\n nonbillableMinutes: number\n totalAmount: number | null\n }\n alreadyReportedCount: number\n alreadyReportedMinutes: number\n rows: ReportSheetRow[]\n rowCount: number\n rowsTruncated: boolean\n events: ReportHistoryEvent[]\n}\n\nfunction readString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\n/** D-9: the customer name comes from the report's own snapshot, never a join. */\nexport function readCustomerName(snapshot: unknown): string | null {\n if (!snapshot || typeof snapshot !== 'object') return null\n const row = snapshot as Record<string, unknown>\n for (const key of ['name', 'displayName', 'display_name', 'legalName', 'legal_name']) {\n const value = readString(row[key])\n if (value) return value\n }\n return null\n}\n\nexport function parseReportSheet(payload: unknown): ReportSheetPayload | null {\n if (!payload || typeof payload !== 'object') return null\n const row = payload as Record<string, unknown>\n const reportRaw = row.report\n if (!reportRaw || typeof reportRaw !== 'object') return null\n const report = reportRaw as Record<string, unknown>\n const id = readString(report.id)\n if (!id) return null\n\n // The grouped sheet has exactly the preview's shape, so it goes through the\n // same parser \u2014 one place decides what a malformed group means.\n const preview = parseReportPreview({\n currencyCode: report.currencyCode,\n grouping: report.grouping,\n nonbillableMode: report.nonbillableMode,\n includeAlreadyReported: report.includeAlreadyReported,\n showRates: report.showRates,\n projects: [],\n groups: row.groups,\n totals: row.totals,\n alreadyReportedCount: row.alreadyReportedCount,\n alreadyReportedMinutes: row.alreadyReportedMinutes,\n alreadyReportedIn: row.alreadyReportedIn,\n rounding: { unitMinutes: report.roundingUnitMinutes, direction: report.roundingDirection },\n })\n if (!preview) return null\n\n return {\n report: {\n id,\n reference: readString(report.reference) ?? '',\n title: readString(report.title) ?? '',\n status: report.status === 'closed' ? 'closed' : 'draft',\n customerId: readString(report.customerId),\n customerName: readCustomerName(report.customerSnapshot),\n periodFrom: readString(report.periodFrom),\n periodTo: readString(report.periodTo),\n currencyCode: preview.currencyCode,\n grouping: preview.grouping,\n nonbillableMode: preview.nonbillableMode,\n includeAlreadyReported: preview.includeAlreadyReported,\n showRates: preview.showRates,\n roundingUnitMinutes: preview.rounding.unitMinutes,\n roundingDirection: preview.rounding.direction,\n closedAt: readString(report.closedAt),\n closedByUserId: readString(report.closedByUserId),\n timeProjectIds: Array.isArray(report.timeProjectIds)\n ? report.timeProjectIds.filter((value): value is string => typeof value === 'string')\n : [],\n },\n groups: preview.groups,\n totals: preview.totals,\n alreadyReportedCount: preview.alreadyReportedCount,\n alreadyReportedMinutes: preview.alreadyReportedMinutes,\n rows: Array.isArray(row.rows)\n ? row.rows\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const source = entry as Record<string, unknown>\n const entryId = readString(source.entryId)\n if (!entryId) return null\n return {\n entryId,\n date: readString(source.date) ?? '',\n projectName: readString(source.projectName) ?? '',\n taskLabel: readString(source.taskLabel) ?? '',\n personLabel: readString(source.personLabel) ?? '',\n description: readString(source.description) ?? '',\n minutes: readNumber(source.minutes) ?? 0,\n rawMinutes: readNumber(source.rawMinutes) ?? 0,\n hours: readString(source.hours) ?? '',\n isBillable: source.isBillable !== false,\n rate: readNumber(source.rate),\n amount: readNumber(source.amount),\n hasOverride: source.hasOverride === true,\n } satisfies ReportSheetRow\n })\n .filter((entry): entry is ReportSheetRow => entry !== null)\n : [],\n rowCount: readNumber(row.rowCount) ?? 0,\n rowsTruncated: row.rowsTruncated === true,\n events: Array.isArray(row.events)\n ? row.events\n .map((entry) => {\n if (!entry || typeof entry !== 'object') return null\n const source = entry as Record<string, unknown>\n const eventId = readString(source.id)\n const eventType = source.eventType\n if (!eventId) return null\n if (eventType !== 'closed' && eventType !== 'unlocked' && eventType !== 'exported') return null\n return {\n id: eventId,\n eventType,\n reason: readString(source.reason),\n actorUserId: readString(source.actorUserId),\n metadata:\n source.metadata && typeof source.metadata === 'object'\n ? (source.metadata as Record<string, unknown>)\n : null,\n createdAt: readString(source.createdAt),\n } satisfies ReportHistoryEvent\n })\n .filter((entry): entry is ReportHistoryEvent => entry !== null)\n : [],\n }\n}\n"],
5
+ "mappings": "AAQA,SAAS,oBAAoB,kBAAqC;AAmElE,SAAS,WAAW,OAA+B;AACjD,SAAO,OAAO,UAAU,YAAY,MAAM,KAAK,EAAE,SAAS,IAAI,MAAM,KAAK,IAAI;AAC/E;AAGO,SAAS,iBAAiB,UAAkC;AACjE,MAAI,CAAC,YAAY,OAAO,aAAa,SAAU,QAAO;AACtD,QAAM,MAAM;AACZ,aAAW,OAAO,CAAC,QAAQ,eAAe,gBAAgB,aAAa,YAAY,GAAG;AACpF,UAAM,QAAQ,WAAW,IAAI,GAAG,CAAC;AACjC,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEO,SAAS,iBAAiB,SAA6C;AAC5E,MAAI,CAAC,WAAW,OAAO,YAAY,SAAU,QAAO;AACpD,QAAM,MAAM;AACZ,QAAM,YAAY,IAAI;AACtB,MAAI,CAAC,aAAa,OAAO,cAAc,SAAU,QAAO;AACxD,QAAM,SAAS;AACf,QAAM,KAAK,WAAW,OAAO,EAAE;AAC/B,MAAI,CAAC,GAAI,QAAO;AAIhB,QAAM,UAAU,mBAAmB;AAAA,IACjC,cAAc,OAAO;AAAA,IACrB,UAAU,OAAO;AAAA,IACjB,iBAAiB,OAAO;AAAA,IACxB,wBAAwB,OAAO;AAAA,IAC/B,WAAW,OAAO;AAAA,IAClB,UAAU,CAAC;AAAA,IACX,QAAQ,IAAI;AAAA,IACZ,QAAQ,IAAI;AAAA,IACZ,sBAAsB,IAAI;AAAA,IAC1B,wBAAwB,IAAI;AAAA,IAC5B,mBAAmB,IAAI;AAAA,IACvB,UAAU,EAAE,aAAa,OAAO,qBAAqB,WAAW,OAAO,kBAAkB;AAAA,EAC3F,CAAC;AACD,MAAI,CAAC,QAAS,QAAO;AAErB,SAAO;AAAA,IACL,QAAQ;AAAA,MACN;AAAA,MACA,WAAW,WAAW,OAAO,SAAS,KAAK;AAAA,MAC3C,OAAO,WAAW,OAAO,KAAK,KAAK;AAAA,MACnC,QAAQ,OAAO,WAAW,WAAW,WAAW;AAAA,MAChD,YAAY,WAAW,OAAO,UAAU;AAAA,MACxC,cAAc,iBAAiB,OAAO,gBAAgB;AAAA,MACtD,YAAY,WAAW,OAAO,UAAU;AAAA,MACxC,UAAU,WAAW,OAAO,QAAQ;AAAA,MACpC,cAAc,QAAQ;AAAA,MACtB,UAAU,QAAQ;AAAA,MAClB,iBAAiB,QAAQ;AAAA,MACzB,wBAAwB,QAAQ;AAAA,MAChC,WAAW,QAAQ;AAAA,MACnB,qBAAqB,QAAQ,SAAS;AAAA,MACtC,mBAAmB,QAAQ,SAAS;AAAA,MACpC,UAAU,WAAW,OAAO,QAAQ;AAAA,MACpC,gBAAgB,WAAW,OAAO,cAAc;AAAA,MAChD,gBAAgB,MAAM,QAAQ,OAAO,cAAc,IAC/C,OAAO,eAAe,OAAO,CAAC,UAA2B,OAAO,UAAU,QAAQ,IAClF,CAAC;AAAA,IACP;AAAA,IACA,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB,sBAAsB,QAAQ;AAAA,IAC9B,wBAAwB,QAAQ;AAAA,IAChC,MAAM,MAAM,QAAQ,IAAI,IAAI,IACxB,IAAI,KACD,IAAI,CAAC,UAAU;AACd,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,YAAM,SAAS;AACf,YAAM,UAAU,WAAW,OAAO,OAAO;AACzC,UAAI,CAAC,QAAS,QAAO;AACrB,aAAO;AAAA,QACL;AAAA,QACA,MAAM,WAAW,OAAO,IAAI,KAAK;AAAA,QACjC,aAAa,WAAW,OAAO,WAAW,KAAK;AAAA,QAC/C,WAAW,WAAW,OAAO,SAAS,KAAK;AAAA,QAC3C,aAAa,WAAW,OAAO,WAAW,KAAK;AAAA,QAC/C,aAAa,WAAW,OAAO,WAAW,KAAK;AAAA,QAC/C,SAAS,WAAW,OAAO,OAAO,KAAK;AAAA,QACvC,YAAY,WAAW,OAAO,UAAU,KAAK;AAAA,QAC7C,OAAO,WAAW,OAAO,KAAK,KAAK;AAAA,QACnC,YAAY,OAAO,eAAe;AAAA,QAClC,MAAM,WAAW,OAAO,IAAI;AAAA,QAC5B,QAAQ,WAAW,OAAO,MAAM;AAAA,QAChC,aAAa,OAAO,gBAAgB;AAAA,MACtC;AAAA,IACF,CAAC,EACA,OAAO,CAAC,UAAmC,UAAU,IAAI,IAC5D,CAAC;AAAA,IACL,UAAU,WAAW,IAAI,QAAQ,KAAK;AAAA,IACtC,eAAe,IAAI,kBAAkB;AAAA,IACrC,QAAQ,MAAM,QAAQ,IAAI,MAAM,IAC5B,IAAI,OACD,IAAI,CAAC,UAAU;AACd,UAAI,CAAC,SAAS,OAAO,UAAU,SAAU,QAAO;AAChD,YAAM,SAAS;AACf,YAAM,UAAU,WAAW,OAAO,EAAE;AACpC,YAAM,YAAY,OAAO;AACzB,UAAI,CAAC,QAAS,QAAO;AACrB,UAAI,cAAc,YAAY,cAAc,cAAc,cAAc,WAAY,QAAO;AAC3F,aAAO;AAAA,QACL,IAAI;AAAA,QACJ;AAAA,QACA,QAAQ,WAAW,OAAO,MAAM;AAAA,QAChC,aAAa,WAAW,OAAO,WAAW;AAAA,QAC1C,UACE,OAAO,YAAY,OAAO,OAAO,aAAa,WACzC,OAAO,WACR;AAAA,QACN,WAAW,WAAW,OAAO,SAAS;AAAA,MACxC;AAAA,IACF,CAAC,EACA,OAAO,CAAC,UAAuC,UAAU,IAAI,IAChE,CAAC;AAAA,EACP;AACF;",
6
+ "names": []
7
+ }