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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (808) hide show
  1. package/.turbo/turbo-build.log +2 -2
  2. package/dist/generated/entities/staff_time_entry/index.js +14 -0
  3. package/dist/generated/entities/staff_time_entry/index.js.map +2 -2
  4. package/dist/generated/entities/staff_time_entry_tag/index.js +15 -0
  5. package/dist/generated/entities/staff_time_entry_tag/index.js.map +7 -0
  6. package/dist/generated/entities/staff_time_project/index.js +16 -0
  7. package/dist/generated/entities/staff_time_project/index.js.map +2 -2
  8. package/dist/generated/entities/staff_time_report/index.js +57 -0
  9. package/dist/generated/entities/staff_time_report/index.js.map +7 -0
  10. package/dist/generated/entities/staff_time_report_entry/index.js +27 -0
  11. package/dist/generated/entities/staff_time_report_entry/index.js.map +7 -0
  12. package/dist/generated/entities/staff_time_report_event/index.js +21 -0
  13. package/dist/generated/entities/staff_time_report_event/index.js.map +7 -0
  14. package/dist/generated/entities/staff_time_report_project/index.js +15 -0
  15. package/dist/generated/entities/staff_time_report_project/index.js.map +7 -0
  16. package/dist/generated/entities/staff_time_tag/index.js +21 -0
  17. package/dist/generated/entities/staff_time_tag/index.js.map +7 -0
  18. package/dist/generated/entities/staff_time_task/index.js +37 -0
  19. package/dist/generated/entities/staff_time_task/index.js.map +7 -0
  20. package/dist/generated/entities/staff_time_task_comment/index.js +21 -0
  21. package/dist/generated/entities/staff_time_task_comment/index.js.map +7 -0
  22. package/dist/generated/entities/staff_time_task_status/index.js +29 -0
  23. package/dist/generated/entities/staff_time_task_status/index.js.map +7 -0
  24. package/dist/generated/entities/staff_time_task_tag/index.js +15 -0
  25. package/dist/generated/entities/staff_time_task_tag/index.js.map +7 -0
  26. package/dist/generated/entities.ids.generated.js +11 -1
  27. package/dist/generated/entities.ids.generated.js.map +2 -2
  28. package/dist/generated/entity-fields-registry.js +149 -0
  29. package/dist/generated/entity-fields-registry.js.map +2 -2
  30. package/dist/helpers/integration/timesheetFixtures.js +7 -0
  31. package/dist/helpers/integration/timesheetFixtures.js.map +2 -2
  32. package/dist/modules/auth/cli.js +16 -0
  33. package/dist/modules/auth/cli.js.map +2 -2
  34. package/dist/modules/auth/lib/backendChrome.js +1 -0
  35. package/dist/modules/auth/lib/backendChrome.js.map +2 -2
  36. package/dist/modules/customer_accounts/lib/customerRoleAcls.js +44 -0
  37. package/dist/modules/customer_accounts/lib/customerRoleAcls.js.map +7 -0
  38. package/dist/modules/customer_accounts/setup.js +1 -28
  39. package/dist/modules/customer_accounts/setup.js.map +2 -2
  40. package/dist/modules/data_sync/api/options.js +2 -0
  41. package/dist/modules/data_sync/api/options.js.map +2 -2
  42. package/dist/modules/data_sync/backend/data-sync/page.js +39 -17
  43. package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
  44. package/dist/modules/data_sync/lib/start-controls.js +42 -0
  45. package/dist/modules/data_sync/lib/start-controls.js.map +7 -0
  46. package/dist/modules/staff/acl.js +9 -1
  47. package/dist/modules/staff/acl.js.map +2 -2
  48. package/dist/modules/staff/ai-agents.js +142 -0
  49. package/dist/modules/staff/ai-agents.js.map +7 -0
  50. package/dist/modules/staff/ai-tools/time-tracking-pack.js +348 -0
  51. package/dist/modules/staff/ai-tools/time-tracking-pack.js.map +7 -0
  52. package/dist/modules/staff/ai-tools/types.js +54 -0
  53. package/dist/modules/staff/ai-tools/types.js.map +7 -0
  54. package/dist/modules/staff/ai-tools.js +8 -0
  55. package/dist/modules/staff/ai-tools.js.map +7 -0
  56. package/dist/modules/staff/analytics.js +84 -1
  57. package/dist/modules/staff/analytics.js.map +2 -2
  58. package/dist/modules/staff/api/guards.js +37 -3
  59. package/dist/modules/staff/api/guards.js.map +2 -2
  60. package/dist/modules/staff/api/leave-requests/accept/route.js +1 -3
  61. package/dist/modules/staff/api/leave-requests/accept/route.js.map +2 -2
  62. package/dist/modules/staff/api/leave-requests/reject/route.js +1 -3
  63. package/dist/modules/staff/api/leave-requests/reject/route.js.map +2 -2
  64. package/dist/modules/staff/api/portal/time-reports/[id]/route.js +131 -0
  65. package/dist/modules/staff/api/portal/time-reports/[id]/route.js.map +7 -0
  66. package/dist/modules/staff/api/portal/time-reports/route.js +179 -0
  67. package/dist/modules/staff/api/portal/time-reports/route.js.map +7 -0
  68. package/dist/modules/staff/api/team-members/self/route.js +1 -3
  69. package/dist/modules/staff/api/team-members/self/route.js.map +2 -2
  70. package/dist/modules/staff/api/team-members/tags/assign/route.js +1 -3
  71. package/dist/modules/staff/api/team-members/tags/assign/route.js.map +2 -2
  72. package/dist/modules/staff/api/team-members/tags/unassign/route.js +1 -3
  73. package/dist/modules/staff/api/team-members/tags/unassign/route.js.map +2 -2
  74. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js +174 -0
  75. package/dist/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.js.map +7 -0
  76. package/dist/modules/staff/api/timesheets/access-requests/route.js +226 -0
  77. package/dist/modules/staff/api/timesheets/access-requests/route.js.map +7 -0
  78. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js +15 -8
  79. package/dist/modules/staff/api/timesheets/my-projects/[projectId]/route.js.map +2 -2
  80. package/dist/modules/staff/api/timesheets/my-projects/route.js +13 -1
  81. package/dist/modules/staff/api/timesheets/my-projects/route.js.map +2 -2
  82. package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js +42 -0
  83. package/dist/modules/staff/api/timesheets/my-work/myWorkAggregate.js.map +7 -0
  84. package/dist/modules/staff/api/timesheets/my-work/route.js +383 -0
  85. package/dist/modules/staff/api/timesheets/my-work/route.js.map +7 -0
  86. package/dist/modules/staff/api/timesheets/projects/kpis/route.js +14 -2
  87. package/dist/modules/staff/api/timesheets/projects/kpis/route.js.map +2 -2
  88. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js +168 -0
  89. package/dist/modules/staff/api/timesheets/reports/[id]/close/route.js.map +7 -0
  90. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js +246 -0
  91. package/dist/modules/staff/api/timesheets/reports/[id]/export/route.js.map +7 -0
  92. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js +183 -0
  93. package/dist/modules/staff/api/timesheets/reports/[id]/sheet/route.js.map +7 -0
  94. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js +164 -0
  95. package/dist/modules/staff/api/timesheets/reports/[id]/unlock/route.js.map +7 -0
  96. package/dist/modules/staff/api/timesheets/reports/preview/route.js +360 -0
  97. package/dist/modules/staff/api/timesheets/reports/preview/route.js.map +7 -0
  98. package/dist/modules/staff/api/timesheets/reports/route.js +316 -0
  99. package/dist/modules/staff/api/timesheets/reports/route.js.map +7 -0
  100. package/dist/modules/staff/api/timesheets/reports/shared.js +63 -0
  101. package/dist/modules/staff/api/timesheets/reports/shared.js.map +7 -0
  102. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js +164 -0
  103. package/dist/modules/staff/api/timesheets/settings/reapply-rounding/route.js.map +7 -0
  104. package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js +168 -0
  105. package/dist/modules/staff/api/timesheets/settings/rounding-impact/route.js.map +7 -0
  106. package/dist/modules/staff/api/timesheets/settings/route.js +199 -0
  107. package/dist/modules/staff/api/timesheets/settings/route.js.map +7 -0
  108. package/dist/modules/staff/api/timesheets/tags/access.js +76 -0
  109. package/dist/modules/staff/api/timesheets/tags/access.js.map +7 -0
  110. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js +235 -0
  111. package/dist/modules/staff/api/timesheets/tags/entry-assignments/route.js.map +7 -0
  112. package/dist/modules/staff/api/timesheets/tags/route.js +160 -0
  113. package/dist/modules/staff/api/timesheets/tags/route.js.map +7 -0
  114. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js +233 -0
  115. package/dist/modules/staff/api/timesheets/tags/task-assignments/route.js.map +7 -0
  116. package/dist/modules/staff/api/timesheets/task-statuses/route.js +188 -0
  117. package/dist/modules/staff/api/timesheets/task-statuses/route.js.map +7 -0
  118. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js +399 -0
  119. package/dist/modules/staff/api/timesheets/tasks/[id]/comments/route.js.map +7 -0
  120. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js +210 -0
  121. package/dist/modules/staff/api/timesheets/tasks/[id]/status/route.js.map +7 -0
  122. package/dist/modules/staff/api/timesheets/tasks/route.js +333 -0
  123. package/dist/modules/staff/api/timesheets/tasks/route.js.map +7 -0
  124. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js +228 -0
  125. package/dist/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.js.map +7 -0
  126. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js +29 -10
  127. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.js.map +2 -2
  128. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js +31 -18
  129. package/dist/modules/staff/api/timesheets/time-entries/[id]/segments/route.js.map +2 -2
  130. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js +21 -7
  131. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.js.map +2 -2
  132. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js +27 -7
  133. package/dist/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.js.map +2 -2
  134. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js +215 -32
  135. package/dist/modules/staff/api/timesheets/time-entries/bulk/route.js.map +2 -2
  136. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js +378 -0
  137. package/dist/modules/staff/api/timesheets/time-entries/copy-day/route.js.map +7 -0
  138. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js +340 -0
  139. package/dist/modules/staff/api/timesheets/time-entries/overlaps/route.js.map +7 -0
  140. package/dist/modules/staff/api/timesheets/time-entries/route.js +238 -26
  141. package/dist/modules/staff/api/timesheets/time-entries/route.js.map +2 -2
  142. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js +23 -8
  143. package/dist/modules/staff/api/timesheets/time-entries/start-timer/route.js.map +2 -2
  144. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js +209 -0
  145. package/dist/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.js.map +7 -0
  146. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js +59 -2
  147. package/dist/modules/staff/api/timesheets/time-projects/[id]/employees/route.js.map +2 -2
  148. package/dist/modules/staff/api/timesheets/time-projects/route.js +264 -22
  149. package/dist/modules/staff/api/timesheets/time-projects/route.js.map +2 -2
  150. package/dist/modules/staff/backend/staff/time-tracking/board/page.js +110 -0
  151. package/dist/modules/staff/backend/staff/time-tracking/board/page.js.map +7 -0
  152. package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js +18 -0
  153. package/dist/modules/staff/backend/staff/time-tracking/board/page.meta.js.map +7 -0
  154. package/dist/modules/staff/backend/staff/time-tracking/entries/page.js +981 -0
  155. package/dist/modules/staff/backend/staff/time-tracking/entries/page.js.map +7 -0
  156. package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js +18 -0
  157. package/dist/modules/staff/backend/staff/time-tracking/entries/page.meta.js.map +7 -0
  158. package/dist/modules/staff/backend/staff/time-tracking/page.js +583 -0
  159. package/dist/modules/staff/backend/staff/time-tracking/page.js.map +7 -0
  160. package/dist/modules/staff/backend/staff/time-tracking/page.meta.js +15 -0
  161. package/dist/modules/staff/backend/staff/time-tracking/page.meta.js.map +7 -0
  162. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js +65 -0
  163. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.js.map +7 -0
  164. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js +16 -0
  165. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.js.map +7 -0
  166. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js +229 -0
  167. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.js.map +7 -0
  168. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js +16 -0
  169. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.js.map +7 -0
  170. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js +1014 -0
  171. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.js.map +7 -0
  172. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js +16 -0
  173. package/dist/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.js.map +7 -0
  174. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js +97 -0
  175. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.js.map +7 -0
  176. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js +16 -0
  177. package/dist/modules/staff/backend/staff/time-tracking/projects/create/page.meta.js.map +7 -0
  178. package/dist/modules/staff/backend/staff/time-tracking/projects/page.js +1040 -0
  179. package/dist/modules/staff/backend/staff/time-tracking/projects/page.js.map +7 -0
  180. package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js +19 -0
  181. package/dist/modules/staff/backend/staff/time-tracking/projects/page.meta.js.map +7 -0
  182. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js +353 -0
  183. package/dist/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.js.map +7 -0
  184. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js +457 -0
  185. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.js.map +7 -0
  186. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js +16 -0
  187. package/dist/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.js.map +7 -0
  188. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js +697 -0
  189. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.js.map +7 -0
  190. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js +16 -0
  191. package/dist/modules/staff/backend/staff/time-tracking/reports/create/page.meta.js.map +7 -0
  192. package/dist/modules/staff/backend/staff/time-tracking/reports/page.js +174 -0
  193. package/dist/modules/staff/backend/staff/time-tracking/reports/page.js.map +7 -0
  194. package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js +18 -0
  195. package/dist/modules/staff/backend/staff/time-tracking/reports/page.meta.js.map +7 -0
  196. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js +546 -0
  197. package/dist/modules/staff/backend/staff/time-tracking/settings/page.js.map +7 -0
  198. package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js +18 -0
  199. package/dist/modules/staff/backend/staff/time-tracking/settings/page.meta.js.map +7 -0
  200. package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js +710 -0
  201. package/dist/modules/staff/backend/staff/time-tracking/timesheet/GridView.js.map +7 -0
  202. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js +646 -0
  203. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.js.map +7 -0
  204. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js +18 -0
  205. package/dist/modules/staff/backend/staff/time-tracking/timesheet/page.meta.js.map +7 -0
  206. package/dist/modules/staff/backend/staff/timesheets/page.js +4 -793
  207. package/dist/modules/staff/backend/staff/timesheets/page.js.map +2 -2
  208. package/dist/modules/staff/backend/staff/timesheets/page.meta.js +2 -7
  209. package/dist/modules/staff/backend/staff/timesheets/page.meta.js.map +2 -2
  210. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js +5 -136
  211. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.js.map +2 -2
  212. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js +1 -7
  213. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.js.map +2 -2
  214. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js +5 -445
  215. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.js.map +3 -3
  216. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js +1 -7
  217. package/dist/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.js.map +2 -2
  218. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js +4 -76
  219. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.js.map +2 -2
  220. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js +1 -7
  221. package/dist/modules/staff/backend/staff/timesheets/projects/create/page.meta.js.map +2 -2
  222. package/dist/modules/staff/backend/staff/timesheets/projects/page.js +4 -613
  223. package/dist/modules/staff/backend/staff/timesheets/projects/page.js.map +2 -2
  224. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js +2 -17
  225. package/dist/modules/staff/backend/staff/timesheets/projects/page.meta.js.map +2 -2
  226. package/dist/modules/staff/ce.js +40 -0
  227. package/dist/modules/staff/ce.js.map +2 -2
  228. package/dist/modules/staff/cli.js +166 -1
  229. package/dist/modules/staff/cli.js.map +2 -2
  230. package/dist/modules/staff/commands/index.js +5 -0
  231. package/dist/modules/staff/commands/index.js.map +2 -2
  232. package/dist/modules/staff/commands/timesheets-entries.js +569 -21
  233. package/dist/modules/staff/commands/timesheets-entries.js.map +3 -3
  234. package/dist/modules/staff/commands/timesheets-projects.js +450 -7
  235. package/dist/modules/staff/commands/timesheets-projects.js.map +2 -2
  236. package/dist/modules/staff/commands/timesheets-reports.js +1036 -0
  237. package/dist/modules/staff/commands/timesheets-reports.js.map +7 -0
  238. package/dist/modules/staff/commands/timesheets-tags.js +1015 -0
  239. package/dist/modules/staff/commands/timesheets-tags.js.map +7 -0
  240. package/dist/modules/staff/commands/timesheets-task-comments.js +438 -0
  241. package/dist/modules/staff/commands/timesheets-task-comments.js.map +7 -0
  242. package/dist/modules/staff/commands/timesheets-task-statuses.js +723 -0
  243. package/dist/modules/staff/commands/timesheets-task-statuses.js.map +7 -0
  244. package/dist/modules/staff/commands/timesheets-tasks.js +834 -0
  245. package/dist/modules/staff/commands/timesheets-tasks.js.map +7 -0
  246. package/dist/modules/staff/data/enrichers.js +426 -12
  247. package/dist/modules/staff/data/enrichers.js.map +2 -2
  248. package/dist/modules/staff/data/entities.js +552 -3
  249. package/dist/modules/staff/data/entities.js.map +2 -2
  250. package/dist/modules/staff/data/extensions.js +41 -0
  251. package/dist/modules/staff/data/extensions.js.map +7 -0
  252. package/dist/modules/staff/data/validators.js +254 -9
  253. package/dist/modules/staff/data/validators.js.map +2 -2
  254. package/dist/modules/staff/di.js +42 -1
  255. package/dist/modules/staff/di.js.map +2 -2
  256. package/dist/modules/staff/events.js +84 -6
  257. package/dist/modules/staff/events.js.map +2 -2
  258. package/dist/modules/staff/events.payloads.js +158 -0
  259. package/dist/modules/staff/events.payloads.js.map +7 -0
  260. package/dist/modules/staff/extension-points.js +261 -0
  261. package/dist/modules/staff/extension-points.js.map +7 -0
  262. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js +138 -0
  263. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.js.map +7 -0
  264. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js +12 -0
  265. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.js.map +7 -0
  266. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js +133 -0
  267. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.js.map +7 -0
  268. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js +19 -0
  269. package/dist/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.js.map +7 -0
  270. package/dist/modules/staff/lib/crud.js +11 -1
  271. package/dist/modules/staff/lib/crud.js.map +2 -2
  272. package/dist/modules/staff/lib/time-tracking/access.js +92 -0
  273. package/dist/modules/staff/lib/time-tracking/access.js.map +7 -0
  274. package/dist/modules/staff/lib/time-tracking/billability.js +39 -0
  275. package/dist/modules/staff/lib/time-tracking/billability.js.map +7 -0
  276. package/dist/modules/staff/lib/time-tracking/capacity.js +68 -0
  277. package/dist/modules/staff/lib/time-tracking/capacity.js.map +7 -0
  278. package/dist/modules/staff/lib/time-tracking/componentContracts.js +15 -0
  279. package/dist/modules/staff/lib/time-tracking/componentContracts.js.map +7 -0
  280. package/dist/modules/staff/lib/time-tracking/cost.js +82 -0
  281. package/dist/modules/staff/lib/time-tracking/cost.js.map +7 -0
  282. package/dist/modules/staff/lib/time-tracking/duration.js +55 -0
  283. package/dist/modules/staff/lib/time-tracking/duration.js.map +7 -0
  284. package/dist/modules/staff/lib/time-tracking/featureAccess.js +41 -0
  285. package/dist/modules/staff/lib/time-tracking/featureAccess.js.map +7 -0
  286. package/dist/modules/staff/lib/time-tracking/interval.js +72 -0
  287. package/dist/modules/staff/lib/time-tracking/interval.js.map +7 -0
  288. package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js +88 -0
  289. package/dist/modules/staff/lib/time-tracking/migrateProjectCodes.js.map +7 -0
  290. package/dist/modules/staff/lib/time-tracking/moneyVisibility.js +10 -0
  291. package/dist/modules/staff/lib/time-tracking/moneyVisibility.js.map +7 -0
  292. package/dist/modules/staff/lib/time-tracking/overlap.js +87 -0
  293. package/dist/modules/staff/lib/time-tracking/overlap.js.map +7 -0
  294. package/dist/modules/staff/lib/time-tracking/portalRecipients.js +27 -0
  295. package/dist/modules/staff/lib/time-tracking/portalRecipients.js.map +7 -0
  296. package/dist/modules/staff/lib/time-tracking/portalReports.js +16 -0
  297. package/dist/modules/staff/lib/time-tracking/portalReports.js.map +7 -0
  298. package/dist/modules/staff/lib/time-tracking/projectCode.js +135 -0
  299. package/dist/modules/staff/lib/time-tracking/projectCode.js.map +7 -0
  300. package/dist/modules/staff/lib/time-tracking/reapplyRounding.js +187 -0
  301. package/dist/modules/staff/lib/time-tracking/reapplyRounding.js.map +7 -0
  302. package/dist/modules/staff/lib/time-tracking/recalculationRunner.js +80 -0
  303. package/dist/modules/staff/lib/time-tracking/recalculationRunner.js.map +7 -0
  304. package/dist/modules/staff/lib/time-tracking/recalculations.js +56 -0
  305. package/dist/modules/staff/lib/time-tracking/recalculations.js.map +7 -0
  306. package/dist/modules/staff/lib/time-tracking/registries/invoke.js +63 -0
  307. package/dist/modules/staff/lib/time-tracking/registries/invoke.js.map +7 -0
  308. package/dist/modules/staff/lib/time-tracking/registries/registry.js +62 -0
  309. package/dist/modules/staff/lib/time-tracking/registries/registry.js.map +7 -0
  310. package/dist/modules/staff/lib/time-tracking/registries/scope.js +21 -0
  311. package/dist/modules/staff/lib/time-tracking/registries/scope.js.map +7 -0
  312. package/dist/modules/staff/lib/time-tracking/rollup.js +34 -0
  313. package/dist/modules/staff/lib/time-tracking/rollup.js.map +7 -0
  314. package/dist/modules/staff/lib/time-tracking/rounding.js +66 -0
  315. package/dist/modules/staff/lib/time-tracking/rounding.js.map +7 -0
  316. package/dist/modules/staff/lib/time-tracking/roundingImpact.js +39 -0
  317. package/dist/modules/staff/lib/time-tracking/roundingImpact.js.map +7 -0
  318. package/dist/modules/staff/lib/time-tracking/settingKeys.js +214 -0
  319. package/dist/modules/staff/lib/time-tracking/settingKeys.js.map +7 -0
  320. package/dist/modules/staff/lib/time-tracking/settings.js +87 -0
  321. package/dist/modules/staff/lib/time-tracking/settings.js.map +7 -0
  322. package/dist/modules/staff/lib/time-tracking/sqlInClause.js +9 -0
  323. package/dist/modules/staff/lib/time-tracking/sqlInClause.js.map +7 -0
  324. package/dist/modules/staff/lib/time-tracking/timeEntrySources.js +48 -0
  325. package/dist/modules/staff/lib/time-tracking/timeEntrySources.js.map +7 -0
  326. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js +283 -0
  327. package/dist/modules/staff/lib/time-tracking-ui/BoardFilterChips.js.map +7 -0
  328. package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js +324 -0
  329. package/dist/modules/staff/lib/time-tracking-ui/CustomerPicker.js.map +7 -0
  330. package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js +121 -0
  331. package/dist/modules/staff/lib/time-tracking-ui/DurationInput.js.map +7 -0
  332. package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js +188 -0
  333. package/dist/modules/staff/lib/time-tracking-ui/EntryDetailsFields.js.map +7 -0
  334. package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js +89 -0
  335. package/dist/modules/staff/lib/time-tracking-ui/EntryFilterBar.js.map +7 -0
  336. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js +855 -0
  337. package/dist/modules/staff/lib/time-tracking-ui/KanbanBoard.js.map +7 -0
  338. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js +360 -0
  339. package/dist/modules/staff/lib/time-tracking-ui/KanbanCard.js.map +7 -0
  340. package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js +259 -0
  341. package/dist/modules/staff/lib/time-tracking-ui/KanbanColumn.js.map +7 -0
  342. package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js +238 -0
  343. package/dist/modules/staff/lib/time-tracking-ui/NewTaskDialog.js.map +7 -0
  344. package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js +130 -0
  345. package/dist/modules/staff/lib/time-tracking-ui/NoProjectAccess.js.map +7 -0
  346. package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js +98 -0
  347. package/dist/modules/staff/lib/time-tracking-ui/PeriodSelector.js.map +7 -0
  348. package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js +27 -0
  349. package/dist/modules/staff/lib/time-tracking-ui/PhasePlaceholder.js.map +7 -0
  350. package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js +166 -0
  351. package/dist/modules/staff/lib/time-tracking-ui/ProjectCodeField.js.map +7 -0
  352. package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js +295 -0
  353. package/dist/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.js.map +7 -0
  354. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js +212 -0
  355. package/dist/modules/staff/lib/time-tracking-ui/ProjectFormSections.js.map +7 -0
  356. package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js +729 -0
  357. package/dist/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.js.map +7 -0
  358. package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js +217 -0
  359. package/dist/modules/staff/lib/time-tracking-ui/ReportSheet.js.map +7 -0
  360. package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js +158 -0
  361. package/dist/modules/staff/lib/time-tracking-ui/TagPicker.js.map +7 -0
  362. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js +224 -0
  363. package/dist/modules/staff/lib/time-tracking-ui/TaskBoardScreen.js.map +7 -0
  364. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js +93 -0
  365. package/dist/modules/staff/lib/time-tracking-ui/TaskCommentThread.js.map +7 -0
  366. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js +1196 -0
  367. package/dist/modules/staff/lib/time-tracking-ui/TaskDrawer.js.map +7 -0
  368. package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js +176 -0
  369. package/dist/modules/staff/lib/time-tracking-ui/TaskListView.js.map +7 -0
  370. package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js +307 -0
  371. package/dist/modules/staff/lib/time-tracking-ui/TaskPicker.js.map +7 -0
  372. package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js +284 -0
  373. package/dist/modules/staff/lib/time-tracking-ui/TaskQuickLog.js.map +7 -0
  374. package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js +73 -0
  375. package/dist/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.js.map +7 -0
  376. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js +1499 -0
  377. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDialog.js.map +7 -0
  378. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js +95 -0
  379. package/dist/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.js.map +7 -0
  380. package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js +188 -0
  381. package/dist/modules/staff/lib/time-tracking-ui/TimesheetCalendar.js.map +7 -0
  382. package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js +61 -0
  383. package/dist/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.js.map +7 -0
  384. package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js +45 -0
  385. package/dist/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.js.map +7 -0
  386. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js +176 -0
  387. package/dist/modules/staff/lib/time-tracking-ui/boardDirectory.js.map +7 -0
  388. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js +82 -0
  389. package/dist/modules/staff/lib/time-tracking-ui/boardFilters.js.map +7 -0
  390. package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js +5 -0
  391. package/dist/modules/staff/lib/time-tracking-ui/boardSummary.js.map +7 -0
  392. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js +152 -0
  393. package/dist/modules/staff/lib/time-tracking-ui/kanbanBoardData.js.map +7 -0
  394. package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js +92 -0
  395. package/dist/modules/staff/lib/time-tracking-ui/projectTeamAssignment.js.map +7 -0
  396. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js +111 -0
  397. package/dist/modules/staff/lib/time-tracking-ui/taskDrawerData.js.map +7 -0
  398. package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js +243 -0
  399. package/dist/modules/staff/lib/time-tracking-ui/timeEntryDialogState.js.map +7 -0
  400. package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js +151 -0
  401. package/dist/modules/staff/lib/time-tracking-ui/timeEntryListData.js.map +7 -0
  402. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js +105 -0
  403. package/dist/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.js.map +7 -0
  404. package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js +132 -0
  405. package/dist/modules/staff/lib/time-tracking-ui/timesheetData.js.map +7 -0
  406. package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js +205 -0
  407. package/dist/modules/staff/lib/time-tracking-ui/timesheetPeriod.js.map +7 -0
  408. package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js +53 -0
  409. package/dist/modules/staff/lib/time-tracking-ui/timesheetTargets.js.map +7 -0
  410. package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js +77 -0
  411. package/dist/modules/staff/lib/time-tracking-ui/useBoardFilters.js.map +7 -0
  412. package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js +151 -0
  413. package/dist/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.js.map +7 -0
  414. package/dist/modules/staff/lib/timeTrackingSeeds.js +809 -0
  415. package/dist/modules/staff/lib/timeTrackingSeeds.js.map +7 -0
  416. package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js +2 -3
  417. package/dist/modules/staff/lib/timesheets/timeEntryCacheInvalidation.js.map +2 -2
  418. package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js +152 -0
  419. package/dist/modules/staff/lib/timesheets/timeEntryDecoration.js.map +7 -0
  420. package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js +36 -0
  421. package/dist/modules/staff/lib/timesheets-projects/budgetBurn.js.map +7 -0
  422. package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js +66 -0
  423. package/dist/modules/staff/lib/timesheets-projects/budgetThreshold.js.map +7 -0
  424. package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js +78 -0
  425. package/dist/modules/staff/lib/timesheets-projects/budgetThresholdState.js.map +7 -0
  426. package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js +81 -0
  427. package/dist/modules/staff/lib/timesheets-projects/computeProjectFinancials.js.map +7 -0
  428. package/dist/modules/staff/lib/timesheets-projects/reportSelection.js +44 -0
  429. package/dist/modules/staff/lib/timesheets-projects/reportSelection.js.map +7 -0
  430. package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js +169 -0
  431. package/dist/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.js.map +7 -0
  432. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js +22 -0
  433. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.js.map +7 -0
  434. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js +51 -1
  435. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectCard.js.map +2 -2
  436. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js +70 -0
  437. package/dist/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.js.map +7 -0
  438. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js +63 -0
  439. package/dist/modules/staff/lib/timesheets-reports/buildReportSheet.js.map +7 -0
  440. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js +170 -0
  441. package/dist/modules/staff/lib/timesheets-reports/loadReportData.js.map +7 -0
  442. package/dist/modules/staff/lib/timesheets-reports/pdf.js +205 -0
  443. package/dist/modules/staff/lib/timesheets-reports/pdf.js.map +7 -0
  444. package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js +68 -0
  445. package/dist/modules/staff/lib/timesheets-reports/reportApprovalPolicies.js.map +7 -0
  446. package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js +135 -0
  447. package/dist/modules/staff/lib/timesheets-reports/reportConfigData.js.map +7 -0
  448. package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js +48 -0
  449. package/dist/modules/staff/lib/timesheets-reports/reportConfigState.js.map +7 -0
  450. package/dist/modules/staff/lib/timesheets-reports/reportExport.js +262 -0
  451. package/dist/modules/staff/lib/timesheets-reports/reportExport.js.map +7 -0
  452. package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js +34 -0
  453. package/dist/modules/staff/lib/timesheets-reports/reportExportFormats.js.map +7 -0
  454. package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js +79 -0
  455. package/dist/modules/staff/lib/timesheets-reports/reportGroupings.js.map +7 -0
  456. package/dist/modules/staff/lib/timesheets-reports/reportLabels.js +11 -0
  457. package/dist/modules/staff/lib/timesheets-reports/reportLabels.js.map +7 -0
  458. package/dist/modules/staff/lib/timesheets-reports/reportReference.js +83 -0
  459. package/dist/modules/staff/lib/timesheets-reports/reportReference.js.map +7 -0
  460. package/dist/modules/staff/lib/timesheets-reports/reportRows.js +42 -0
  461. package/dist/modules/staff/lib/timesheets-reports/reportRows.js.map +7 -0
  462. package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js +107 -0
  463. package/dist/modules/staff/lib/timesheets-reports/reportSheetData.js.map +7 -0
  464. package/dist/modules/staff/lib/timesheets-reports/reportTotals.js +289 -0
  465. package/dist/modules/staff/lib/timesheets-reports/reportTotals.js.map +7 -0
  466. package/dist/modules/staff/lib/timesheets-reports/xlsx.js +145 -0
  467. package/dist/modules/staff/lib/timesheets-reports/xlsx.js.map +7 -0
  468. package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js +116 -0
  469. package/dist/modules/staff/lib/timesheets-tasks/computeTaskRollups.js.map +7 -0
  470. package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js +50 -0
  471. package/dist/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.js.map +7 -0
  472. package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js +27 -0
  473. package/dist/modules/staff/lib/timesheets-tasks/seedProjectStatuses.js.map +7 -0
  474. package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js +65 -0
  475. package/dist/modules/staff/lib/timesheets-tasks/statusPositions.js.map +7 -0
  476. package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js +31 -0
  477. package/dist/modules/staff/lib/timesheets-tasks/statusSlug.js.map +7 -0
  478. package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js +31 -0
  479. package/dist/modules/staff/lib/timesheets-tasks/taskHierarchy.js.map +7 -0
  480. package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js +17 -0
  481. package/dist/modules/staff/lib/timesheets-tasks/taskHoursTotals.js.map +7 -0
  482. package/dist/modules/staff/lib/timesheets-tasks/taskReference.js +51 -0
  483. package/dist/modules/staff/lib/timesheets-tasks/taskReference.js.map +7 -0
  484. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js +11 -4
  485. package/dist/modules/staff/lib/timesheets-ui/CreateProjectDialog.js.map +2 -2
  486. package/dist/modules/staff/lib/timesheets-ui/ListView.js +369 -111
  487. package/dist/modules/staff/lib/timesheets-ui/ListView.js.map +2 -2
  488. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js +47 -2
  489. package/dist/modules/staff/lib/timesheets-ui/TimerBar.js.map +2 -2
  490. package/dist/modules/staff/migrations/Migration20260813073131_staff.js +79 -0
  491. package/dist/modules/staff/migrations/Migration20260813073131_staff.js.map +7 -0
  492. package/dist/modules/staff/migrations/Migration20260824143357_staff.js +15 -0
  493. package/dist/modules/staff/migrations/Migration20260824143357_staff.js.map +7 -0
  494. package/dist/modules/staff/notifications.client.js +16 -0
  495. package/dist/modules/staff/notifications.client.js.map +7 -0
  496. package/dist/modules/staff/notifications.handlers.js +80 -0
  497. package/dist/modules/staff/notifications.handlers.js.map +7 -0
  498. package/dist/modules/staff/notifications.js +168 -0
  499. package/dist/modules/staff/notifications.js.map +2 -2
  500. package/dist/modules/staff/search.js +159 -1
  501. package/dist/modules/staff/search.js.map +2 -2
  502. package/dist/modules/staff/setup.js +20 -1
  503. package/dist/modules/staff/setup.js.map +2 -2
  504. package/dist/modules/staff/subscribers/time-project-access-requested-notification.js +68 -0
  505. package/dist/modules/staff/subscribers/time-project-access-requested-notification.js.map +7 -0
  506. package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js +149 -0
  507. package/dist/modules/staff/subscribers/time-project-budget-threshold-notification.js.map +7 -0
  508. package/dist/modules/staff/subscribers/time-report-approved-notification.js +78 -0
  509. package/dist/modules/staff/subscribers/time-report-approved-notification.js.map +7 -0
  510. package/dist/modules/staff/subscribers/time-report-portal-broadcast.js +78 -0
  511. package/dist/modules/staff/subscribers/time-report-portal-broadcast.js.map +7 -0
  512. package/dist/modules/staff/translations.js +4 -1
  513. package/dist/modules/staff/translations.js.map +2 -2
  514. package/dist/modules/staff/widgets/components.js +7 -0
  515. package/dist/modules/staff/widgets/components.js.map +7 -0
  516. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js +5 -4
  517. package/dist/modules/staff/widgets/injection/timer-sidebar-indicator/widget.js.map +2 -2
  518. package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js +135 -0
  519. package/dist/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.js.map +7 -0
  520. package/dist/modules/staff/widgets/notifications/index.js +5 -0
  521. package/dist/modules/staff/widgets/notifications/index.js.map +7 -0
  522. package/dist/modules/staff/workers/timesheets-reapply-rounding.js +43 -0
  523. package/dist/modules/staff/workers/timesheets-reapply-rounding.js.map +7 -0
  524. package/generated/entities/staff_time_entry/index.ts +7 -0
  525. package/generated/entities/staff_time_entry_tag/index.ts +6 -0
  526. package/generated/entities/staff_time_project/index.ts +8 -0
  527. package/generated/entities/staff_time_report/index.ts +27 -0
  528. package/generated/entities/staff_time_report_entry/index.ts +12 -0
  529. package/generated/entities/staff_time_report_event/index.ts +9 -0
  530. package/generated/entities/staff_time_report_project/index.ts +6 -0
  531. package/generated/entities/staff_time_tag/index.ts +9 -0
  532. package/generated/entities/staff_time_task/index.ts +17 -0
  533. package/generated/entities/staff_time_task_comment/index.ts +9 -0
  534. package/generated/entities/staff_time_task_status/index.ts +13 -0
  535. package/generated/entities/staff_time_task_tag/index.ts +6 -0
  536. package/generated/entities.ids.generated.ts +11 -1
  537. package/generated/entity-fields-registry.ts +149 -0
  538. package/package.json +7 -7
  539. package/src/helpers/integration/timesheetFixtures.ts +31 -1
  540. package/src/modules/auth/README.md +1 -1
  541. package/src/modules/auth/cli.ts +35 -1
  542. package/src/modules/auth/i18n/de.json +7 -0
  543. package/src/modules/auth/i18n/en.json +7 -0
  544. package/src/modules/auth/i18n/es.json +7 -0
  545. package/src/modules/auth/i18n/ko.json +7 -0
  546. package/src/modules/auth/i18n/pl.json +7 -0
  547. package/src/modules/auth/lib/backendChrome.tsx +1 -0
  548. package/src/modules/customer_accounts/lib/customerRoleAcls.ts +79 -0
  549. package/src/modules/customer_accounts/setup.ts +1 -45
  550. package/src/modules/data_sync/AGENTS.md +34 -0
  551. package/src/modules/data_sync/api/options.ts +2 -0
  552. package/src/modules/data_sync/backend/data-sync/page.tsx +82 -33
  553. package/src/modules/data_sync/i18n/de.json +1 -0
  554. package/src/modules/data_sync/i18n/en.json +1 -0
  555. package/src/modules/data_sync/i18n/es.json +1 -0
  556. package/src/modules/data_sync/i18n/ko.json +1 -0
  557. package/src/modules/data_sync/i18n/pl.json +1 -0
  558. package/src/modules/data_sync/lib/adapter.ts +45 -0
  559. package/src/modules/data_sync/lib/start-controls.ts +89 -0
  560. package/src/modules/staff/AGENTS.md +769 -1
  561. package/src/modules/staff/acl.ts +9 -0
  562. package/src/modules/staff/ai-agents.ts +189 -0
  563. package/src/modules/staff/ai-tools/time-tracking-pack.ts +494 -0
  564. package/src/modules/staff/ai-tools/types.ts +82 -0
  565. package/src/modules/staff/ai-tools.ts +13 -0
  566. package/src/modules/staff/analytics.ts +113 -0
  567. package/src/modules/staff/api/guards.ts +85 -3
  568. package/src/modules/staff/api/leave-requests/accept/route.ts +0 -2
  569. package/src/modules/staff/api/leave-requests/reject/route.ts +0 -2
  570. package/src/modules/staff/api/portal/time-reports/[id]/route.ts +182 -0
  571. package/src/modules/staff/api/portal/time-reports/route.ts +270 -0
  572. package/src/modules/staff/api/team-members/self/route.ts +0 -2
  573. package/src/modules/staff/api/team-members/tags/assign/route.ts +0 -2
  574. package/src/modules/staff/api/team-members/tags/unassign/route.ts +0 -2
  575. package/src/modules/staff/api/timesheets/_shared/withTimesheetInterceptors.ts +292 -0
  576. package/src/modules/staff/api/timesheets/access-requests/route.ts +299 -0
  577. package/src/modules/staff/api/timesheets/my-projects/[projectId]/route.ts +15 -7
  578. package/src/modules/staff/api/timesheets/my-projects/route.ts +14 -1
  579. package/src/modules/staff/api/timesheets/my-work/myWorkAggregate.ts +90 -0
  580. package/src/modules/staff/api/timesheets/my-work/route.ts +475 -0
  581. package/src/modules/staff/api/timesheets/projects/kpis/route.ts +15 -2
  582. package/src/modules/staff/api/timesheets/reports/[id]/close/route.ts +203 -0
  583. package/src/modules/staff/api/timesheets/reports/[id]/export/route.ts +315 -0
  584. package/src/modules/staff/api/timesheets/reports/[id]/sheet/route.ts +220 -0
  585. package/src/modules/staff/api/timesheets/reports/[id]/unlock/route.ts +208 -0
  586. package/src/modules/staff/api/timesheets/reports/preview/route.ts +449 -0
  587. package/src/modules/staff/api/timesheets/reports/route.ts +386 -0
  588. package/src/modules/staff/api/timesheets/reports/shared.ts +121 -0
  589. package/src/modules/staff/api/timesheets/settings/reapply-rounding/route.ts +205 -0
  590. package/src/modules/staff/api/timesheets/settings/rounding-impact/route.ts +226 -0
  591. package/src/modules/staff/api/timesheets/settings/route.ts +242 -0
  592. package/src/modules/staff/api/timesheets/tags/access.ts +134 -0
  593. package/src/modules/staff/api/timesheets/tags/entry-assignments/route.ts +290 -0
  594. package/src/modules/staff/api/timesheets/tags/route.ts +177 -0
  595. package/src/modules/staff/api/timesheets/tags/task-assignments/route.ts +294 -0
  596. package/src/modules/staff/api/timesheets/task-statuses/route.ts +232 -0
  597. package/src/modules/staff/api/timesheets/tasks/[id]/comments/route.ts +532 -0
  598. package/src/modules/staff/api/timesheets/tasks/[id]/status/route.ts +271 -0
  599. package/src/modules/staff/api/timesheets/tasks/route.ts +443 -0
  600. package/src/modules/staff/api/timesheets/time-entries/[id]/duplicate/route.ts +306 -0
  601. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/[segmentId]/route.ts +32 -10
  602. package/src/modules/staff/api/timesheets/time-entries/[id]/segments/route.ts +32 -17
  603. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-start/route.ts +27 -6
  604. package/src/modules/staff/api/timesheets/time-entries/[id]/timer-stop/route.ts +36 -6
  605. package/src/modules/staff/api/timesheets/time-entries/bulk/route.ts +331 -34
  606. package/src/modules/staff/api/timesheets/time-entries/copy-day/route.ts +533 -0
  607. package/src/modules/staff/api/timesheets/time-entries/overlaps/route.ts +457 -0
  608. package/src/modules/staff/api/timesheets/time-entries/route.ts +378 -24
  609. package/src/modules/staff/api/timesheets/time-entries/start-timer/route.ts +31 -9
  610. package/src/modules/staff/api/timesheets/time-projects/[id]/change-currency/route.ts +246 -0
  611. package/src/modules/staff/api/timesheets/time-projects/[id]/employees/route.ts +62 -2
  612. package/src/modules/staff/api/timesheets/time-projects/route.ts +397 -22
  613. package/src/modules/staff/backend/staff/time-tracking/board/page.meta.ts +14 -0
  614. package/src/modules/staff/backend/staff/time-tracking/board/page.tsx +151 -0
  615. package/src/modules/staff/backend/staff/time-tracking/entries/page.meta.ts +14 -0
  616. package/src/modules/staff/backend/staff/time-tracking/entries/page.tsx +1229 -0
  617. package/src/modules/staff/backend/staff/time-tracking/page.meta.ts +11 -0
  618. package/src/modules/staff/backend/staff/time-tracking/page.tsx +823 -0
  619. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.meta.ts +12 -0
  620. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/board/page.tsx +81 -0
  621. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.meta.ts +12 -0
  622. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/edit/page.tsx +275 -0
  623. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.meta.ts +12 -0
  624. package/src/modules/staff/backend/staff/time-tracking/projects/[id]/page.tsx +1420 -0
  625. package/src/modules/staff/backend/staff/time-tracking/projects/create/page.meta.ts +12 -0
  626. package/src/modules/staff/backend/staff/time-tracking/projects/create/page.tsx +109 -0
  627. package/src/modules/staff/backend/staff/time-tracking/projects/page.meta.ts +15 -0
  628. package/src/modules/staff/backend/staff/time-tracking/projects/page.tsx +1254 -0
  629. package/src/modules/staff/backend/staff/time-tracking/projects/projectFormConfig.ts +466 -0
  630. package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.meta.ts +12 -0
  631. package/src/modules/staff/backend/staff/time-tracking/reports/[id]/page.tsx +632 -0
  632. package/src/modules/staff/backend/staff/time-tracking/reports/create/page.meta.ts +12 -0
  633. package/src/modules/staff/backend/staff/time-tracking/reports/create/page.tsx +867 -0
  634. package/src/modules/staff/backend/staff/time-tracking/reports/page.meta.ts +14 -0
  635. package/src/modules/staff/backend/staff/time-tracking/reports/page.tsx +246 -0
  636. package/src/modules/staff/backend/staff/time-tracking/settings/page.meta.ts +14 -0
  637. package/src/modules/staff/backend/staff/time-tracking/settings/page.tsx +701 -0
  638. package/src/modules/staff/backend/staff/time-tracking/timesheet/GridView.tsx +953 -0
  639. package/src/modules/staff/backend/staff/time-tracking/timesheet/page.meta.ts +14 -0
  640. package/src/modules/staff/backend/staff/time-tracking/timesheet/page.tsx +800 -0
  641. package/src/modules/staff/backend/staff/timesheets/page.meta.ts +6 -6
  642. package/src/modules/staff/backend/staff/timesheets/page.tsx +12 -1010
  643. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.meta.ts +0 -6
  644. package/src/modules/staff/backend/staff/timesheets/projects/[id]/edit/page.tsx +4 -158
  645. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.meta.ts +0 -6
  646. package/src/modules/staff/backend/staff/timesheets/projects/[id]/page.tsx +4 -609
  647. package/src/modules/staff/backend/staff/timesheets/projects/create/page.meta.ts +0 -6
  648. package/src/modules/staff/backend/staff/timesheets/projects/create/page.tsx +3 -89
  649. package/src/modules/staff/backend/staff/timesheets/projects/page.meta.ts +2 -19
  650. package/src/modules/staff/backend/staff/timesheets/projects/page.tsx +3 -778
  651. package/src/modules/staff/ce.ts +63 -0
  652. package/src/modules/staff/cli.ts +207 -1
  653. package/src/modules/staff/commands/index.ts +5 -0
  654. package/src/modules/staff/commands/timesheets-entries.ts +1006 -28
  655. package/src/modules/staff/commands/timesheets-projects.ts +593 -7
  656. package/src/modules/staff/commands/timesheets-reports.ts +1329 -0
  657. package/src/modules/staff/commands/timesheets-tags.ts +1315 -0
  658. package/src/modules/staff/commands/timesheets-task-comments.ts +583 -0
  659. package/src/modules/staff/commands/timesheets-task-statuses.ts +889 -0
  660. package/src/modules/staff/commands/timesheets-tasks.ts +1121 -0
  661. package/src/modules/staff/data/enrichers.ts +675 -10
  662. package/src/modules/staff/data/entities.ts +494 -2
  663. package/src/modules/staff/data/extensions.ts +68 -0
  664. package/src/modules/staff/data/validators.ts +348 -3
  665. package/src/modules/staff/di.ts +96 -0
  666. package/src/modules/staff/events.payloads.ts +268 -0
  667. package/src/modules/staff/events.ts +87 -5
  668. package/src/modules/staff/extension-points.ts +308 -0
  669. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.meta.ts +10 -0
  670. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/[id]/page.tsx +225 -0
  671. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.meta.ts +17 -0
  672. package/src/modules/staff/frontend/[orgSlug]/portal/time-reports/page.tsx +182 -0
  673. package/src/modules/staff/i18n/de.json +899 -0
  674. package/src/modules/staff/i18n/en.json +899 -0
  675. package/src/modules/staff/i18n/es.json +899 -0
  676. package/src/modules/staff/i18n/ko.json +899 -0
  677. package/src/modules/staff/i18n/pl.json +899 -0
  678. package/src/modules/staff/lib/crud.ts +14 -3
  679. package/src/modules/staff/lib/time-tracking/access.ts +155 -0
  680. package/src/modules/staff/lib/time-tracking/billability.ts +68 -0
  681. package/src/modules/staff/lib/time-tracking/capacity.ts +124 -0
  682. package/src/modules/staff/lib/time-tracking/componentContracts.ts +26 -0
  683. package/src/modules/staff/lib/time-tracking/cost.ts +144 -0
  684. package/src/modules/staff/lib/time-tracking/duration.ts +68 -0
  685. package/src/modules/staff/lib/time-tracking/featureAccess.ts +115 -0
  686. package/src/modules/staff/lib/time-tracking/interval.ts +90 -0
  687. package/src/modules/staff/lib/time-tracking/migrateProjectCodes.ts +161 -0
  688. package/src/modules/staff/lib/time-tracking/moneyVisibility.ts +37 -0
  689. package/src/modules/staff/lib/time-tracking/overlap.ts +159 -0
  690. package/src/modules/staff/lib/time-tracking/portalRecipients.ts +76 -0
  691. package/src/modules/staff/lib/time-tracking/portalReports.ts +31 -0
  692. package/src/modules/staff/lib/time-tracking/projectCode.ts +221 -0
  693. package/src/modules/staff/lib/time-tracking/reapplyRounding.ts +313 -0
  694. package/src/modules/staff/lib/time-tracking/recalculationRunner.ts +118 -0
  695. package/src/modules/staff/lib/time-tracking/recalculations.ts +135 -0
  696. package/src/modules/staff/lib/time-tracking/registries/invoke.ts +122 -0
  697. package/src/modules/staff/lib/time-tracking/registries/registry.ts +124 -0
  698. package/src/modules/staff/lib/time-tracking/registries/scope.ts +56 -0
  699. package/src/modules/staff/lib/time-tracking/rollup.ts +59 -0
  700. package/src/modules/staff/lib/time-tracking/rounding.ts +126 -0
  701. package/src/modules/staff/lib/time-tracking/roundingImpact.ts +75 -0
  702. package/src/modules/staff/lib/time-tracking/settingKeys.ts +274 -0
  703. package/src/modules/staff/lib/time-tracking/settings.ts +168 -0
  704. package/src/modules/staff/lib/time-tracking/sqlInClause.ts +22 -0
  705. package/src/modules/staff/lib/time-tracking/timeEntrySources.ts +85 -0
  706. package/src/modules/staff/lib/time-tracking-ui/BoardFilterChips.tsx +360 -0
  707. package/src/modules/staff/lib/time-tracking-ui/CustomerPicker.tsx +427 -0
  708. package/src/modules/staff/lib/time-tracking-ui/DurationInput.tsx +192 -0
  709. package/src/modules/staff/lib/time-tracking-ui/EntryDetailsFields.tsx +224 -0
  710. package/src/modules/staff/lib/time-tracking-ui/EntryFilterBar.tsx +144 -0
  711. package/src/modules/staff/lib/time-tracking-ui/KanbanBoard.tsx +1065 -0
  712. package/src/modules/staff/lib/time-tracking-ui/KanbanCard.tsx +435 -0
  713. package/src/modules/staff/lib/time-tracking-ui/KanbanColumn.tsx +316 -0
  714. package/src/modules/staff/lib/time-tracking-ui/NewTaskDialog.tsx +291 -0
  715. package/src/modules/staff/lib/time-tracking-ui/NoProjectAccess.tsx +162 -0
  716. package/src/modules/staff/lib/time-tracking-ui/PeriodSelector.tsx +149 -0
  717. package/src/modules/staff/lib/time-tracking-ui/PhasePlaceholder.tsx +31 -0
  718. package/src/modules/staff/lib/time-tracking-ui/ProjectCodeField.tsx +230 -0
  719. package/src/modules/staff/lib/time-tracking-ui/ProjectCurrencyField.tsx +432 -0
  720. package/src/modules/staff/lib/time-tracking-ui/ProjectFormSections.tsx +323 -0
  721. package/src/modules/staff/lib/time-tracking-ui/ProjectTeamDrawer.tsx +930 -0
  722. package/src/modules/staff/lib/time-tracking-ui/ReportSheet.tsx +357 -0
  723. package/src/modules/staff/lib/time-tracking-ui/TagPicker.tsx +195 -0
  724. package/src/modules/staff/lib/time-tracking-ui/TaskBoardScreen.tsx +243 -0
  725. package/src/modules/staff/lib/time-tracking-ui/TaskCommentThread.tsx +137 -0
  726. package/src/modules/staff/lib/time-tracking-ui/TaskDrawer.tsx +1405 -0
  727. package/src/modules/staff/lib/time-tracking-ui/TaskListView.tsx +260 -0
  728. package/src/modules/staff/lib/time-tracking-ui/TaskPicker.tsx +435 -0
  729. package/src/modules/staff/lib/time-tracking-ui/TaskQuickLog.tsx +296 -0
  730. package/src/modules/staff/lib/time-tracking-ui/TimeEntriesSummaryFooter.tsx +97 -0
  731. package/src/modules/staff/lib/time-tracking-ui/TimeEntryDialog.tsx +1929 -0
  732. package/src/modules/staff/lib/time-tracking-ui/TimeEntryDurationCell.tsx +126 -0
  733. package/src/modules/staff/lib/time-tracking-ui/TimesheetCalendar.tsx +265 -0
  734. package/src/modules/staff/lib/time-tracking-ui/TimesheetPeriodFooter.tsx +78 -0
  735. package/src/modules/staff/lib/time-tracking-ui/TimesheetViewSwitch.tsx +70 -0
  736. package/src/modules/staff/lib/time-tracking-ui/boardDirectory.ts +231 -0
  737. package/src/modules/staff/lib/time-tracking-ui/boardFilters.ts +128 -0
  738. package/src/modules/staff/lib/time-tracking-ui/boardSummary.ts +20 -0
  739. package/src/modules/staff/lib/time-tracking-ui/kanbanBoardData.ts +228 -0
  740. package/src/modules/staff/lib/time-tracking-ui/projectTeamAssignment.ts +143 -0
  741. package/src/modules/staff/lib/time-tracking-ui/taskDrawerData.ts +194 -0
  742. package/src/modules/staff/lib/time-tracking-ui/timeEntryDialogState.ts +400 -0
  743. package/src/modules/staff/lib/time-tracking-ui/timeEntryListData.ts +271 -0
  744. package/src/modules/staff/lib/time-tracking-ui/timeTrackingSettingsForm.ts +168 -0
  745. package/src/modules/staff/lib/time-tracking-ui/timesheetData.ts +225 -0
  746. package/src/modules/staff/lib/time-tracking-ui/timesheetPeriod.ts +278 -0
  747. package/src/modules/staff/lib/time-tracking-ui/timesheetTargets.ts +93 -0
  748. package/src/modules/staff/lib/time-tracking-ui/useBoardFilters.ts +107 -0
  749. package/src/modules/staff/lib/time-tracking-ui/useTimesheetPreferences.ts +245 -0
  750. package/src/modules/staff/lib/timeTrackingSeeds.ts +1037 -0
  751. package/src/modules/staff/lib/timesheets/timeEntryCacheInvalidation.ts +11 -10
  752. package/src/modules/staff/lib/timesheets/timeEntryDecoration.ts +256 -0
  753. package/src/modules/staff/lib/timesheets-projects/budgetBurn.ts +60 -0
  754. package/src/modules/staff/lib/timesheets-projects/budgetThreshold.ts +135 -0
  755. package/src/modules/staff/lib/timesheets-projects/budgetThresholdState.ts +137 -0
  756. package/src/modules/staff/lib/timesheets-projects/computeProjectFinancials.ts +142 -0
  757. package/src/modules/staff/lib/timesheets-projects/reportSelection.ts +82 -0
  758. package/src/modules/staff/lib/timesheets-projects-ui/AssignMembersDialog.tsx +237 -0
  759. package/src/modules/staff/lib/timesheets-projects-ui/ProjectBudgetCell.tsx +33 -0
  760. package/src/modules/staff/lib/timesheets-projects-ui/ProjectCard.tsx +56 -1
  761. package/src/modules/staff/lib/timesheets-projects-ui/ProjectsBulkActionsBar.tsx +90 -0
  762. package/src/modules/staff/lib/timesheets-reports/buildReportSheet.ts +125 -0
  763. package/src/modules/staff/lib/timesheets-reports/loadReportData.ts +251 -0
  764. package/src/modules/staff/lib/timesheets-reports/pdf.ts +263 -0
  765. package/src/modules/staff/lib/timesheets-reports/reportApprovalPolicies.ts +137 -0
  766. package/src/modules/staff/lib/timesheets-reports/reportConfigData.ts +247 -0
  767. package/src/modules/staff/lib/timesheets-reports/reportConfigState.ts +89 -0
  768. package/src/modules/staff/lib/timesheets-reports/reportExport.ts +373 -0
  769. package/src/modules/staff/lib/timesheets-reports/reportExportFormats.ts +71 -0
  770. package/src/modules/staff/lib/timesheets-reports/reportGroupings.ts +153 -0
  771. package/src/modules/staff/lib/timesheets-reports/reportLabels.ts +23 -0
  772. package/src/modules/staff/lib/timesheets-reports/reportReference.ts +146 -0
  773. package/src/modules/staff/lib/timesheets-reports/reportRows.ts +89 -0
  774. package/src/modules/staff/lib/timesheets-reports/reportSheetData.ts +196 -0
  775. package/src/modules/staff/lib/timesheets-reports/reportTotals.ts +544 -0
  776. package/src/modules/staff/lib/timesheets-reports/xlsx.ts +207 -0
  777. package/src/modules/staff/lib/timesheets-tasks/computeTaskRollups.ts +238 -0
  778. package/src/modules/staff/lib/timesheets-tasks/defaultStatusTemplate.ts +90 -0
  779. package/src/modules/staff/lib/timesheets-tasks/seedProjectStatuses.ts +43 -0
  780. package/src/modules/staff/lib/timesheets-tasks/statusPositions.ts +132 -0
  781. package/src/modules/staff/lib/timesheets-tasks/statusSlug.ts +43 -0
  782. package/src/modules/staff/lib/timesheets-tasks/taskHierarchy.ts +99 -0
  783. package/src/modules/staff/lib/timesheets-tasks/taskHoursTotals.ts +42 -0
  784. package/src/modules/staff/lib/timesheets-tasks/taskReference.ts +108 -0
  785. package/src/modules/staff/lib/timesheets-ui/CreateProjectDialog.tsx +18 -4
  786. package/src/modules/staff/lib/timesheets-ui/ListView.tsx +504 -149
  787. package/src/modules/staff/lib/timesheets-ui/TimerBar.tsx +50 -2
  788. package/src/modules/staff/migrations/.snapshot-open-mercato.json +3244 -228
  789. package/src/modules/staff/migrations/Migration20260813073131_staff.ts +94 -0
  790. package/src/modules/staff/migrations/Migration20260824143357_staff.ts +17 -0
  791. package/src/modules/staff/notifications.client.ts +16 -0
  792. package/src/modules/staff/notifications.handlers.ts +88 -0
  793. package/src/modules/staff/notifications.ts +163 -0
  794. package/src/modules/staff/search.ts +191 -1
  795. package/src/modules/staff/setup.ts +22 -0
  796. package/src/modules/staff/subscribers/time-project-access-requested-notification.ts +95 -0
  797. package/src/modules/staff/subscribers/time-project-budget-threshold-notification.ts +226 -0
  798. package/src/modules/staff/subscribers/time-report-approved-notification.ts +116 -0
  799. package/src/modules/staff/subscribers/time-report-portal-broadcast.ts +120 -0
  800. package/src/modules/staff/translations.ts +17 -0
  801. package/src/modules/staff/widgets/components.ts +34 -0
  802. package/src/modules/staff/widgets/injection/timer-sidebar-indicator/widget.tsx +6 -5
  803. package/src/modules/staff/widgets/notifications/TimeProjectAccessRequestedRenderer.tsx +138 -0
  804. package/src/modules/staff/widgets/notifications/index.ts +1 -0
  805. package/src/modules/staff/workers/timesheets-reapply-rounding.ts +59 -0
  806. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js +0 -123
  807. package/dist/modules/staff/backend/staff/timesheets/projects/projectFormConfig.js.map +0 -7
  808. package/src/modules/staff/backend/staff/timesheets/projects/projectFormConfig.ts +0 -138
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../src/modules/staff/backend/staff/time-tracking/reports/create/page.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\n/**\n * Screen 13 \u2014 report configuration.\n *\n * The four notes on the mockup are the four decisions this screen exists to\n * make:\n *\n * 1. **Every number recomputes on the server as the period moves** (note 1).\n * The pick-list would be guesswork otherwise. The page never adds up money\n * itself: `POST .../reports/preview` owns D-7 and the screen renders what it\n * answers, so a figure beside a project and the grand total can never come\n * from two different rules.\n * 2. **A project with no entries in the period stays listed** (note 2),\n * unticked and muted. Hiding it leaves the user asking where the UX workshop\n * project went.\n * 3. **Presets fill an editable range** (note 3 \u2192 D-4). Week/Month/Year seed\n * From and To; moving either date drops the preset to `custom`, because a\n * highlighted \"Month\" over a 1 June \u2013 19 July range would be a lie.\n * 4. **An hour already frozen in another report is excluded by default**\n * (note 4 \u2192 D-5). This deviates from the mockup, which drew silent\n * inclusion. The panel names the count, the minutes and the reports\n * responsible, and the opt-in ships unticked \u2014 re-billing the same hour must\n * be a deliberate act.\n *\n * The currency rule (R2) is enforced twice and surfaced once: the server refuses\n * a mixed selection with `422 report_currency_conflict`, and the screen renders\n * the offending projects it names rather than a generic failure.\n */\n\nimport * as React from 'react'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { AlertTriangle, FileText, Info } from 'lucide-react'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { Alert, AlertDescription, AlertTitle } from '@open-mercato/ui/primitives/alert'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { Card, CardContent, CardHeader, CardTitle } from '@open-mercato/ui/primitives/card'\nimport { Checkbox } from '@open-mercato/ui/primitives/checkbox'\nimport { Input } from '@open-mercato/ui/primitives/input'\nimport { Label } from '@open-mercato/ui/primitives/label'\nimport { Separator } from '@open-mercato/ui/primitives/separator'\nimport { SegmentedControl, SegmentedControlItem } from '@open-mercato/ui/primitives/segmented-control'\nimport {\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n} from '@open-mercato/ui/primitives/select'\nimport { Switch } from '@open-mercato/ui/primitives/switch'\nimport { Spinner } from '@open-mercato/ui/primitives/spinner'\nimport { FormHeader } from '@open-mercato/ui/backend/forms'\nimport { InjectionSpot } from '@open-mercato/ui/backend/injection/InjectionSpot'\nimport { extensionPoints } from '@open-mercato/core/modules/staff/extension-points'\nimport { extensionSpotChildId } from '@open-mercato/shared/modules/widgets/extension-points'\nimport { ErrorMessage } from '@open-mercato/ui/backend/detail'\nimport { apiCall, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { useGuardedMutation } from '@open-mercato/ui/backend/injection/useGuardedMutation'\nimport { useBackendChrome } from '@open-mercato/ui/backend/BackendChromeProvider'\nimport { flash } from '@open-mercato/ui/backend/FlashMessages'\nimport { formatCurrency } from '@open-mercato/ui/utils/format'\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { CustomerPicker, type CustomerSelection } from '../../../../../lib/time-tracking-ui/CustomerPicker'\nimport {\n applyBound,\n applyPreset,\n defaultReportTitle,\n initialReportPeriod,\n isValidReportPeriod,\n REPORT_PERIOD_PRESETS,\n spansMultipleMonths,\n type ReportPeriodState,\n} from '../../../../../lib/timesheets-reports/reportConfigState'\nimport {\n parseReportPreview,\n readCurrencyConflict,\n toCandidateProject,\n type CurrencyConflict,\n type ReportCandidateProject,\n type ReportPreview,\n} from '../../../../../lib/timesheets-reports/reportConfigData'\nimport { formatReportMinutes } from '../../../../../lib/timesheets-reports/reportTotals'\n\nconst logger = createLogger('staff').child({ component: 'time-tracking/reports/create' })\n\nconst REPORTS_HREF = '/backend/staff/time-tracking/reports'\nconst PROJECTS_API = '/api/staff/timesheets/time-projects'\nconst PREVIEW_API = '/api/staff/timesheets/reports/preview'\nconst REPORTS_API_PATH = 'staff/timesheets/reports'\nconst RATES_FEATURE = 'staff.timesheets.rates.view'\nconst MUTATION_CONTEXT_ID = 'staff.time_tracking.reportCreate'\nconst REPORT_ENTITY_ID = 'staff:staff_time_report'\nconst RESOURCE_KIND = 'staff.timesheets.time_report'\nconst CANDIDATE_PAGE_SIZE = 100\n\ntype Grouping = 'project_task' | 'project_person' | 'project_day'\ntype NonbillableMode = 'separate' | 'exclude'\n\ntype MutationContext = {\n formId: string\n resourceKind: string\n resourceId: string\n retryLastMutation: () => Promise<boolean>\n}\n\nfunction readPreselectedProjectIds(params: URLSearchParams): string[] {\n const raw = params.get('projectIds')\n return raw ? raw.split(',').map((id) => id.trim()).filter(Boolean) : []\n}\n\nfunction readRows(payload: unknown): Array<Record<string, unknown>> {\n if (!payload || typeof payload !== 'object') return []\n const items = (payload as { items?: unknown }).items\n return Array.isArray(items) ? (items.filter((row) => row && typeof row === 'object') as Array<Record<string, unknown>>) : []\n}\n\nexport default function TimeTrackingReportCreatePage() {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const scopeVersion = useOrganizationScopeVersion()\n const { payload } = useBackendChrome()\n const canSeeMoney = hasFeature(payload?.grantedFeatures, RATES_FEATURE)\n\n const [customer, setCustomer] = React.useState<CustomerSelection | null>(null)\n const [customerId, setCustomerId] = React.useState<string | null>(() => searchParams.get('customerId'))\n const [period, setPeriod] = React.useState<ReportPeriodState>(() => initialReportPeriod())\n const [candidates, setCandidates] = React.useState<ReportCandidateProject[]>([])\n const [candidatesLoading, setCandidatesLoading] = React.useState(false)\n const preselectedIds = React.useMemo(() => readPreselectedProjectIds(searchParams), [searchParams])\n const [selectedIds, setSelectedIds] = React.useState<string[]>(preselectedIds)\n // Note 2 forbids a pre-ticked project with no entries in the period, and the\n // entry counts only arrive with the candidate preview. So the default tick is\n // owed rather than applied: this flag says the screen still has to decide it\n // once the counts are in. An explicit `?projectIds=` preselection settles the\n // question up front and never becomes pending.\n const [defaultSelectionPending, setDefaultSelectionPending] = React.useState(preselectedIds.length === 0)\n const [grouping, setGrouping] = React.useState<Grouping>('project_task')\n const [nonbillableMode, setNonbillableMode] = React.useState<NonbillableMode>('separate')\n const [showRates, setShowRates] = React.useState(true)\n const [includeAlreadyReported, setIncludeAlreadyReported] = React.useState(false)\n const [title, setTitle] = React.useState('')\n const [titleTouched, setTitleTouched] = React.useState(false)\n\n const [candidatePreview, setCandidatePreview] = React.useState<ReportPreview | null>(null)\n const [preview, setPreview] = React.useState<ReportPreview | null>(null)\n const [previewLoading, setPreviewLoading] = React.useState(false)\n const [previewError, setPreviewError] = React.useState<string | null>(null)\n const [conflict, setConflict] = React.useState<CurrencyConflict | null>(null)\n const [submitting, setSubmitting] = React.useState(false)\n\n const labels = React.useMemo(\n () => ({\n customer: t('staff.time_tracking.reports.create.customer', 'Customer'),\n customerHint: t(\n 'staff.time_tracking.reports.create.customerHint',\n 'Report currency: {currency} \u2014 it comes from this customer projects.',\n ),\n unknownCustomer: t('staff.time_tracking.reports.create.unknownCustomer', 'Customer'),\n previewError: t('staff.time_tracking.reports.errors.previewFailed', 'Could not compute the report totals.'),\n createError: t('staff.time_tracking.reports.errors.createFailed', 'Could not create the report.'),\n }),\n [t],\n )\n\n const { runMutation, retryLastMutation } = useGuardedMutation<MutationContext>({\n contextId: MUTATION_CONTEXT_ID,\n blockedMessage: labels.createError,\n })\n\n const selectedIdsRef = React.useRef<string[]>(selectedIds)\n React.useEffect(() => {\n selectedIdsRef.current = selectedIds\n }, [selectedIds])\n\n React.useEffect(() => {\n if (!customer) return\n setCustomerId(customer.id)\n }, [customer])\n\n React.useEffect(() => {\n if (titleTouched) return\n setTitle(defaultReportTitle(customer?.name ?? null, period, labels.unknownCustomer))\n }, [customer?.name, labels.unknownCustomer, period, titleTouched])\n\n // The customer's whole project list, not just what is ticked: note 2 keeps an\n // empty project visible so nobody wonders where it went.\n React.useEffect(() => {\n if (!customerId) {\n setCandidates([])\n return\n }\n let cancelled = false\n setCandidatesLoading(true)\n const params = new URLSearchParams({\n page: '1',\n pageSize: String(CANDIDATE_PAGE_SIZE),\n customerId,\n })\n void readApiResultOrThrow<Record<string, unknown>>(`${PROJECTS_API}?${params.toString()}`, undefined, {\n allowNullResult: true,\n errorMessage: labels.previewError,\n })\n .then((result) => {\n if (cancelled) return\n const rows = readRows(result)\n .map(toCandidateProject)\n .filter((project): project is ReportCandidateProject => project !== null)\n setCandidates(rows)\n const allowed = new Set(rows.map((project) => project.id))\n const kept = selectedIdsRef.current.filter((id) => allowed.has(id))\n setSelectedIds(kept)\n setDefaultSelectionPending(kept.length === 0)\n })\n .catch((err) => {\n if (cancelled) return\n logger.error('staff.time_tracking.reports candidate projects failed', { err })\n setCandidates([])\n })\n .finally(() => {\n if (!cancelled) setCandidatesLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [customerId, labels.previewError, scopeVersion])\n\n const runPreview = React.useCallback(\n async (projectIds: string[], signal: AbortSignal): Promise<ReportPreview | null> => {\n if (projectIds.length === 0 || !isValidReportPeriod(period)) return null\n const call = await apiCall<Record<string, unknown>>(\n PREVIEW_API,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n customerId,\n periodKind: period.kind,\n periodFrom: period.from,\n periodTo: period.to,\n grouping,\n nonbillableMode,\n includeAlreadyReported,\n showRates,\n timeProjectIds: projectIds,\n }),\n signal,\n },\n )\n if (!call.ok) {\n const currencyConflict = readCurrencyConflict(call.result)\n if (currencyConflict) {\n setConflict(currencyConflict)\n return null\n }\n const message =\n (call.result && typeof call.result === 'object' && typeof (call.result as { error?: unknown }).error === 'string'\n ? ((call.result as { error: string }).error)\n : null) ?? labels.previewError\n throw new Error(message)\n }\n setConflict(null)\n return parseReportPreview(call.result)\n },\n [customerId, grouping, includeAlreadyReported, labels.previewError, nonbillableMode, period, showRates],\n )\n\n // Per-project figures depend only on (project, period), never on the ticks, so\n // they are fetched once for the whole candidate set and stay put while the\n // user changes the selection.\n React.useEffect(() => {\n if (candidates.length === 0) {\n setCandidatePreview(null)\n return\n }\n const controller = new AbortController()\n void runPreview(candidates.map((project) => project.id), controller.signal)\n .then((result) => {\n if (!controller.signal.aborted) setCandidatePreview(result)\n })\n .catch((err) => {\n if (controller.signal.aborted) return\n logger.error('staff.time_tracking.reports candidate preview failed', { err })\n })\n return () => controller.abort()\n }, [candidates, runPreview])\n\n React.useEffect(() => {\n if (selectedIds.length === 0) {\n setPreview(null)\n setPreviewError(null)\n return\n }\n const controller = new AbortController()\n setPreviewLoading(true)\n setPreviewError(null)\n void runPreview(selectedIds, controller.signal)\n .then((result) => {\n if (!controller.signal.aborted) setPreview(result)\n })\n .catch((err) => {\n if (controller.signal.aborted) return\n setPreview(null)\n setPreviewError(err instanceof Error ? err.message : labels.previewError)\n })\n .finally(() => {\n if (!controller.signal.aborted) setPreviewLoading(false)\n })\n return () => controller.abort()\n }, [labels.previewError, runPreview, selectedIds])\n\n const projectFigures = React.useMemo(() => {\n const map = new Map<string, { entryCount: number; minutes: number; amount: number | null }>()\n for (const row of candidatePreview?.projects ?? []) {\n map.set(row.id, {\n entryCount: row.entryCount,\n minutes: row.billableMinutes + row.nonbillableMinutes,\n amount: row.amount,\n })\n }\n return map\n }, [candidatePreview])\n\n // The counts decide the default: every project with time in the period is\n // ticked, the empty ones stay listed and untouched. Whatever the user ticked\n // while the counts were in flight is merged in rather than overwritten \u2014 the\n // screen settles the default once and then leaves the selection alone.\n React.useEffect(() => {\n if (!defaultSelectionPending || !candidatePreview || candidates.length === 0) return\n const withEntries = candidates\n .filter((project) => (projectFigures.get(project.id)?.entryCount ?? 0) > 0)\n .map((project) => project.id)\n setSelectedIds((current) => Array.from(new Set([...current, ...withEntries])))\n setDefaultSelectionPending(false)\n }, [candidatePreview, candidates, defaultSelectionPending, projectFigures])\n\n const currencyCode = preview?.currencyCode ?? candidatePreview?.currencyCode ?? null\n\n const money = React.useCallback(\n (amount: number | null | undefined) => {\n if (amount === null || amount === undefined) return '\u2014'\n return formatCurrency(amount, currencyCode ?? undefined) ?? '\u2014'\n },\n [currencyCode],\n )\n\n const toggleProject = React.useCallback((projectId: string, checked: boolean) => {\n setSelectedIds((current) =>\n checked ? Array.from(new Set([...current, projectId])) : current.filter((id) => id !== projectId),\n )\n }, [])\n\n const reportFormValues = React.useMemo(\n () => ({\n customerId,\n timeProjectIds: selectedIds,\n periodFrom: period.from,\n periodTo: period.to,\n grouping,\n nonbillableMode,\n showRates,\n includeAlreadyReported,\n title,\n }),\n [customerId, grouping, includeAlreadyReported, nonbillableMode, period.from, period.to, selectedIds, showRates, title],\n )\n\n const reportFormInjectionContext = React.useMemo(\n () => ({\n formId: MUTATION_CONTEXT_ID,\n entityId: REPORT_ENTITY_ID,\n recordId: null,\n resourceKind: 'staff.timesheets.time_report',\n resourceId: 'new',\n operation: 'create' as const,\n retryLastMutation,\n }),\n [retryLastMutation],\n )\n\n const canSubmit =\n Boolean(customerId) &&\n selectedIds.length > 0 &&\n isValidReportPeriod(period) &&\n title.trim().length > 0 &&\n !conflict &&\n !submitting\n\n const handleSubmit = React.useCallback(async () => {\n if (!customerId || selectedIds.length === 0) return\n setSubmitting(true)\n try {\n const call = await runMutation({\n operation: () =>\n apiCall<{ id?: string | null }>(\n `/api/${REPORTS_API_PATH}`,\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n customerId,\n title: title.trim(),\n periodKind: period.kind,\n periodFrom: period.from,\n periodTo: period.to,\n grouping,\n nonbillableMode,\n includeAlreadyReported,\n showRates,\n timeProjectIds: selectedIds,\n }),\n },\n ),\n context: {\n formId: MUTATION_CONTEXT_ID,\n resourceKind: RESOURCE_KIND,\n resourceId: 'new',\n retryLastMutation,\n },\n mutationPayload: { customerId, timeProjectIds: selectedIds },\n })\n if (!call.ok) {\n const currencyConflict = readCurrencyConflict(call.result)\n if (currencyConflict) {\n setConflict(currencyConflict)\n return\n }\n const message =\n call.result && typeof call.result === 'object' && typeof (call.result as { error?: unknown }).error === 'string'\n ? (call.result as { error: string }).error\n : labels.createError\n flash(message, 'error')\n return\n }\n const reportId = call.result?.id ?? null\n flash(t('staff.time_tracking.reports.create.created', 'Report generated.'), 'success')\n router.push(reportId ? `${REPORTS_HREF}/${reportId}` : REPORTS_HREF)\n } catch (err) {\n logger.error('staff.time_tracking.reports create failed', { err })\n flash(err instanceof Error ? err.message : labels.createError, 'error')\n } finally {\n setSubmitting(false)\n }\n }, [\n customerId,\n grouping,\n includeAlreadyReported,\n labels.createError,\n nonbillableMode,\n period,\n retryLastMutation,\n router,\n runMutation,\n selectedIds,\n showRates,\n t,\n title,\n ])\n\n return (\n <Page>\n <PageBody>\n <FormHeader\n mode=\"detail\"\n title={t('staff.time_tracking.reports.create.title', 'New report')}\n subtitle={t('staff.time_tracking.reports.create.subtitle', 'A report always covers one customer.')}\n backHref={REPORTS_HREF}\n />\n\n <div className=\"grid gap-6 lg:grid-cols-[minmax(0,2fr)_minmax(0,1fr)]\">\n <div className=\"flex flex-col gap-6\">\n <InjectionSpot\n spotId={extensionSpotChildId(extensionPoints.hosts.reportForm.spotId, 'before-fields')}\n context={reportFormInjectionContext}\n data={reportFormValues}\n />\n\n <section className=\"flex flex-col gap-2\">\n <Label htmlFor=\"report-customer\">{labels.customer}</Label>\n <CustomerPicker\n value={customerId}\n snapshot={customer}\n onChange={(selection) => {\n setCustomer(selection)\n setCustomerId(selection?.id ?? null)\n setSelectedIds([])\n setDefaultSelectionPending(true)\n setConflict(null)\n }}\n />\n {currencyCode ? (\n <p className=\"text-xs text-muted-foreground\">\n {labels.customerHint.replace('{currency}', currencyCode)}\n </p>\n ) : null}\n </section>\n\n <section className=\"flex flex-col gap-2\">\n <Label htmlFor=\"report-title\">\n {t('staff.time_tracking.reports.create.reportTitle', 'Report title')}\n </Label>\n <Input\n id=\"report-title\"\n value={title}\n onChange={(event) => {\n setTitleTouched(true)\n setTitle(event.target.value)\n }}\n />\n </section>\n\n <section className=\"flex flex-col gap-3\">\n <Label>{t('staff.time_tracking.reports.create.period', 'Period')}</Label>\n <SegmentedControl\n value={period.kind === 'custom' ? '' : period.kind}\n onValueChange={(value) => {\n if (value === 'week' || value === 'month' || value === 'year') {\n setPeriod((current) => applyPreset(current, value))\n }\n }}\n >\n {REPORT_PERIOD_PRESETS.map((preset) => (\n <SegmentedControlItem key={preset} value={preset}>\n {t(`staff.time_tracking.reports.create.preset.${preset}`, preset)}\n </SegmentedControlItem>\n ))}\n </SegmentedControl>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"report-from\">{t('staff.time_tracking.reports.create.from', 'From')}</Label>\n <Input\n id=\"report-from\"\n type=\"date\"\n value={period.from}\n onChange={(event) => setPeriod((current) => applyBound(current, 'from', event.target.value))}\n />\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"report-to\">{t('staff.time_tracking.reports.create.to', 'To')}</Label>\n <Input\n id=\"report-to\"\n type=\"date\"\n value={period.to}\n onChange={(event) => setPeriod((current) => applyBound(current, 'to', event.target.value))}\n />\n </div>\n </div>\n {!isValidReportPeriod(period) ? (\n <p className=\"text-xs text-status-error-text\">\n {t('staff.time_tracking.reports.create.invalidPeriod', 'The end date must not precede the start date.')}\n </p>\n ) : spansMultipleMonths(period) ? (\n <p className=\"text-xs text-muted-foreground\">\n {t(\n 'staff.time_tracking.reports.create.spansMonths',\n 'This range covers more than one month \u2014 adjust the dates if you only want one of them.',\n )}\n </p>\n ) : null}\n </section>\n\n <section className=\"flex flex-col gap-2\">\n <div>\n <Label>{t('staff.time_tracking.reports.create.projects', 'Customer projects')}</Label>\n <p className=\"text-xs text-muted-foreground\">\n {t('staff.time_tracking.reports.create.projectsHint', 'Tick the projects this report should cover.')}\n </p>\n </div>\n {candidatesLoading ? (\n <div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n <Spinner className=\"size-4\" />\n {t('staff.time_tracking.reports.create.loadingProjects', 'Loading projects\u2026')}\n </div>\n ) : candidates.length === 0 ? (\n <p className=\"rounded-md border border-border p-4 text-sm text-muted-foreground\">\n {customerId\n ? t('staff.time_tracking.reports.create.noProjects', 'This customer has no time projects yet.')\n : t('staff.time_tracking.reports.create.pickCustomer', 'Pick a customer to see their projects.')}\n </p>\n ) : (\n <ul className=\"divide-y divide-border rounded-md border border-border\">\n {candidates.map((project) => {\n const figures = projectFigures.get(project.id)\n const empty = (figures?.entryCount ?? 0) === 0\n const checked = selectedIds.includes(project.id)\n const isOffender = conflict?.offenders.some((offender) => offender.id === project.id) ?? false\n return (\n <li\n key={project.id}\n className={`flex items-center gap-3 p-3 ${empty && !checked ? 'opacity-60' : ''}`}\n >\n <Checkbox\n checked={checked}\n onCheckedChange={(value) => toggleProject(project.id, value === true)}\n aria-label={project.name}\n />\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"truncate text-sm font-medium\">{project.name}</span>\n <span className=\"text-xs text-muted-foreground\">\n {[\n canSeeMoney && project.hourlyRate !== null\n ? `${money(project.hourlyRate)}/h`\n : null,\n t('staff.time_tracking.reports.create.entriesInPeriod', '{count} entries in period').replace(\n '{count}',\n String(figures?.entryCount ?? 0),\n ),\n isOffender && project.currencyCode ? project.currencyCode : null,\n ]\n .filter(Boolean)\n .join(' \u00B7 ')}\n </span>\n </div>\n <span className=\"font-mono text-sm tabular-nums\">\n {formatReportMinutes(figures?.minutes ?? 0)}\n </span>\n <span className=\"w-28 text-right font-mono text-sm tabular-nums text-muted-foreground\">\n {canSeeMoney ? money(figures?.amount ?? null) : '\u2014'}\n </span>\n </li>\n )\n })}\n </ul>\n )}\n </section>\n\n <section className=\"flex flex-col gap-3\">\n <Label>{t('staff.time_tracking.reports.create.presentation', 'Presentation')}</Label>\n <div className=\"grid gap-3 sm:grid-cols-2\">\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"report-grouping\">\n {t('staff.time_tracking.reports.create.grouping', 'Grouping')}\n </Label>\n <Select value={grouping} onValueChange={(value) => setGrouping(value as Grouping)}>\n <SelectTrigger id=\"report-grouping\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"project_task\">\n {t('staff.time_tracking.reports.grouping.project_task', 'Project \u2192 task')}\n </SelectItem>\n <SelectItem value=\"project_person\">\n {t('staff.time_tracking.reports.grouping.project_person', 'Project \u2192 person')}\n </SelectItem>\n <SelectItem value=\"project_day\">\n {t('staff.time_tracking.reports.grouping.project_day', 'Project \u2192 day')}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n <Label htmlFor=\"report-nonbillable\">\n {t('staff.time_tracking.reports.create.nonbillable', 'Non-billable time')}\n </Label>\n <Select\n value={nonbillableMode}\n onValueChange={(value) => setNonbillableMode(value as NonbillableMode)}\n >\n <SelectTrigger id=\"report-nonbillable\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"separate\">\n {t('staff.time_tracking.reports.nonbillable.separate', 'Show separately, at no cost')}\n </SelectItem>\n <SelectItem value=\"exclude\">\n {t('staff.time_tracking.reports.nonbillable.exclude', 'Leave it out entirely')}\n </SelectItem>\n </SelectContent>\n </Select>\n </div>\n </div>\n <div className=\"flex items-start gap-3\">\n <Switch\n checked={showRates}\n onCheckedChange={(value) => setShowRates(value === true)}\n aria-label={t('staff.time_tracking.reports.create.showRates', 'Show hourly rates')}\n disabled={!canSeeMoney}\n />\n <div className=\"flex flex-col\">\n <span className=\"text-sm font-medium\">\n {t('staff.time_tracking.reports.create.showRates', 'Show hourly rates')}\n </span>\n <span className=\"text-xs text-muted-foreground\">\n {t(\n 'staff.time_tracking.reports.create.showRatesHint',\n 'Turn off if the client should see amounts only.',\n )}\n </span>\n </div>\n </div>\n </section>\n\n <InjectionSpot\n spotId={extensionSpotChildId(extensionPoints.hosts.reportForm.spotId, 'fields')}\n context={reportFormInjectionContext}\n data={reportFormValues}\n />\n </div>\n\n <aside className=\"flex flex-col gap-4\">\n <Card>\n <CardHeader>\n <CardTitle>{t('staff.time_tracking.reports.create.summary', 'Range summary')}</CardTitle>\n </CardHeader>\n <CardContent className=\"flex flex-col gap-3\">\n <SummaryRow\n label={t('staff.time_tracking.reports.create.summaryProjects', 'Projects')}\n value={`${selectedIds.length} / ${candidates.length}`}\n />\n <SummaryRow\n label={t('staff.time_tracking.reports.create.summaryEntries', 'Entries')}\n value={String(preview?.totals.entryCount ?? 0)}\n mono\n />\n <SummaryRow\n label={t('staff.time_tracking.reports.create.summaryBillable', 'Billable time')}\n value={formatReportMinutes(preview?.totals.billableMinutes ?? 0)}\n mono\n />\n <SummaryRow\n label={t('staff.time_tracking.reports.create.summaryNonbillable', 'Non-billable')}\n value={formatReportMinutes(preview?.totals.nonbillableMinutes ?? 0)}\n mono\n />\n <Separator />\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {t('staff.time_tracking.reports.create.summaryTotal', 'To invoice')}\n </span>\n <span className=\"font-mono text-sm font-semibold tabular-nums\">\n {previewLoading ? <Spinner className=\"size-4\" /> : money(preview?.totals.totalAmount ?? null)}\n </span>\n </div>\n </CardContent>\n </Card>\n\n {conflict ? (\n <Alert status=\"error\">\n <AlertTitle>\n {t('staff.time_tracking.reports.errors.currencyConflictTitle', 'Mixed currencies in this selection')}\n </AlertTitle>\n <AlertDescription>\n <p>\n {t(\n 'staff.time_tracking.reports.errors.currencyConflict',\n 'A report always covers one currency. Selected projects use {currencies}.',\n ).replace('{currencies}', conflict.currencies.join(', '))}\n </p>\n <ul className=\"mt-2 list-disc pl-4\">\n {conflict.offenders.map((offender) => (\n <li key={offender.id}>\n {offender.name} \u2014 {offender.currencyCode ?? '\u2014'}\n </li>\n ))}\n </ul>\n </AlertDescription>\n </Alert>\n ) : null}\n\n {previewError ? <ErrorMessage label={previewError} /> : null}\n\n {(preview?.alreadyReportedCount ?? 0) > 0 || includeAlreadyReported ? (\n <Alert status=\"warning\" icon={<AlertTriangle aria-hidden=\"true\" />}>\n <AlertTitle>\n {t(\n 'staff.time_tracking.reports.alreadyReported.title',\n '{count} entries are already in another report',\n ).replace('{count}', String(preview?.alreadyReportedCount ?? 0))}\n </AlertTitle>\n <AlertDescription>\n <p>\n {t(\n 'staff.time_tracking.reports.alreadyReported.body',\n 'They are excluded from this report so the same hour is not billed twice. Including them adds {hours} at the values frozen when those reports were closed.',\n ).replace('{hours}', formatReportMinutes(preview?.alreadyReportedMinutes ?? 0))}\n </p>\n {(preview?.alreadyReportedIn.length ?? 0) > 0 ? (\n <ul className=\"mt-2 list-disc pl-4\">\n {preview?.alreadyReportedIn.map((source) => (\n <li key={source.reportId}>\n <a className=\"underline\" href={`${REPORTS_HREF}/${source.reportId}`}>\n {source.reference ?? source.title ?? source.reportId}\n </a>{' '}\n \u2014 {source.entryCount} \u00B7 {formatReportMinutes(source.minutes)}\n </li>\n ))}\n </ul>\n ) : null}\n <label className=\"mt-3 flex items-start gap-2\">\n <Checkbox\n checked={includeAlreadyReported}\n onCheckedChange={(value) => setIncludeAlreadyReported(value === true)}\n />\n <span className=\"text-sm\">\n {t(\n 'staff.time_tracking.reports.alreadyReported.optIn',\n 'Include them anyway, at their frozen values',\n )}\n </span>\n </label>\n </AlertDescription>\n </Alert>\n ) : null}\n\n <Alert status=\"information\" icon={<Info aria-hidden=\"true\" />}>\n <AlertDescription>\n {t(\n 'staff.time_tracking.reports.create.roundingNotice',\n 'Rounding: {rule} (global). Every amount above is rounded at the entry and then summed, so the printed lines add up to the total.',\n ).replace(\n '{rule}',\n preview?.rounding.unitMinutes || candidatePreview?.rounding.unitMinutes\n ? t('staff.time_tracking.reports.create.roundingRule', '{minutes} min, {direction}')\n .replace(\n '{minutes}',\n String(preview?.rounding.unitMinutes ?? candidatePreview?.rounding.unitMinutes ?? 0),\n )\n .replace(\n '{direction}',\n (preview?.rounding.direction ?? candidatePreview?.rounding.direction) === 'nearest'\n ? t('staff.time_tracking.reports.create.roundingNearest', 'to the nearest')\n : t('staff.time_tracking.reports.create.roundingUp', 'always up'),\n )\n : t('staff.time_tracking.reports.create.roundingOff', 'off'),\n )}\n </AlertDescription>\n </Alert>\n </aside>\n </div>\n\n <InjectionSpot\n spotId={extensionSpotChildId(extensionPoints.hosts.reportForm.spotId, 'after-fields')}\n context={reportFormInjectionContext}\n data={reportFormValues}\n />\n\n <div className=\"mt-6 flex items-center justify-end gap-2\">\n <InjectionSpot\n spotId={extensionSpotChildId(extensionPoints.hosts.reportForm.spotId, 'footer')}\n context={reportFormInjectionContext}\n data={reportFormValues}\n />\n <Button variant=\"ghost\" onClick={() => router.push(REPORTS_HREF)}>\n {t('staff.time_tracking.reports.create.cancel', 'Cancel')}\n </Button>\n <Button onClick={() => void handleSubmit()} disabled={!canSubmit}>\n <FileText aria-hidden=\"true\" />\n {t('staff.time_tracking.reports.create.submit', 'Generate preview')}\n </Button>\n </div>\n </PageBody>\n </Page>\n )\n}\n\nfunction SummaryRow({ label, value, mono }: { label: string; value: string; mono?: boolean }) {\n return (\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm text-muted-foreground\">{label}</span>\n <span className={mono ? 'font-mono text-sm tabular-nums' : 'text-sm font-medium'}>{value}</span>\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,16 @@
1
+ const metadata = {
2
+ requireAuth: true,
3
+ requireFeatures: ["staff.timesheets.reports.manage"],
4
+ pageTitle: "New report",
5
+ pageTitleKey: "staff.time_tracking.reports.create.title",
6
+ navHidden: true,
7
+ breadcrumb: [
8
+ { label: "Time tracking", labelKey: "staff.time_tracking.nav.group", href: "/backend/staff/time-tracking" },
9
+ { label: "Reports", labelKey: "staff.time_tracking.nav.reports", href: "/backend/staff/time-tracking/reports" },
10
+ { label: "New report", labelKey: "staff.time_tracking.reports.create.title" }
11
+ ]
12
+ };
13
+ export {
14
+ metadata
15
+ };
16
+ //# sourceMappingURL=page.meta.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../../src/modules/staff/backend/staff/time-tracking/reports/create/page.meta.ts"],
4
+ "sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['staff.timesheets.reports.manage'],\n pageTitle: 'New report',\n pageTitleKey: 'staff.time_tracking.reports.create.title',\n navHidden: true,\n breadcrumb: [\n { label: 'Time tracking', labelKey: 'staff.time_tracking.nav.group', href: '/backend/staff/time-tracking' },\n { label: 'Reports', labelKey: 'staff.time_tracking.nav.reports', href: '/backend/staff/time-tracking/reports' },\n { label: 'New report', labelKey: 'staff.time_tracking.reports.create.title' },\n ],\n}\n"],
5
+ "mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,iCAAiC;AAAA,EACnD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,YAAY;AAAA,IACV,EAAE,OAAO,iBAAiB,UAAU,iCAAiC,MAAM,+BAA+B;AAAA,IAC1G,EAAE,OAAO,WAAW,UAAU,mCAAmC,MAAM,uCAAuC;AAAA,IAC9G,EAAE,OAAO,cAAc,UAAU,2CAA2C;AAAA,EAC9E;AACF;",
6
+ "names": []
7
+ }
@@ -0,0 +1,174 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import { extensionPoints } from "@open-mercato/core/modules/staff/extension-points";
4
+ import * as React from "react";
5
+ import { useRouter, useSearchParams } from "next/navigation";
6
+ import { FileText, Lock, Plus } from "lucide-react";
7
+ import { Page, PageBody } from "@open-mercato/ui/backend/Page";
8
+ import { DataTable } from "@open-mercato/ui/backend/DataTable";
9
+ import { Badge } from "@open-mercato/ui/primitives/badge";
10
+ import { Button } from "@open-mercato/ui/primitives/button";
11
+ import { readApiResultOrThrow } from "@open-mercato/ui/backend/utils/apiCall";
12
+ import { formatCurrency } from "@open-mercato/ui/utils/format";
13
+ import { hasFeature } from "@open-mercato/shared/security/features";
14
+ import { useBackendChrome } from "@open-mercato/ui/backend/BackendChromeProvider";
15
+ import { useT } from "@open-mercato/shared/lib/i18n/context";
16
+ import { useOrganizationScopeVersion } from "@open-mercato/shared/lib/frontend/useOrganizationScope";
17
+ import { createLogger } from "@open-mercato/shared/lib/logger";
18
+ import { readCustomerName } from "../../../../lib/timesheets-reports/reportSheetData.js";
19
+ import { readNumber } from "../../../../lib/timesheets-reports/reportConfigData.js";
20
+ import { formatReportMinutes } from "../../../../lib/timesheets-reports/reportTotals.js";
21
+ const logger = createLogger("staff").child({ component: "time-tracking/reports/list" });
22
+ const REPORTS_HREF = "/backend/staff/time-tracking/reports";
23
+ const REPORTS_API = "/api/staff/timesheets/reports";
24
+ const MANAGE_FEATURE = "staff.timesheets.reports.manage";
25
+ const RATES_FEATURE = "staff.timesheets.rates.view";
26
+ const PAGE_SIZE = 25;
27
+ function toRow(raw) {
28
+ const id = typeof raw.id === "string" ? raw.id : null;
29
+ if (!id) return null;
30
+ return {
31
+ id,
32
+ reference: typeof raw.reference === "string" ? raw.reference : "",
33
+ title: typeof raw.title === "string" ? raw.title : "",
34
+ customerName: readCustomerName(raw.customer_snapshot ?? raw.customerSnapshot) ?? "",
35
+ status: raw.status === "closed" ? "closed" : "draft",
36
+ periodFrom: typeof raw.period_from === "string" ? raw.period_from.slice(0, 10) : "",
37
+ periodTo: typeof raw.period_to === "string" ? raw.period_to.slice(0, 10) : "",
38
+ currencyCode: typeof raw.currency_code === "string" ? raw.currency_code : null,
39
+ totalAmount: readNumber(raw.total_amount),
40
+ totalBillableMinutes: readNumber(raw.total_billable_minutes)
41
+ };
42
+ }
43
+ function TimeTrackingReportsPage() {
44
+ const t = useT();
45
+ const router = useRouter();
46
+ const searchParams = useSearchParams();
47
+ const scopeVersion = useOrganizationScopeVersion();
48
+ const { payload } = useBackendChrome();
49
+ const canManage = hasFeature(payload?.grantedFeatures, MANAGE_FEATURE);
50
+ const canSeeMoney = hasFeature(payload?.grantedFeatures, RATES_FEATURE);
51
+ const [rows, setRows] = React.useState([]);
52
+ const [total, setTotal] = React.useState(0);
53
+ const [totalIsCapped, setTotalIsCapped] = React.useState(false);
54
+ const [page, setPage] = React.useState(1);
55
+ const [loading, setLoading] = React.useState(true);
56
+ const handoffCustomerId = searchParams.get("customerId");
57
+ const handoffProjectIds = searchParams.get("projectIds");
58
+ React.useEffect(() => {
59
+ if (!handoffCustomerId && !handoffProjectIds) return;
60
+ const params = new URLSearchParams();
61
+ if (handoffCustomerId) params.set("customerId", handoffCustomerId);
62
+ if (handoffProjectIds) params.set("projectIds", handoffProjectIds);
63
+ router.replace(`${REPORTS_HREF}/create?${params.toString()}`);
64
+ }, [handoffCustomerId, handoffProjectIds, router]);
65
+ React.useEffect(() => {
66
+ let cancelled = false;
67
+ setLoading(true);
68
+ const params = new URLSearchParams({ page: String(page), pageSize: String(PAGE_SIZE) });
69
+ void readApiResultOrThrow(`${REPORTS_API}?${params.toString()}`, void 0, {
70
+ allowNullResult: true
71
+ }).then((result) => {
72
+ if (cancelled) return;
73
+ const items = Array.isArray(result?.items) ? result.items : [];
74
+ setRows(items.map(toRow).filter((row) => row !== null));
75
+ setTotal(readNumber(result?.total) ?? 0);
76
+ setTotalIsCapped(result?.totalIsCapped === true);
77
+ }).catch((err) => {
78
+ if (cancelled) return;
79
+ logger.error("staff.time_tracking.reports list failed", { err });
80
+ setRows([]);
81
+ setTotal(0);
82
+ setTotalIsCapped(false);
83
+ }).finally(() => {
84
+ if (!cancelled) setLoading(false);
85
+ });
86
+ return () => {
87
+ cancelled = true;
88
+ };
89
+ }, [page, scopeVersion]);
90
+ const columns = React.useMemo(() => {
91
+ const base = [
92
+ {
93
+ id: "reference",
94
+ header: t("staff.time_tracking.reports.list.reference", "Number"),
95
+ accessorKey: "reference",
96
+ cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "font-mono text-xs", children: row.original.reference })
97
+ },
98
+ {
99
+ id: "title",
100
+ header: t("staff.time_tracking.reports.list.title", "Report"),
101
+ accessorKey: "title",
102
+ cell: ({ row }) => /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
103
+ /* @__PURE__ */ jsx("span", { className: "font-medium", children: row.original.title }),
104
+ row.original.customerName ? /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: row.original.customerName }) : null
105
+ ] })
106
+ },
107
+ {
108
+ id: "period",
109
+ header: t("staff.time_tracking.reports.list.period", "Period"),
110
+ cell: ({ row }) => /* @__PURE__ */ jsxs("span", { className: "text-sm text-muted-foreground", children: [
111
+ row.original.periodFrom,
112
+ " \u2013 ",
113
+ row.original.periodTo
114
+ ] })
115
+ },
116
+ {
117
+ id: "status",
118
+ header: t("staff.time_tracking.reports.list.status", "Status"),
119
+ cell: ({ row }) => row.original.status === "closed" ? /* @__PURE__ */ jsxs(Badge, { variant: "success", children: [
120
+ /* @__PURE__ */ jsx(Lock, { "aria-hidden": "true", className: "size-3" }),
121
+ t("staff.time_tracking.reports.status.closed", "Closed")
122
+ ] }) : /* @__PURE__ */ jsx(Badge, { variant: "warning", children: t("staff.time_tracking.reports.status.draft", "Draft") })
123
+ },
124
+ {
125
+ id: "hours",
126
+ header: t("staff.time_tracking.reports.list.hours", "Billable"),
127
+ cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "font-mono text-sm tabular-nums", children: row.original.totalBillableMinutes === null ? "\u2014" : formatReportMinutes(row.original.totalBillableMinutes) })
128
+ }
129
+ ];
130
+ if (canSeeMoney) {
131
+ base.push({
132
+ id: "amount",
133
+ header: t("staff.time_tracking.reports.list.amount", "Total"),
134
+ cell: ({ row }) => /* @__PURE__ */ jsx("span", { className: "font-mono text-sm tabular-nums", children: row.original.totalAmount === null ? "\u2014" : formatCurrency(row.original.totalAmount, row.original.currencyCode ?? void 0) ?? "\u2014" })
135
+ });
136
+ }
137
+ return base;
138
+ }, [canSeeMoney, t]);
139
+ return /* @__PURE__ */ jsx(Page, { children: /* @__PURE__ */ jsx(PageBody, { children: /* @__PURE__ */ jsx(
140
+ DataTable,
141
+ {
142
+ extensionTableId: extensionPoints.hosts.timeReportsTable.tableId,
143
+ title: t("staff.time_tracking.nav.reports", "Reports"),
144
+ titleHeadingLevel: 1,
145
+ columns,
146
+ data: rows,
147
+ isLoading: loading,
148
+ pagination: {
149
+ page,
150
+ pageSize: PAGE_SIZE,
151
+ total,
152
+ totalIsCapped,
153
+ totalPages: Math.max(1, Math.ceil(total / PAGE_SIZE)),
154
+ onPageChange: setPage
155
+ },
156
+ onRowClick: (row) => router.push(`${REPORTS_HREF}/${row.id}`),
157
+ emptyState: /* @__PURE__ */ jsx("div", { className: "py-12 text-center text-sm text-muted-foreground", children: t(
158
+ "staff.time_tracking.reports.list.empty",
159
+ "No reports yet. Generate one for a customer to see what is billable."
160
+ ) }),
161
+ actions: canManage ? /* @__PURE__ */ jsxs(Button, { onClick: () => router.push(`${REPORTS_HREF}/create`), children: [
162
+ /* @__PURE__ */ jsx(Plus, { "aria-hidden": "true" }),
163
+ t("staff.time_tracking.reports.list.create", "New report")
164
+ ] }) : /* @__PURE__ */ jsxs("span", { className: "inline-flex items-center gap-2 text-sm text-muted-foreground", children: [
165
+ /* @__PURE__ */ jsx(FileText, { "aria-hidden": "true", className: "size-4" }),
166
+ t("staff.time_tracking.reports.list.readOnly", "You can view reports but not create them.")
167
+ ] })
168
+ }
169
+ ) }) });
170
+ }
171
+ export {
172
+ TimeTrackingReportsPage as default
173
+ };
174
+ //# sourceMappingURL=page.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/staff/backend/staff/time-tracking/reports/page.tsx"],
4
+ "sourcesContent": ["\"use client\"\n\n/**\n * The reports index. The mockups never draw it \u2014 they start at \"New report\" \u2014\n * but a closed report is a document somebody has to be able to find again\n * months later, and screen 13's already-reported panel links straight to the\n * reports that froze an hour. Without a list those links land nowhere.\n *\n * It also absorbs the projects list's \"Report from selected\" hand-off: that\n * screen pushes `?customerId=\u2026&projectIds=\u2026` here, and this page forwards the\n * selection to the configuration screen rather than making the user re-pick it.\n */\n\nimport { extensionPoints } from '@open-mercato/core/modules/staff/extension-points'\nimport * as React from 'react'\nimport { useRouter, useSearchParams } from 'next/navigation'\nimport { FileText, Lock, Plus } from 'lucide-react'\nimport type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'\nimport { Page, PageBody } from '@open-mercato/ui/backend/Page'\nimport { DataTable } from '@open-mercato/ui/backend/DataTable'\nimport { Badge } from '@open-mercato/ui/primitives/badge'\nimport { Button } from '@open-mercato/ui/primitives/button'\nimport { readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'\nimport { formatCurrency } from '@open-mercato/ui/utils/format'\nimport { hasFeature } from '@open-mercato/shared/security/features'\nimport { useBackendChrome } from '@open-mercato/ui/backend/BackendChromeProvider'\nimport { useT } from '@open-mercato/shared/lib/i18n/context'\nimport { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'\nimport { createLogger } from '@open-mercato/shared/lib/logger'\nimport { readCustomerName } from '../../../../lib/timesheets-reports/reportSheetData'\nimport { readNumber } from '../../../../lib/timesheets-reports/reportConfigData'\nimport { formatReportMinutes } from '../../../../lib/timesheets-reports/reportTotals'\n\nconst logger = createLogger('staff').child({ component: 'time-tracking/reports/list' })\n\nconst REPORTS_HREF = '/backend/staff/time-tracking/reports'\nconst REPORTS_API = '/api/staff/timesheets/reports'\nconst MANAGE_FEATURE = 'staff.timesheets.reports.manage'\nconst RATES_FEATURE = 'staff.timesheets.rates.view'\nconst PAGE_SIZE = 25\n\ntype ReportRow = {\n id: string\n reference: string\n title: string\n customerName: string\n status: 'draft' | 'closed'\n periodFrom: string\n periodTo: string\n currencyCode: string | null\n totalAmount: number | null\n totalBillableMinutes: number | null\n}\n\nfunction toRow(raw: Record<string, unknown>): ReportRow | null {\n const id = typeof raw.id === 'string' ? raw.id : null\n if (!id) return null\n return {\n id,\n reference: typeof raw.reference === 'string' ? raw.reference : '',\n title: typeof raw.title === 'string' ? raw.title : '',\n customerName: readCustomerName(raw.customer_snapshot ?? raw.customerSnapshot) ?? '',\n status: raw.status === 'closed' ? 'closed' : 'draft',\n periodFrom: typeof raw.period_from === 'string' ? raw.period_from.slice(0, 10) : '',\n periodTo: typeof raw.period_to === 'string' ? raw.period_to.slice(0, 10) : '',\n currencyCode: typeof raw.currency_code === 'string' ? raw.currency_code : null,\n totalAmount: readNumber(raw.total_amount),\n totalBillableMinutes: readNumber(raw.total_billable_minutes),\n }\n}\n\nexport default function TimeTrackingReportsPage() {\n const t = useT()\n const router = useRouter()\n const searchParams = useSearchParams()\n const scopeVersion = useOrganizationScopeVersion()\n const { payload } = useBackendChrome()\n const canManage = hasFeature(payload?.grantedFeatures, MANAGE_FEATURE)\n const canSeeMoney = hasFeature(payload?.grantedFeatures, RATES_FEATURE)\n\n const [rows, setRows] = React.useState<ReportRow[]>([])\n const [total, setTotal] = React.useState(0)\n const [totalIsCapped, setTotalIsCapped] = React.useState(false)\n const [page, setPage] = React.useState(1)\n const [loading, setLoading] = React.useState(true)\n\n const handoffCustomerId = searchParams.get('customerId')\n const handoffProjectIds = searchParams.get('projectIds')\n\n React.useEffect(() => {\n if (!handoffCustomerId && !handoffProjectIds) return\n const params = new URLSearchParams()\n if (handoffCustomerId) params.set('customerId', handoffCustomerId)\n if (handoffProjectIds) params.set('projectIds', handoffProjectIds)\n router.replace(`${REPORTS_HREF}/create?${params.toString()}`)\n }, [handoffCustomerId, handoffProjectIds, router])\n\n React.useEffect(() => {\n let cancelled = false\n setLoading(true)\n const params = new URLSearchParams({ page: String(page), pageSize: String(PAGE_SIZE) })\n void readApiResultOrThrow<Record<string, unknown>>(`${REPORTS_API}?${params.toString()}`, undefined, {\n allowNullResult: true,\n })\n .then((result) => {\n if (cancelled) return\n const items = Array.isArray((result as { items?: unknown })?.items)\n ? ((result as { items: unknown[] }).items as Array<Record<string, unknown>>)\n : []\n setRows(items.map(toRow).filter((row): row is ReportRow => row !== null))\n setTotal(readNumber((result as { total?: unknown })?.total) ?? 0)\n setTotalIsCapped((result as { totalIsCapped?: unknown })?.totalIsCapped === true)\n })\n .catch((err) => {\n if (cancelled) return\n logger.error('staff.time_tracking.reports list failed', { err })\n setRows([])\n setTotal(0)\n setTotalIsCapped(false)\n })\n .finally(() => {\n if (!cancelled) setLoading(false)\n })\n return () => {\n cancelled = true\n }\n }, [page, scopeVersion])\n\n const columns = React.useMemo<ColumnDef<ReportRow>[]>(() => {\n const base: ColumnDef<ReportRow>[] = [\n {\n id: 'reference',\n header: t('staff.time_tracking.reports.list.reference', 'Number'),\n accessorKey: 'reference',\n cell: ({ row }) => <span className=\"font-mono text-xs\">{row.original.reference}</span>,\n },\n {\n id: 'title',\n header: t('staff.time_tracking.reports.list.title', 'Report'),\n accessorKey: 'title',\n cell: ({ row }) => (\n <div className=\"flex flex-col\">\n <span className=\"font-medium\">{row.original.title}</span>\n {row.original.customerName ? (\n <span className=\"text-xs text-muted-foreground\">{row.original.customerName}</span>\n ) : null}\n </div>\n ),\n },\n {\n id: 'period',\n header: t('staff.time_tracking.reports.list.period', 'Period'),\n cell: ({ row }) => (\n <span className=\"text-sm text-muted-foreground\">\n {row.original.periodFrom} \u2013 {row.original.periodTo}\n </span>\n ),\n },\n {\n id: 'status',\n header: t('staff.time_tracking.reports.list.status', 'Status'),\n cell: ({ row }) =>\n row.original.status === 'closed' ? (\n <Badge variant=\"success\">\n <Lock aria-hidden=\"true\" className=\"size-3\" />\n {t('staff.time_tracking.reports.status.closed', 'Closed')}\n </Badge>\n ) : (\n <Badge variant=\"warning\">{t('staff.time_tracking.reports.status.draft', 'Draft')}</Badge>\n ),\n },\n {\n id: 'hours',\n header: t('staff.time_tracking.reports.list.hours', 'Billable'),\n cell: ({ row }) => (\n <span className=\"font-mono text-sm tabular-nums\">\n {row.original.totalBillableMinutes === null\n ? '\u2014'\n : formatReportMinutes(row.original.totalBillableMinutes)}\n </span>\n ),\n },\n ]\n\n if (canSeeMoney) {\n base.push({\n id: 'amount',\n header: t('staff.time_tracking.reports.list.amount', 'Total'),\n cell: ({ row }) => (\n <span className=\"font-mono text-sm tabular-nums\">\n {row.original.totalAmount === null\n ? '\u2014'\n : (formatCurrency(row.original.totalAmount, row.original.currencyCode ?? undefined) ?? '\u2014')}\n </span>\n ),\n })\n }\n\n return base\n }, [canSeeMoney, t])\n\n return (\n <Page>\n <PageBody>\n <DataTable<ReportRow>\n extensionTableId={extensionPoints.hosts.timeReportsTable.tableId}\n title={t('staff.time_tracking.nav.reports', 'Reports')}\n titleHeadingLevel={1}\n columns={columns}\n data={rows}\n isLoading={loading}\n pagination={{\n page,\n pageSize: PAGE_SIZE,\n total,\n totalIsCapped,\n totalPages: Math.max(1, Math.ceil(total / PAGE_SIZE)),\n onPageChange: setPage,\n }}\n onRowClick={(row) => router.push(`${REPORTS_HREF}/${row.id}`)}\n emptyState={\n <div className=\"py-12 text-center text-sm text-muted-foreground\">\n {t(\n 'staff.time_tracking.reports.list.empty',\n 'No reports yet. Generate one for a customer to see what is billable.',\n )}\n </div>\n }\n actions={\n canManage ? (\n <Button onClick={() => router.push(`${REPORTS_HREF}/create`)}>\n <Plus aria-hidden=\"true\" />\n {t('staff.time_tracking.reports.list.create', 'New report')}\n </Button>\n ) : (\n <span className=\"inline-flex items-center gap-2 text-sm text-muted-foreground\">\n <FileText aria-hidden=\"true\" className=\"size-4\" />\n {t('staff.time_tracking.reports.list.readOnly', 'You can view reports but not create them.')}\n </span>\n )\n }\n />\n </PageBody>\n </Page>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -0,0 +1,18 @@
1
+ const metadata = {
2
+ requireAuth: true,
3
+ requireFeatures: ["staff.timesheets.reports.view"],
4
+ pageTitle: "Reports",
5
+ pageTitleKey: "staff.time_tracking.nav.reports",
6
+ pageGroup: "Time tracking",
7
+ pageGroupKey: "staff.time_tracking.nav.group",
8
+ pageOrder: 60,
9
+ icon: "file-text",
10
+ breadcrumb: [
11
+ { label: "Time tracking", labelKey: "staff.time_tracking.nav.group", href: "/backend/staff/time-tracking" },
12
+ { label: "Reports", labelKey: "staff.time_tracking.nav.reports" }
13
+ ]
14
+ };
15
+ export {
16
+ metadata
17
+ };
18
+ //# sourceMappingURL=page.meta.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/staff/backend/staff/time-tracking/reports/page.meta.ts"],
4
+ "sourcesContent": ["export const metadata = {\n requireAuth: true,\n requireFeatures: ['staff.timesheets.reports.view'],\n pageTitle: 'Reports',\n pageTitleKey: 'staff.time_tracking.nav.reports',\n pageGroup: 'Time tracking',\n pageGroupKey: 'staff.time_tracking.nav.group',\n pageOrder: 60,\n icon: 'file-text',\n breadcrumb: [\n { label: 'Time tracking', labelKey: 'staff.time_tracking.nav.group', href: '/backend/staff/time-tracking' },\n { label: 'Reports', labelKey: 'staff.time_tracking.nav.reports' },\n ],\n}\n"],
5
+ "mappings": "AAAO,MAAM,WAAW;AAAA,EACtB,aAAa;AAAA,EACb,iBAAiB,CAAC,+BAA+B;AAAA,EACjD,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,cAAc;AAAA,EACd,WAAW;AAAA,EACX,MAAM;AAAA,EACN,YAAY;AAAA,IACV,EAAE,OAAO,iBAAiB,UAAU,iCAAiC,MAAM,+BAA+B;AAAA,IAC1G,EAAE,OAAO,WAAW,UAAU,kCAAkC;AAAA,EAClE;AACF;",
6
+ "names": []
7
+ }